};
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;
}
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);
static int link_reconfigure_impl(Link *link, bool force) {
Network *network = NULL;
+ NetDev *netdev = NULL;
int r;
assert(link);
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;
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;
typedef struct Manager Manager;
typedef struct Network Network;
+typedef struct NetDev NetDev;
typedef struct DUID DUID;
typedef struct Link {
sd_event_source *carrier_lost_timer;
Network *network;
+ NetDev *netdev;
LinkState state;
LinkOperationalState operstate;
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;