Subnets

Martin Mares mj at ucw.cz
Wed Jun 21 12:00:30 CEST 2000


Hello!

> Hmm, I thought I checked that before dropping setting the broadcast
> address (too many recent IP changes).  I added it back in, but I'm
> surprised that the default isn't the last address in the net
> (CIDR-wise).

I don't know what ifconfig does use as a default, but if you use the `ip'
command to set up the interfaces, default broadcast address is `none' and
BIRD correctly defaults that to the last address in the net. I've added
a check for broadcast address sanity to BIRD (see the patch below), so that
it now complains loudly if it gets an invalid one.

				Have a nice fortnight
-- 
Martin `MJ' Mares   <mj at ucw.cz>   http://atrey.karlin.mff.cuni.cz/~mj/
Faculty of Math and Physics, Charles University, Prague, Czech Rep., Earth
"DEC = Delay in Error Correction"


diff -u -r1.33 netlink.c
--- sysdep/linux/netlink/netlink.c	2000/06/04 19:56:06	1.33
+++ sysdep/linux/netlink/netlink.c	2000/06/21 09:57:41
@@ -377,24 +377,28 @@
   else
     {
       ip_addr netmask = ipa_mkmask(ifa.pxlen);
+      ip_addr xbrd;
+      ifa.prefix = ipa_and(ifa.ip, netmask);
+      ifa.brd = ipa_or(ifa.ip, ipa_not(netmask));
 #ifndef IPV6
       if (i->ifa_prefixlen == BITS_PER_IP_ADDRESS - 2)
 	ifa.opposite = ipa_opposite(ifa.ip);
       if ((ifi->flags & IF_BROADCAST) && a[IFA_BROADCAST])
 	{
-	  memcpy(&ifa.brd, RTA_DATA(a[IFA_BROADCAST]), sizeof(ifa.brd));
-	  ipa_ntoh(ifa.brd);
+	  memcpy(&xbrd, RTA_DATA(a[IFA_BROADCAST]), sizeof(xbrd));
+	  ipa_ntoh(xbrd);
+	  if (ipa_equal(xbrd, ifa.prefix) || ipa_equal(xbrd, ifa.brd))
+	    ifa.brd = xbrd;
+	  else
+	    log(L_ERR "KIF: Invalid broadcast address %I for %s", xbrd, ifi->name);
 	}
-      else
-	ifa.brd = ipa_or(ifa.ip, ipa_not(netmask));
 #endif
-      ifa.prefix = ipa_and(ifa.ip, netmask);
     }
 
   scope = ipa_classify(ifa.ip);
   if (scope < 0)
     {
-      log(L_ERR "KIF: Invalid interface address %I", ifa.ip);
+      log(L_ERR "KIF: Invalid interface address %I for %s", ifa.ip, ifi->name);
       return;
     }
   ifa.scope = scope & IADDR_SCOPE_MASK;



More information about the Bird-users mailing list