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

rif_mac_profiles.sh (4758B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3
      4lib_dir=$(dirname $0)/../../../net/forwarding
      5
      6ALL_TESTS="
      7	mac_profile_test
      8"
      9NUM_NETIFS=4
     10source $lib_dir/lib.sh
     11source $lib_dir/tc_common.sh
     12source $lib_dir/devlink_lib.sh
     13
     14h1_create()
     15{
     16	simple_if_init $h1 192.0.2.1/24
     17	ip route add 198.51.100.0/24 vrf v$h1 nexthop via 192.0.2.2
     18
     19	tc qdisc add dev $h1 ingress
     20}
     21
     22h1_destroy()
     23{
     24	tc qdisc del dev $h1 ingress
     25
     26	ip route del 198.51.100.0/24 vrf v$h1
     27	simple_if_fini $h1 192.0.2.1/24
     28}
     29
     30h2_create()
     31{
     32	simple_if_init $h2 198.51.100.1/24
     33	ip route add 192.0.2.0/24 vrf v$h2 nexthop via 198.51.100.2
     34
     35	tc qdisc add dev $h2 ingress
     36}
     37
     38h2_destroy()
     39{
     40	tc qdisc del dev $h2 ingress
     41
     42	ip route del 192.0.2.0/24 vrf v$h2
     43	simple_if_fini $h2 198.51.100.1/24
     44}
     45
     46router_create()
     47{
     48	ip link set dev $rp1 up
     49	ip link set dev $rp2 up
     50
     51	tc qdisc add dev $rp1 clsact
     52	tc qdisc add dev $rp2 clsact
     53	ip address add 192.0.2.2/24 dev $rp1
     54	ip address add 198.51.100.2/24 dev $rp2
     55}
     56
     57router_destroy()
     58{
     59	ip address del 198.51.100.2/24 dev $rp2
     60	ip address del 192.0.2.2/24 dev $rp1
     61	tc qdisc del dev $rp2 clsact
     62	tc qdisc del dev $rp1 clsact
     63
     64	ip link set dev $rp2 down
     65	ip link set dev $rp1 down
     66}
     67
     68setup_prepare()
     69{
     70	h1=${NETIFS[p1]}
     71	rp1=${NETIFS[p2]}
     72
     73	rp2=${NETIFS[p3]}
     74	h2=${NETIFS[p4]}
     75
     76	vrf_prepare
     77
     78	h1_create
     79	h2_create
     80
     81	router_create
     82
     83	forwarding_enable
     84}
     85
     86cleanup()
     87{
     88	pre_cleanup
     89
     90	forwarding_restore
     91
     92	router_destroy
     93
     94	h2_destroy
     95	h1_destroy
     96
     97	vrf_cleanup
     98}
     99
    100h1_to_h2()
    101{
    102	local test_name=$@; shift
    103	local smac=$(mac_get $rp2)
    104
    105	RET=0
    106
    107	# Replace neighbour to avoid first packet being forwarded in software
    108	ip neigh replace dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
    109
    110	# Add a filter to ensure that packets are forwarded in hardware. Cannot
    111	# match on source MAC because it is not set in eACL after routing
    112	tc filter add dev $rp2 egress proto ip pref 1 handle 101 \
    113		flower skip_sw ip_proto udp src_port 12345 dst_port 54321 \
    114		action pass
    115
    116	# Add a filter to ensure that packets are received with the correct
    117	# source MAC
    118	tc filter add dev $h2 ingress proto ip pref 1 handle 101 \
    119		flower skip_sw src_mac $smac ip_proto udp src_port 12345 \
    120		dst_port 54321 action pass
    121
    122	$MZ $h1 -a own -b $(mac_get $rp1) -t udp "sp=12345,dp=54321" \
    123		-A 192.0.2.1 -B 198.51.100.1 -c 10 -p 100 -d 1msec -q
    124
    125	tc_check_packets "dev $rp2 egress" 101 10
    126	check_err $? "packets not forwarded in hardware"
    127
    128	tc_check_packets "dev $h2 ingress" 101 10
    129	check_err $? "packets not forwarded with correct source mac"
    130
    131	log_test "h1->h2: $test_name"
    132
    133	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    134	tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
    135	ip neigh del dev $rp2 198.51.100.1 lladdr $(mac_get $h2)
    136}
    137
    138h2_to_h1()
    139{
    140	local test_name=$@; shift
    141	local rp1_mac=$(mac_get $rp1)
    142
    143	RET=0
    144
    145	ip neigh replace dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
    146
    147	tc filter add dev $rp1 egress proto ip pref 1 handle 101 \
    148		flower skip_sw ip_proto udp src_port 54321 dst_port 12345 \
    149		action pass
    150
    151	tc filter add dev $h1 ingress proto ip pref 1 handle 101 \
    152		flower skip_sw src_mac $rp1_mac ip_proto udp src_port 54321 \
    153		dst_port 12345 action pass
    154
    155	$MZ $h2 -a own -b $(mac_get $rp2) -t udp "sp=54321,dp=12345" \
    156		-A 198.51.100.1 -B 192.0.2.1 -c 10 -p 100 -d 1msec -q
    157
    158	tc_check_packets "dev $rp1 egress" 101 10
    159	check_err $? "packets not forwarded in hardware"
    160
    161	tc_check_packets "dev $h1 ingress" 101 10
    162	check_err $? "packets not forwarded with correct source mac"
    163
    164	log_test "h2->h1: $test_name"
    165
    166	tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower
    167	tc filter del dev $rp1 egress protocol ip pref 1 handle 101 flower
    168	ip neigh del dev $rp1 192.0.2.1 lladdr $(mac_get $h1)
    169}
    170
    171smac_test()
    172{
    173	local test_name=$@; shift
    174
    175	# Test that packets forwarded to $h2 via $rp2 are forwarded with the
    176	# current source MAC of $rp2
    177	h1_to_h2 $test_name
    178
    179	# Test that packets forwarded to $h1 via $rp1 are forwarded with the
    180	# current source MAC of $rp1. This MAC is never changed during the test,
    181	# but given the shared nature of MAC profile, the point is to see that
    182	# changes to the MAC of $rp2 do not affect that of $rp1
    183	h2_to_h1 $test_name
    184}
    185
    186mac_profile_test()
    187{
    188	local rp2_mac=$(mac_get $rp2)
    189
    190	# Test behavior when the RIF backing $rp2 is transitioned to use
    191	# a new MAC profile
    192	ip link set dev $rp2 addr 00:11:22:33:44:55
    193	smac_test "new mac profile"
    194
    195	# Test behavior when the MAC profile used by the RIF is edited
    196	ip link set dev $rp2 address 00:22:22:22:22:22
    197	smac_test "edit mac profile"
    198
    199	# Restore original MAC
    200	ip link set dev $rp2 addr $rp2_mac
    201}
    202
    203trap cleanup EXIT
    204
    205setup_prepare
    206setup_wait
    207
    208mac_profiles=$(devlink_resource_size_get rif_mac_profiles)
    209if [[ $mac_profiles -ne 1 ]]; then
    210	tests_run
    211fi
    212
    213exit $EXIT_STATUS