]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: use link_request_to_set_master() or friends
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 26 May 2021 05:52:45 +0000 (14:52 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 7 Jun 2021 21:39:48 +0000 (06:39 +0900)
12 files changed:
src/network/netdev/bond.c
src/network/netdev/bond.h
src/network/netdev/bridge.c
src/network/netdev/bridge.h
src/network/netdev/netdev.c
src/network/netdev/netdev.h
src/network/networkd-bridge-vlan.c
src/network/networkd-bridge-vlan.h
src/network/networkd-can.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-setlink.c

index cf7ca88d6f3a397495fcb802a9c766b4ff771049..a7a4adce455a2b9b584f321aba9b1f1c65f0e6c2 100644 (file)
@@ -222,78 +222,6 @@ static int netdev_bond_fill_message_create(NetDev *netdev, Link *link, sd_netlin
         return 0;
 }
 
-static int link_set_bond_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(m);
-        assert(link);
-        assert(link->ifname);
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0) {
-                log_link_warning_errno(link, r, "Could not set bonding interface: %m");
-                return 1;
-        }
-
-        return 1;
-}
-
-int link_set_bond(Link *link) {
-        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
-        int r;
-
-        assert(link);
-        assert(link->network);
-
-        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_NEWLINK, link->network->bond->ifindex);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
-
-        r = sd_netlink_message_set_flags(req, NLM_F_REQUEST | NLM_F_ACK);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not set netlink flags: %m");
-
-        r = sd_netlink_message_open_container(req, IFLA_LINKINFO);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_PROTINFO attribute: %m");
-
-        r = sd_netlink_message_open_container_union(req, IFLA_INFO_DATA, "bond");
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_INFO_DATA attribute: %m");
-
-        if (link->network->active_slave) {
-                r = sd_netlink_message_append_u32(req, IFLA_BOND_ACTIVE_SLAVE, link->ifindex);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BOND_ACTIVE_SLAVE attribute: %m");
-        }
-
-        if (link->network->primary_slave) {
-                r = sd_netlink_message_append_u32(req, IFLA_BOND_PRIMARY, link->ifindex);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BOND_PRIMARY attribute: %m");
-        }
-
-        r = sd_netlink_message_close_container(req);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_LINKINFO attribute: %m");
-
-        r = sd_netlink_message_close_container(req);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_INFO_DATA attribute: %m");
-
-        r = netlink_call_async(link->manager->rtnl, NULL, req, link_set_bond_handler,
-                               link_netlink_destroy_callback, link);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
-
-        link_ref(link);
-
-        return r;
-}
-
 int config_parse_arp_ip_target_address(
                 const char *unit,
                 const char *filename,
index 11d3e9ba26debf9a7b2bae3394ba5557cb579d1f..e4b0a0d94d172181117b58cc8501e3d062b9356f 100644 (file)
@@ -46,8 +46,6 @@ typedef struct Bond {
 DEFINE_NETDEV_CAST(BOND, Bond);
 extern const NetDevVTable bond_vtable;
 
-int link_set_bond(Link *link);
-
 CONFIG_PARSER_PROTOTYPE(config_parse_bond_mode);
 CONFIG_PARSER_PROTOTYPE(config_parse_bond_xmit_hash_policy);
 CONFIG_PARSER_PROTOTYPE(config_parse_bond_lacp_rate);
index 38432f157846b00f1fe9057c325c02178d3d1636..99fb9e1c3c132d807764ba10390bd59650d0df93 100644 (file)
@@ -161,142 +161,6 @@ static int netdev_bridge_post_create(NetDev *netdev, Link *link, sd_netlink_mess
         return r;
 }
 
-static int link_set_bridge_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(m);
-        assert(link);
-        assert(link->ifname);
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0) {
-                log_link_warning_errno(link, r, "Could not set bridge interface: %m");
-                return 1;
-        }
-
-        return 1;
-}
-
-int link_set_bridge(Link *link) {
-        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
-        int r;
-
-        assert(link);
-        assert(link->network);
-
-        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
-
-        r = sd_rtnl_message_link_set_family(req, AF_BRIDGE);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not set message family: %m");
-
-        r = sd_netlink_message_open_container(req, IFLA_PROTINFO);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_PROTINFO attribute: %m");
-
-        if (link->network->use_bpdu >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_GUARD, link->network->use_bpdu);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_GUARD attribute: %m");
-        }
-
-        if (link->network->hairpin >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_MODE, link->network->hairpin);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_MODE attribute: %m");
-        }
-
-        if (link->network->fast_leave >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_FAST_LEAVE, link->network->fast_leave);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_FAST_LEAVE attribute: %m");
-        }
-
-        if (link->network->allow_port_to_be_root >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_PROTECT, link->network->allow_port_to_be_root);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PROTECT attribute: %m");
-        }
-
-        if (link->network->unicast_flood >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_UNICAST_FLOOD, link->network->unicast_flood);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_UNICAST_FLOOD attribute: %m");
-        }
-
-        if (link->network->multicast_flood >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_MCAST_FLOOD, link->network->multicast_flood);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_MCAST_FLOOD attribute: %m");
-        }
-
-        if (link->network->multicast_to_unicast >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_MCAST_TO_UCAST, link->network->multicast_to_unicast);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_MCAST_TO_UCAST attribute: %m");
-        }
-
-        if (link->network->neighbor_suppression >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_NEIGH_SUPPRESS, link->network->neighbor_suppression);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_NEIGH_SUPPRESS attribute: %m");
-        }
-
-        if (link->network->learning >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_LEARNING, link->network->learning);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_LEARNING attribute: %m");
-        }
-
-        if (link->network->bridge_proxy_arp >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_PROXYARP, link->network->bridge_proxy_arp);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PROXYARP attribute: %m");
-        }
-
-        if (link->network->bridge_proxy_arp_wifi >= 0) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_PROXYARP_WIFI, link->network->bridge_proxy_arp_wifi);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PROXYARP_WIFI attribute: %m");
-        }
-
-        if (link->network->cost != 0) {
-                r = sd_netlink_message_append_u32(req, IFLA_BRPORT_COST, link->network->cost);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_COST attribute: %m");
-        }
-
-        if (link->network->priority != LINK_BRIDGE_PORT_PRIORITY_INVALID) {
-                r = sd_netlink_message_append_u16(req, IFLA_BRPORT_PRIORITY, link->network->priority);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_PRIORITY attribute: %m");
-        }
-
-        if (link->network->multicast_router != _MULTICAST_ROUTER_INVALID) {
-                r = sd_netlink_message_append_u8(req, IFLA_BRPORT_MULTICAST_ROUTER, link->network->multicast_router);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not append IFLA_BRPORT_MULTICAST_ROUTER attribute: %m");
-        }
-
-        r = sd_netlink_message_close_container(req);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_LINKINFO attribute: %m");
-
-        r = netlink_call_async(link->manager->rtnl, NULL, req, link_set_bridge_handler,
-                               link_netlink_destroy_callback, link);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
-
-        link_ref(link);
-
-        return r;
-}
-
 int config_parse_bridge_igmp_version(
                 const char *unit,
                 const char *filename,
index 459a5eed689fa306a76b09b2694d39338501f956..4510842022b64dbe16cfad7674ea81c54f392e27 100644 (file)
@@ -41,8 +41,6 @@ typedef enum MulticastRouter {
 DEFINE_NETDEV_CAST(BRIDGE, Bridge);
 extern const NetDevVTable bridge_vtable;
 
-int link_set_bridge(Link *link);
-
 const char* multicast_router_to_string(MulticastRouter i) _const_;
 MulticastRouter multicast_router_from_string(const char *s) _pure_;
 
index 5c1927cdfce8352ad44eef223875e055d80a4b72..89c52a00d2be2109bb8fd8c76c4692e4c1c9c632 100644 (file)
@@ -159,19 +159,6 @@ int config_parse_netdev_kind(
         return 0;
 }
 
-static void netdev_callbacks_clear(NetDev *netdev) {
-        netdev_join_callback *callback;
-
-        if (!netdev)
-                return;
-
-        while ((callback = netdev->callbacks)) {
-                LIST_REMOVE(callbacks, netdev->callbacks, callback);
-                link_unref(callback->link);
-                free(callback);
-        }
-}
-
 bool netdev_is_managed(NetDev *netdev) {
         if (!netdev || !netdev->manager || !netdev->ifname)
                 return false;
@@ -187,8 +174,6 @@ static void netdev_detach_from_manager(NetDev *netdev) {
 static NetDev *netdev_free(NetDev *netdev) {
         assert(netdev);
 
-        netdev_callbacks_clear(netdev);
-
         netdev_detach_from_manager(netdev);
 
         free(netdev->filename);
@@ -223,12 +208,8 @@ void netdev_drop(NetDev *netdev) {
 
         log_netdev_debug(netdev, "netdev removed");
 
-        netdev_callbacks_clear(netdev);
-
         netdev_detach_from_manager(netdev);
-
         netdev_unref(netdev);
-
         return;
 }
 
@@ -252,55 +233,10 @@ int netdev_get(Manager *manager, const char *name, NetDev **ret) {
 
 static int netdev_enter_failed(NetDev *netdev) {
         netdev->state = NETDEV_STATE_FAILED;
-
-        netdev_callbacks_clear(netdev);
-
-        return 0;
-}
-
-static int netdev_enslave_ready(NetDev *netdev, Link* link, link_netlink_message_handler_t callback) {
-        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
-        int r;
-
-        assert(netdev);
-        assert(netdev->state == NETDEV_STATE_READY);
-        assert(netdev->manager);
-        assert(netdev->manager->rtnl);
-        assert(IN_SET(netdev->kind, NETDEV_KIND_BRIDGE, NETDEV_KIND_BOND, NETDEV_KIND_VRF, NETDEV_KIND_BATADV));
-        assert(link);
-        assert(callback);
-
-        if (link->flags & IFF_UP && netdev->kind == NETDEV_KIND_BOND) {
-                log_netdev_debug(netdev, "Link '%s' was up when attempting to enslave it. Bringing link down.", link->ifname);
-                r = link_down(link);
-                if (r < 0)
-                        return log_netdev_error_errno(netdev, r, "Could not bring link down: %m");
-        }
-
-        r = sd_rtnl_message_new_link(netdev->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not allocate RTM_SETLINK message: %m");
-
-        r = sd_netlink_message_append_u32(req, IFLA_MASTER, netdev->ifindex);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not append IFLA_MASTER attribute: %m");
-
-        r = netlink_call_async(netdev->manager->rtnl, NULL, req, callback,
-                               link_netlink_destroy_callback, link);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not send rtnetlink message: %m");
-
-        link_ref(link);
-
-        log_netdev_debug(netdev, "Enslaving link '%s'", link->ifname);
-
         return 0;
 }
 
 static int netdev_enter_ready(NetDev *netdev) {
-        netdev_join_callback *callback, *callback_next;
-        int r;
-
         assert(netdev);
         assert(netdev->ifname);
 
@@ -311,18 +247,6 @@ static int netdev_enter_ready(NetDev *netdev) {
 
         log_netdev_info(netdev, "netdev ready");
 
-        LIST_FOREACH_SAFE(callbacks, callback, callback_next, netdev->callbacks) {
-                /* enslave the links that were attempted to be enslaved before the
-                 * link was ready */
-                r = netdev_enslave_ready(netdev, callback->link, callback->callback);
-                if (r < 0)
-                        return r;
-
-                LIST_REMOVE(callbacks, netdev->callbacks, callback);
-                link_unref(callback->link);
-                free(callback);
-        }
-
         if (NETDEV_VTABLE(netdev)->post_create)
                 NETDEV_VTABLE(netdev)->post_create(netdev, NULL, NULL);
 
@@ -351,45 +275,6 @@ static int netdev_create_handler(sd_netlink *rtnl, sd_netlink_message *m, NetDev
         return 1;
 }
 
-static int netdev_enslave(NetDev *netdev, Link *link, link_netlink_message_handler_t callback) {
-        int r;
-
-        assert(netdev);
-        assert(netdev->manager);
-        assert(netdev->manager->rtnl);
-        assert(IN_SET(netdev->kind, NETDEV_KIND_BRIDGE, NETDEV_KIND_BOND, NETDEV_KIND_VRF, NETDEV_KIND_BATADV));
-
-        if (netdev->state == NETDEV_STATE_READY) {
-                r = netdev_enslave_ready(netdev, link, callback);
-                if (r < 0)
-                        return r;
-        } else if (IN_SET(netdev->state, NETDEV_STATE_LINGER, NETDEV_STATE_FAILED)) {
-                _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
-
-                r = rtnl_message_new_synthetic_error(netdev->manager->rtnl, -ENODEV, 0, &m);
-                if (r >= 0)
-                        callback(netdev->manager->rtnl, m, link);
-        } else {
-                /* the netdev is not yet ready, save this request for when it is */
-                netdev_join_callback *cb;
-
-                cb = new(netdev_join_callback, 1);
-                if (!cb)
-                        return log_oom();
-
-                *cb = (netdev_join_callback) {
-                        .callback = callback,
-                        .link = link_ref(link),
-                };
-
-                LIST_PREPEND(callbacks, netdev->callbacks, cb);
-
-                log_netdev_debug(netdev, "Will enslave '%s', when ready", link->ifname);
-        }
-
-        return 0;
-}
-
 int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *message) {
         uint16_t type;
         const char *kind;
@@ -622,7 +507,6 @@ static int netdev_create_after_configured(NetDev *netdev, Link *link) {
         return NETDEV_VTABLE(netdev)->create_after_configured(netdev, link);
 }
 
-/* the callback must be called, possibly after a timeout, as otherwise the Link will hang */
 int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callback) {
         int r;
 
@@ -631,12 +515,6 @@ int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t callb
         assert(netdev->manager->rtnl);
 
         switch (netdev_get_create_type(netdev)) {
-        case NETDEV_CREATE_MASTER:
-                r = netdev_enslave(netdev, link, callback);
-                if (r < 0)
-                        return r;
-
-                break;
         case NETDEV_CREATE_STACKED:
                 r = netdev_create(netdev, link, callback);
                 if (r < 0)
@@ -905,8 +783,6 @@ int netdev_load_one(Manager *manager, const char *filename) {
         if (r < 0)
                 return r;
 
-        LIST_HEAD_INIT(netdev->callbacks);
-
         log_netdev_debug(netdev, "loaded %s", netdev_kind_to_string(netdev->kind));
 
         if (IN_SET(netdev_get_create_type(netdev), NETDEV_CREATE_MASTER, NETDEV_CREATE_INDEPENDENT)) {
index edc1a77af19cd02d1e458b4227c4e9795c3d2a32..493ae32b2293450ed47b2287949bc3ff7fc95033 100644 (file)
         "-WireGuardPeer\0"                        \
         "-Xfrm\0"
 
-typedef struct netdev_join_callback netdev_join_callback;
-
-struct netdev_join_callback {
-        link_netlink_message_handler_t callback;
-        Link *link;
-
-        LIST_FIELDS(netdev_join_callback, callbacks);
-};
-
 typedef enum NetDevKind {
         NETDEV_KIND_BRIDGE,
         NETDEV_KIND_BOND,
@@ -130,8 +121,6 @@ typedef struct NetDev {
         struct ether_addr *mac;
         uint32_t mtu;
         int ifindex;
-
-        LIST_HEAD(netdev_join_callback, callbacks);
 } NetDev;
 
 typedef struct NetDevVTable {
@@ -206,7 +195,6 @@ int netdev_get(Manager *manager, const char *name, NetDev **ret);
 int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *newlink);
 int netdev_get_mac(const char *ifname, struct ether_addr **ret);
 int netdev_join(NetDev *netdev, Link *link, link_netlink_message_handler_t cb);
-int netdev_join_after_configured(NetDev *netdev, Link *link, link_netlink_message_handler_t callback);
 
 int request_process_create_stacked_netdev(Request *req);
 int link_request_to_crate_stacked_netdev(Link *link, NetDev *netdev);
index 8f39d35c783fc4eb6b9a176f92cc914000eb4eb1..3153bf6984f18109e15a2984a4106e37ea508a26 100644 (file)
@@ -141,73 +141,6 @@ int bridge_vlan_append_info(
         return cnt;
 }
 
-static int set_brvlan_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(link);
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0 && r != -EEXIST)
-                log_link_message_warning_errno(link, m, r, "Could not add VLAN to bridge port");
-
-        return 1;
-}
-
-int link_set_bridge_vlan(Link *link) {
-        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
-        int r;
-
-        assert(link);
-        assert(link->manager);
-        assert(link->network);
-
-        if (!link->network->use_br_vlan)
-                return 0;
-
-        if (!link->network->bridge && !streq_ptr(link->kind, "bridge"))
-                return 0;
-
-        /* create new RTM message */
-        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
-
-        r = sd_rtnl_message_link_set_family(req, AF_BRIDGE);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not set message family: %m");
-
-        r = sd_netlink_message_open_container(req, IFLA_AF_SPEC);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not open IFLA_AF_SPEC container: %m");
-
-        /* master needs flag self */
-        if (!link->network->bridge) {
-                uint16_t flags = BRIDGE_FLAGS_SELF;
-                r = sd_netlink_message_append_data(req, IFLA_BRIDGE_FLAGS, &flags, sizeof(flags));
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Could not open IFLA_BRIDGE_FLAGS: %m");
-        }
-
-        /* add vlan info */
-        r = bridge_vlan_append_info(link, req, link->network->pvid, link->network->br_vid_bitmap, link->network->br_untagged_bitmap);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append VLANs: %m");
-
-        r = sd_netlink_message_close_container(req);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not close IFLA_AF_SPEC container: %m");
-
-        /* send message to the kernel */
-        r = netlink_call_async(link->manager->rtnl, NULL, req, set_brvlan_handler,
-                               link_netlink_destroy_callback, link);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
-
-        link_ref(link);
-
-        return 0;
-}
-
 void network_adjust_bridge_vlan(Network *network) {
         assert(network);
 
index 3ee87729d16c796af88d97b6a132ba2ef90a20b2..f44b8101a556d3f29f4ef7292eb2aacdadc6b547 100644 (file)
@@ -26,8 +26,6 @@ int bridge_vlan_append_info(
                 const uint32_t *br_vid_bitmap,
                 const uint32_t *br_untagged_bitmap);
 
-int link_set_bridge_vlan(Link *link);
-
 CONFIG_PARSER_PROTOTYPE(config_parse_brvlan_pvid);
 CONFIG_PARSER_PROTOTYPE(config_parse_brvlan_vlan);
 CONFIG_PARSER_PROTOTYPE(config_parse_brvlan_untagged);
index 41b946b44d3b9861101d63d79d868bb72033d1ad..c2644a1b8e13488cfabb06ad809cdd9ddaf0753a 100644 (file)
@@ -70,7 +70,7 @@ static int link_set_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link)
 
         log_link_debug(link, "Link set");
 
-        r = link_activate(link);
+        r = link_request_to_activate(link);
         if (r < 0) {
                 link_enter_failed(link);
                 return 1;
@@ -246,7 +246,7 @@ int link_configure_can(Link *link) {
                 return link_set_can(link);
         }
 
-        r = link_activate(link);
+        r = link_request_to_activate(link);
         if (r < 0)
                 return r;
 
index 00bcb5b0bc6a2f55bb090eed857dbb9be1bb3f60..36389010f73441e51bf958cef76717fd59c39034 100644 (file)
@@ -154,15 +154,11 @@ bool link_is_ready_to_configure(Link *link, bool allow_unmanaged) {
         if (link->set_link_messages > 0)
                 return false;
 
-        /* TODO: enable this check when link_request_to_create_stacked_netdev() is used.
         if (!link->stacked_netdevs_created)
                 return false;
-        */
 
-        /* TODO: enable this check when link_request_to_activate() is used.
         if (!link->activated)
                 return false;
-        */
 
         return true;
 }
@@ -407,34 +403,6 @@ void link_enter_failed(Link *link) {
         (void) link_stop_engines(link, false);
 }
 
-static int link_join_netdevs_after_configured(Link *link) {
-        NetDev *netdev;
-        int r;
-
-        HASHMAP_FOREACH(netdev, link->network->stacked_netdevs) {
-                if (netdev->ifindex > 0)
-                        /* Assume already enslaved. */
-                        continue;
-
-                if (netdev_get_create_type(netdev) != NETDEV_CREATE_AFTER_CONFIGURED)
-                        continue;
-
-                log_struct(LOG_DEBUG,
-                           LOG_LINK_INTERFACE(link),
-                           LOG_NETDEV_INTERFACE(netdev),
-                           LOG_LINK_MESSAGE(link, "Enslaving by '%s'", netdev->ifname));
-
-                r = netdev_join(netdev, link, NULL);
-                if (r < 0)
-                        return log_struct_errno(LOG_WARNING, r,
-                                                LOG_LINK_INTERFACE(link),
-                                                LOG_NETDEV_INTERFACE(netdev),
-                                                LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", netdev->ifname));
-        }
-
-        return 0;
-}
-
 static void link_enter_configured(Link *link) {
         assert(link);
         assert(link->network);
@@ -443,8 +411,6 @@ static void link_enter_configured(Link *link) {
                 return;
 
         link_set_state(link, LINK_STATE_CONFIGURED);
-
-        (void) link_join_netdevs_after_configured(link);
 }
 
 void link_check_ready(Link *link) {
@@ -602,52 +568,25 @@ static int link_request_static_configs(Link *link) {
         return 0;
 }
 
-static int link_nomaster_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(link);
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0)
-                log_link_message_warning_errno(link, m, r, "Could not set nomaster, ignoring");
-        else
-                log_link_debug(link, "Setting nomaster done.");
-
-        return 1;
-}
-
-static int link_set_nomaster(Link *link) {
-        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+static int link_request_stacked_netdevs(Link *link) {
+        NetDev *netdev;
         int r;
 
         assert(link);
-        assert(link->network);
-        assert(link->manager);
-        assert(link->manager->rtnl);
 
-        /* set it free if not enslaved with networkd */
-        if (link->network->batadv || link->network->bridge || link->network->bond || link->network->vrf)
-                return 0;
-
-        log_link_debug(link, "Setting nomaster");
-
-        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_SETLINK, link->ifindex);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not allocate RTM_SETLINK message: %m");
+        link->stacked_netdevs_created = false;
+        link->stacked_netdevs_after_configured_created = false;
 
-        r = sd_netlink_message_append_u32(req, IFLA_MASTER, 0);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not append IFLA_MASTER attribute: %m");
-
-        r = netlink_call_async(link->manager->rtnl, NULL, req, link_nomaster_handler,
-                               link_netlink_destroy_callback, link);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
+        HASHMAP_FOREACH(netdev, link->network->stacked_netdevs) {
+                r = link_request_to_crate_stacked_netdev(link, netdev);
+                if (r < 0)
+                        return r;
+        }
 
-        link_ref(link);
+        if (link->create_stacked_netdev_messages == 0)
+                link->stacked_netdevs_created = true;
+        if (link->create_stacked_netdev_after_configured_messages == 0)
+                link->stacked_netdevs_after_configured_created = true;
 
         return 0;
 }
@@ -1030,255 +969,6 @@ static Link *link_drop(Link *link) {
         return link_unref(link);
 }
 
-int link_activate(Link *link) {
-        int r;
-
-        assert(link);
-        assert(link->network);
-
-        switch (link->network->activation_policy) {
-        case ACTIVATION_POLICY_BOUND:
-                r = link_handle_bound_to_list(link);
-                if (r < 0)
-                        return r;
-                break;
-        case ACTIVATION_POLICY_UP:
-                if (link->activated)
-                        break;
-                _fallthrough_;
-        case ACTIVATION_POLICY_ALWAYS_UP:
-                r = link_up(link);
-                if (r < 0)
-                        return r;
-                break;
-        case ACTIVATION_POLICY_DOWN:
-                if (link->activated)
-                        break;
-                _fallthrough_;
-        case ACTIVATION_POLICY_ALWAYS_DOWN:
-                r = link_down(link);
-                if (r < 0)
-                        return r;
-                break;
-        default:
-                break;
-        }
-        link->activated = true;
-
-        return 0;
-}
-
-static int link_joined(Link *link) {
-        int r;
-
-        assert(link);
-        assert(link->network);
-
-        r = link_activate(link);
-        if (r < 0)
-                return r;
-
-        link_set_state(link, LINK_STATE_CONFIGURING);
-
-        if (link->network->bridge) {
-                r = link_set_bridge(link);
-                if (r < 0)
-                        log_link_error_errno(link, r, "Could not set bridge message: %m");
-        }
-
-        if (link->network->bond) {
-                r = link_set_bond(link);
-                if (r < 0)
-                        log_link_error_errno(link, r, "Could not set bond message: %m");
-        }
-
-        r = link_set_bridge_vlan(link);
-        if (r < 0)
-                log_link_error_errno(link, r, "Could not set bridge vlan: %m");
-
-        r = link_append_to_master(link);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Failed to add to master interface's slave list: %m");
-
-        r = link_request_static_configs(link);
-        if (r < 0)
-                return r;
-
-        if (!link_has_carrier(link))
-                return 0;
-
-        return link_acquire_dynamic_conf(link);
-}
-
-static int netdev_join_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
-        int r;
-
-        assert(link);
-        assert(link->network);
-        assert(link->enslaving > 0);
-
-        link->enslaving--;
-
-        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
-                return 1;
-
-        r = sd_netlink_message_get_errno(m);
-        if (r < 0 && r != -EEXIST) {
-                log_link_message_warning_errno(link, m, r, "Could not join netdev");
-                link_enter_failed(link);
-                return 1;
-        }
-
-        log_link_debug(link, "Joined netdev");
-
-        if (link->enslaving == 0) {
-                r = link_joined(link);
-                if (r < 0)
-                        link_enter_failed(link);
-        }
-
-        return 1;
-}
-
-int link_enter_join_netdev(Link *link) {
-        NetDev *netdev;
-        Request req;
-        int r;
-
-        assert(link);
-        assert(link->network);
-        assert(link->state == LINK_STATE_INITIALIZED);
-
-        req = (Request) {
-                .link = link,
-                .type = REQUEST_TYPE_SET_LINK,
-                .set_link_operation = SET_LINK_MTU,
-        };
-
-        if (ordered_set_contains(link->manager->request_queue, &req)) {
-                link->entering_to_join_netdev = true;
-                return 0;
-        }
-
-        link->entering_to_join_netdev = false;
-
-        link_set_state(link, LINK_STATE_CONFIGURING);
-
-        link->enslaving = 0;
-
-        if (link->network->bond) {
-                if (link->network->bond->state == NETDEV_STATE_READY &&
-                    link->network->bond->ifindex == link->master_ifindex)
-                        return link_joined(link);
-
-                log_struct(LOG_DEBUG,
-                           LOG_LINK_INTERFACE(link),
-                           LOG_NETDEV_INTERFACE(link->network->bond),
-                           LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->bond->ifname));
-
-                link->enslaving++;
-
-                r = netdev_join(link->network->bond, link, netdev_join_handler);
-                if (r < 0) {
-                        log_struct_errno(LOG_WARNING, r,
-                                         LOG_LINK_INTERFACE(link),
-                                         LOG_NETDEV_INTERFACE(link->network->bond),
-                                         LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->bond->ifname));
-                        link_enter_failed(link);
-                        return r;
-                }
-        }
-
-        if (link->network->batadv) {
-                log_struct(LOG_DEBUG,
-                           LOG_LINK_INTERFACE(link),
-                           LOG_NETDEV_INTERFACE(link->network->batadv),
-                           LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->batadv->ifname));
-
-                link->enslaving++;
-
-                r = netdev_join(link->network->batadv, link, netdev_join_handler);
-                if (r < 0) {
-                        log_struct_errno(LOG_WARNING, r,
-                                         LOG_LINK_INTERFACE(link),
-                                         LOG_NETDEV_INTERFACE(link->network->batadv),
-                                         LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->batadv->ifname));
-                        link_enter_failed(link);
-                        return r;
-                }
-        }
-
-        if (link->network->bridge) {
-                log_struct(LOG_DEBUG,
-                           LOG_LINK_INTERFACE(link),
-                           LOG_NETDEV_INTERFACE(link->network->bridge),
-                           LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->bridge->ifname));
-
-                link->enslaving++;
-
-                r = netdev_join(link->network->bridge, link, netdev_join_handler);
-                if (r < 0) {
-                        log_struct_errno(LOG_WARNING, r,
-                                         LOG_LINK_INTERFACE(link),
-                                         LOG_NETDEV_INTERFACE(link->network->bridge),
-                                         LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->bridge->ifname));
-                        link_enter_failed(link);
-                        return r;
-                }
-        }
-
-        if (link->network->vrf) {
-                log_struct(LOG_DEBUG,
-                           LOG_LINK_INTERFACE(link),
-                           LOG_NETDEV_INTERFACE(link->network->vrf),
-                           LOG_LINK_MESSAGE(link, "Enslaving by '%s'", link->network->vrf->ifname));
-
-                link->enslaving++;
-
-                r = netdev_join(link->network->vrf, link, netdev_join_handler);
-                if (r < 0) {
-                        log_struct_errno(LOG_WARNING, r,
-                                         LOG_LINK_INTERFACE(link),
-                                         LOG_NETDEV_INTERFACE(link->network->vrf),
-                                         LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", link->network->vrf->ifname));
-                        link_enter_failed(link);
-                        return r;
-                }
-        }
-
-        HASHMAP_FOREACH(netdev, link->network->stacked_netdevs) {
-
-                if (netdev->ifindex > 0)
-                        /* Assume already enslaved. */
-                        continue;
-
-                if (netdev_get_create_type(netdev) != NETDEV_CREATE_STACKED)
-                        continue;
-
-                log_struct(LOG_DEBUG,
-                           LOG_LINK_INTERFACE(link),
-                           LOG_NETDEV_INTERFACE(netdev),
-                           LOG_LINK_MESSAGE(link, "Enslaving by '%s'", netdev->ifname));
-
-                link->enslaving++;
-
-                r = netdev_join(netdev, link, netdev_join_handler);
-                if (r < 0) {
-                        log_struct_errno(LOG_WARNING, r,
-                                         LOG_LINK_INTERFACE(link),
-                                         LOG_NETDEV_INTERFACE(netdev),
-                                         LOG_LINK_MESSAGE(link, "Could not join netdev '%s': %m", netdev->ifname));
-                        link_enter_failed(link);
-                        return r;
-                }
-        }
-
-        if (link->enslaving == 0)
-                return link_joined(link);
-
-        return 0;
-}
-
 static int link_drop_foreign_config(Link *link) {
         int k, r;
 
@@ -1342,6 +1032,8 @@ static int link_configure(Link *link) {
         assert(link->network);
         assert(link->state == LINK_STATE_INITIALIZED);
 
+        link_set_state(link, LINK_STATE_CONFIGURING);
+
         r = link_configure_traffic_control(link);
         if (r < 0)
                 return r;
@@ -1362,15 +1054,43 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
-        r = link_set_nomaster(link);
+        r = link_request_to_set_flags(link);
         if (r < 0)
                 return r;
 
-        r = link_request_to_set_flags(link);
+        r = link_request_to_set_group(link);
         if (r < 0)
                 return r;
 
-        r = link_request_to_set_group(link);
+        r = link_configure_mtu(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_to_set_addrgen_mode(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_to_set_master(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_stacked_netdevs(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_to_set_bond(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_to_set_bridge(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_to_set_bridge_vlan(link);
+        if (r < 0)
+                return r;
+
+        r = link_request_to_activate(link);
         if (r < 0)
                 return r;
 
@@ -1402,14 +1122,6 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
-        r = link_configure_mtu(link);
-        if (r < 0)
-                return r;
-
-        r = link_request_to_set_addrgen_mode(link);
-        if (r < 0)
-                return r;
-
         /* Drop foreign config, but ignore loopback or critical devices.
          * We do not want to remove loopback address or addresses used for root NFS. */
         if (!(link->flags & IFF_LOOPBACK) &&
@@ -1419,7 +1131,14 @@ static int link_configure(Link *link) {
                         return r;
         }
 
-        return link_enter_join_netdev(link);
+        r = link_request_static_configs(link);
+        if (r < 0)
+                return r;
+
+        if (!link_has_carrier(link))
+                return 0;
+
+        return link_acquire_dynamic_conf(link);
 }
 
 static int link_get_network(Link *link, Network **ret) {
index 15a0cdd7d0ad407ada3f75e7ef129dc1a3f3ba57..a3cc829ca6e4bd410b9343618179fa2272be5936 100644 (file)
@@ -94,7 +94,6 @@ typedef struct Link {
         unsigned route_remove_messages;
         unsigned tc_messages;
         unsigned sr_iov_messages;
-        unsigned enslaving;
         unsigned set_link_messages;
         unsigned create_stacked_netdev_messages;
         unsigned create_stacked_netdev_after_configured_messages;
@@ -140,7 +139,6 @@ typedef struct Link {
         bool can_configured:1;
         bool activated:1;
         bool master_set:1;
-        bool entering_to_join_netdev:1;
         bool stacked_netdevs_created:1;
         bool stacked_netdevs_after_configured_created:1;
 
@@ -224,12 +222,9 @@ int link_get_master(Link *link, Link **ret);
 
 int link_getlink_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg);
 int link_call_getlink(Link *link, link_netlink_message_handler_t callback);
-int link_activate(Link *link);
 int link_handle_bound_to_list(Link *link);
 
-int link_enter_join_netdev(Link *link);
 void link_enter_failed(Link *link);
-
 void link_set_state(Link *link, LinkState state);
 void link_check_ready(Link *link);
 
index 5abe379b6b8b6089f3e4f5be1f189df04f576153..e9269d36ef602acc644446a2fe32aac7a9c522de 100644 (file)
@@ -140,12 +140,6 @@ static int link_set_mtu_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *l
         if (r < 0)
                 log_link_warning_errno(link, r, "Failed to set IPv6 MTU, ignoring: %m");
 
-        if (link->entering_to_join_netdev) {
-                r = link_enter_join_netdev(link);
-                if (r < 0)
-                        link_enter_failed(link);
-        }
-
         return 0;
 }