]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: netdev: add flag to skip kind check
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 14 Feb 2022 19:24:44 +0000 (04:24 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 15 Feb 2022 07:06:43 +0000 (16:06 +0900)
It will be used in later commit.

src/network/netdev/netdev.c
src/network/netdev/netdev.h

index 72cbf66696c6551b25b87d1b95475b7bf048010e..48b263eaa63370f0b60f244ac5404b5e524e466c 100644 (file)
@@ -352,37 +352,40 @@ int netdev_set_ifindex(NetDev *netdev, sd_netlink_message *message) {
                 return -EINVAL;
         }
 
-        r = sd_netlink_message_enter_container(message, IFLA_LINKINFO);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not get LINKINFO: %m");
+        if (!NETDEV_VTABLE(netdev)->skip_netdev_kind_check) {
 
-        r = sd_netlink_message_read_string(message, IFLA_INFO_KIND, &received_kind);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not get KIND: %m");
+                r = sd_netlink_message_enter_container(message, IFLA_LINKINFO);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not get LINKINFO: %m");
 
-        r = sd_netlink_message_exit_container(message);
-        if (r < 0)
-                return log_netdev_error_errno(netdev, r, "Could not exit container: %m");
-
-        if (netdev->kind == NETDEV_KIND_TAP)
-                /* the kernel does not distinguish between tun and tap */
-                kind = "tun";
-        else {
-                kind = netdev_kind_to_string(netdev->kind);
-                if (!kind) {
-                        log_netdev_error(netdev, "Could not get kind");
+                r = sd_netlink_message_read_string(message, IFLA_INFO_KIND, &received_kind);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not get KIND: %m");
+
+                r = sd_netlink_message_exit_container(message);
+                if (r < 0)
+                        return log_netdev_error_errno(netdev, r, "Could not exit container: %m");
+
+                if (netdev->kind == NETDEV_KIND_TAP)
+                        /* the kernel does not distinguish between tun and tap */
+                        kind = "tun";
+                else {
+                        kind = netdev_kind_to_string(netdev->kind);
+                        if (!kind) {
+                                log_netdev_error(netdev, "Could not get kind");
+                                netdev_enter_failed(netdev);
+                                return -EINVAL;
+                        }
+                }
+
+                if (!streq(kind, received_kind)) {
+                        log_netdev_error(netdev, "Received newlink with wrong KIND %s, expected %s",
+                                         received_kind, kind);
                         netdev_enter_failed(netdev);
                         return -EINVAL;
                 }
         }
 
-        if (!streq(kind, received_kind)) {
-                log_netdev_error(netdev, "Received newlink with wrong KIND %s, expected %s",
-                                 received_kind, kind);
-                netdev_enter_failed(netdev);
-                return -EINVAL;
-        }
-
         netdev->ifindex = ifindex;
 
         log_netdev_debug(netdev, "netdev has index %d", netdev->ifindex);
index f383315ac33ccfc7429f4546489f7ad9c1aaa695..6382d4e620bd10e2ac45b61fde7def462b97fe67 100644 (file)
@@ -173,6 +173,9 @@ typedef struct NetDevVTable {
 
         /* Generate MAC address when MACAddress= is not specified. */
         bool generate_mac;
+
+        /* When assigning ifindex to the netdev, skip to check if the netdev kind matches. */
+        bool skip_netdev_kind_check;
 } NetDevVTable;
 
 extern const NetDevVTable * const netdev_vtable[_NETDEV_KIND_MAX];