Skip site navigation (1)Skip section navigation (2)
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>