This should be the full patch , but I'm not so sure :)
I add ifconfig and net/rtsock.c fixes. I hope I don't miss something this
time :)
--- 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    Sat Jun  8 23:00:19 2002
+++ sbin/ifconfig/ifconfig.my.c Sat Jun  8 23:00:14 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);
 }
@@ -1092,7 +1094,7 @@
 #define        IFFBITS \
 "\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6SMART\7RUNNING" \
 "\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
-"\20MULTICAST"
+"\20MULTICAST\21POLLING\22NOROUTE"
 
 #define        IFCAPBITS \
 "\003\1rxcsum\2txcsum\3netcons"
--- 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"
--- sys/net/rtsock.c    Mon Feb 18 17:26:35 2002
+++ sys/net/rtsock.my.c Sat Jun  8 23:01:13 2002
@@ -746,7 +746,7 @@
                return;
        ifm = mtod(m, struct if_msghdr *);
        ifm->ifm_index = ifp->if_index;
-       ifm->ifm_flags = (u_short)ifp->if_flags;
+       ifm->ifm_flags = (u_short)ifp->if_flags | ifp->if_ipending;
        ifm->ifm_data = ifp->if_data;
        ifm->ifm_addrs = 0;
        route_proto.sp_protocol = 0;
@@ -947,7 +947,7 @@
 
                        ifm = (struct if_msghdr *)w->w_tmem;
                        ifm->ifm_index = ifp->if_index;
-                       ifm->ifm_flags = (u_short)ifp->if_flags;
+                       ifm->ifm_flags = (u_short)ifp->if_flags | ifp->if_ipending;
                        ifm->ifm_data = ifp->if_data;
                        ifm->ifm_addrs = info.rti_addrs;
                        error = SYSCTL_OUT(w->w_req,(caddr_t)ifm, len);


Reply via email to