]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce link_remove()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 5 Dec 2021 16:35:44 +0000 (01:35 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 7 Dec 2021 11:32:02 +0000 (20:32 +0900)
src/network/networkd-setlink.c
src/network/networkd-setlink.h

index 77451e39ae72b5d31e2f6cf8bb661fca659f5817..e00cc1e5892af1a9dba659863969b1220243486e 100644 (file)
@@ -1180,3 +1180,43 @@ int link_request_to_bring_up_or_down(Link *link, bool up) {
         log_link_debug(link, "Requested to bring link %s", up_or_down(up));
         return 0;
 }
+
+static int link_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
+        int r;
+
+        assert(m);
+        assert(link);
+
+        if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER))
+                return 0;
+
+        r = sd_netlink_message_get_errno(m);
+        if (r < 0)
+                log_link_message_warning_errno(link, m, r, "Could not remove interface, ignoring");
+
+        return 0;
+}
+
+int link_remove(Link *link) {
+        _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
+        int r;
+
+        assert(link);
+        assert(link->manager);
+        assert(link->manager->rtnl);
+
+        log_link_debug(link, "Removing link.");
+
+        r = sd_rtnl_message_new_link(link->manager->rtnl, &req, RTM_DELLINK, link->ifindex);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Could not allocate RTM_DELLINK message: %m");
+
+        r = netlink_call_async(link->manager->rtnl, NULL, req, link_remove_handler,
+                               link_netlink_destroy_callback, link);
+        if (r < 0)
+                return log_link_debug_errno(link, r, "Could not send rtnetlink message: %m");
+
+        link_ref(link);
+
+        return 0;
+}
index 39a85a6871d848d19972187372f23965c4825ca3..47d87837e4650f5deab8e166e24478226ec72583 100644 (file)
@@ -49,3 +49,5 @@ int link_request_to_activate(Link *link);
 
 int request_process_link_up_or_down(Request *req);
 int link_request_to_bring_up_or_down(Link *link, bool up);
+
+int link_remove(Link *link);