diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2022-02-26 08:13:38 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-26 08:13:38 +0900 |
commit | a23e4f60d5fe7a759e617452fa1454d600da4d85 (patch) | |
tree | 77925eea8fc9150a218e58e9828cfa21dda9f8fe | |
parent | d490188b8f6da658d8086dd53b7db95735e5cca1 (diff) | |
parent | b93ce59e51203c3e30bcec0555fc43a906423470 (diff) | |
download | systemd-a23e4f60d5fe7a759e617452fa1454d600da4d85.tar.gz |
Merge pull request #22619 from yuwata/network-netdev-cleanups
network: several netdev cleanups
-rw-r--r-- | src/network/netdev/batadv.c | 2 | ||||
-rw-r--r-- | src/network/netdev/bridge.c | 2 | ||||
-rw-r--r-- | src/network/netdev/ipvlan.c | 13 | ||||
-rw-r--r-- | src/network/netdev/macsec.c | 2 | ||||
-rw-r--r-- | src/network/netdev/netdev.c | 156 | ||||
-rw-r--r-- | src/network/netdev/netdev.h | 3 | ||||
-rw-r--r-- | src/network/netdev/wireguard.c | 2 | ||||
-rw-r--r-- | src/network/networkd-link.c | 12 | ||||
-rw-r--r-- | src/network/networkd-link.h | 4 | ||||
-rw-r--r-- | src/network/networkd-route.c | 9 |
10 files changed, 93 insertions, 112 deletions
diff --git a/src/network/netdev/batadv.c b/src/network/netdev/batadv.c index 2a13aa31dd..c8650f3d9b 100644 --- a/src/network/netdev/batadv.c +++ b/src/network/netdev/batadv.c @@ -163,7 +163,7 @@ static int netdev_batadv_post_create_message(NetDev *netdev, sd_netlink_message return 0; } -static int netdev_batadv_post_create(NetDev *netdev, Link *link, sd_netlink_message *m) { +static int netdev_batadv_post_create(NetDev *netdev, Link *link) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *message = NULL; int r; diff --git a/src/network/netdev/bridge.c b/src/network/netdev/bridge.c index 15edc7aed6..401d35e844 100644 --- a/src/network/netdev/bridge.c +++ b/src/network/netdev/bridge.c @@ -149,7 +149,7 @@ static int netdev_bridge_post_create_message(NetDev *netdev, sd_netlink_message return 0; } -static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_message *m) { +static int netdev_bridge_post_create(NetDev *netdev, Link *link) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; int r; diff --git a/src/network/netdev/ipvlan.c b/src/network/netdev/ipvlan.c index 727e46085b..058eadebd7 100644 --- a/src/network/netdev/ipvlan.c +++ b/src/network/netdev/ipvlan.c @@ -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; } diff --git a/src/network/netdev/macsec.c b/src/network/netdev/macsec.c index a049ade6ba..ac626495bc 100644 --- a/src/network/netdev/macsec.c +++ b/src/network/netdev/macsec.c @@ -474,7 +474,7 @@ static int netdev_macsec_configure_transmit_association(NetDev *netdev, Transmit return 0; } -static int netdev_macsec_configure(NetDev *netdev, Link *link, sd_netlink_message *m) { +static int netdev_macsec_configure(NetDev *netdev, Link *link) { TransmitAssociation *a; ReceiveChannel *c; MACsec *s; diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 52643cf3c3..10df9a27da 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -253,10 +253,8 @@ int netdev_get(Manager *manager, const char *name, NetDev **ret) { assert(ret); netdev = hashmap_get(manager->netdevs, name); - if (!netdev) { - *ret = NULL; + if (!netdev) return -ENOENT; - } *ret = netdev; @@ -279,7 +277,7 @@ static int netdev_enter_ready(NetDev *netdev) { log_netdev_info(netdev, "netdev ready"); if (NETDEV_VTABLE(netdev)->post_create) - NETDEV_VTABLE(netdev)->post_create(netdev, NULL, NULL); + NETDEV_VTABLE(netdev)->post_create(netdev, NULL); return 0; } @@ -544,17 +542,14 @@ static int netdev_create_message(NetDev *netdev, Link *link, sd_netlink_message return 0; } -static int netdev_create(NetDev *netdev, Link *link, link_netlink_message_handler_t callback) { +static int independent_netdev_create(NetDev *netdev) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; int r; assert(netdev); - assert(!link || callback); /* create netdev */ if (NETDEV_VTABLE(netdev)->create) { - assert(!link); - r = NETDEV_VTABLE(netdev)->create(netdev); if (r < 0) return r; @@ -565,65 +560,50 @@ static int netdev_create(NetDev *netdev, Link *link, link_netlink_message_handle r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not allocate netlink message: %m"); + return r; - r = netdev_create_message(netdev, link, m); + r = netdev_create_message(netdev, NULL, m); if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not create netlink message: %m"); - - if (link) { - r = netlink_call_async(netdev->manager->rtnl, NULL, m, callback, - link_netlink_destroy_callback, link); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not send netlink message: %m"); + return r; - link_ref(link); - } else { - r = netlink_call_async(netdev->manager->rtnl, NULL, m, netdev_create_handler, - netdev_destroy_callback, netdev); - if (r < 0) - return log_netdev_error_errno(netdev, r, "Could not send netlink message: %m"); + r = netlink_call_async(netdev->manager->rtnl, NULL, m, netdev_create_handler, + netdev_destroy_callback, netdev); + if (r < 0) + return r; - netdev_ref(netdev); - } + netdev_ref(netdev); netdev->state = NETDEV_STATE_CREATING; - log_netdev_debug(netdev, "Creating"); return 0; } -static int netdev_create_after_configured(NetDev *netdev, Link *link) { - assert(netdev); - assert(link); - assert(NETDEV_VTABLE(netdev)->create_after_configured); - - return NETDEV_VTABLE(netdev)->create_after_configured(netdev, link); -} - -int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callback) { +static int stacked_netdev_create(NetDev *netdev, Link *link, link_netlink_message_handler_t callback) { + _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; int r; assert(netdev); assert(netdev->manager); - assert(netdev->manager->rtnl); + assert(link); + assert(callback); - switch (netdev_get_create_type(netdev)) { - case NETDEV_CREATE_STACKED: - r = netdev_create(netdev, link, callback); - if (r < 0) - return r; + r = sd_rtnl_message_new_link(netdev->manager->rtnl, &m, RTM_NEWLINK, 0); + if (r < 0) + return r; - break; - case NETDEV_CREATE_AFTER_CONFIGURED: - r = netdev_create_after_configured(netdev, link); - if (r < 0) - return r; - break; - default: - assert_not_reached(); - } + r = netdev_create_message(netdev, link, m); + if (r < 0) + return r; + r = netlink_call_async(netdev->manager->rtnl, NULL, m, callback, + link_netlink_destroy_callback, link); + if (r < 0) + return r; + + link_ref(link); + + netdev->state = NETDEV_STATE_CREATING; + log_netdev_debug(netdev, "Creating"); return 0; } @@ -657,21 +637,34 @@ static int netdev_is_ready_to_create(NetDev *netdev, Link *link) { } int request_process_stacked_netdev(Request *req) { + NetDev *netdev; + Link *link; int r; assert(req); - assert(req->link); assert(req->type == REQUEST_TYPE_NETDEV_STACKED); - assert(req->netdev); assert(req->netlink_handler); - r = netdev_is_ready_to_create(req->netdev, req->link); + netdev = ASSERT_PTR(req->netdev); + link = ASSERT_PTR(req->link); + + r = netdev_is_ready_to_create(netdev, link); if (r <= 0) return r; - r = netdev_join(req->netdev, req->link, req->netlink_handler); + switch (netdev_get_create_type(netdev)) { + case NETDEV_CREATE_STACKED: + r = stacked_netdev_create(netdev, link, req->netlink_handler); + break; + case NETDEV_CREATE_AFTER_CONFIGURED: + assert(NETDEV_VTABLE(netdev)->create_after_configured); + r = NETDEV_VTABLE(netdev)->create_after_configured(netdev, link); + break; + default: + assert_not_reached(); + } if (r < 0) - return log_link_error_errno(req->link, r, "Failed to create stacked netdev '%s': %m", req->netdev->ifname); + return log_netdev_warning_errno(netdev, r, "Failed to create netdev: %m"); return 1; } @@ -714,19 +707,6 @@ static int link_create_stacked_netdev_handler(sd_netlink *rtnl, sd_netlink_messa } static int link_create_stacked_netdev_after_configured_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { - assert(link); - assert(link->create_stacked_netdev_after_configured_messages > 0); - - link->create_stacked_netdev_after_configured_messages--; - - if (link_create_stacked_netdev_handler_internal(rtnl, m, link) <= 0) - return 0; - - if (link->create_stacked_netdev_after_configured_messages == 0) { - link->stacked_netdevs_after_configured_created = true; - log_link_debug(link, "Stacked netdevs created."); - } - return 0; } @@ -748,13 +728,9 @@ int link_request_stacked_netdev(Link *link, NetDev *netdev) { &link->create_stacked_netdev_messages, link_create_stacked_netdev_handler, NULL); - } else { - link->stacked_netdevs_after_configured_created = false; + } else r = link_queue_request(link, REQUEST_TYPE_NETDEV_STACKED, netdev_ref(netdev), true, - &link->create_stacked_netdev_after_configured_messages, - link_create_stacked_netdev_after_configured_handler, - NULL); - } + NULL, link_create_stacked_netdev_after_configured_handler, NULL); if (r < 0) return log_link_error_errno(link, r, "Failed to request stacked netdev '%s': %m", netdev->ifname); @@ -764,24 +740,26 @@ int link_request_stacked_netdev(Link *link, NetDev *netdev) { } int request_process_independent_netdev(Request *req) { + NetDev *netdev; int r; assert(req); assert(req->type == REQUEST_TYPE_NETDEV_INDEPENDENT); - assert(req->netdev); - r = netdev_is_ready_to_create(req->netdev, NULL); + netdev = ASSERT_PTR(req->netdev); + + r = netdev_is_ready_to_create(netdev, NULL); if (r <= 0) return r; - r = netdev_create(req->netdev, NULL, NULL); + r = independent_netdev_create(netdev); if (r < 0) - return r; + return log_netdev_warning_errno(netdev, r, "Failed to create netdev: %m"); return 1; } -static int netdev_request(NetDev *netdev) { +static int netdev_request_to_create(NetDev *netdev) { int r; assert(netdev); @@ -793,12 +771,20 @@ static int netdev_request(NetDev *netdev) { r = netdev_is_ready_to_create(netdev, NULL); if (r < 0) return r; - if (r > 0) + if (r > 0) { /* If the netdev has no dependency, then create it now. */ - return netdev_create(netdev, NULL, NULL); + r = independent_netdev_create(netdev); + if (r < 0) + return log_netdev_warning_errno(netdev, r, "Failed to create netdev: %m"); + + } else { + /* Otherwise, wait for the dependencies being resolved. */ + r = netdev_queue_request(netdev, NULL); + if (r < 0) + return log_netdev_warning_errno(netdev, r, "Failed to request to create: %m"); + } - /* Otherwise, wait for the dependencies being resolved. */ - return netdev_queue_request(netdev, NULL); + return 0; } int netdev_load_one(Manager *manager, const char *filename) { @@ -911,9 +897,9 @@ int netdev_load_one(Manager *manager, const char *filename) { log_netdev_debug(netdev, "loaded %s", netdev_kind_to_string(netdev->kind)); - r = netdev_request(netdev); + r = netdev_request_to_create(netdev); if (r < 0) - return log_netdev_warning_errno(netdev, r, "Failed to request to create: %m"); + return r; TAKE_PTR(netdev); return 0; diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index be26d1969d..5c695b201f 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -165,7 +165,7 @@ typedef struct NetDevVTable { int (*create_after_configured)(NetDev *netdev, Link *link); /* perform additional configuration after netdev has been createad */ - int (*post_create)(NetDev *netdev, Link *link, sd_netlink_message *message); + int (*post_create)(NetDev *netdev, Link *link); /* verify that compulsory configuration options were specified */ int (*config_verify)(NetDev *netdev, const char *filename); @@ -213,7 +213,6 @@ int netdev_get(Manager *manager, const char *name, NetDev **ret); int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink); int netdev_generate_hw_addr(NetDev *netdev, Link *link, const char *name, const struct hw_addr_data *hw_addr, struct hw_addr_data *ret); -int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t cb); int request_process_independent_netdev(Request *req); int request_process_stacked_netdev(Request *req); diff --git a/src/network/netdev/wireguard.c b/src/network/netdev/wireguard.c index 431b5ec045..3bb496130b 100644 --- a/src/network/netdev/wireguard.c +++ b/src/network/netdev/wireguard.c @@ -437,7 +437,7 @@ static void wireguard_resolve_endpoints(NetDev *netdev) { break; } -static int netdev_wireguard_post_create(NetDev *netdev, Link *link, sd_netlink_message *m) { +static int netdev_wireguard_post_create(NetDev *netdev, Link *link) { assert(netdev); assert(WIREGUARD(netdev)); diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index d26027f0bd..e46f209e7a 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -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); @@ -561,7 +562,6 @@ static int link_request_stacked_netdevs(Link *link) { assert(link); link->stacked_netdevs_created = false; - link->stacked_netdevs_after_configured_created = false; HASHMAP_FOREACH(netdev, link->network->stacked_netdevs) { r = link_request_stacked_netdev(link, netdev); @@ -573,8 +573,6 @@ static int link_request_stacked_netdevs(Link *link) { link->stacked_netdevs_created = true; link_check_ready(link); } - if (link->create_stacked_netdev_after_configured_messages == 0) - link->stacked_netdevs_after_configured_created = true; return 0; } @@ -1206,6 +1204,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 +1212,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 +1268,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; diff --git a/src/network/networkd-link.h b/src/network/networkd-link.h index 0b257c2414..645a8e7147 100644 --- a/src/network/networkd-link.h +++ b/src/network/networkd-link.h @@ -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; @@ -106,7 +108,6 @@ typedef struct Link { unsigned set_link_messages; unsigned set_flags_messages; unsigned create_stacked_netdev_messages; - unsigned create_stacked_netdev_after_configured_messages; Set *addresses; Set *neighbors; @@ -140,7 +141,6 @@ typedef struct Link { bool activated:1; bool master_set:1; bool stacked_netdevs_created:1; - bool stacked_netdevs_after_configured_created:1; sd_dhcp_server *dhcp_server; diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index cb40e3f1ae..2de75f2485 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -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; |