I've crossposted to -net and -arch as this could probably do with a 
review from a larger audience....

> Brian Somers writes:
> | > In message: <[EMAIL PROTECTED]>
> | >             Joerg Wunsch <[EMAIL PROTECTED]> writes:
> | > : As Alan Clegg wrote:
> | > : 
> | > : > Is there any motion to pull this back?
> | > : 
> | > : There was only consensus to special-case the BOOTP case.
> | > : 
> | > : As i understand it, the change itself was more than desirable for
> | > : PPP connections (so no surprise it was Brian who committed it).
> | > 
> | > dhclient is still broken, however.  The 0.0.0.0 should be the special
> | > case, not bootp.
> | 
> | Yes, I agree.
> | 
> | The question is.... should interface address assignments with 
> | destinations of 0.0.0.0 have host routes created in the first place ?
> | 
> | I'd tend to think not.
> | 
> | Doing this will make things consistent, but maybe at the expense of 
> | breaking something else - under ``usual'' circumstances.  I'm 
> | thinking along the lines of some program that may configure a 
> | destination address of 0.0.0.0 and then expect to be able to do stuff 
> | with the routing table - such as adding a route via 0.0.0.0 or calling 
> | sendto() or connect() with 0.0.0.0 as the destination.
> | 
> | I'm guessing that dhclient will continue to work without a host route 
> | as it writes raw IP packets, and I haven't heard of any problems with 
> | running multiple dhclients using the old in.c code where second and 
> | subsequent SIOCAIADDRs with a 0.0.0.0 destination had no host route.  
> | I haven't tested it yet though.
> | 
> | If nobody objects, I'll tweak things so that destinations of 0.0.0.0 
> | don't add host routes and see if it breaks anything I know of.  I'll 
> | post patches to -arch and cc -net when I get something working.
> 
> Sounds reasonable.  I can test it when you have something since I'm hitting
> this on a few machines around here.
> 
> Doug A.

The attached patches seem to make things work for BOOTP with multiple 
interfaces and for ppp expecting failures for duplicate destination 
address assignments.

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

If people could get some time to review it, it'd be appreciated.

Cheers.
-- 
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: netinet/in.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in.c,v
retrieving revision 1.63
diff -u -r1.63 in.c
--- netinet/in.c        1 Apr 2002 21:31:06 -0000       1.63
+++ netinet/in.c        4 Apr 2002 16:52:59 -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,21 @@
                        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 routing table entries for interface address entries
+        * of 0.0.0.0.  This makes it possible to assign several such address
+        * pairs with consistent results (no host route) and is required by
+        * BOOTP.
+        */
+       if (ia->ia_addr.sin_addr.s_addr != INADDR_ANY) {
+               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