1*99e4c35eSHangbin Liu#!/bin/bash 2*99e4c35eSHangbin Liu# SPDX-License-Identifier: GPL-2.0 3*99e4c35eSHangbin Liu 4*99e4c35eSHangbin Liu# IPsec over bonding offload test: 5*99e4c35eSHangbin Liu# 6*99e4c35eSHangbin Liu# +----------------+ 7*99e4c35eSHangbin Liu# | bond0 | 8*99e4c35eSHangbin Liu# | | | 9*99e4c35eSHangbin Liu# | eth0 eth1 | 10*99e4c35eSHangbin Liu# +---+-------+----+ 11*99e4c35eSHangbin Liu# 12*99e4c35eSHangbin Liu# We use netdevsim instead of physical interfaces 13*99e4c35eSHangbin Liu#------------------------------------------------------------------- 14*99e4c35eSHangbin Liu# Example commands 15*99e4c35eSHangbin Liu# ip x s add proto esp src 192.0.2.1 dst 192.0.2.2 \ 16*99e4c35eSHangbin Liu# spi 0x07 mode transport reqid 0x07 replay-window 32 \ 17*99e4c35eSHangbin Liu# aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \ 18*99e4c35eSHangbin Liu# sel src 192.0.2.1/24 dst 192.0.2.2/24 19*99e4c35eSHangbin Liu# offload dev bond0 dir out 20*99e4c35eSHangbin Liu# ip x p add dir out src 192.0.2.1/24 dst 192.0.2.2/24 \ 21*99e4c35eSHangbin Liu# tmpl proto esp src 192.0.2.1 dst 192.0.2.2 \ 22*99e4c35eSHangbin Liu# spi 0x07 mode transport reqid 0x07 23*99e4c35eSHangbin Liu# 24*99e4c35eSHangbin Liu#------------------------------------------------------------------- 25*99e4c35eSHangbin Liu 26*99e4c35eSHangbin Liulib_dir=$(dirname "$0") 27*99e4c35eSHangbin Liu# shellcheck disable=SC1091 28*99e4c35eSHangbin Liusource "$lib_dir"/../../../net/lib.sh 29*99e4c35eSHangbin Liusrcip=192.0.2.1 30*99e4c35eSHangbin Liudstip=192.0.2.2 31*99e4c35eSHangbin Liuipsec0=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/ipsec 32*99e4c35eSHangbin Liuipsec1=/sys/kernel/debug/netdevsim/netdevsim0/ports/1/ipsec 33*99e4c35eSHangbin Liuactive_slave="" 34*99e4c35eSHangbin Liu 35*99e4c35eSHangbin Liu# shellcheck disable=SC2317 36*99e4c35eSHangbin Liuactive_slave_changed() 37*99e4c35eSHangbin Liu{ 38*99e4c35eSHangbin Liu local old_active_slave=$1 39*99e4c35eSHangbin Liu local new_active_slave 40*99e4c35eSHangbin Liu 41*99e4c35eSHangbin Liu # shellcheck disable=SC2154 42*99e4c35eSHangbin Liu new_active_slave=$(ip -n "${ns}" -d -j link show bond0 | \ 43*99e4c35eSHangbin Liu jq -r ".[].linkinfo.info_data.active_slave") 44*99e4c35eSHangbin Liu [ "$new_active_slave" != "$old_active_slave" ] && [ "$new_active_slave" != "null" ] 45*99e4c35eSHangbin Liu} 46*99e4c35eSHangbin Liu 47*99e4c35eSHangbin Liutest_offload() 48*99e4c35eSHangbin Liu{ 49*99e4c35eSHangbin Liu # use ping to exercise the Tx path 50*99e4c35eSHangbin Liu ip netns exec "$ns" ping -I bond0 -c 3 -W 1 -i 0 "$dstip" >/dev/null 51*99e4c35eSHangbin Liu 52*99e4c35eSHangbin Liu active_slave=$(ip -n "${ns}" -d -j link show bond0 | \ 53*99e4c35eSHangbin Liu jq -r ".[].linkinfo.info_data.active_slave") 54*99e4c35eSHangbin Liu 55*99e4c35eSHangbin Liu if [ "$active_slave" = "$nic0" ]; then 56*99e4c35eSHangbin Liu sysfs=$ipsec0 57*99e4c35eSHangbin Liu elif [ "$active_slave" = "$nic1" ]; then 58*99e4c35eSHangbin Liu sysfs=$ipsec1 59*99e4c35eSHangbin Liu else 60*99e4c35eSHangbin Liu check_err 1 "bond_ipsec_offload invalid active_slave $active_slave" 61*99e4c35eSHangbin Liu fi 62*99e4c35eSHangbin Liu 63*99e4c35eSHangbin Liu # The tx/rx order in sysfs may changed after failover 64*99e4c35eSHangbin Liu grep -q "SA count=2 tx=3" "$sysfs" && grep -q "tx ipaddr=$dstip" "$sysfs" 65*99e4c35eSHangbin Liu check_err $? "incorrect tx count with link ${active_slave}" 66*99e4c35eSHangbin Liu 67*99e4c35eSHangbin Liu log_test bond_ipsec_offload "active_slave ${active_slave}" 68*99e4c35eSHangbin Liu} 69*99e4c35eSHangbin Liu 70*99e4c35eSHangbin Liusetup_env() 71*99e4c35eSHangbin Liu{ 72*99e4c35eSHangbin Liu if ! mount | grep -q debugfs; then 73*99e4c35eSHangbin Liu mount -t debugfs none /sys/kernel/debug/ &> /dev/null 74*99e4c35eSHangbin Liu defer umount /sys/kernel/debug/ 75*99e4c35eSHangbin Liu 76*99e4c35eSHangbin Liu fi 77*99e4c35eSHangbin Liu 78*99e4c35eSHangbin Liu # setup netdevsim since dummy/veth dev doesn't have offload support 79*99e4c35eSHangbin Liu if [ ! -w /sys/bus/netdevsim/new_device ] ; then 80*99e4c35eSHangbin Liu if ! modprobe -q netdevsim; then 81*99e4c35eSHangbin Liu echo "SKIP: can't load netdevsim for ipsec offload" 82*99e4c35eSHangbin Liu # shellcheck disable=SC2154 83*99e4c35eSHangbin Liu exit "$ksft_skip" 84*99e4c35eSHangbin Liu fi 85*99e4c35eSHangbin Liu defer modprobe -r netdevsim 86*99e4c35eSHangbin Liu fi 87*99e4c35eSHangbin Liu 88*99e4c35eSHangbin Liu setup_ns ns 89*99e4c35eSHangbin Liu defer cleanup_ns "$ns" 90*99e4c35eSHangbin Liu} 91*99e4c35eSHangbin Liu 92*99e4c35eSHangbin Liusetup_bond() 93*99e4c35eSHangbin Liu{ 94*99e4c35eSHangbin Liu ip -n "$ns" link add bond0 type bond mode active-backup miimon 100 95*99e4c35eSHangbin Liu ip -n "$ns" addr add "$srcip/24" dev bond0 96*99e4c35eSHangbin Liu ip -n "$ns" link set bond0 up 97*99e4c35eSHangbin Liu 98*99e4c35eSHangbin Liu echo "0 2" | ip netns exec "$ns" tee /sys/bus/netdevsim/new_device >/dev/null 99*99e4c35eSHangbin Liu nic0=$(ip netns exec "$ns" ls /sys/bus/netdevsim/devices/netdevsim0/net | head -n 1) 100*99e4c35eSHangbin Liu nic1=$(ip netns exec "$ns" ls /sys/bus/netdevsim/devices/netdevsim0/net | tail -n 1) 101*99e4c35eSHangbin Liu ip -n "$ns" link set "$nic0" master bond0 102*99e4c35eSHangbin Liu ip -n "$ns" link set "$nic1" master bond0 103*99e4c35eSHangbin Liu 104*99e4c35eSHangbin Liu # we didn't create a peer, make sure we can Tx by adding a permanent 105*99e4c35eSHangbin Liu # neighbour this need to be added after enslave 106*99e4c35eSHangbin Liu ip -n "$ns" neigh add "$dstip" dev bond0 lladdr 00:11:22:33:44:55 107*99e4c35eSHangbin Liu 108*99e4c35eSHangbin Liu # create offloaded SAs, both in and out 109*99e4c35eSHangbin Liu ip -n "$ns" x p add dir out src "$srcip/24" dst "$dstip/24" \ 110*99e4c35eSHangbin Liu tmpl proto esp src "$srcip" dst "$dstip" spi 9 \ 111*99e4c35eSHangbin Liu mode transport reqid 42 112*99e4c35eSHangbin Liu 113*99e4c35eSHangbin Liu ip -n "$ns" x p add dir in src "$dstip/24" dst "$srcip/24" \ 114*99e4c35eSHangbin Liu tmpl proto esp src "$dstip" dst "$srcip" spi 9 \ 115*99e4c35eSHangbin Liu mode transport reqid 42 116*99e4c35eSHangbin Liu 117*99e4c35eSHangbin Liu ip -n "$ns" x s add proto esp src "$srcip" dst "$dstip" spi 9 \ 118*99e4c35eSHangbin Liu mode transport reqid 42 aead "rfc4106(gcm(aes))" \ 119*99e4c35eSHangbin Liu 0x3132333435363738393031323334353664636261 128 \ 120*99e4c35eSHangbin Liu sel src "$srcip/24" dst "$dstip/24" \ 121*99e4c35eSHangbin Liu offload dev bond0 dir out 122*99e4c35eSHangbin Liu 123*99e4c35eSHangbin Liu ip -n "$ns" x s add proto esp src "$dstip" dst "$srcip" spi 9 \ 124*99e4c35eSHangbin Liu mode transport reqid 42 aead "rfc4106(gcm(aes))" \ 125*99e4c35eSHangbin Liu 0x3132333435363738393031323334353664636261 128 \ 126*99e4c35eSHangbin Liu sel src "$dstip/24" dst "$srcip/24" \ 127*99e4c35eSHangbin Liu offload dev bond0 dir in 128*99e4c35eSHangbin Liu 129*99e4c35eSHangbin Liu # does offload show up in ip output 130*99e4c35eSHangbin Liu lines=$(ip -n "$ns" x s list | grep -c "crypto offload parameters: dev bond0 dir") 131*99e4c35eSHangbin Liu if [ "$lines" -ne 2 ] ; then 132*99e4c35eSHangbin Liu check_err 1 "bond_ipsec_offload SA offload missing from list output" 133*99e4c35eSHangbin Liu fi 134*99e4c35eSHangbin Liu} 135*99e4c35eSHangbin Liu 136*99e4c35eSHangbin Liutrap defer_scopes_cleanup EXIT 137*99e4c35eSHangbin Liusetup_env 138*99e4c35eSHangbin Liusetup_bond 139*99e4c35eSHangbin Liu 140*99e4c35eSHangbin Liu# start Offload testing 141*99e4c35eSHangbin Liutest_offload 142*99e4c35eSHangbin Liu 143*99e4c35eSHangbin Liu# do failover and re-test 144*99e4c35eSHangbin Liuip -n "$ns" link set "$active_slave" down 145*99e4c35eSHangbin Liuslowwait 5 active_slave_changed "$active_slave" 146*99e4c35eSHangbin Liutest_offload 147*99e4c35eSHangbin Liu 148*99e4c35eSHangbin Liu# make sure offload get removed from driver 149*99e4c35eSHangbin Liuip -n "$ns" x s flush 150*99e4c35eSHangbin Liuip -n "$ns" x p flush 151*99e4c35eSHangbin Liuline0=$(grep -c "SA count=0" "$ipsec0") 152*99e4c35eSHangbin Liuline1=$(grep -c "SA count=0" "$ipsec1") 153*99e4c35eSHangbin Liu[ "$line0" -ne 1 ] || [ "$line1" -ne 1 ] 154*99e4c35eSHangbin Liucheck_fail $? "bond_ipsec_offload SA not removed from driver" 155*99e4c35eSHangbin Liu 156*99e4c35eSHangbin Liuexit "$EXIT_STATUS" 157