]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: assign corresponding NetDev object to Link
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 17 Feb 2022 15:01:28 +0000 (00:01 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 25 Feb 2022 20:49:52 +0000 (05:49 +0900)
src/network/netdev/ipvlan.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-route.c

index 727e46085be738055cdc58481f36e3a810188ce9..058eadebd7a3cdb6115e47322c76dbf8a3783499 100644 (file)
@@ -80,16 +80,13 @@ const NetDevVTable ipvtap_vtable = {
 };
 
 IPVlanMode link_get_ipvlan_mode(Link *link) {
-        NetDev *netdev;
+        IPVlan *ipvlan;
 
-        if (!streq_ptr(link->kind, "ipvlan"))
-                return _NETDEV_IPVLAN_MODE_INVALID;
-
-        if (netdev_get(link->manager, link->ifname, &netdev) < 0)
-                return _NETDEV_IPVLAN_MODE_INVALID;
+        assert(link);
 
-        if (netdev->kind != NETDEV_KIND_IPVLAN)
+        ipvlan = IPVLAN(link->netdev);
+        if (!ipvlan)
                 return _NETDEV_IPVLAN_MODE_INVALID;
 
-        return IPVLAN(netdev)->mode;
+        return ipvlan->mode;
 }
index d26027f0bded5008f0f04bb5e9901c644d17197c..121b4d5e0a10f3c55b94ca892d1a5b84c84d5644 100644 (file)
@@ -228,6 +228,7 @@ static Link *link_free(Link *link) {
         unlink_and_free(link->state_file);
 
         sd_device_unref(link->sd_device);
+        netdev_unref(link->netdev);
 
         hashmap_free(link->bound_to_links);
         hashmap_free(link->bound_by_links);
@@ -1206,6 +1207,7 @@ static int link_get_network(Link *link, Network **ret) {
 
 static int link_reconfigure_impl(Link *link, bool force) {
         Network *network = NULL;
+        NetDev *netdev = NULL;
         int r;
 
         assert(link);
@@ -1213,6 +1215,10 @@ static int link_reconfigure_impl(Link *link, bool force) {
         if (!IN_SET(link->state, LINK_STATE_INITIALIZED, LINK_STATE_CONFIGURING, LINK_STATE_CONFIGURED, LINK_STATE_UNMANAGED))
                 return 0;
 
+        r = netdev_get(link->manager, link->ifname, &netdev);
+        if (r < 0 && r != -ENOENT)
+                return r;
+
         r = link_get_network(link, &network);
         if (r < 0 && r != -ENOENT)
                 return r;
@@ -1265,6 +1271,9 @@ static int link_reconfigure_impl(Link *link, bool force) {
         link_free_engines(link);
         link->network = network_unref(link->network);
 
+        netdev_unref(link->netdev);
+        link->netdev = netdev_ref(netdev);
+
         if (!network) {
                 link_set_state(link, LINK_STATE_UNMANAGED);
                 return 0;
index 0b257c2414ce6ca3e4a7aef665f92bc91d536fc6..1a3231efc0e6867f51f96c5539ed9f154a9d4030 100644 (file)
@@ -41,6 +41,7 @@ typedef enum LinkState {
 
 typedef struct Manager Manager;
 typedef struct Network Network;
+typedef struct NetDev NetDev;
 typedef struct DUID DUID;
 
 typedef struct Link {
@@ -83,6 +84,7 @@ typedef struct Link {
         sd_event_source *carrier_lost_timer;
 
         Network *network;
+        NetDev *netdev;
 
         LinkState state;
         LinkOperationalState operstate;
index cb40e3f1aedb1c9f84d4ab87b979f5cb093fdbee..2de75f2485d669c4c435a575cfb5cc52ba3a61a2 100644 (file)
@@ -871,18 +871,11 @@ static bool route_by_kernel(const Route *route) {
 
 static void link_unmark_wireguard_routes(Link *link) {
         Route *route, *existing;
-        NetDev *netdev;
         Wireguard *w;
 
         assert(link);
 
-        if (!streq_ptr(link->kind, "wireguard"))
-                return;
-
-        if (netdev_get(link->manager, link->ifname, &netdev) < 0)
-                return;
-
-        w = WIREGUARD(netdev);
+        w = WIREGUARD(link->netdev);
         if (!w)
                 return;