1415b7cefSSabrina Dubroca#!/bin/bash
2415b7cefSSabrina Dubroca# SPDX-License-Identifier: GPL-2.0-only
3415b7cefSSabrina Dubroca
4415b7cefSSabrina Dubrocasource ethtool-common.sh
5415b7cefSSabrina Dubroca
6415b7cefSSabrina DubrocaNSIM_NETDEV=$(make_netdev)
7415b7cefSSabrina DubrocaMACSEC_NETDEV=macsec_nsim
8415b7cefSSabrina Dubroca
9415b7cefSSabrina Dubrocaset -o pipefail
10415b7cefSSabrina Dubroca
11415b7cefSSabrina Dubrocaif ! ethtool -k $NSIM_NETDEV | grep -q 'macsec-hw-offload: on'; then
12415b7cefSSabrina Dubroca    echo "SKIP: netdevsim doesn't support MACsec offload"
13415b7cefSSabrina Dubroca    exit 4
14415b7cefSSabrina Dubrocafi
15415b7cefSSabrina Dubroca
16415b7cefSSabrina Dubrocaif ! ip link add link $NSIM_NETDEV $MACSEC_NETDEV type macsec offload mac 2>/dev/null; then
17415b7cefSSabrina Dubroca    echo "SKIP: couldn't create macsec device"
18415b7cefSSabrina Dubroca    exit 4
19415b7cefSSabrina Dubrocafi
20415b7cefSSabrina Dubrocaip link del $MACSEC_NETDEV
21415b7cefSSabrina Dubroca
22415b7cefSSabrina Dubroca#
23415b7cefSSabrina Dubroca# test macsec offload API
24415b7cefSSabrina Dubroca#
25415b7cefSSabrina Dubroca
26415b7cefSSabrina Dubrocaip link add link $NSIM_NETDEV "${MACSEC_NETDEV}" type macsec port 4 offload mac
27415b7cefSSabrina Dubrocacheck $?
28415b7cefSSabrina Dubroca
29415b7cefSSabrina Dubrocaip link add link $NSIM_NETDEV "${MACSEC_NETDEV}2" type macsec address "aa:bb:cc:dd:ee:ff" port 5 offload mac
30415b7cefSSabrina Dubrocacheck $?
31415b7cefSSabrina Dubroca
32415b7cefSSabrina Dubrocaip link add link $NSIM_NETDEV "${MACSEC_NETDEV}3" type macsec sci abbacdde01020304 offload mac
33415b7cefSSabrina Dubrocacheck $?
34415b7cefSSabrina Dubroca
35415b7cefSSabrina Dubrocaip link add link $NSIM_NETDEV "${MACSEC_NETDEV}4" type macsec port 8 offload mac 2> /dev/null
36415b7cefSSabrina Dubrocacheck $? '' '' 1
37415b7cefSSabrina Dubroca
38415b7cefSSabrina Dubrocaip macsec add "${MACSEC_NETDEV}" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012
39415b7cefSSabrina Dubrocacheck $?
40415b7cefSSabrina Dubroca
41415b7cefSSabrina Dubrocaip macsec add "${MACSEC_NETDEV}" rx port 1234 address "1c:ed:de:ad:be:ef"
42415b7cefSSabrina Dubrocacheck $?
43415b7cefSSabrina Dubroca
44415b7cefSSabrina Dubrocaip macsec add "${MACSEC_NETDEV}" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on \
45415b7cefSSabrina Dubroca    key 00 0123456789abcdef0123456789abcdef
46415b7cefSSabrina Dubrocacheck $?
47415b7cefSSabrina Dubroca
48415b7cefSSabrina Dubrocaip macsec add "${MACSEC_NETDEV}" rx port 1235 address "1c:ed:de:ad:be:ef" 2> /dev/null
49415b7cefSSabrina Dubrocacheck $? '' '' 1
50415b7cefSSabrina Dubroca
51*29084ea5SSabrina Dubroca# can't disable macsec offload when SAs are configured
52*29084ea5SSabrina Dubrocaip link set "${MACSEC_NETDEV}" type macsec offload off 2> /dev/null
53*29084ea5SSabrina Dubrocacheck $? '' '' 1
54*29084ea5SSabrina Dubroca
55*29084ea5SSabrina Dubrocaip macsec offload "${MACSEC_NETDEV}" off 2> /dev/null
56*29084ea5SSabrina Dubrocacheck $? '' '' 1
57*29084ea5SSabrina Dubroca
58*29084ea5SSabrina Dubroca# toggle macsec offload via rtnetlink
59*29084ea5SSabrina Dubrocaip link set "${MACSEC_NETDEV}2" type macsec offload off
60*29084ea5SSabrina Dubrocacheck $?
61*29084ea5SSabrina Dubroca
62*29084ea5SSabrina Dubrocaip link set "${MACSEC_NETDEV}2" type macsec offload mac
63*29084ea5SSabrina Dubrocacheck $?
64*29084ea5SSabrina Dubroca
65*29084ea5SSabrina Dubroca# toggle macsec offload via genetlink
66*29084ea5SSabrina Dubrocaip macsec offload "${MACSEC_NETDEV}2" off
67*29084ea5SSabrina Dubrocacheck $?
68*29084ea5SSabrina Dubroca
69*29084ea5SSabrina Dubrocaip macsec offload "${MACSEC_NETDEV}2" mac
70*29084ea5SSabrina Dubrocacheck $?
71*29084ea5SSabrina Dubroca
72415b7cefSSabrina Dubrocafor dev in ${MACSEC_NETDEV}{,2,3} ; do
73415b7cefSSabrina Dubroca    ip link del $dev
74415b7cefSSabrina Dubroca    check $?
75415b7cefSSabrina Dubrocadone
76415b7cefSSabrina Dubroca
77415b7cefSSabrina Dubroca
78415b7cefSSabrina Dubrocaif [ $num_errors -eq 0 ]; then
79415b7cefSSabrina Dubroca    echo "PASSED all $((num_passes)) checks"
80415b7cefSSabrina Dubroca    exit 0
81415b7cefSSabrina Dubrocaelse
82415b7cefSSabrina Dubroca    echo "FAILED $num_errors/$((num_errors+num_passes)) checks"
83415b7cefSSabrina Dubroca    exit 1
84415b7cefSSabrina Dubrocafi
85