summaryrefslogtreecommitdiffhomepage
path: root/system-linux.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2012-02-26 16:51:48 +0100
committerFelix Fietkau <nbd@openwrt.org>2012-02-26 16:51:48 +0100
commit22cdb6d1f33821db46fed47544cf685b072cd7a4 (patch)
treedb3ecbd3490d89d4cf9d39714e00e7f108ef70ac /system-linux.c
parent58d36928da0e3099e17309bd7a44ee442b5f5153 (diff)
system-linux: fix the default broadcast address for v4
Diffstat (limited to 'system-linux.c')
-rw-r--r--system-linux.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/system-linux.c b/system-linux.c
index 58ac5d4..0a989b0 100644
--- a/system-linux.c
+++ b/system-linux.c
@@ -807,7 +807,8 @@ system_if_dump_stats(struct device *dev, struct blob_buf *b)
static int system_addr(struct device *dev, struct device_addr *addr, int cmd)
{
- int alen = ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET4) ? 4 : 16;
+ bool v4 = ((addr->flags & DEVADDR_FAMILY) == DEVADDR_INET4);
+ int alen = v4 ? 4 : 16;
struct ifaddrmsg ifa = {
.ifa_family = (alen == 4) ? AF_INET : AF_INET6,
.ifa_prefixlen = addr->mask,
@@ -822,6 +823,14 @@ static int system_addr(struct device *dev, struct device_addr *addr, int cmd)
nlmsg_append(msg, &ifa, sizeof(ifa), 0);
nla_put(msg, IFA_LOCAL, alen, &addr->addr);
+ if (v4) {
+ uint32_t mask = ~0;
+ uint32_t *a = (uint32_t *) &addr->addr;
+
+ mask >>= addr->mask;
+ nla_put_u32(msg, IFA_BROADCAST, *a | mask);
+ }
+
return system_rtnl_call(msg);
}