cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hw_stats_l3.sh (7175B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3
      4# +--------------------+                     +----------------------+
      5# | H1                 |                     |                   H2 |
      6# |                    |                     |                      |
      7# |          $h1.200 + |                     | + $h2.200            |
      8# |     192.0.2.1/28 | |                     | | 192.0.2.18/28      |
      9# | 2001:db8:1::1/64 | |                     | | 2001:db8:2::1/64   |
     10# |                  | |                     | |                    |
     11# |              $h1 + |                     | + $h2                |
     12# |                  | |                     | |                    |
     13# +------------------|-+                     +-|--------------------+
     14#                    |                         |
     15# +------------------|-------------------------|--------------------+
     16# | SW               |                         |                    |
     17# |                  |                         |                    |
     18# |             $rp1 +                         + $rp2               |
     19# |                  |                         |                    |
     20# |         $rp1.200 +                         + $rp2.200           |
     21# |     192.0.2.2/28                             192.0.2.17/28      |
     22# | 2001:db8:1::2/64                             2001:db8:2::2/64   |
     23# |                                                                 |
     24# +-----------------------------------------------------------------+
     25
     26ALL_TESTS="
     27	ping_ipv4
     28	ping_ipv6
     29	test_stats_rx_ipv4
     30	test_stats_tx_ipv4
     31	test_stats_rx_ipv6
     32	test_stats_tx_ipv6
     33	respin_enablement
     34	test_stats_rx_ipv4
     35	test_stats_tx_ipv4
     36	test_stats_rx_ipv6
     37	test_stats_tx_ipv6
     38	reapply_config
     39	ping_ipv4
     40	ping_ipv6
     41	test_stats_rx_ipv4
     42	test_stats_tx_ipv4
     43	test_stats_rx_ipv6
     44	test_stats_tx_ipv6
     45	test_stats_report_rx
     46	test_stats_report_tx
     47	test_destroy_enabled
     48	test_double_enable
     49"
     50NUM_NETIFS=4
     51source lib.sh
     52
     53h1_create()
     54{
     55	simple_if_init $h1
     56	vlan_create $h1 200 v$h1 192.0.2.1/28 2001:db8:1::1/64
     57	ip route add 192.0.2.16/28 vrf v$h1 nexthop via 192.0.2.2
     58	ip -6 route add 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
     59}
     60
     61h1_destroy()
     62{
     63	ip -6 route del 2001:db8:2::/64 vrf v$h1 nexthop via 2001:db8:1::2
     64	ip route del 192.0.2.16/28 vrf v$h1 nexthop via 192.0.2.2
     65	vlan_destroy $h1 200
     66	simple_if_fini $h1
     67}
     68
     69h2_create()
     70{
     71	simple_if_init $h2
     72	vlan_create $h2 200 v$h2 192.0.2.18/28 2001:db8:2::1/64
     73	ip route add 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.17
     74	ip -6 route add 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::2
     75}
     76
     77h2_destroy()
     78{
     79	ip -6 route del 2001:db8:1::/64 vrf v$h2 nexthop via 2001:db8:2::2
     80	ip route del 192.0.2.0/28 vrf v$h2 nexthop via 192.0.2.17
     81	vlan_destroy $h2 200
     82	simple_if_fini $h2
     83}
     84
     85router_rp1_200_create()
     86{
     87	ip link add name $rp1.200 up \
     88		link $rp1 addrgenmode eui64 type vlan id 200
     89	ip address add dev $rp1.200 192.0.2.2/28
     90	ip address add dev $rp1.200 2001:db8:1::2/64
     91	ip stats set dev $rp1.200 l3_stats on
     92}
     93
     94router_rp1_200_destroy()
     95{
     96	ip stats set dev $rp1.200 l3_stats off
     97	ip address del dev $rp1.200 2001:db8:1::2/64
     98	ip address del dev $rp1.200 192.0.2.2/28
     99	ip link del dev $rp1.200
    100}
    101
    102router_create()
    103{
    104	ip link set dev $rp1 up
    105	router_rp1_200_create
    106
    107	ip link set dev $rp2 up
    108	vlan_create $rp2 200 "" 192.0.2.17/28 2001:db8:2::2/64
    109}
    110
    111router_destroy()
    112{
    113	vlan_destroy $rp2 200
    114	ip link set dev $rp2 down
    115
    116	router_rp1_200_destroy
    117	ip link set dev $rp1 down
    118}
    119
    120setup_prepare()
    121{
    122	h1=${NETIFS[p1]}
    123	rp1=${NETIFS[p2]}
    124
    125	rp2=${NETIFS[p3]}
    126	h2=${NETIFS[p4]}
    127
    128	rp1mac=$(mac_get $rp1)
    129	rp2mac=$(mac_get $rp2)
    130
    131	vrf_prepare
    132
    133	h1_create
    134	h2_create
    135
    136	router_create
    137
    138	forwarding_enable
    139}
    140
    141cleanup()
    142{
    143	pre_cleanup
    144
    145	forwarding_restore
    146
    147	router_destroy
    148
    149	h2_destroy
    150	h1_destroy
    151
    152	vrf_cleanup
    153}
    154
    155ping_ipv4()
    156{
    157	ping_test $h1.200 192.0.2.18 " IPv4"
    158}
    159
    160ping_ipv6()
    161{
    162	ping_test $h1.200 2001:db8:2::1 " IPv6"
    163}
    164
    165send_packets_rx_ipv4()
    166{
    167	# Send 21 packets instead of 20, because the first one might trap and go
    168	# through the SW datapath, which might not bump the HW counter.
    169	$MZ $h1.200 -c 21 -d 20msec -p 100 \
    170	    -a own -b $rp1mac -A 192.0.2.1 -B 192.0.2.18 \
    171	    -q -t udp sp=54321,dp=12345
    172}
    173
    174send_packets_rx_ipv6()
    175{
    176	$MZ $h1.200 -6 -c 21 -d 20msec -p 100 \
    177	    -a own -b $rp1mac -A 2001:db8:1::1 -B 2001:db8:2::1 \
    178	    -q -t udp sp=54321,dp=12345
    179}
    180
    181send_packets_tx_ipv4()
    182{
    183	$MZ $h2.200 -c 21 -d 20msec -p 100 \
    184	    -a own -b $rp2mac -A 192.0.2.18 -B 192.0.2.1 \
    185	    -q -t udp sp=54321,dp=12345
    186}
    187
    188send_packets_tx_ipv6()
    189{
    190	$MZ $h2.200 -6 -c 21 -d 20msec -p 100 \
    191	    -a own -b $rp2mac -A 2001:db8:2::1 -B 2001:db8:1::1 \
    192	    -q -t udp sp=54321,dp=12345
    193}
    194
    195___test_stats()
    196{
    197	local dir=$1; shift
    198	local prot=$1; shift
    199
    200	local a
    201	local b
    202
    203	a=$(hw_stats_get l3_stats $rp1.200 ${dir} packets)
    204	send_packets_${dir}_${prot}
    205	"$@"
    206	b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
    207		       hw_stats_get l3_stats $rp1.200 ${dir} packets)
    208	check_err $? "Traffic not reflected in the counter: $a -> $b"
    209}
    210
    211__test_stats()
    212{
    213	local dir=$1; shift
    214	local prot=$1; shift
    215
    216	RET=0
    217	___test_stats "$dir" "$prot"
    218	log_test "Test $dir packets: $prot"
    219}
    220
    221test_stats_rx_ipv4()
    222{
    223	__test_stats rx ipv4
    224}
    225
    226test_stats_tx_ipv4()
    227{
    228	__test_stats tx ipv4
    229}
    230
    231test_stats_rx_ipv6()
    232{
    233	__test_stats rx ipv6
    234}
    235
    236test_stats_tx_ipv6()
    237{
    238	__test_stats tx ipv6
    239}
    240
    241# Make sure everything works well even after stats have been disabled and
    242# reenabled on the same device without touching the L3 configuration.
    243respin_enablement()
    244{
    245	log_info "Turning stats off and on again"
    246	ip stats set dev $rp1.200 l3_stats off
    247	ip stats set dev $rp1.200 l3_stats on
    248}
    249
    250# For the initial run, l3_stats is enabled on a completely set up netdevice. Now
    251# do it the other way around: enabling the L3 stats on an L2 netdevice, and only
    252# then apply the L3 configuration.
    253reapply_config()
    254{
    255	log_info "Reapplying configuration"
    256
    257	router_rp1_200_destroy
    258
    259	ip link add name $rp1.200 link $rp1 addrgenmode none type vlan id 200
    260	ip stats set dev $rp1.200 l3_stats on
    261	ip link set dev $rp1.200 up addrgenmode eui64
    262	ip address add dev $rp1.200 192.0.2.2/28
    263	ip address add dev $rp1.200 2001:db8:1::2/64
    264}
    265
    266__test_stats_report()
    267{
    268	local dir=$1; shift
    269	local prot=$1; shift
    270
    271	local a
    272	local b
    273
    274	RET=0
    275
    276	a=$(hw_stats_get l3_stats $rp1.200 ${dir} packets)
    277	send_packets_${dir}_${prot}
    278	ip address flush dev $rp1.200
    279	b=$(busywait "$TC_HIT_TIMEOUT" until_counter_is ">= $a + 20" \
    280		       hw_stats_get l3_stats $rp1.200 ${dir} packets)
    281	check_err $? "Traffic not reflected in the counter: $a -> $b"
    282	log_test "Test ${dir} packets: stats pushed on loss of L3"
    283
    284	ip stats set dev $rp1.200 l3_stats off
    285	ip link del dev $rp1.200
    286	router_rp1_200_create
    287}
    288
    289test_stats_report_rx()
    290{
    291	__test_stats_report rx ipv4
    292}
    293
    294test_stats_report_tx()
    295{
    296	__test_stats_report tx ipv4
    297}
    298
    299test_destroy_enabled()
    300{
    301	RET=0
    302
    303	ip link del dev $rp1.200
    304	router_rp1_200_create
    305
    306	log_test "Destroy l3_stats-enabled netdev"
    307}
    308
    309test_double_enable()
    310{
    311	RET=0
    312	___test_stats rx ipv4 \
    313		ip stats set dev $rp1.200 l3_stats on
    314	log_test "Test stat retention across a spurious enablement"
    315}
    316
    317trap cleanup EXIT
    318
    319setup_prepare
    320setup_wait
    321
    322tests_run
    323
    324exit $EXIT_STATUS