From 1d4312d5f95edd2a999636abd2e6967a492bbf2c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 15 Feb 2022 04:24:44 +0900 Subject: [PATCH] network: netdev: add flag to skip kind check It will be used in later commit. --- src/network/netdev/netdev.c | 51 ++++++++++++++++++++----------------- src/network/netdev/netdev.h | 3 +++ 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index 72cbf66696..48b263eaa6 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 f383315ac3..6382d4e620 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]; -- 2.25.1