chiark / gitweb /
networkd: store netmask and mac address explicitly
authorTom Gundersen <teg@jklm.no>
Sun, 17 Nov 2013 20:01:20 +0000 (21:01 +0100)
committerTom Gundersen <teg@jklm.no>
Sun, 17 Nov 2013 22:11:11 +0000 (23:11 +0100)
src/network/networkd-address.c
src/network/networkd-link.c
src/network/networkd.h

index e02b1df864abeacba8b495da77bb2dbb5e34ada2..75a9bae20197a411e735371b43aa6778d15bc641 100644 (file)
@@ -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();
index 085b8db2f8c69292d23b5c27dd7dfb3ce6638717..d0a3dccd9bc5a75eaa19013a2bf083c1ddb2e9af 100644 (file)
@@ -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;
 
index fd3b60a6cbf04a952f12f16f663b8b2e43317e1f..c019ceca76c115ac80b4d9d4c1dcb46625c1d04d 100644 (file)
@@ -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;