Date: Sat, 8 Jun 2002 23:20:40 +0300 (EEST) From: Iasen Kostoff <tbyte@otel.net> To: Brian Somers <brian@Awfulhak.org> Cc: freebsd-net@FreeBSD.ORG Subject: Re: host routes for interface addresses Message-ID: <20020608231655.J21392-200000@shadowhand.OTEL.net> In-Reply-To: <20020608172432.3f030ceb.brian@Awfulhak.org>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
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 :)
[-- Attachment #2 --]
--- 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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020608231655.J21392-200000>
