From: Tom Gundersen Date: Sun, 17 Nov 2013 20:01:20 +0000 (+0100) Subject: networkd: store netmask and mac address explicitly X-Git-Tag: v209~1412 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=8cd11a0f0f4ca05199e1166f6a07472b296f7455;p=elogind.git networkd: store netmask and mac address explicitly --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index e02b1df86..75a9bae20 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -78,8 +78,7 @@ int address_configure(Manager *manager, Address *address, Link *link) { if (address->family == AF_INET) { struct in_addr broadcast; - broadcast.s_addr = address->in_addr.in.s_addr | - htonl(0xfffffffflu >> address->prefixlen); + broadcast.s_addr = address->in_addr.in.s_addr | address->netmask.s_addr; r = sd_rtnl_message_append(req, IFA_BROADCAST, &broadcast); if (r < 0) { @@ -147,6 +146,8 @@ int config_parse_address(const char *unit, } n->prefixlen = (unsigned char) i; + n->netmask.s_addr = htonl(0xfffffffflu >> n->prefixlen); + address = strndup(rvalue, e - rvalue); if (!address) return log_oom(); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 085b8db2f..d0a3dccd9 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -29,6 +29,7 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) { _cleanup_link_free_ Link *link = NULL; uint64_t ifindex; + const char *mac; int r; assert(device); @@ -42,6 +43,11 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) { if (ifindex <= 0) return -EINVAL; + mac = udev_device_get_sysattr_value(device, "address"); + if (!mac) + return -EINVAL; + + memcpy(&link->mac.ether_addr_octet[0], ether_aton(mac), ETH_ALEN); link->ifindex = ifindex; link->manager = manager; diff --git a/src/network/networkd.h b/src/network/networkd.h index fd3b60a6c..c019ceca7 100644 --- a/src/network/networkd.h +++ b/src/network/networkd.h @@ -64,6 +64,8 @@ struct Address { unsigned char prefixlen; char *label; + struct in_addr netmask; + union { struct in_addr in; struct in6_addr in6; @@ -89,6 +91,7 @@ struct Link { Manager *manager; int ifindex; + struct ether_addr mac; unsigned flags;