svn commit: r190758 - head/sbin/route
Robert Watson
rwatson at FreeBSD.org
Mon Apr 6 03:39:48 PDT 2009
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;
>
More information about the svn-src-all
mailing list