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);