From: Yu Watanabe Date: Mon, 14 Feb 2022 19:24:44 +0000 (+0900) Subject: network: netdev: add flag to skip kind check X-Git-Tag: v251-rc1~280^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1d4312d5f95edd2a999636abd2e6967a492bbf2c;p=thirdparty%2Fsystemd.git network: netdev: add flag to skip kind check It will be used in later commit. --- diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 72cbf66696c..48b263eaa63 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -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); diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index f383315ac33..6382d4e620b 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -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];