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

router.sh (7492B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3
      4# +--------------------+                     +----------------------+
      5# | H1                 |                     |                   H2 |
      6# |                    |                     |                      |
      7# |              $h1 + |                     | + $h2                |
      8# |     192.0.2.2/24 | |                     | | 198.51.100.2/24    |
      9# | 2001:db8:1::2/64 | |                     | | 2001:db8:2::2/64   |
     10# |                  | |                     | |                    |
     11# +------------------|-+                     +-|--------------------+
     12#                    |                         |
     13# +------------------|-------------------------|--------------------+
     14# | SW               |                         |                    |
     15# |                  |                         |                    |
     16# |             $rp1 +                         + $rp2               |
     17# |     192.0.2.1/24                             198.51.100.1/24    |
     18# | 2001:db8:1::1/64                             2001:db8:2::1/64   |
     19# |                                                                 |
     20# +-----------------------------------------------------------------+
     21
     22ALL_TESTS="
     23	ping_ipv4
     24	ping_ipv6
     25	sip_in_class_e
     26	mc_mac_mismatch
     27	ipv4_sip_equal_dip
     28	ipv6_sip_equal_dip
     29	ipv4_dip_link_local
     30"
     31
     32NUM_NETIFS=4
     33source lib.sh
     34source tc_common.sh
     35
     36require_command $MCD
     37require_command $MC_CLI
     38table_name=selftests
     39
     40h1_create()
     41{
     42	vrf_create "vrf-h1"
     43	ip link set dev $h1 master vrf-h1
     44
     45	ip link set dev vrf-h1 up
     46	ip link set dev $h1 up
     47
     48	ip address add 192.0.2.2/24 dev $h1
     49	ip address add 2001:db8:1::2/64 dev $h1
     50
     51	ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1
     52	ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1
     53}
     54
     55h1_destroy()
     56{
     57	ip route del 2001:db8:2::/64 vrf vrf-h1
     58	ip route del 198.51.100.0/24 vrf vrf-h1
     59
     60	ip address del 2001:db8:1::2/64 dev $h1
     61	ip address del 192.0.2.2/24 dev $h1
     62
     63	ip link set dev $h1 down
     64	vrf_destroy "vrf-h1"
     65}
     66
     67h2_create()
     68{
     69	vrf_create "vrf-h2"
     70	ip link set dev $h2 master vrf-h2
     71
     72	ip link set dev vrf-h2 up
     73	ip link set dev $h2 up
     74
     75	ip address add 198.51.100.2/24 dev $h2
     76	ip address add 2001:db8:2::2/64 dev $h2
     77
     78	ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1
     79	ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1
     80}
     81
     82h2_destroy()
     83{
     84	ip route del 2001:db8:1::/64 vrf vrf-h2
     85	ip route del 192.0.2.0/24 vrf vrf-h2
     86
     87	ip address del 2001:db8:2::2/64 dev $h2
     88	ip address del 198.51.100.2/24 dev $h2
     89
     90	ip link set dev $h2 down
     91	vrf_destroy "vrf-h2"
     92}
     93
     94router_create()
     95{
     96	ip link set dev $rp1 up
     97	ip link set dev $rp2 up
     98
     99	tc qdisc add dev $rp2 clsact
    100
    101	ip address add 192.0.2.1/24 dev $rp1
    102	ip address add 2001:db8:1::1/64 dev $rp1
    103
    104	ip address add 198.51.100.1/24 dev $rp2
    105	ip address add 2001:db8:2::1/64 dev $rp2
    106}
    107
    108router_destroy()
    109{
    110	ip address del 2001:db8:2::1/64 dev $rp2
    111	ip address del 198.51.100.1/24 dev $rp2
    112
    113	ip address del 2001:db8:1::1/64 dev $rp1
    114	ip address del 192.0.2.1/24 dev $rp1
    115
    116	tc qdisc del dev $rp2 clsact
    117
    118	ip link set dev $rp2 down
    119	ip link set dev $rp1 down
    120}
    121
    122start_mcd()
    123{
    124	SMCROUTEDIR="$(mktemp -d)"
    125
    126	for ((i = 1; i <= $NUM_NETIFS; ++i)); do
    127		echo "phyint ${NETIFS[p$i]} enable" >> \
    128			$SMCROUTEDIR/$table_name.conf
    129	done
    130
    131	$MCD -N -I $table_name -f $SMCROUTEDIR/$table_name.conf \
    132		-P $SMCROUTEDIR/$table_name.pid
    133}
    134
    135kill_mcd()
    136{
    137	pkill $MCD
    138	rm -rf $SMCROUTEDIR
    139}
    140
    141setup_prepare()
    142{
    143	h1=${NETIFS[p1]}
    144	rp1=${NETIFS[p2]}
    145
    146	rp2=${NETIFS[p3]}
    147	h2=${NETIFS[p4]}
    148
    149	rp1mac=$(mac_get $rp1)
    150
    151	start_mcd
    152
    153	vrf_prepare
    154
    155	h1_create
    156	h2_create
    157
    158	router_create
    159
    160	forwarding_enable
    161}
    162
    163cleanup()
    164{
    165	pre_cleanup
    166
    167	forwarding_restore
    168
    169	router_destroy
    170
    171	h2_destroy
    172	h1_destroy
    173
    174	vrf_cleanup
    175
    176	kill_mcd
    177}
    178
    179ping_ipv4()
    180{
    181	ping_test $h1 198.51.100.2
    182}
    183
    184ping_ipv6()
    185{
    186	ping6_test $h1 2001:db8:2::2
    187}
    188
    189sip_in_class_e()
    190{
    191	RET=0
    192
    193	# Disable rpfilter to prevent packets to be dropped because of it.
    194	sysctl_set net.ipv4.conf.all.rp_filter 0
    195	sysctl_set net.ipv4.conf.$rp1.rp_filter 0
    196
    197	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
    198		flower src_ip 240.0.0.1 ip_proto udp action pass
    199
    200	$MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
    201		-A 240.0.0.1 -b $rp1mac -B 198.51.100.2 -q
    202
    203	tc_check_packets "dev $rp2 egress" 101 5
    204	check_err $? "Packets were dropped"
    205
    206	log_test "Source IP in class E"
    207
    208	tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
    209	sysctl_restore net.ipv4.conf.$rp1.rp_filter
    210	sysctl_restore net.ipv4.conf.all.rp_filter
    211}
    212
    213create_mcast_sg()
    214{
    215	local if_name=$1; shift
    216	local s_addr=$1; shift
    217	local mcast=$1; shift
    218	local dest_ifs=${@}
    219
    220	$MC_CLI -I $table_name add $if_name $s_addr $mcast $dest_ifs
    221}
    222
    223delete_mcast_sg()
    224{
    225	local if_name=$1; shift
    226	local s_addr=$1; shift
    227	local mcast=$1; shift
    228	local dest_ifs=${@}
    229
    230	$MC_CLI -I $table_name remove $if_name $s_addr $mcast $dest_ifs
    231}
    232
    233__mc_mac_mismatch()
    234{
    235	local desc=$1; shift
    236	local proto=$1; shift
    237	local sip=$1; shift
    238	local dip=$1; shift
    239	local flags=${1:-""}; shift
    240	local dmac=01:02:03:04:05:06
    241
    242	RET=0
    243
    244	tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
    245		flower dst_ip $dip action pass
    246
    247	create_mcast_sg $rp1 $sip $dip $rp2
    248
    249	$MZ $flags $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $dmac \
    250		-B $dip -q
    251
    252	tc_check_packets "dev $rp2 egress" 101 5
    253	check_err $? "Packets were dropped"
    254
    255	log_test "Multicast MAC mismatch: $desc"
    256
    257	delete_mcast_sg $rp1 $sip $dip $rp2
    258	tc filter del dev $rp2 egress protocol $proto pref 1 handle 101 flower
    259}
    260
    261mc_mac_mismatch()
    262{
    263	__mc_mac_mismatch "IPv4" "ip" 192.0.2.2 225.1.2.3
    264	__mc_mac_mismatch "IPv6" "ipv6" 2001:db8:1::2 ff0e::3 "-6"
    265}
    266
    267ipv4_sip_equal_dip()
    268{
    269	RET=0
    270
    271	# Disable rpfilter to prevent packets to be dropped because of it.
    272	sysctl_set net.ipv4.conf.all.rp_filter 0
    273	sysctl_set net.ipv4.conf.$rp1.rp_filter 0
    274
    275	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
    276		flower src_ip 198.51.100.2  action pass
    277
    278	$MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
    279		-A 198.51.100.2 -b $rp1mac -B 198.51.100.2 -q
    280
    281	tc_check_packets "dev $rp2 egress" 101 5
    282	check_err $? "Packets were dropped"
    283
    284	log_test "Source IP is equal to destination IP: IPv4"
    285
    286	tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
    287	sysctl_restore net.ipv4.conf.$rp1.rp_filter
    288	sysctl_restore net.ipv4.conf.all.rp_filter
    289}
    290
    291ipv6_sip_equal_dip()
    292{
    293	RET=0
    294
    295	tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
    296		flower src_ip 2001:db8:2::2 action pass
    297
    298	$MZ -6 $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \
    299		-A 2001:db8:2::2 -b $rp1mac -B 2001:db8:2::2 -q
    300
    301	tc_check_packets "dev $rp2 egress" 101 5
    302	check_err $? "Packets were dropped"
    303
    304	log_test "Source IP is equal to destination IP: IPv6"
    305
    306	tc filter del dev $rp2 egress protocol ipv6 pref 1 handle 101 flower
    307}
    308
    309ipv4_dip_link_local()
    310{
    311	local dip=169.254.1.1
    312
    313	RET=0
    314
    315	tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
    316		flower dst_ip $dip action pass
    317
    318	ip neigh add 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2
    319	ip route add 169.254.1.0/24 dev $rp2
    320
    321	$MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $rp1mac -B $dip -q
    322
    323	tc_check_packets "dev $rp2 egress" 101 5
    324	check_err $? "Packets were dropped"
    325
    326	log_test "IPv4 destination IP is link-local"
    327
    328	ip route del 169.254.1.0/24 dev $rp2
    329	ip neigh del 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2
    330	tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower
    331}
    332
    333trap cleanup EXIT
    334
    335setup_prepare
    336setup_wait
    337
    338tests_run
    339
    340exit $EXIT_STATUS