ipcalc did not know about rfc3021
Broadcast address was not computed correctly
We have taught ipcalc that rfc3021 exists.
Broadcast address should be now correct.
Description of problem:
Broadcast address is wrong for /31 networks, this will cause misconfiguration of ethernet devices.
Version-Release number of selected component (if applicable):
How reproducible: Always
Steps to Reproduce:
ipcalc -b 10.10.10.10/31
[root@fmc ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
Note that "BROADCAST=255.255.255.255" needs to be manually inserted if you want your ethernet configured correctly, actually it should not require that because the correct result is well defined already.
[root@fmc ~]# strace -o /tmp/fff -f /sbin/ifup eth1
[root@fmc ~]# fgrep ipcalc /tmp/fff
9100 execve("/bin/ipcalc", ["/bin/ipcalc", "--prefix", "10.81.81.81", "255.255.255.254"], [/* 18 vars */]) = 0
9101 execve("/bin/ipcalc", ["/bin/ipcalc", "--broadcast", "10.81.81.81", "255.255.255.254"], [/* 18 vars */]) = 0
9106 execve("/bin/ipcalc", ["/bin/ipcalc", "--network", "10.81.81.81", "255.255.255.254"], [/* 18 vars */]) = 0
You can see the script depends on ipcalc to get the answer right... and so it should get the answer right.
Can you please try this patch:
diff --git a/src/ipcalc.c b/src/ipcalc.c
index 7316f05..416180b 100644
@@ -141,7 +141,11 @@ struct in_addr calc_broadcast(struct in_addr addr, int prefix)
struct in_addr broadcast;
memset(&broadcast, 0, sizeof(broadcast));
- broadcast.s_addr = (addr.s_addr & mask.s_addr) | ~mask.s_addr;
+ if (mask.s_addr == htonl(0xFFFFFFFE))
+ broadcast.s_addr = htonl(0xFFFFFFFF);
+ broadcast.s_addr = (addr.s_addr & mask.s_addr) | ~mask.s_addr;
I replied to the Bugzilla email, but does not seem to have updated...
Yes the above patch worked for me (I tested by rebuilding SRPM). May I suggest a one-line comment in the source code mentioning RFC3021 (so people can find a reference explaining why it works that way, also in case anyone in future greps out the code looking for the RFC number) ?
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.
For information on the advisory, and where to find the updated
files, follow the link below.
If the solution does not work for you, open a new bug report.