chiark / gitweb /
Replace /var/run with /run in remaining places
[elogind.git] / src / network / networkd-link.c
index 66bcb6bacf051f9ba1afc3381f3c2b3bd25b2fa5..b217123ecc3efb193662c8c03b97a5a28cd1b01e 100644 (file)
@@ -35,6 +35,8 @@ int link_new(Manager *manager, struct udev_device *device, Link **ret) {
         const char *ifname;
         int r;
 
+        assert(manager);
+        assert(manager->links);
         assert(device);
         assert(ret);
 
@@ -105,7 +107,7 @@ int link_get(Manager *m, int ifindex, Link **ret) {
 }
 
 int link_add(Manager *m, struct udev_device *device, Link **ret) {
-        Link *link;
+        Link *link = NULL;
         Network *network;
         int r;
 
@@ -395,11 +397,11 @@ static int set_hostname(sd_bus *bus, const char *hostname) {
 
         r = sd_bus_message_new_method_call(
                         bus,
+                        &m,
                         "org.freedesktop.hostname1",
                         "/org/freedesktop/hostname1",
                         "org.freedesktop.hostname1",
-                        "SetHostname",
-                        &m);
+                        "SetHostname");
         if (r < 0)
                 return r;
 
@@ -446,8 +448,8 @@ static int link_set_mtu(Link *link, uint32_t mtu) {
 
         log_debug_link(link, "setting MTU: %" PRIu32, mtu);
 
-        r = sd_rtnl_message_new_link(link->manager->rtnl, RTM_SETLINK,
-                                     link->ifindex, &req);
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
+                                     RTM_SETLINK, link->ifindex);
         if (r < 0) {
                 log_error_link(link, "Could not allocate RTM_SETLINK message");
                 return r;
@@ -479,6 +481,8 @@ static int dhcp_lease_lost(Link *link) {
         assert(link);
         assert(link->dhcp_lease);
 
+        log_warning_link(link, "DHCP lease lost");
+
         r = address_new_dynamic(&address);
         if (r >= 0) {
                 sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
@@ -507,9 +511,14 @@ static int dhcp_lease_lost(Link *link) {
         }
 
         if (link->network->dhcp_hostname) {
-                r = set_hostname(link->manager->bus, "");
-                if (r < 0)
-                        log_error("Failed to reset transient hostname");
+                const char *hostname = NULL;
+
+                r = sd_dhcp_lease_get_hostname(link->dhcp_lease, &hostname);
+                if (r >= 0 && hostname) {
+                        r = set_hostname(link->manager->bus, "");
+                        if (r < 0)
+                                log_error("Failed to reset transient hostname");
+                }
         }
 
         link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease);
@@ -806,8 +815,8 @@ static int link_up(Link *link) {
 
         log_debug_link(link, "bringing link up");
 
-        r = sd_rtnl_message_new_link(link->manager->rtnl, RTM_SETLINK,
-                                     link->ifindex, &req);
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
+                                     RTM_SETLINK, link->ifindex);
         if (r < 0) {
                 log_error_link(link, "Could not allocate RTM_SETLINK message");
                 return r;
@@ -881,7 +890,7 @@ static int enslave_handler(sd_rtnl *rtnl, sd_rtnl_message *m, void *userdata) {
 }
 
 static int link_enter_enslave(Link *link) {
-        NetDev *vlan;
+        NetDev *vlan, *macvlan;
         Iterator i;
         int r;
 
@@ -892,7 +901,8 @@ static int link_enter_enslave(Link *link) {
         link->state = LINK_STATE_ENSLAVING;
 
         if (!link->network->bridge && !link->network->bond &&
-            hashmap_isempty(link->network->vlans))
+            hashmap_isempty(link->network->vlans) &&
+            hashmap_isempty(link->network->macvlans))
                 return link_enslaved(link);
 
         if (link->network->bridge) {
@@ -934,6 +944,24 @@ static int link_enter_enslave(Link *link) {
                 link->enslaving ++;
         }
 
+        HASHMAP_FOREACH(macvlan, link->network->macvlans, i) {
+                log_struct_link(LOG_DEBUG, link,
+                                "MESSAGE=%s: enslaving by '%s'",
+                                link->ifname, macvlan->name, NETDEV(macvlan), NULL);
+
+                r = netdev_enslave(macvlan, link, &enslave_handler);
+                if (r < 0) {
+                        log_struct_link(LOG_WARNING, link,
+                                        "MESSAGE=%s: could not enslave by '%s': %s",
+                                        link->ifname, macvlan->name, strerror(-r),
+                                        NETDEV(macvlan), NULL);
+                        link_enter_failed(link);
+                        return r;
+                }
+
+                link->enslaving ++;
+        }
+
         return 0;
 }
 
@@ -975,8 +1003,8 @@ static int link_getlink(Link *link) {
 
         log_debug_link(link, "requesting link status");
 
-        r = sd_rtnl_message_new_link(link->manager->rtnl, RTM_GETLINK,
-                                     link->ifindex, &req);
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req,
+                                     RTM_GETLINK, link->ifindex);
         if (r < 0) {
                 log_error_link(link, "Could not allocate RTM_GETLINK message");
                 return r;