| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| # IPsec over bonding offload test: |
| # |
| # +----------------+ |
| # | bond0 | |
| # | | | |
| # | eth0 eth1 | |
| # +---+-------+----+ |
| # |
| # We use netdevsim instead of physical interfaces |
| #------------------------------------------------------------------- |
| # Example commands |
| # ip x s add proto esp src 192.0.2.1 dst 192.0.2.2 \ |
| # spi 0x07 mode transport reqid 0x07 replay-window 32 \ |
| # aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \ |
| # sel src 192.0.2.1/24 dst 192.0.2.2/24 |
| # offload dev bond0 dir out |
| # ip x p add dir out src 192.0.2.1/24 dst 192.0.2.2/24 \ |
| # tmpl proto esp src 192.0.2.1 dst 192.0.2.2 \ |
| # spi 0x07 mode transport reqid 0x07 |
| # |
| #------------------------------------------------------------------- |
| |
| lib_dir=$(dirname "$0") |
| # shellcheck disable=SC1091 |
| source "$lib_dir"/../../../net/lib.sh |
| srcip=192.0.2.1 |
| dstip=192.0.2.2 |
| ipsec0=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/ipsec |
| ipsec1=/sys/kernel/debug/netdevsim/netdevsim0/ports/1/ipsec |
| active_slave="" |
| |
| # shellcheck disable=SC2317 |
| active_slave_changed() |
| { |
| local old_active_slave=$1 |
| local new_active_slave |
| |
| # shellcheck disable=SC2154 |
| new_active_slave=$(ip -n "${ns}" -d -j link show bond0 | \ |
| jq -r ".[].linkinfo.info_data.active_slave") |
| [ "$new_active_slave" != "$old_active_slave" ] && [ "$new_active_slave" != "null" ] |
| } |
| |
| test_offload() |
| { |
| # use ping to exercise the Tx path |
| ip netns exec "$ns" ping -I bond0 -c 3 -W 1 -i 0 "$dstip" >/dev/null |
| |
| active_slave=$(ip -n "${ns}" -d -j link show bond0 | \ |
| jq -r ".[].linkinfo.info_data.active_slave") |
| |
| if [ "$active_slave" = "$nic0" ]; then |
| sysfs=$ipsec0 |
| elif [ "$active_slave" = "$nic1" ]; then |
| sysfs=$ipsec1 |
| else |
| check_err 1 "bond_ipsec_offload invalid active_slave $active_slave" |
| fi |
| |
| # The tx/rx order in sysfs may changed after failover |
| grep -q "SA count=2 tx=3" "$sysfs" && grep -q "tx ipaddr=$dstip" "$sysfs" |
| check_err $? "incorrect tx count with link ${active_slave}" |
| |
| log_test bond_ipsec_offload "active_slave ${active_slave}" |
| } |
| |
| setup_env() |
| { |
| if ! mount | grep -q debugfs; then |
| mount -t debugfs none /sys/kernel/debug/ &> /dev/null |
| defer umount /sys/kernel/debug/ |
| |
| fi |
| |
| # setup netdevsim since dummy/veth dev doesn't have offload support |
| if [ ! -w /sys/bus/netdevsim/new_device ] ; then |
| if ! modprobe -q netdevsim; then |
| echo "SKIP: can't load netdevsim for ipsec offload" |
| # shellcheck disable=SC2154 |
| exit "$ksft_skip" |
| fi |
| defer modprobe -r netdevsim |
| fi |
| |
| setup_ns ns |
| defer cleanup_ns "$ns" |
| } |
| |
| setup_bond() |
| { |
| ip -n "$ns" link add bond0 type bond mode active-backup miimon 100 |
| ip -n "$ns" addr add "$srcip/24" dev bond0 |
| ip -n "$ns" link set bond0 up |
| |
| echo "0 2" | ip netns exec "$ns" tee /sys/bus/netdevsim/new_device >/dev/null |
| nic0=$(ip netns exec "$ns" ls /sys/bus/netdevsim/devices/netdevsim0/net | head -n 1) |
| nic1=$(ip netns exec "$ns" ls /sys/bus/netdevsim/devices/netdevsim0/net | tail -n 1) |
| ip -n "$ns" link set "$nic0" master bond0 |
| ip -n "$ns" link set "$nic1" master bond0 |
| |
| # we didn't create a peer, make sure we can Tx by adding a permanent |
| # neighbour this need to be added after enslave |
| ip -n "$ns" neigh add "$dstip" dev bond0 lladdr 00:11:22:33:44:55 |
| |
| # create offloaded SAs, both in and out |
| ip -n "$ns" x p add dir out src "$srcip/24" dst "$dstip/24" \ |
| tmpl proto esp src "$srcip" dst "$dstip" spi 9 \ |
| mode transport reqid 42 |
| |
| ip -n "$ns" x p add dir in src "$dstip/24" dst "$srcip/24" \ |
| tmpl proto esp src "$dstip" dst "$srcip" spi 9 \ |
| mode transport reqid 42 |
| |
| ip -n "$ns" x s add proto esp src "$srcip" dst "$dstip" spi 9 \ |
| mode transport reqid 42 aead "rfc4106(gcm(aes))" \ |
| 0x3132333435363738393031323334353664636261 128 \ |
| sel src "$srcip/24" dst "$dstip/24" \ |
| offload dev bond0 dir out |
| |
| ip -n "$ns" x s add proto esp src "$dstip" dst "$srcip" spi 9 \ |
| mode transport reqid 42 aead "rfc4106(gcm(aes))" \ |
| 0x3132333435363738393031323334353664636261 128 \ |
| sel src "$dstip/24" dst "$srcip/24" \ |
| offload dev bond0 dir in |
| |
| # does offload show up in ip output |
| lines=$(ip -n "$ns" x s list | grep -c "crypto offload parameters: dev bond0 dir") |
| if [ "$lines" -ne 2 ] ; then |
| check_err 1 "bond_ipsec_offload SA offload missing from list output" |
| fi |
| } |
| |
| trap defer_scopes_cleanup EXIT |
| setup_env |
| setup_bond |
| |
| # start Offload testing |
| test_offload |
| |
| # do failover and re-test |
| ip -n "$ns" link set "$active_slave" down |
| slowwait 5 active_slave_changed "$active_slave" |
| test_offload |
| |
| # make sure offload get removed from driver |
| ip -n "$ns" x s flush |
| ip -n "$ns" x p flush |
| line0=$(grep -c "SA count=0" "$ipsec0") |
| line1=$(grep -c "SA count=0" "$ipsec1") |
| [ "$line0" -ne 1 ] || [ "$line1" -ne 1 ] |
| check_fail $? "bond_ipsec_offload SA not removed from driver" |
| |
| exit "$EXIT_STATUS" |