svn commit: r243019 - head/sbin/route
Xin LI
delphij at gmail.com
Mon Dec 3 19:47:36 UTC 2012
It seems that this commit breaks the following commands like this:
route add -net 10.8/16 10.2.0.1
---
Script started on Mon Dec 3 11:36:49 2012
delphij has logged on ttyv0 from local.
[delphij at epsilon] ~> netstat -anrafinet
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.2.0.1 UGS 0 37 alc0
10.2.0.0/16 link#1 U 0 32 alc0
10.2.2.130 link#1 UHS 0 0 lo0
127.0.0.1 link#2 UH 0 0 lo0
[delphij at epsilon] ~> sudo route add -net 10.8/16 10.2.0.1
add net 10.8: gateway 10.2.0.1
[delphij at epsilon] ~> netstat -anrafinet
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
0.0.0.0/16 10.2.0.1 UGS 0 0 alc0 =>
default 10.2.0.1 UGS 0 40 alc0
10.2.0.0/16 link#1 U 0 32 alc0
10.2.2.130 link#1 UHS 0 0 lo0
127.0.0.1 link#2 UH 0 0 lo0
[delphij at epsilon] ~> sudo route delete 0.0.0.0/16 10.2.0.1
delete net 0.0.0.0: gateway 10.2.0.1
[delphij at epsilon] ~> exit
Script done on Mon Dec 3 11:37:31 2012
---
If I reverted the changeset, it would add the right route. According to
the commit message, this doesn't seem intentional? Could you please take a
look at this and fix it?
Thanks in advance!
Cheers,
On Wed, Nov 14, 2012 at 12:05 AM, Gleb Smirnoff <glebius at freebsd.org> wrote:
> Author: glebius
> Date: Wed Nov 14 08:05:21 2012
> New Revision: 243019
> URL: http://svnweb.freebsd.org/changeset/base/243019
>
> Log:
> Remove remnants of classful addressing. These magic transformations
> of supplied arguments is not what a modern sysadmin expect.
>
> Modified:
> head/sbin/route/route.c
>
> Modified: head/sbin/route/route.c
>
> ==============================================================================
> --- head/sbin/route/route.c Wed Nov 14 06:37:43 2012 (r243018)
> +++ head/sbin/route/route.c Wed Nov 14 08:05:21 2012 (r243019)
> @@ -422,7 +422,7 @@ routename(struct sockaddr *sa)
>
> /*
> * Return the name of the network whose address is given.
> - * The address is assumed to be that of a net or subnet, not a host.
> + * The address is assumed to be that of a net, not a host.
> */
> const char *
> netname(struct sockaddr *sa)
> @@ -430,9 +430,8 @@ netname(struct sockaddr *sa)
> const char *cp = NULL;
> static char line[MAXHOSTNAMELEN + 1];
> struct netent *np = NULL;
> - u_long net, mask;
> u_long i;
> - int n, subnetshift;
> + int n;
>
> switch (sa->sa_family) {
>
> @@ -444,28 +443,7 @@ netname(struct sockaddr *sa)
> if (in.s_addr == 0)
> cp = "default";
> else if (!nflag) {
> - if (IN_CLASSA(i)) {
> - mask = IN_CLASSA_NET;
> - subnetshift = 8;
> - } else if (IN_CLASSB(i)) {
> - mask = IN_CLASSB_NET;
> - subnetshift = 8;
> - } else {
> - mask = IN_CLASSC_NET;
> - subnetshift = 4;
> - }
> - /*
> - * If there are more bits than the standard mask
> - * would suggest, subnets must be in use.
> - * Guess at the subnet mask, assuming reasonable
> - * width subnet fields.
> - */
> - while (in.s_addr & ~mask)
> - mask |= mask >> subnetshift;
> - net = in.s_addr & mask;
> - while ((mask & 1) == 0)
> - mask >>= 1, net >>= 1;
> - np = getnetbyaddr(net, AF_INET);
> + np = getnetbyaddr(i, AF_INET);
> if (np != NULL)
> cp = np->n_name;
> }
> @@ -810,30 +788,19 @@ newroute(int argc, char **argv)
> static void
> inet_makenetandmask(u_long net, struct sockaddr_in *sin, u_long bits)
> {
> - u_long addr, mask = 0;
> + u_long mask = 0;
> char *cp;
>
> rtm_addrs |= RTA_NETMASK;
> - /*
> - * XXX: This approach unable to handle 0.0.0.1/32 correctly
> - * as inet_network() converts 0.0.0.1 and 1 equally.
> - */
> - if (net <= 0xff)
> - addr = net << IN_CLASSA_NSHIFT;
> - else if (net <= 0xffff)
> - addr = net << IN_CLASSB_NSHIFT;
> - else if (net <= 0xffffff)
> - addr = net << IN_CLASSC_NSHIFT;
> - else
> - addr = net;
> +
> /*
> * If no /xx was specified we must calculate the
> * CIDR address.
> */
> - if ((bits == 0) && (addr != 0)) {
> + if ((bits == 0) && (net != 0)) {
> u_long i, j;
> for(i=0,j=0xff; i<4; i++) {
> - if (addr & j) {
> + if (net & j) {
> break;
> }
> j <<= 8;
> @@ -844,7 +811,7 @@ inet_makenetandmask(u_long net, struct s
> if (bits != 0)
> mask = 0xffffffff << (32 - bits);
>
> - sin->sin_addr.s_addr = htonl(addr);
> + sin->sin_addr.s_addr = htonl(net);
> sin = &so_mask.sin;
> sin->sin_addr.s_addr = htonl(mask);
> sin->sin_len = 0;
>
--
Xin LI <delphij at delphij.net> https://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die
More information about the svn-src-all
mailing list