From: Yu Watanabe Date: Tue, 29 Oct 2024 17:01:59 +0000 (+0900) Subject: network/netdev: introduce netdev_can_set_mac/mtu() helper functions X-Git-Tag: v257-rc1~91^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=17c5337f7b2993619d84acc2088b2ba1789e6477;p=thirdparty%2Fsystemd.git network/netdev: introduce netdev_can_set_mac/mtu() helper functions Several netdevs cannot set IFLA_ADDRESS or IFLA_MTU attribute on update. Currently, the vtable field is unused, as we do not support updating existing netdevs. Preparation for later commits. --- diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c index f7598dc7eac..4d552505694 100644 --- a/src/network/netdev/netdev.c +++ b/src/network/netdev/netdev.c @@ -611,6 +611,31 @@ finalize: return 0; } +static bool netdev_can_set_mac(NetDev *netdev, const struct hw_addr_data *hw_addr) { + assert(netdev); + assert(hw_addr); + + if (hw_addr->length <= 0) + return false; + + if (!NETDEV_VTABLE(netdev)->can_set_mac) + return true; + + return NETDEV_VTABLE(netdev)->can_set_mac(netdev, hw_addr); +} + +static bool netdev_can_set_mtu(NetDev *netdev, uint32_t mtu) { + assert(netdev); + + if (mtu <= 0) + return false; + + if (!NETDEV_VTABLE(netdev)->can_set_mtu) + return true; + + return NETDEV_VTABLE(netdev)->can_set_mtu(netdev, mtu); +} + static int netdev_create_message(NetDev *netdev, Link *link, sd_netlink_message *m) { int r; @@ -623,14 +648,14 @@ static int netdev_create_message(NetDev *netdev, Link *link, sd_netlink_message if (r < 0) return r; - if (hw_addr.length > 0) { + if (netdev_can_set_mac(netdev, &hw_addr)) { log_netdev_debug(netdev, "Using MAC address: %s", HW_ADDR_TO_STR(&hw_addr)); r = netlink_message_append_hw_addr(m, IFLA_ADDRESS, &hw_addr); if (r < 0) return r; } - if (netdev->mtu != 0) { + if (netdev_can_set_mtu(netdev, netdev->mtu)) { r = sd_netlink_message_append_u32(m, IFLA_MTU, netdev->mtu); if (r < 0) return r; diff --git a/src/network/netdev/netdev.h b/src/network/netdev/netdev.h index 10b9d0dd77a..9d8c4c7afdc 100644 --- a/src/network/netdev/netdev.h +++ b/src/network/netdev/netdev.h @@ -179,6 +179,12 @@ typedef struct NetDevVTable { /* get ifindex of the netdev. */ int (*get_ifindex)(NetDev *netdev, const char *name); + /* provides if MAC address can be set. If this is not set, assumed to be yes. */ + bool (*can_set_mac)(NetDev *netdev, const struct hw_addr_data *hw_addr); + + /* provides if MTU can be set. If this is not set, assumed to be yes. */ + bool (*can_set_mtu)(NetDev *netdev, uint32_t mtu); + /* expected iftype, e.g. ARPHRD_ETHER. */ uint16_t iftype;