X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto.c;h=c100735785c9652868e53f707744a4c48fd945a3;hp=81469f99b6f43db6f356ad91ae6a96ff5ecaf957;hb=73a32ab092ae32ec97e20b61512998c8411b8bd5;hpb=05c0ded29cf9dd7716528e61029886550ba1f7ab diff --git a/proto.c b/proto.c index 81469f9..c100735 100644 --- a/proto.c +++ b/proto.c @@ -123,7 +123,8 @@ proto_parse_ip_addr_string(const char *str, bool v6, int mask) } static bool -parse_addr(struct interface *iface, const char *str, bool v6, int mask, bool ext) +parse_addr(struct interface *iface, const char *str, bool v6, int mask, + bool ext, uint32_t broadcast) { struct device_addr *addr; @@ -133,6 +134,9 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask, bool ext return false; } + if (broadcast) + addr->broadcast = broadcast; + if (ext) addr->flags |= DEVADDR_EXTERNAL; @@ -141,7 +145,8 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask, bool ext } static int -parse_address_option(struct interface *iface, struct blob_attr *attr, bool v6, int netmask, bool ext) +parse_address_option(struct interface *iface, struct blob_attr *attr, bool v6, + int netmask, bool ext, uint32_t broadcast) { struct blob_attr *cur; int n_addr = 0; @@ -152,7 +157,8 @@ parse_address_option(struct interface *iface, struct blob_attr *attr, bool v6, i return -1; n_addr++; - if (!parse_addr(iface, blobmsg_data(cur), v6, netmask, ext)) + if (!parse_addr(iface, blobmsg_data(cur), v6, netmask, ext, + broadcast)) return -1; } @@ -188,6 +194,7 @@ proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr, bool ex const char *error; unsigned int netmask = 32; int n_v4 = 0, n_v6 = 0; + uint32_t broadcast = 0; blobmsg_parse(proto_ip_attributes, __OPT_MAX, tb, blob_data(attr), blob_len(attr)); @@ -200,10 +207,12 @@ proto_apply_ip_settings(struct interface *iface, struct blob_attr *attr, bool ex } if (tb[OPT_IPADDR]) - n_v4 = parse_address_option(iface, tb[OPT_IPADDR], false, netmask, ext); + n_v4 = parse_address_option(iface, tb[OPT_IPADDR], false, + netmask, ext, broadcast); if (tb[OPT_IP6ADDR]) - n_v6 = parse_address_option(iface, tb[OPT_IP6ADDR], true, netmask, ext); + n_v6 = parse_address_option(iface, tb[OPT_IP6ADDR], true, + netmask, ext, 0); if (!n_v4 && !n_v6) { error = "NO_ADDRESS";