Sure it should..

If you do

route add -net 10.0.0.0 it will work.. Hmmm

I wonder if more is not needed though.. let me think on this.

What strange about the whole thing is that the
behavior I put in used to work in previous releases... its
rather strange actually..

I reviewed several of the past commits and I can't see what broke
it.


R
On Apr 6, 2009, at 6:39 AM, Robert Watson wrote:


On Mon, 6 Apr 2009, Randall Stewart wrote:

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.

Does this maintain compatibility for people who may still mysteriously be specifying class-based IPs and netmasks in configuration files? If not, this should not be MFC'd...

Robert N M Watson
Computer Laboratory
University of Cambridge


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;



------------------------------
Randall Stewart
803-317-4952 (cell)
803-345-0391(direct)

_______________________________________________
svn-src-all@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"

Reply via email to