> As Brian Somers wrote:
> 
> > The code now avoids adding a host route if the interface address is 
> > 0.0.0.0, and always treats a failure to add a host route as fatal 
> > (previously, it masked EEXIST for some reason - I guessed because it 
> > was trying to handle address re-assignment, but that works ok with 
> > this patch).
> 
> I think that will be fatal for the sppp case with dynamic IP
> address negotiation.  We use 0.0.0.0 as the local IP address
> for the unnegotiated PPP link then, with the idea that it's
> still possible to route through the interface anyway.  For
> dial-on-demand PPP links (like on ISDN), the routed packets
> will then trigger the dialout event.  In the course of the
> PPP negotiations, an actual local IP address will be negotiated
> and assigned, but we first need some packets to pass through the
> PPP layer in order to trigger this.
> 
> Perhaps it would still be possible to use per-interface routes
> even after your change (-iface isp0 etc.), but currently, a number
> of documents describe that it's possible to use local address
> 0.0.0.0 and still get normal routing behaviour for those links.

Hmm, valid point :(

So the code will have to become something like the attached ?  This 
is quite grotty, but I can't think of any clean way other than 
somehow telling SIOCAIFADDR and SIOCSIFADDR not to add the host route 
in the first place.

> -- 
> cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL
> 
> http://www.sax.de/~joerg/                        NIC: JW11-RIPE
> Never trust an operating system you don't have sources for. ;-)

-- 
Brian <[EMAIL PROTECTED]>                <[EMAIL PROTECTED]>
      http://www.freebsd-services.com/        <brian@[uk.]FreeBSD.org>
Don't _EVER_ lose your sense of humour !      <brian@[uk.]OpenBSD.org>

Index: in.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in.c,v
retrieving revision 1.63
diff -u -r1.63 in.c
--- in.c        1 Apr 2002 21:31:06 -0000       1.63
+++ in.c        4 Apr 2002 23:18:36 -0000
@@ -661,7 +661,7 @@
 {
        register u_long i = ntohl(sin->sin_addr.s_addr);
        struct sockaddr_in oldaddr;
-       int s = splimp(), flags = RTF_UP, error;
+       int s = splimp(), flags = RTF_UP, error = 0;
 
        oldaddr = ia->ia_addr;
        ia->ia_addr = *sin;
@@ -723,17 +723,25 @@
                        return (0);
                flags |= RTF_HOST;
        }
-       if ((error = rtinit(&(ia->ia_ifa), (int)RTM_ADD, flags)) == 0)
-               ia->ia_flags |= IFA_ROUTE;
 
-       if (error != 0 && ia->ia_dstaddr.sin_family == AF_INET) {
-               ia->ia_addr = oldaddr;
-               return (error);
+       /*-
+        * Don't add host routes for interface addresses of
+        * 0.0.0.0 --> 0.255.255.255 netmask 255.0.0.0.  This makes it
+        * possible to assign several such address pairs with consistent
+        * results (no host route) and is required by BOOTP.
+        *
+        * 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;
        }
-
-       /* XXX check if the subnet route points to the same interface */
-       if (error == EEXIST)
-               error = 0;
 
        /*
         * If the interface supports multicast, join the "all hosts"



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-net" in the body of the message

Reply via email to