Skip to content

Commit a893f88

Browse files
author
CKI KWF Bot
committed
Merge: macsec: inherit lower device's features and TSO limits when offloading
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/809 JIRA: https://issues.redhat.com/browse/RHEL-26055 Backport of upstream series: f95a392 Merge branch 'macsec-inherit-lower-device-s-features-and-tso-limits-when-offloading' 494bd83 netdevsim: add more hw_features 0189270 selftests: netdevsim: add a test checking ethtool features bd97c29 macsec: add some of the lower device's features when offloading f29d24a macsec: clean up local variables in macsec_notify de187a3 macsec: inherit lower device's TSO limits when offloading 415b7ce selftests: move macsec offload tests from net/rtnetlink to drivers/net/netdvesim 29084ea selftests: netdevsim: add test toggling macsec offload 0f8800e selftests: netdevsim: add ethtool features to macsec offload tests Signed-off-by: Sabrina Dubroca <sdubroca@redhat.com> Approved-by: Xin Long <lxin@redhat.com> Approved-by: Hangbin Liu <haliu@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 4530278 + 02b3ad9 commit a893f88

File tree

7 files changed

+200
-89
lines changed

7 files changed

+200
-89
lines changed

drivers/net/macsec.c

Lines changed: 44 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2621,6 +2621,17 @@ static void macsec_set_head_tail_room(struct net_device *dev)
26212621
dev->needed_tailroom = real_dev->needed_tailroom + needed_tailroom;
26222622
}
26232623

2624+
static void macsec_inherit_tso_max(struct net_device *dev)
2625+
{
2626+
struct macsec_dev *macsec = macsec_priv(dev);
2627+
2628+
/* if macsec is offloaded, we need to follow the lower
2629+
* device's capabilities. otherwise, we can ignore them.
2630+
*/
2631+
if (macsec_is_offloaded(macsec))
2632+
netif_inherit_tso_max(dev, macsec->real_dev);
2633+
}
2634+
26242635
static int macsec_update_offload(struct net_device *dev, enum macsec_offload offload)
26252636
{
26262637
enum macsec_offload prev_offload;
@@ -2666,6 +2677,10 @@ static int macsec_update_offload(struct net_device *dev, enum macsec_offload off
26662677
macsec_set_head_tail_room(dev);
26672678
macsec->insert_tx_tag = macsec_needs_tx_tag(macsec, ops);
26682679

2680+
macsec_inherit_tso_max(dev);
2681+
2682+
netdev_update_features(dev);
2683+
26692684
return ret;
26702685
}
26712686

@@ -3521,6 +3536,10 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff *skb,
35213536
#define MACSEC_FEATURES \
35223537
(NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST)
35233538

3539+
#define MACSEC_OFFLOAD_FEATURES \
3540+
(MACSEC_FEATURES | NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES | \
3541+
NETIF_F_LRO | NETIF_F_RXHASH | NETIF_F_CSUM_MASK | NETIF_F_RXCSUM)
3542+
35243543
static int macsec_dev_init(struct net_device *dev)
35253544
{
35263545
struct macsec_dev *macsec = macsec_priv(dev);
@@ -3531,7 +3550,12 @@ static int macsec_dev_init(struct net_device *dev)
35313550
if (err)
35323551
return err;
35333552

3534-
dev->features = real_dev->features & MACSEC_FEATURES;
3553+
macsec_inherit_tso_max(dev);
3554+
3555+
dev->hw_features = real_dev->hw_features & MACSEC_OFFLOAD_FEATURES;
3556+
dev->hw_features |= NETIF_F_GSO_SOFTWARE;
3557+
3558+
dev->features = real_dev->features & MACSEC_OFFLOAD_FEATURES;
35353559
dev->features |= NETIF_F_GSO_SOFTWARE;
35363560
dev->lltx = true;
35373561
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
@@ -3561,8 +3585,12 @@ static netdev_features_t macsec_fix_features(struct net_device *dev,
35613585
{
35623586
struct macsec_dev *macsec = macsec_priv(dev);
35633587
struct net_device *real_dev = macsec->real_dev;
3588+
netdev_features_t mask;
3589+
3590+
mask = macsec_is_offloaded(macsec) ? MACSEC_OFFLOAD_FEATURES
3591+
: MACSEC_FEATURES;
35643592

3565-
features &= (real_dev->features & MACSEC_FEATURES) |
3593+
features &= (real_dev->features & mask) |
35663594
NETIF_F_GSO_SOFTWARE | NETIF_F_SOFT_FEATURES;
35673595

35683596
return features;
@@ -4428,31 +4456,26 @@ static int macsec_notify(struct notifier_block *this, unsigned long event,
44284456
void *ptr)
44294457
{
44304458
struct net_device *real_dev = netdev_notifier_info_to_dev(ptr);
4459+
struct macsec_rxh_data *rxd;
4460+
struct macsec_dev *m, *n;
44314461
LIST_HEAD(head);
44324462

44334463
if (!is_macsec_master(real_dev))
44344464
return NOTIFY_DONE;
44354465

4466+
rxd = macsec_data_rtnl(real_dev);
4467+
44364468
switch (event) {
44374469
case NETDEV_DOWN:
44384470
case NETDEV_UP:
4439-
case NETDEV_CHANGE: {
4440-
struct macsec_dev *m, *n;
4441-
struct macsec_rxh_data *rxd;
4442-
4443-
rxd = macsec_data_rtnl(real_dev);
4471+
case NETDEV_CHANGE:
44444472
list_for_each_entry_safe(m, n, &rxd->secys, secys) {
44454473
struct net_device *dev = m->secy.netdev;
44464474

44474475
netif_stacked_transfer_operstate(real_dev, dev);
44484476
}
44494477
break;
4450-
}
4451-
case NETDEV_UNREGISTER: {
4452-
struct macsec_dev *m, *n;
4453-
struct macsec_rxh_data *rxd;
4454-
4455-
rxd = macsec_data_rtnl(real_dev);
4478+
case NETDEV_UNREGISTER:
44564479
list_for_each_entry_safe(m, n, &rxd->secys, secys) {
44574480
macsec_common_dellink(m->secy.netdev, &head);
44584481
}
@@ -4462,12 +4485,7 @@ static int macsec_notify(struct notifier_block *this, unsigned long event,
44624485

44634486
unregister_netdevice_many(&head);
44644487
break;
4465-
}
4466-
case NETDEV_CHANGEMTU: {
4467-
struct macsec_dev *m;
4468-
struct macsec_rxh_data *rxd;
4469-
4470-
rxd = macsec_data_rtnl(real_dev);
4488+
case NETDEV_CHANGEMTU:
44714489
list_for_each_entry(m, &rxd->secys, secys) {
44724490
struct net_device *dev = m->secy.netdev;
44734491
unsigned int mtu = real_dev->mtu - (m->secy.icv_len +
@@ -4476,7 +4494,13 @@ static int macsec_notify(struct notifier_block *this, unsigned long event,
44764494
if (dev->mtu > mtu)
44774495
dev_set_mtu(dev, mtu);
44784496
}
4479-
}
4497+
break;
4498+
case NETDEV_FEAT_CHANGE:
4499+
list_for_each_entry(m, &rxd->secys, secys) {
4500+
macsec_inherit_tso_max(m->secy.netdev);
4501+
netdev_update_features(m->secy.netdev);
4502+
}
4503+
break;
44804504
}
44814505

44824506
return NOTIFY_OK;

drivers/net/netdevsim/netdev.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,11 @@ static void nsim_setup(struct net_device *dev)
624624
NETIF_F_FRAGLIST |
625625
NETIF_F_HW_CSUM |
626626
NETIF_F_TSO;
627-
dev->hw_features |= NETIF_F_HW_TC;
627+
dev->hw_features |= NETIF_F_HW_TC |
628+
NETIF_F_SG |
629+
NETIF_F_FRAGLIST |
630+
NETIF_F_HW_CSUM |
631+
NETIF_F_TSO;
628632
dev->max_mtu = ETH_MAX_MTU;
629633
dev->xdp_features = NETDEV_XDP_ACT_HW_OFFLOAD;
630634
}

tools/testing/selftests/drivers/net/netdevsim/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ TEST_PROGS = devlink.sh \
44
devlink_in_netns.sh \
55
devlink_trap.sh \
66
ethtool-coalesce.sh \
7+
ethtool-features.sh \
78
ethtool-fec.sh \
89
ethtool-pause.sh \
910
ethtool-ring.sh \
1011
fib.sh \
1112
hw_stats_l3.sh \
13+
macsec-offload.sh \
1214
nexthop.sh \
1315
peer.sh \
1416
psample.sh \

tools/testing/selftests/drivers/net/netdevsim/config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
CONFIG_DUMMY=y
22
CONFIG_GENEVE=m
33
CONFIG_IPV6=y
4+
CONFIG_MACSEC=m
45
CONFIG_NETDEVSIM=m
56
CONFIG_NET_SCH_MQPRIO=y
67
CONFIG_NET_SCH_MULTIQ=y
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-2.0-only
3+
4+
source ethtool-common.sh
5+
6+
NSIM_NETDEV=$(make_netdev)
7+
8+
set -o pipefail
9+
10+
FEATS="
11+
tx-checksum-ip-generic
12+
tx-scatter-gather
13+
tx-tcp-segmentation
14+
generic-segmentation-offload
15+
generic-receive-offload"
16+
17+
for feat in $FEATS ; do
18+
s=$(ethtool --json -k $NSIM_NETDEV | jq ".[].\"$feat\".active" 2>/dev/null)
19+
check $? "$s" true
20+
21+
s=$(ethtool --json -k $NSIM_NETDEV | jq ".[].\"$feat\".fixed" 2>/dev/null)
22+
check $? "$s" false
23+
done
24+
25+
if [ $num_errors -eq 0 ]; then
26+
echo "PASSED all $((num_passes)) checks"
27+
exit 0
28+
else
29+
echo "FAILED $num_errors/$((num_errors+num_passes)) checks"
30+
exit 1
31+
fi
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-2.0-only
3+
4+
source ethtool-common.sh
5+
6+
NSIM_NETDEV=$(make_netdev)
7+
MACSEC_NETDEV=macsec_nsim
8+
9+
set -o pipefail
10+
11+
if ! ethtool -k $NSIM_NETDEV | grep -q 'macsec-hw-offload: on'; then
12+
echo "SKIP: netdevsim doesn't support MACsec offload"
13+
exit 4
14+
fi
15+
16+
if ! ip link add link $NSIM_NETDEV $MACSEC_NETDEV type macsec offload mac 2>/dev/null; then
17+
echo "SKIP: couldn't create macsec device"
18+
exit 4
19+
fi
20+
ip link del $MACSEC_NETDEV
21+
22+
#
23+
# test macsec offload API
24+
#
25+
26+
ip link add link $NSIM_NETDEV "${MACSEC_NETDEV}" type macsec port 4 offload mac
27+
check $?
28+
29+
ip link add link $NSIM_NETDEV "${MACSEC_NETDEV}2" type macsec address "aa:bb:cc:dd:ee:ff" port 5 offload mac
30+
check $?
31+
32+
ip link add link $NSIM_NETDEV "${MACSEC_NETDEV}3" type macsec sci abbacdde01020304 offload mac
33+
check $?
34+
35+
ip link add link $NSIM_NETDEV "${MACSEC_NETDEV}4" type macsec port 8 offload mac 2> /dev/null
36+
check $? '' '' 1
37+
38+
ip macsec add "${MACSEC_NETDEV}" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012
39+
check $?
40+
41+
ip macsec add "${MACSEC_NETDEV}" rx port 1234 address "1c:ed:de:ad:be:ef"
42+
check $?
43+
44+
ip macsec add "${MACSEC_NETDEV}" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on \
45+
key 00 0123456789abcdef0123456789abcdef
46+
check $?
47+
48+
ip macsec add "${MACSEC_NETDEV}" rx port 1235 address "1c:ed:de:ad:be:ef" 2> /dev/null
49+
check $? '' '' 1
50+
51+
# can't disable macsec offload when SAs are configured
52+
ip link set "${MACSEC_NETDEV}" type macsec offload off 2> /dev/null
53+
check $? '' '' 1
54+
55+
ip macsec offload "${MACSEC_NETDEV}" off 2> /dev/null
56+
check $? '' '' 1
57+
58+
# toggle macsec offload via rtnetlink
59+
ip link set "${MACSEC_NETDEV}2" type macsec offload off
60+
check $?
61+
62+
ip link set "${MACSEC_NETDEV}2" type macsec offload mac
63+
check $?
64+
65+
# toggle macsec offload via genetlink
66+
ip macsec offload "${MACSEC_NETDEV}2" off
67+
check $?
68+
69+
ip macsec offload "${MACSEC_NETDEV}2" mac
70+
check $?
71+
72+
for dev in ${MACSEC_NETDEV}{,2,3} ; do
73+
ip link del $dev
74+
check $?
75+
done
76+
77+
78+
#
79+
# test ethtool features when toggling offload
80+
#
81+
82+
ip link add link $NSIM_NETDEV $MACSEC_NETDEV type macsec offload mac
83+
TMP_FEATS_ON_1="$(ethtool -k $MACSEC_NETDEV)"
84+
85+
ip link set $MACSEC_NETDEV type macsec offload off
86+
TMP_FEATS_OFF_1="$(ethtool -k $MACSEC_NETDEV)"
87+
88+
ip link set $MACSEC_NETDEV type macsec offload mac
89+
TMP_FEATS_ON_2="$(ethtool -k $MACSEC_NETDEV)"
90+
91+
[ "$TMP_FEATS_ON_1" = "$TMP_FEATS_ON_2" ]
92+
check $?
93+
94+
ip link del $MACSEC_NETDEV
95+
96+
ip link add link $NSIM_NETDEV $MACSEC_NETDEV type macsec
97+
check $?
98+
99+
TMP_FEATS_OFF_2="$(ethtool -k $MACSEC_NETDEV)"
100+
[ "$TMP_FEATS_OFF_1" = "$TMP_FEATS_OFF_2" ]
101+
check $?
102+
103+
ip link set $MACSEC_NETDEV type macsec offload mac
104+
check $?
105+
106+
TMP_FEATS_ON_3="$(ethtool -k $MACSEC_NETDEV)"
107+
[ "$TMP_FEATS_ON_1" = "$TMP_FEATS_ON_3" ]
108+
check $?
109+
110+
111+
if [ $num_errors -eq 0 ]; then
112+
echo "PASSED all $((num_passes)) checks"
113+
exit 0
114+
else
115+
echo "FAILED $num_errors/$((num_errors+num_passes)) checks"
116+
exit 1
117+
fi

0 commit comments

Comments
 (0)