Merge pull request #4773 from thozza/31-prefix-bcast-addr

ipv4_broadcast_addr() didn't comply with RFC3021
This commit is contained in:
Russ White 2020-01-28 11:42:45 -05:00 committed by GitHub
commit b27b58be24
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 7 deletions

View File

@ -1113,11 +1113,11 @@ in_addr_t ipv4_broadcast_addr(in_addr_t hostaddr, int masklen)
masklen2ip(masklen, &mask);
return (masklen != IPV4_MAX_PREFIXLEN - 1) ?
/* normal case */
(hostaddr | ~mask.s_addr)
:
/* special case for /31 */
(hostaddr ^ ~mask.s_addr);
/* normal case */
(hostaddr | ~mask.s_addr)
:
/* For prefix 31 return 255.255.255.255 (RFC3021) */
htonl(0xFFFFFFFF);
}
/* Utility function to convert ipv4 netmask to prefixes

View File

@ -451,8 +451,7 @@ extern uint8_t ip_masklen(struct in_addr);
extern void masklen2ip(const int, struct in_addr *);
/* given the address of a host on a network and the network mask length,
* calculate the broadcast address for that network;
* special treatment for /31: returns the address of the other host
* on the network by flipping the host bit */
* special treatment for /31 according to RFC3021 section 3.3 */
extern in_addr_t ipv4_broadcast_addr(in_addr_t hostaddr, int masklen);
extern int netmask_str2prefix_str(const char *, const char *, char *);