diff options
author | Felix Fietkau <nbd@openwrt.org> | 2012-02-26 16:51:48 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2012-02-26 16:51:48 +0100 |
commit | 22cdb6d1f33821db46fed47544cf685b072cd7a4 (patch) | |
tree | db3ecbd3490d89d4cf9d39714e00e7f108ef70ac /system-linux.c | |
parent | 58d36928da0e3099e17309bd7a44ee442b5f5153 (diff) |
system-linux: fix the default broadcast address for v4
Diffstat (limited to 'system-linux.c')
-rw-r--r-- | system-linux.c | 11 |
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); } |