Ops here is the patch (not enough  sleep again :().

On Fri, 16 Aug 2002, Iasen Kostov wrote:

>    Please take a look at this patch. It implement 1 more flag to if_flags
> and ofcourse it increases size of this flag field by using if_ipending
> which is unused.
>
> On Thu, 15 Aug 2002, Julian Elischer wrote:
>
> > you cannot break ABIs in 4.x
> > in 5.x it will probably be ok until (say) 5.1 or something.
> >
> >
> > On Thu, 15 Aug 2002, Maxim Sobolev wrote:
> >
> > > Folks,
> > >
> > > When implementing ability to switch interface into promisc mode using
> > > ifconfig(8) I've stumbled into the problem with already exhausted
> > > space in the `short if_flags' field in the ifnet structure. I need to
> > > allocate one new flag, while we already have 16 IFF_* flags, and even
> > > one additional flag which is implemented using currently free
> > > if_ipending field of the said structure. Attached patch is aimed at
> > > increasing size of if_flags to 32 bits, as well as to clean-up
> > > if_ipending abuse. Granted, it will break backward ABI compatibility,
> > > but IMO it is not a big problem.
> > >
> > > Comments and suggestions are greatly appreciated. Thanks!
> > >
> > > -Maxim
> >
> >
> > To Unsubscribe: send mail to [EMAIL PROTECTED]
> > with "unsubscribe freebsd-net" in the body of the message
> >
>
>
> To Unsubscribe: send mail to [EMAIL PROTECTED]
> with "unsubscribe freebsd-net" in the body of the message
>
--- sys/net/if.c        Sun Apr 28 08:40:25 2002
+++ sys/net/if.my.c     Sat Jun  8 20:52:12 2002
@@ -952,6 +952,7 @@
        struct ifstat *ifs;
        int error;
        short oif_flags;
+       int flagslong;
 
        switch (cmd) {
 
@@ -980,7 +981,8 @@
        switch (cmd) {
 
        case SIOCGIFFLAGS:
-               ifr->ifr_flags = ifp->if_flags;
+               flagslong = ifp->if_flags & 0x0000ffff;
+               ifr->ifr_flagslong = flagslong | ifp->if_ipending;
                break;
 
        case SIOCGIFCAP:
@@ -1004,6 +1006,7 @@
                error = suser(p);
                if (error)
                        return (error);
+               ifp->if_ipending = ifr->ifr_flagslong & 0xffff0000;
                ifr->ifr_prevflags = ifp->if_flags;
                if (ifp->if_flags & IFF_SMART) {
                        /* Smart drivers twiddle their own routes */
--- sys/net/if.h        Sun Feb 10 01:02:39 2002
+++ sys/net/if.my.h     Sat Jun  8 20:52:20 2002
@@ -139,6 +139,7 @@
  * IFF flags, so we have an easier time when we want to merge them.
  */
 #define        IFF_POLLING     0x10000         /* Interface is in polling mode. */
+#define        IFF_NOROUTE     0x20000         /* Interface doesn't need host route. 
+*/
 
 /* flags set internally only: */
 #define        IFF_CANTCHANGE \
@@ -224,6 +225,7 @@
                struct  sockaddr ifru_dstaddr;
                struct  sockaddr ifru_broadaddr;
                short   ifru_flags[2];
+               int     ifru_flagslong;
                int     ifru_metric;
                int     ifru_mtu;
                int     ifru_phys;
@@ -236,6 +238,7 @@
 #define        ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */
 #define        ifr_flags       ifr_ifru.ifru_flags[0]  /* flags */
 #define        ifr_prevflags   ifr_ifru.ifru_flags[1]  /* flags */
+#define        ifr_flagslong   ifr_ifru.ifru_flagslong /* long flags (int) */
 #define        ifr_metric      ifr_ifru.ifru_metric    /* metric */
 #define        ifr_mtu         ifr_ifru.ifru_mtu       /* mtu */
 #define ifr_phys       ifr_ifru.ifru_phys      /* physical wire */
--- sbin/ifconfig/ifconfig.c    Wed Apr  3 14:48:48 2002
+++ sbin/ifconfig/ifconfig.my.c Sat Jun  8 21:05:00 2002
@@ -205,6 +205,8 @@
        { "-alias",     -IFF_UP,        notealias },
        { "delete",     -IFF_UP,        notealias },
        { "remove",     -IFF_UP,        notealias },
+       { "noroute",    IFF_NOROUTE,    setifflags },
+       { "-noroute",   -IFF_NOROUTE,   setifflags },
 #ifdef notdef
 #define        EN_SWABIPS      0x1000
        { "swabips",    EN_SWABIPS,     setifflags },
@@ -1028,14 +1030,14 @@
                exit(1);
        }
        strncpy(my_ifr.ifr_name, name, sizeof (my_ifr.ifr_name));
-       flags = my_ifr.ifr_flags;
+       flags = my_ifr.ifr_flagslong;
 
        if (value < 0) {
                value = -value;
                flags &= ~value;
        } else
                flags |= value;
-       my_ifr.ifr_flags = flags;
+       my_ifr.ifr_flagslong = flags;
        if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&my_ifr) < 0)
                Perror(vname);
 }
--- sys/netinet/in.c    Sat Jun  8 21:21:12 2002
+++ sys/netinet/in.my.c Sat Jun  8 20:53:06 2002
@@ -739,15 +739,16 @@
         * XXX: This is ugly !  There should be a way for the caller to
         *      say that they don't want a host route.
         */
-       if (ia->ia_addr.sin_addr.s_addr != INADDR_ANY ||
-           ia->ia_netmask != IN_CLASSA_NET ||
-           ia->ia_dstaddr.sin_addr.s_addr != htonl(IN_CLASSA_HOST)) {
-               if ((error = rtinit(&ia->ia_ifa, (int)RTM_ADD, flags)) != 0) {
-                       ia->ia_addr = oldaddr;
-                           return (error);
-               }
-               ia->ia_flags |= IFA_ROUTE;
-       }
+       if (!(ifp->if_ipending & IFF_NOROUTE))
+           if (ia->ia_addr.sin_addr.s_addr != INADDR_ANY ||
+               ia->ia_netmask != IN_CLASSA_NET ||
+               ia->ia_dstaddr.sin_addr.s_addr != htonl(IN_CLASSA_HOST)) {
+                   if ((error = rtinit(&ia->ia_ifa, (int)RTM_ADD, flags)) != 0) {
+                       ia->ia_addr = oldaddr;
+                       return (error);
+                   }
+                   ia->ia_flags |= IFA_ROUTE;
+           }
 
        /*
         * If the interface supports multicast, join the "all hosts"

Reply via email to