@@ -611,6 +611,119 @@ kci_test_ipsec()
611611 echo " PASS: ipsec"
612612}
613613
614+ # -------------------------------------------------------------------
615+ # Example commands
616+ # ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \
617+ # spi 0x07 mode transport reqid 0x07 replay-window 32 \
618+ # aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \
619+ # sel src 14.0.0.52/24 dst 14.0.0.70/24
620+ # offload dev sim1 dir out
621+ # ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \
622+ # tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \
623+ # spi 0x07 mode transport reqid 0x07
624+ #
625+ # -------------------------------------------------------------------
626+ kci_test_ipsec_offload ()
627+ {
628+ ret=0
629+ algo=" aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"
630+ srcip=192.168.123.3
631+ dstip=192.168.123.4
632+ dev=simx1
633+ sysfsd=/sys/kernel/debug/netdevsim/$dev
634+ sysfsf=$sysfsd /ipsec
635+
636+ # setup netdevsim since dummydev doesn't have offload support
637+ modprobe netdevsim
638+ check_err $?
639+ if [ $ret -ne 0 ]; then
640+ echo " FAIL: ipsec_offload can't load netdevsim"
641+ return 1
642+ fi
643+
644+ ip link add $dev type netdevsim
645+ ip addr add $srcip dev $dev
646+ ip link set $dev up
647+ if [ ! -d $sysfsd ] ; then
648+ echo " FAIL: ipsec_offload can't create device $dev "
649+ return 1
650+ fi
651+ if [ ! -f $sysfsf ] ; then
652+ echo " FAIL: ipsec_offload netdevsim doesn't support IPsec offload"
653+ return 1
654+ fi
655+
656+ # flush to be sure there's nothing configured
657+ ip x s flush ; ip x p flush
658+
659+ # create offloaded SAs, both in and out
660+ ip x p add dir out src $srcip /24 dst $dstip /24 \
661+ tmpl proto esp src $srcip dst $dstip spi 9 \
662+ mode transport reqid 42
663+ check_err $?
664+ ip x p add dir out src $dstip /24 dst $srcip /24 \
665+ tmpl proto esp src $dstip dst $srcip spi 9 \
666+ mode transport reqid 42
667+ check_err $?
668+
669+ ip x s add proto esp src $srcip dst $dstip spi 9 \
670+ mode transport reqid 42 $algo sel src $srcip /24 dst $dstip /24 \
671+ offload dev $dev dir out
672+ check_err $?
673+ ip x s add proto esp src $dstip dst $srcip spi 9 \
674+ mode transport reqid 42 $algo sel src $dstip /24 dst $srcip /24 \
675+ offload dev $dev dir in
676+ check_err $?
677+ if [ $ret -ne 0 ]; then
678+ echo " FAIL: ipsec_offload can't create SA"
679+ return 1
680+ fi
681+
682+ # does offload show up in ip output
683+ lines=` ip x s list | grep -c " crypto offload parameters: dev $dev dir" `
684+ if [ $lines -ne 2 ] ; then
685+ echo " FAIL: ipsec_offload SA offload missing from list output"
686+ check_err 1
687+ fi
688+
689+ # use ping to exercise the Tx path
690+ ping -I $dev -c 3 -W 1 -i 0 $dstip > /dev/null
691+
692+ # does driver have correct offload info
693+ diff $sysfsf - << EOF
694+ SA count=2 tx=3
695+ sa[0] tx ipaddr=0x00000000 00000000 00000000 00000000
696+ sa[0] spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1
697+ sa[0] key=0x34333231 38373635 32313039 36353433
698+ sa[1] rx ipaddr=0x00000000 00000000 00000000 037ba8c0
699+ sa[1] spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1
700+ sa[1] key=0x34333231 38373635 32313039 36353433
701+ EOF
702+ if [ $? -ne 0 ] ; then
703+ echo " FAIL: ipsec_offload incorrect driver data"
704+ check_err 1
705+ fi
706+
707+ # does offload get removed from driver
708+ ip x s flush
709+ ip x p flush
710+ lines=` grep -c " SA count=0" $sysfsf `
711+ if [ $lines -ne 1 ] ; then
712+ echo " FAIL: ipsec_offload SA not removed from driver"
713+ check_err 1
714+ fi
715+
716+ # clean up any leftovers
717+ ip link del $dev
718+ rmmod netdevsim
719+
720+ if [ $ret -ne 0 ]; then
721+ echo " FAIL: ipsec_offload"
722+ return 1
723+ fi
724+ echo " PASS: ipsec_offload"
725+ }
726+
614727kci_test_gretap ()
615728{
616729 testns=" testns"
@@ -865,6 +978,7 @@ kci_test_rtnl()
865978 kci_test_encap
866979 kci_test_macsec
867980 kci_test_ipsec
981+ kci_test_ipsec_offload
868982
869983 kci_del_dummy
870984}
0 commit comments