Summary: | route(8): route add changes interpretation of network specification [regression] | ||||||
---|---|---|---|---|---|---|---|
Product: | Base System | Reporter: | Vick Khera <vivek> | ||||
Component: | bin | Assignee: | freebsd-bugs (Nobody) <bugs> | ||||
Status: | Open --- | ||||||
Severity: | Affects Only Me | ||||||
Priority: | Normal | ||||||
Version: | 7.1-RELEASE | ||||||
Hardware: | Any | ||||||
OS: | Any | ||||||
Attachments: |
|
Description
Vick Khera
2009-02-04 15:50:02 UTC
Responsible Changed From-To: freebsd-bugs->freebsd-net Over to maintainer(s) 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-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" Hi! r190758 break using 0.0.0.0/0 as alias for default rote: $ route -n get default route to: default destination: default mask: default gateway: 192.168.1.1 interface: em0 flags: <UP,GATEWAY,DONE,STATIC> recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 0 0 0 0 0 0 1500 0 $ route -n get -net 0.0.0.0 route: writing to routing socket: No such process Attached patch fix this -- Mykola Dzham, LEFT-(UANIC|RIPE) JID: levsha@jabber.net.ua Good catch Mykola.. I will get this in :) R On Apr 11, 2009, at 4:20 AM, Mykola Dzham wrote: > Hi! > r190758 break using 0.0.0.0/0 as alias for default rote: > > $ route -n get default > route to: default > destination: default > mask: default > gateway: 192.168.1.1 > interface: em0 > flags: <UP,GATEWAY,DONE,STATIC> > recvpipe sendpipe ssthresh rtt,msec rttvar hopcount > mtu expire > 0 0 0 0 0 0 > 1500 0 > > $ route -n get -net 0.0.0.0 > route: writing to routing socket: No such process > > Attached patch fix this > > -- > Mykola Dzham, LEFT-(UANIC|RIPE) > JID: levsha@jabber.net.ua > <route.c.patch> ------------------------------ Randall Stewart 803-317-4952 (cell) 803-345-0391(direct) I'm not really following the discussion here so much, but in FreeBSD 7.2, it still sets the routes incorrectly from my perspective. I have in my rc.conf the following: route_vpn1="-net 192.168 192.168.100.202" and it results in the following route (from netstat -rn) Destination Gateway Flags Refs Use Netif Expire 192.168.0.0/24 192.168.100.202 UGS 0 0 em1 whereas in 7.0 and prior, it resulted in a /16 route as I expected, and as I understand it should be from the man page. The man page explicitly states: "-net 128.32 is interpreted as 128.32.0.0" so the man page and the behavior are seemingly inconsistent (still). For bugs matching the following criteria: Status: In Progress Changed: (is less than) 2014-06-01 Reset to default assignee and clear in-progress tags. Mail being skipped |