Skip to content

Commit

Permalink
address: removed broadcast calculations (bsc#944710)
Browse files Browse the repository at this point in the history
Send broadcast address to the kernel only when the config (or dhcp)
explicitly provides one instead to calculate it in some cases.
The kernel has an own logic to automatically properly calculate
related settings as needed (e.g. set routes), also depending on
sysctl and other flags. Sending it, overrides the logic and can
enforce specific, non-standard behavior.
An "ip address add 192.0.2.1/24 dev eth0" does not send it too.
  • Loading branch information
mtomaschewski committed Nov 19, 2015
1 parent 9f81969 commit 5cd629b
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 38 deletions.
4 changes: 2 additions & 2 deletions client/compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1482,9 +1482,9 @@ __ni_compat_generate_static_address_list(xml_node_t *afnode, ni_address_t *addr_
anode = xml_node_new("address", afnode);
xml_node_new_element("local", anode, ni_sockaddr_prefix_print(&ap->local_addr, ap->prefixlen));

if (ap->peer_addr.ss_family != AF_UNSPEC)
if (ap->peer_addr.ss_family == af)
xml_node_new_element("peer", anode, ni_sockaddr_print(&ap->peer_addr));
if (ap->bcast_addr.ss_family != AF_UNSPEC)
if (ap->bcast_addr.ss_family == af && af == AF_INET)
xml_node_new_element("broadcast", anode, ni_sockaddr_print(&ap->bcast_addr));
if (af == AF_INET && ap->label)
xml_node_new_element("label", anode, ap->label);
Expand Down
19 changes: 8 additions & 11 deletions client/suse/compat-suse.c
Original file line number Diff line number Diff line change
Expand Up @@ -3566,14 +3566,12 @@ __get_ipaddr(const ni_sysconfig_t *sc, const char *ifname, const char *suffix, n
ap = ni_address_new(local_addr.ss_family, prefixlen, &local_addr, list);
if (ap && ap->family == AF_INET) {
var = __find_indexed_variable(sc, "BROADCAST", suffix);
if (var) {
ni_sockaddr_parse(&ap->bcast_addr, var->value, AF_INET);
if (ap->bcast_addr.ss_family != ap->family) {
ni_warn("ifcfg-%s: ignoring BROADCAST%s=%s (wrong address family)",
ifname, suffix, var->value);
ap->bcast_addr.ss_family = AF_UNSPEC;
}
} else {
if (var && ni_sockaddr_parse(&ap->bcast_addr, var->value, AF_INET) < 0) {
ni_warn("ifcfg-%s: ignoring BROADCAST%s=%s (unable to parse)",
ifname, suffix, var->value);
ap->bcast_addr.ss_family = AF_UNSPEC;
} else
if (ni_sockaddr_equal(&ap->bcast_addr, &ap->local_addr)) {
/* Clear the default, it's useless */
memset(&ap->bcast_addr, 0, sizeof(ap->bcast_addr));
}
Expand All @@ -3582,9 +3580,8 @@ __get_ipaddr(const ni_sysconfig_t *sc, const char *ifname, const char *suffix, n
if (prefixlen == ni_af_address_prefixlen(local_addr.ss_family)) {
var = __find_indexed_variable(sc, "REMOTE_IPADDR", suffix);
if (var) {
ni_sockaddr_parse(&ap->peer_addr, var->value, AF_UNSPEC);
if (ap->peer_addr.ss_family != ap->family) {
ni_warn("ifcfg-%s: ignoring REMOTE_IPADDR%s=%s (wrong address family)",
if (ni_sockaddr_parse(&ap->peer_addr, var->value, AF_UNSPEC) < 0) {
ni_warn("ifcfg-%s: ignoring REMOTE_IPADDR%s=%s (unable to parse)",
ifname, suffix, var->value);
ap->peer_addr.ss_family = AF_UNSPEC;
} else
Expand Down
6 changes: 0 additions & 6 deletions src/address.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,6 @@ ni_address_new(int af, unsigned int prefix_len, const ni_sockaddr_t *local_addr,
if (local_addr)
ap->local_addr = *local_addr;

/* FIXME: is this the right place to do this? */
if (af == AF_INET && local_addr && prefix_len < 32) {
ap->bcast_addr = *local_addr;
ap->bcast_addr.sin.sin_addr.s_addr |= htonl(0xFFFFFFFFUL >> prefix_len);
}

if (list_head) {
ni_address_list_append(list_head, ap);
}
Expand Down
11 changes: 2 additions & 9 deletions src/dhcp4/protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1931,10 +1931,6 @@ ni_dhcp4_parse_response(const ni_dhcp4_message_t *message, ni_buffer_t *options,
"guessed netmask: %s, cidr: %u",
inet_ntoa(lease->dhcp4.netmask), pfxlen);
}
if (!lease->dhcp4.broadcast.s_addr) {
lease->dhcp4.broadcast.s_addr = lease->dhcp4.address.s_addr |
~lease->dhcp4.netmask.s_addr;
}
if (lease->dhcp4.address.s_addr) {
ni_sockaddr_t local_addr;
ni_address_t *ap;
Expand All @@ -1943,11 +1939,8 @@ ni_dhcp4_parse_response(const ni_dhcp4_message_t *message, ni_buffer_t *options,
local_addr.sin.sin_family = AF_INET;
local_addr.sin.sin_addr = lease->dhcp4.address;
ap = ni_address_new(AF_INET, pfxlen, &local_addr, &lease->addrs);
if (ap) {
memset(&ap->bcast_addr, 0, sizeof(ap->bcast_addr));
ap->bcast_addr.sin.sin_family = AF_INET;
ap->bcast_addr.sin.sin_addr = lease->dhcp4.broadcast;
}
if (ap && lease->dhcp4.broadcast.s_addr)
ni_sockaddr_set_ipv4(&ap->bcast_addr, lease->dhcp4.broadcast, 0);
}

if (classless_routes.count) {
Expand Down
6 changes: 1 addition & 5 deletions src/iflist.c
Original file line number Diff line number Diff line change
Expand Up @@ -1962,12 +1962,8 @@ __ni_rtnl_parse_newaddr(unsigned ifflags, struct nlmsghdr *h, struct ifaddrmsg *
*/
} else {
__ni_nla_get_addr(ifa->ifa_family, &ap->local_addr, tb[IFA_ADDRESS]);
if (tb[IFA_BROADCAST]) {
if (tb[IFA_BROADCAST])
__ni_nla_get_addr(ifa->ifa_family, &ap->bcast_addr, tb[IFA_BROADCAST]);
} else if(ifa->ifa_family == AF_INET && tb[IFA_ADDRESS] && ifa->ifa_prefixlen < 32) {
ap->bcast_addr = ap->local_addr;
ap->bcast_addr.sin.sin_addr.s_addr |= htonl(0xFFFFFFFFUL >> ifa->ifa_prefixlen);
}
}
__ni_nla_get_addr(ifa->ifa_family, &ap->anycast_addr, tb[IFA_ANYCAST]);

Expand Down
9 changes: 4 additions & 5 deletions src/leaseinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,6 @@ __ni_leaseinfo_print_addrs(FILE *out, const char *prefix, ni_address_t *addrs,
ni_address_t *ap;
ni_sockaddr_t nm;
ni_sockaddr_t net;
ni_sockaddr_t brd;
unsigned int i;
char *buf = NULL;

Expand All @@ -175,10 +174,10 @@ __ni_leaseinfo_print_addrs(FILE *out, const char *prefix, ni_address_t *addrs,
__ni_leaseinfo_print_string(out, prefix, "NETWORK",
ni_sockaddr_print(&net), NULL, i);

ni_sockaddr_set_ipv4(&brd, net.sin.sin_addr, 0);
brd.sin.sin_addr.s_addr |= ~nm.sin.sin_addr.s_addr;
__ni_leaseinfo_print_string(out, prefix, "BROADCAST",
ni_sockaddr_print(&brd), NULL, i);
if (!ni_sockaddr_is_unspecified(&ap->bcast_addr)) {
__ni_leaseinfo_print_string(out, prefix, "BROADCAST",
ni_sockaddr_print(&ap->bcast_addr), NULL, i);
}

ni_string_printf(&buf, "%u", ap->prefixlen);
__ni_leaseinfo_print_string(out, prefix, "PREFIXLEN",
Expand Down

0 comments on commit 5cd629b

Please sign in to comment.