Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
(cherry picked from commit 4175867167)
92 lines
3.0 KiB
Diff
92 lines
3.0 KiB
Diff
From d6fe532b7499e4575f9647879b7a34625817fe7f Mon Sep 17 00:00:00 2001
|
|
From: Daniel Borkmann <daniel@iogearbox.net>
|
|
Date: Fri, 24 May 2024 18:36:16 +0200
|
|
Subject: [PATCH] netkit: Fix setting mac address in l2 mode
|
|
|
|
When running Cilium connectivity test suite with netkit in L2 mode, we
|
|
found that it is expected to be able to specify a custom MAC address for
|
|
the devices, in particular, cilium-cni obtains the specified MAC address
|
|
by querying the endpoint and sets the MAC address of the interface inside
|
|
the Pod. Thus, fix the missing support in netkit for L2 mode.
|
|
|
|
Fixes: 35dfaad7188c ("netkit, bpf: Add bpf programmable net device")
|
|
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
|
|
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
|
|
Acked-by: Stanislav Fomichev <sdf@google.com>
|
|
Link: https://lore.kernel.org/r/20240524163619.26001-1-daniel@iogearbox.net
|
|
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
|
|
---
|
|
drivers/net/netkit.c | 26 +++++++++++++++++++++-----
|
|
1 file changed, 21 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/net/netkit.c
|
|
+++ b/drivers/net/netkit.c
|
|
@@ -155,6 +155,16 @@ static void netkit_set_multicast(struct
|
|
/* Nothing to do, we receive whatever gets pushed to us! */
|
|
}
|
|
|
|
+static int netkit_set_macaddr(struct net_device *dev, void *sa)
|
|
+{
|
|
+ struct netkit *nk = netkit_priv(dev);
|
|
+
|
|
+ if (nk->mode != NETKIT_L2)
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
+ return eth_mac_addr(dev, sa);
|
|
+}
|
|
+
|
|
static void netkit_set_headroom(struct net_device *dev, int headroom)
|
|
{
|
|
struct netkit *nk = netkit_priv(dev), *nk2;
|
|
@@ -198,6 +208,7 @@ static const struct net_device_ops netki
|
|
.ndo_start_xmit = netkit_xmit,
|
|
.ndo_set_rx_mode = netkit_set_multicast,
|
|
.ndo_set_rx_headroom = netkit_set_headroom,
|
|
+ .ndo_set_mac_address = netkit_set_macaddr,
|
|
.ndo_get_iflink = netkit_get_iflink,
|
|
.ndo_get_peer_dev = netkit_peer_dev,
|
|
.ndo_get_stats64 = netkit_get_stats,
|
|
@@ -300,9 +311,11 @@ static int netkit_validate(struct nlattr
|
|
|
|
if (!attr)
|
|
return 0;
|
|
- NL_SET_ERR_MSG_ATTR(extack, attr,
|
|
- "Setting Ethernet address is not supported");
|
|
- return -EOPNOTSUPP;
|
|
+ if (nla_len(attr) != ETH_ALEN)
|
|
+ return -EINVAL;
|
|
+ if (!is_valid_ether_addr(nla_data(attr)))
|
|
+ return -EADDRNOTAVAIL;
|
|
+ return 0;
|
|
}
|
|
|
|
static struct rtnl_link_ops netkit_link_ops;
|
|
@@ -365,6 +378,9 @@ static int netkit_new_link(struct net *s
|
|
strscpy(ifname, "nk%d", IFNAMSIZ);
|
|
ifname_assign_type = NET_NAME_ENUM;
|
|
}
|
|
+ if (mode != NETKIT_L2 &&
|
|
+ (tb[IFLA_ADDRESS] || tbp[IFLA_ADDRESS]))
|
|
+ return -EOPNOTSUPP;
|
|
|
|
net = rtnl_link_get_net(src_net, tbp);
|
|
if (IS_ERR(net))
|
|
@@ -379,7 +395,7 @@ static int netkit_new_link(struct net *s
|
|
|
|
netif_inherit_tso_max(peer, dev);
|
|
|
|
- if (mode == NETKIT_L2)
|
|
+ if (mode == NETKIT_L2 && !(ifmp && tbp[IFLA_ADDRESS]))
|
|
eth_hw_addr_random(peer);
|
|
if (ifmp && dev->ifindex)
|
|
peer->ifindex = ifmp->ifi_index;
|
|
@@ -402,7 +418,7 @@ static int netkit_new_link(struct net *s
|
|
if (err < 0)
|
|
goto err_configure_peer;
|
|
|
|
- if (mode == NETKIT_L2)
|
|
+ if (mode == NETKIT_L2 && !tb[IFLA_ADDRESS])
|
|
eth_hw_addr_random(dev);
|
|
if (tb[IFLA_IFNAME])
|
|
nla_strscpy(dev->name, tb[IFLA_IFNAME], IFNAMSIZ);
|