The following reply was made to PR bin/131365; it has been noted by GNATS.

From: dfil...@freebsd.org (dfilter service)
To: bug-follo...@freebsd.org
Cc:  
Subject: Re: bin/131365: commit references a PR
Date: Mon,  6 Apr 2009 10:09:37 +0000 (UTC)

 Author: rrs
 Date: Mon Apr  6 10:09:20 2009
 New Revision: 190758
 URL: http://svn.freebsd.org/changeset/base/190758
 
 Log:
   Class based addressing went out in the early 90's. Basically
   if a entry is not route add -net xxx/bits then we should use
   the addr (xxx) to establish the number of bits by looking at
   the first non-zero bit. So if we enter
   route add -net 10.1.1.0 10.1.3.5
   this is the same as doing
   route add -net 10.1.1.0/24
   Since the 8th bit (zero counting) is set to 1 we set bits
   to 32-8.
   
   Users can of course still use the /x to change this behavior
   or in cases where the network is in the trailing part
   of the address, a "netmask" argument can be supplied to
   override what is established from the interpretation of the
   address itself. e.g:
   
   route add -net 10.1.1.8 -netmask 0xff00ffff
   
   should overide and place the proper CIDR mask in place.
   
   PR:          131365
   MFC after:   1 week
 
 Modified:
   head/sbin/route/route.c
 
 Modified: head/sbin/route/route.c
 ==============================================================================
 --- head/sbin/route/route.c    Mon Apr  6 07:13:26 2009        (r190757)
 +++ head/sbin/route/route.c    Mon Apr  6 10:09:20 2009        (r190758)
 @@ -713,7 +713,7 @@ newroute(argc, argv)
  #ifdef INET6
                if (af == AF_INET6) {
                        rtm_addrs &= ~RTA_NETMASK;
 -                      memset((void *)&so_mask, 0, sizeof(so_mask));
 +                              memset((void *)&so_mask, 0, sizeof(so_mask));
                }
  #endif 
        }
 @@ -803,21 +803,22 @@ inet_makenetandmask(net, sin, bits)
                addr = net << IN_CLASSC_NSHIFT;
        else
                addr = net;
 -
 -      if (bits != 0)
 -              mask = 0xffffffff << (32 - bits);
 -      else if (net == 0)
 -              mask = 0;
 -      else if (IN_CLASSA(addr))
 -              mask = IN_CLASSA_NET;
 -      else if (IN_CLASSB(addr))
 -              mask = IN_CLASSB_NET;
 -      else if (IN_CLASSC(addr))
 -              mask = IN_CLASSC_NET;
 -      else if (IN_MULTICAST(addr))
 -              mask = IN_CLASSD_NET;
 -      else
 -              mask = 0xffffffff;
 +      /*
 +       * If no /xx was specified we must cacluate the 
 +       * CIDR address.
 +       */
 +      if ((bits == 0)  && (addr != 0)) {
 +              int i, j;
 +              for(i=0,j=1; i<32; i++)  {
 +                      if (addr & j) {
 +                              break;
 +                      }
 +                      j <<= 1;
 +              }
 +              /* i holds the first non zero bit */
 +              bits = 32 - i;  
 +      }
 +      mask = 0xffffffff << (32 - bits);
  
        sin->sin_addr.s_addr = htonl(addr);
        sin = &so_mask.sin;
 _______________________________________________
 svn-src-...@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"
 
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to