Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 3 Dec 2012 11:47:32 -0800
From:      Xin LI <delphij@gmail.com>
To:        Gleb Smirnoff <glebius@freebsd.org>
Cc:        "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>
Subject:   Re: svn commit: r243019 - head/sbin/route
Message-ID:  <CAGMYy3u8dKX8DFGFmv%2BQqpDqVm-0ivVxM03QNskqEPuiwrGSqA@mail.gmail.com>
In-Reply-To: <201211140805.qAE85MHU031099@svn.freebsd.org>
References:  <201211140805.qAE85MHU031099@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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@epsilon] ~> sudo route add -net 10.8/16 10.2.0.1
add net 10.8: gateway 10.2.0.1
[delphij@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@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@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@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@delphij.net> https://www.delphij.net/
FreeBSD - The Power to Serve! Live free or die



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAGMYy3u8dKX8DFGFmv%2BQqpDqVm-0ivVxM03QNskqEPuiwrGSqA>