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