Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Jun 2002 22:28:25 +0300 (EEST)
From:      Iasen Kostov <ikostov@otel.net>
To:        Brian Somers <brian@Awfulhak.org>
Cc:        freebsd-net@FreeBSD.ORG
Subject:   Re: host routes for interface addresses
Message-ID:  <20020608222106.U9095-200000@shadowhand.OTEL.net>
In-Reply-To: <20020608201825.468bbab6.brian@Awfulhak.org>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
  Oooo...ppzzZ. I think I didn't sleep enough last night :P. But I found
what I was looking for :).

This is it line 950 of net/rtsock.c :

       ifm->ifm_flags = (u_short)ifp->if_flags | ifp->if_ipending;

And I even try it - it works. But Im not sure if it will work in all
cases...

On Sat, 8 Jun 2002, Brian Somers wrote:

> On Sat, 8 Jun 2002 21:53:59 +0300 (EEST), Iasen Kostov <ikostov@otel.net> wrote:
> >   Here is the patch. I'm now looking in the code to see where kernel
> > replays to the interface table requests. I hope there are not a lot
> > of places where it sets ifm_flags.
> [.....]
>
> I think you forgot to add the patch :*P
>
> --
> Brian <brian@Awfulhak.org>                       <brian.somers@sun.com>
>       <http://www.Awfulhak.org>;                <brian@[uk.]FreeBSD.org>
> Don't _EVER_ lose your sense of humour !       <brian@[uk.]OpenBSD.org>
>
> To Unsubscribe: send mail to majordomo@FreeBSD.org
> with "unsubscribe freebsd-net" in the body of the message
>

[-- 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	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"

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020608222106.U9095-200000>