diff --git a/client/compat.c b/client/compat.c index 5da461e82..b9b8b8e61 100644 --- a/client/compat.c +++ b/client/compat.c @@ -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); diff --git a/client/suse/compat-suse.c b/client/suse/compat-suse.c index 76884a137..cd3ced58c 100644 --- a/client/suse/compat-suse.c +++ b/client/suse/compat-suse.c @@ -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)); } @@ -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 diff --git a/client/suse/config/ifcfg-lo b/client/suse/config/ifcfg-lo index 3d92df154..8f5836514 100644 --- a/client/suse/config/ifcfg-lo +++ b/client/suse/config/ifcfg-lo @@ -2,7 +2,6 @@ IPADDR=127.0.0.1/8 NETMASK=255.0.0.0 NETWORK=127.0.0.0 -BROADCAST=127.255.255.255 STARTMODE=nfsroot BOOTPROTO=static USERCONTROL=no diff --git a/src/address.c b/src/address.c index 29601f5bb..2df36785c 100644 --- a/src/address.c +++ b/src/address.c @@ -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); } diff --git a/src/dhcp4/protocol.c b/src/dhcp4/protocol.c index e31b41e64..d0fb3c65e 100644 --- a/src/dhcp4/protocol.c +++ b/src/dhcp4/protocol.c @@ -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; @@ -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) { diff --git a/src/iflist.c b/src/iflist.c index e49b426fa..9b0453ef2 100644 --- a/src/iflist.c +++ b/src/iflist.c @@ -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]); diff --git a/src/leaseinfo.c b/src/leaseinfo.c index c2ce1aaec..dd5dc75dd 100644 --- a/src/leaseinfo.c +++ b/src/leaseinfo.c @@ -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; @@ -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",