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

tc_flower.sh (21750B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3
      4ALL_TESTS="match_dst_mac_test match_src_mac_test match_dst_ip_test \
      5	match_src_ip_test match_ip_flags_test match_pcp_test match_vlan_test \
      6	match_ip_tos_test match_indev_test match_ip_ttl_test
      7	match_mpls_label_test \
      8	match_mpls_tc_test match_mpls_bos_test match_mpls_ttl_test \
      9	match_mpls_lse_test"
     10NUM_NETIFS=2
     11source tc_common.sh
     12source lib.sh
     13
     14tcflags="skip_hw"
     15
     16h1_create()
     17{
     18	simple_if_init $h1 192.0.2.1/24 198.51.100.1/24
     19}
     20
     21h1_destroy()
     22{
     23	simple_if_fini $h1 192.0.2.1/24 198.51.100.1/24
     24}
     25
     26h2_create()
     27{
     28	simple_if_init $h2 192.0.2.2/24 198.51.100.2/24
     29	tc qdisc add dev $h2 clsact
     30}
     31
     32h2_destroy()
     33{
     34	tc qdisc del dev $h2 clsact
     35	simple_if_fini $h2 192.0.2.2/24 198.51.100.2/24
     36}
     37
     38match_dst_mac_test()
     39{
     40	local dummy_mac=de:ad:be:ef:aa:aa
     41
     42	RET=0
     43
     44	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
     45		$tcflags dst_mac $dummy_mac action drop
     46	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
     47		$tcflags dst_mac $h2mac action drop
     48
     49	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
     50		-t ip -q
     51
     52	tc_check_packets "dev $h2 ingress" 101 1
     53	check_fail $? "Matched on a wrong filter"
     54
     55	tc_check_packets "dev $h2 ingress" 102 1
     56	check_err $? "Did not match on correct filter"
     57
     58	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
     59	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
     60
     61	log_test "dst_mac match ($tcflags)"
     62}
     63
     64match_src_mac_test()
     65{
     66	local dummy_mac=de:ad:be:ef:aa:aa
     67
     68	RET=0
     69
     70	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
     71		$tcflags src_mac $dummy_mac action drop
     72	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
     73		$tcflags src_mac $h1mac action drop
     74
     75	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
     76		-t ip -q
     77
     78	tc_check_packets "dev $h2 ingress" 101 1
     79	check_fail $? "Matched on a wrong filter"
     80
     81	tc_check_packets "dev $h2 ingress" 102 1
     82	check_err $? "Did not match on correct filter"
     83
     84	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
     85	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
     86
     87	log_test "src_mac match ($tcflags)"
     88}
     89
     90match_dst_ip_test()
     91{
     92	RET=0
     93
     94	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
     95		$tcflags dst_ip 198.51.100.2 action drop
     96	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
     97		$tcflags dst_ip 192.0.2.2 action drop
     98	tc filter add dev $h2 ingress protocol ip pref 3 handle 103 flower \
     99		$tcflags dst_ip 192.0.2.0/24 action drop
    100
    101	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    102		-t ip -q
    103
    104	tc_check_packets "dev $h2 ingress" 101 1
    105	check_fail $? "Matched on a wrong filter"
    106
    107	tc_check_packets "dev $h2 ingress" 102 1
    108	check_err $? "Did not match on correct filter"
    109
    110	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
    111
    112	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    113		-t ip -q
    114
    115	tc_check_packets "dev $h2 ingress" 103 1
    116	check_err $? "Did not match on correct filter with mask"
    117
    118	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    119	tc filter del dev $h2 ingress protocol ip pref 3 handle 103 flower
    120
    121	log_test "dst_ip match ($tcflags)"
    122}
    123
    124match_src_ip_test()
    125{
    126	RET=0
    127
    128	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
    129		$tcflags src_ip 198.51.100.1 action drop
    130	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
    131		$tcflags src_ip 192.0.2.1 action drop
    132	tc filter add dev $h2 ingress protocol ip pref 3 handle 103 flower \
    133		$tcflags src_ip 192.0.2.0/24 action drop
    134
    135	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    136		-t ip -q
    137
    138	tc_check_packets "dev $h2 ingress" 101 1
    139	check_fail $? "Matched on a wrong filter"
    140
    141	tc_check_packets "dev $h2 ingress" 102 1
    142	check_err $? "Did not match on correct filter"
    143
    144	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
    145
    146	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    147		-t ip -q
    148
    149	tc_check_packets "dev $h2 ingress" 103 1
    150	check_err $? "Did not match on correct filter with mask"
    151
    152	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    153	tc filter del dev $h2 ingress protocol ip pref 3 handle 103 flower
    154
    155	log_test "src_ip match ($tcflags)"
    156}
    157
    158match_ip_flags_test()
    159{
    160	RET=0
    161
    162	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
    163		$tcflags ip_flags frag action continue
    164	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
    165		$tcflags ip_flags firstfrag action continue
    166	tc filter add dev $h2 ingress protocol ip pref 3 handle 103 flower \
    167		$tcflags ip_flags nofirstfrag action continue
    168	tc filter add dev $h2 ingress protocol ip pref 4 handle 104 flower \
    169		$tcflags ip_flags nofrag action drop
    170
    171	$MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    172		-t ip "frag=0" -q
    173
    174	tc_check_packets "dev $h2 ingress" 101 1
    175	check_fail $? "Matched on wrong frag filter (nofrag)"
    176
    177	tc_check_packets "dev $h2 ingress" 102 1
    178	check_fail $? "Matched on wrong firstfrag filter (nofrag)"
    179
    180	tc_check_packets "dev $h2 ingress" 103 1
    181	check_err $? "Did not match on nofirstfrag filter (nofrag) "
    182
    183	tc_check_packets "dev $h2 ingress" 104 1
    184	check_err $? "Did not match on nofrag filter (nofrag)"
    185
    186	$MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    187		-t ip "frag=0,mf" -q
    188
    189	tc_check_packets "dev $h2 ingress" 101 1
    190	check_err $? "Did not match on frag filter (1stfrag)"
    191
    192	tc_check_packets "dev $h2 ingress" 102 1
    193	check_err $? "Did not match fistfrag filter (1stfrag)"
    194
    195	tc_check_packets "dev $h2 ingress" 103 1
    196	check_err $? "Matched on wrong nofirstfrag filter (1stfrag)"
    197
    198	tc_check_packets "dev $h2 ingress" 104 1
    199	check_err $? "Match on wrong nofrag filter (1stfrag)"
    200
    201	$MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    202		-t ip "frag=256,mf" -q
    203	$MZ $h1 -c 1 -p 1000 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    204		-t ip "frag=256" -q
    205
    206	tc_check_packets "dev $h2 ingress" 101 3
    207	check_err $? "Did not match on frag filter (no1stfrag)"
    208
    209	tc_check_packets "dev $h2 ingress" 102 1
    210	check_err $? "Matched on wrong firstfrag filter (no1stfrag)"
    211
    212	tc_check_packets "dev $h2 ingress" 103 3
    213	check_err $? "Did not match on nofirstfrag filter (no1stfrag)"
    214
    215	tc_check_packets "dev $h2 ingress" 104 1
    216	check_err $? "Matched on nofrag filter (no1stfrag)"
    217
    218	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    219	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
    220	tc filter del dev $h2 ingress protocol ip pref 3 handle 103 flower
    221	tc filter del dev $h2 ingress protocol ip pref 4 handle 104 flower
    222
    223	log_test "ip_flags match ($tcflags)"
    224}
    225
    226match_pcp_test()
    227{
    228	RET=0
    229
    230	vlan_create $h2 85 v$h2 192.0.2.11/24
    231
    232	tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 101 \
    233		flower vlan_prio 6 $tcflags dst_mac $h2mac action drop
    234	tc filter add dev $h2 ingress protocol 802.1q pref 2 handle 102 \
    235		flower vlan_prio 7 $tcflags dst_mac $h2mac action drop
    236
    237	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -B 192.0.2.11 -Q 7:85 -t ip -q
    238	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -B 192.0.2.11 -Q 0:85 -t ip -q
    239
    240	tc_check_packets "dev $h2 ingress" 101 0
    241	check_err $? "Matched on specified PCP when should not"
    242
    243	tc_check_packets "dev $h2 ingress" 102 1
    244	check_err $? "Did not match on specified PCP"
    245
    246	tc filter del dev $h2 ingress protocol 802.1q pref 2 handle 102 flower
    247	tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 101 flower
    248
    249	vlan_destroy $h2 85
    250
    251	log_test "PCP match ($tcflags)"
    252}
    253
    254match_vlan_test()
    255{
    256	RET=0
    257
    258	vlan_create $h2 85 v$h2 192.0.2.11/24
    259	vlan_create $h2 75 v$h2 192.0.2.10/24
    260
    261	tc filter add dev $h2 ingress protocol 802.1q pref 1 handle 101 \
    262		flower vlan_id 75 $tcflags action drop
    263	tc filter add dev $h2 ingress protocol 802.1q pref 2 handle 102 \
    264		flower vlan_id 85 $tcflags action drop
    265
    266	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -B 192.0.2.11 -Q 0:85 -t ip -q
    267
    268	tc_check_packets "dev $h2 ingress" 101 0
    269	check_err $? "Matched on specified VLAN when should not"
    270
    271	tc_check_packets "dev $h2 ingress" 102 1
    272	check_err $? "Did not match on specified VLAN"
    273
    274	tc filter del dev $h2 ingress protocol 802.1q pref 2 handle 102 flower
    275	tc filter del dev $h2 ingress protocol 802.1q pref 1 handle 101 flower
    276
    277	vlan_destroy $h2 75
    278	vlan_destroy $h2 85
    279
    280	log_test "VLAN match ($tcflags)"
    281}
    282
    283match_ip_tos_test()
    284{
    285	RET=0
    286
    287	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
    288		$tcflags dst_ip 192.0.2.2 ip_tos 0x20 action drop
    289	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
    290		$tcflags dst_ip 192.0.2.2 ip_tos 0x18 action drop
    291
    292	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    293		-t ip tos=18 -q
    294
    295	tc_check_packets "dev $h2 ingress" 101 1
    296	check_fail $? "Matched on a wrong filter (0x18)"
    297
    298	tc_check_packets "dev $h2 ingress" 102 1
    299	check_err $? "Did not match on correct filter (0x18)"
    300
    301	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    302		-t ip tos=20 -q
    303
    304	tc_check_packets "dev $h2 ingress" 102 2
    305	check_fail $? "Matched on a wrong filter (0x20)"
    306
    307	tc_check_packets "dev $h2 ingress" 101 1
    308	check_err $? "Did not match on correct filter (0x20)"
    309
    310	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
    311	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    312
    313	log_test "ip_tos match ($tcflags)"
    314}
    315
    316match_ip_ttl_test()
    317{
    318	RET=0
    319
    320	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
    321		$tcflags dst_ip 192.0.2.2 ip_ttl 63 action drop
    322	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
    323		$tcflags dst_ip 192.0.2.2 action drop
    324
    325	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    326		-t ip "ttl=63" -q
    327
    328	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    329		-t ip "ttl=63,mf,frag=256" -q
    330
    331	tc_check_packets "dev $h2 ingress" 102 1
    332	check_fail $? "Matched on the wrong filter (no check on ttl)"
    333
    334	tc_check_packets "dev $h2 ingress" 101 2
    335	check_err $? "Did not match on correct filter (ttl=63)"
    336
    337	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    338		-t ip "ttl=255" -q
    339
    340	tc_check_packets "dev $h2 ingress" 101 3
    341	check_fail $? "Matched on a wrong filter (ttl=63)"
    342
    343	tc_check_packets "dev $h2 ingress" 102 1
    344	check_err $? "Did not match on correct filter (no check on ttl)"
    345
    346	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
    347	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    348
    349	log_test "ip_ttl match ($tcflags)"
    350}
    351
    352match_indev_test()
    353{
    354	RET=0
    355
    356	tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \
    357		$tcflags indev $h1 dst_mac $h2mac action drop
    358	tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \
    359		$tcflags indev $h2 dst_mac $h2mac action drop
    360
    361	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
    362		-t ip -q
    363
    364	tc_check_packets "dev $h2 ingress" 101 1
    365	check_fail $? "Matched on a wrong filter"
    366
    367	tc_check_packets "dev $h2 ingress" 102 1
    368	check_err $? "Did not match on correct filter"
    369
    370	tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower
    371	tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower
    372
    373	log_test "indev match ($tcflags)"
    374}
    375
    376# Unfortunately, mausezahn can't build MPLS headers when used in L2
    377# mode, so we have this function to build Label Stack Entries.
    378mpls_lse()
    379{
    380	local label=$1
    381	local tc=$2
    382	local bos=$3
    383	local ttl=$4
    384
    385	printf "%02x %02x %02x %02x"                        \
    386		$((label >> 12))                            \
    387		$((label >> 4 & 0xff))                      \
    388		$((((label & 0xf) << 4) + (tc << 1) + bos)) \
    389		$ttl
    390}
    391
    392match_mpls_label_test()
    393{
    394	local ethtype="88 47"; readonly ethtype
    395	local pkt
    396
    397	RET=0
    398
    399	check_tc_mpls_support $h2 || return 0
    400
    401	tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
    402		flower $tcflags mpls_label 0 action drop
    403	tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
    404		flower $tcflags mpls_label 1048575 action drop
    405
    406	pkt="$ethtype $(mpls_lse 1048575 0 1 255)"
    407	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    408
    409	tc_check_packets "dev $h2 ingress" 101 1
    410	check_fail $? "Matched on a wrong filter (1048575)"
    411
    412	tc_check_packets "dev $h2 ingress" 102 1
    413	check_err $? "Did not match on correct filter (1048575)"
    414
    415	pkt="$ethtype $(mpls_lse 0 0 1 255)"
    416	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    417
    418	tc_check_packets "dev $h2 ingress" 102 2
    419	check_fail $? "Matched on a wrong filter (0)"
    420
    421	tc_check_packets "dev $h2 ingress" 101 1
    422	check_err $? "Did not match on correct filter (0)"
    423
    424	tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
    425	tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
    426
    427	log_test "mpls_label match ($tcflags)"
    428}
    429
    430match_mpls_tc_test()
    431{
    432	local ethtype="88 47"; readonly ethtype
    433	local pkt
    434
    435	RET=0
    436
    437	check_tc_mpls_support $h2 || return 0
    438
    439	tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
    440		flower $tcflags mpls_tc 0 action drop
    441	tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
    442		flower $tcflags mpls_tc 7 action drop
    443
    444	pkt="$ethtype $(mpls_lse 0 7 1 255)"
    445	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    446
    447	tc_check_packets "dev $h2 ingress" 101 1
    448	check_fail $? "Matched on a wrong filter (7)"
    449
    450	tc_check_packets "dev $h2 ingress" 102 1
    451	check_err $? "Did not match on correct filter (7)"
    452
    453	pkt="$ethtype $(mpls_lse 0 0 1 255)"
    454	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    455
    456	tc_check_packets "dev $h2 ingress" 102 2
    457	check_fail $? "Matched on a wrong filter (0)"
    458
    459	tc_check_packets "dev $h2 ingress" 101 1
    460	check_err $? "Did not match on correct filter (0)"
    461
    462	tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
    463	tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
    464
    465	log_test "mpls_tc match ($tcflags)"
    466}
    467
    468match_mpls_bos_test()
    469{
    470	local ethtype="88 47"; readonly ethtype
    471	local pkt
    472
    473	RET=0
    474
    475	check_tc_mpls_support $h2 || return 0
    476
    477	tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
    478		flower $tcflags mpls_bos 0 action drop
    479	tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
    480		flower $tcflags mpls_bos 1 action drop
    481
    482	pkt="$ethtype $(mpls_lse 0 0 1 255)"
    483	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    484
    485	tc_check_packets "dev $h2 ingress" 101 1
    486	check_fail $? "Matched on a wrong filter (1)"
    487
    488	tc_check_packets "dev $h2 ingress" 102 1
    489	check_err $? "Did not match on correct filter (1)"
    490
    491	# Need to add a second label to properly mark the Bottom of Stack
    492	pkt="$ethtype $(mpls_lse 0 0 0 255) $(mpls_lse 0 0 1 255)"
    493	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    494
    495	tc_check_packets "dev $h2 ingress" 102 2
    496	check_fail $? "Matched on a wrong filter (0)"
    497
    498	tc_check_packets "dev $h2 ingress" 101 1
    499	check_err $? "Did not match on correct filter (0)"
    500
    501	tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
    502	tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
    503
    504	log_test "mpls_bos match ($tcflags)"
    505}
    506
    507match_mpls_ttl_test()
    508{
    509	local ethtype="88 47"; readonly ethtype
    510	local pkt
    511
    512	RET=0
    513
    514	check_tc_mpls_support $h2 || return 0
    515
    516	tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
    517		flower $tcflags mpls_ttl 0 action drop
    518	tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
    519		flower $tcflags mpls_ttl 255 action drop
    520
    521	pkt="$ethtype $(mpls_lse 0 0 1 255)"
    522	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    523
    524	tc_check_packets "dev $h2 ingress" 101 1
    525	check_fail $? "Matched on a wrong filter (255)"
    526
    527	tc_check_packets "dev $h2 ingress" 102 1
    528	check_err $? "Did not match on correct filter (255)"
    529
    530	pkt="$ethtype $(mpls_lse 0 0 1 0)"
    531	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    532
    533	tc_check_packets "dev $h2 ingress" 102 2
    534	check_fail $? "Matched on a wrong filter (0)"
    535
    536	tc_check_packets "dev $h2 ingress" 101 1
    537	check_err $? "Did not match on correct filter (0)"
    538
    539	tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
    540	tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
    541
    542	log_test "mpls_ttl match ($tcflags)"
    543}
    544
    545match_mpls_lse_test()
    546{
    547	local ethtype="88 47"; readonly ethtype
    548	local pkt
    549
    550	RET=0
    551
    552	check_tc_mpls_lse_stats $h2 || return 0
    553
    554	# Match on first LSE (minimal values for each field)
    555	tc filter add dev $h2 ingress protocol mpls_uc pref 1 handle 101 \
    556		flower $tcflags mpls lse depth 1 label 0 action continue
    557	tc filter add dev $h2 ingress protocol mpls_uc pref 2 handle 102 \
    558		flower $tcflags mpls lse depth 1 tc 0 action continue
    559	tc filter add dev $h2 ingress protocol mpls_uc pref 3 handle 103 \
    560		flower $tcflags mpls lse depth 1 bos 0 action continue
    561	tc filter add dev $h2 ingress protocol mpls_uc pref 4 handle 104 \
    562		flower $tcflags mpls lse depth 1 ttl 0 action continue
    563
    564	# Match on second LSE (maximal values for each field)
    565	tc filter add dev $h2 ingress protocol mpls_uc pref 5 handle 105 \
    566		flower $tcflags mpls lse depth 2 label 1048575 action continue
    567	tc filter add dev $h2 ingress protocol mpls_uc pref 6 handle 106 \
    568		flower $tcflags mpls lse depth 2 tc 7 action continue
    569	tc filter add dev $h2 ingress protocol mpls_uc pref 7 handle 107 \
    570		flower $tcflags mpls lse depth 2 bos 1 action continue
    571	tc filter add dev $h2 ingress protocol mpls_uc pref 8 handle 108 \
    572		flower $tcflags mpls lse depth 2 ttl 255 action continue
    573
    574	# Match on LSE depth
    575	tc filter add dev $h2 ingress protocol mpls_uc pref 9 handle 109 \
    576		flower $tcflags mpls lse depth 1 action continue
    577	tc filter add dev $h2 ingress protocol mpls_uc pref 10 handle 110 \
    578		flower $tcflags mpls lse depth 2 action continue
    579	tc filter add dev $h2 ingress protocol mpls_uc pref 11 handle 111 \
    580		flower $tcflags mpls lse depth 3 action continue
    581
    582	# Base packet, matched by all filters (except for stack depth 3)
    583	pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 7 1 255)"
    584	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    585
    586	# Make a variant of the above packet, with a non-matching value
    587	# for each LSE field
    588
    589	# Wrong label at depth 1
    590	pkt="$ethtype $(mpls_lse 1 0 0 0) $(mpls_lse 1048575 7 1 255)"
    591	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    592
    593	# Wrong TC at depth 1
    594	pkt="$ethtype $(mpls_lse 0 1 0 0) $(mpls_lse 1048575 7 1 255)"
    595	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    596
    597	# Wrong BOS at depth 1 (not adding a second LSE here since BOS is set
    598	# in the first label, so anything that'd follow wouldn't be considered)
    599	pkt="$ethtype $(mpls_lse 0 0 1 0)"
    600	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    601
    602	# Wrong TTL at depth 1
    603	pkt="$ethtype $(mpls_lse 0 0 0 1) $(mpls_lse 1048575 7 1 255)"
    604	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    605
    606	# Wrong label at depth 2
    607	pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048574 7 1 255)"
    608	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    609
    610	# Wrong TC at depth 2
    611	pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 6 1 255)"
    612	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    613
    614	# Wrong BOS at depth 2 (adding a third LSE here since BOS isn't set in
    615	# the second label)
    616	pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 7 0 255)"
    617	pkt="$pkt $(mpls_lse 0 0 1 255)"
    618	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    619
    620	# Wrong TTL at depth 2
    621	pkt="$ethtype $(mpls_lse 0 0 0 0) $(mpls_lse 1048575 7 1 254)"
    622	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
    623
    624	# Filters working at depth 1 should match all packets but one
    625
    626	tc_check_packets "dev $h2 ingress" 101 8
    627	check_err $? "Did not match on correct filter"
    628
    629	tc_check_packets "dev $h2 ingress" 102 8
    630	check_err $? "Did not match on correct filter"
    631
    632	tc_check_packets "dev $h2 ingress" 103 8
    633	check_err $? "Did not match on correct filter"
    634
    635	tc_check_packets "dev $h2 ingress" 104 8
    636	check_err $? "Did not match on correct filter"
    637
    638	# Filters working at depth 2 should match all packets but two (because
    639	# of the test packet where the label stack depth is just one)
    640
    641	tc_check_packets "dev $h2 ingress" 105 7
    642	check_err $? "Did not match on correct filter"
    643
    644	tc_check_packets "dev $h2 ingress" 106 7
    645	check_err $? "Did not match on correct filter"
    646
    647	tc_check_packets "dev $h2 ingress" 107 7
    648	check_err $? "Did not match on correct filter"
    649
    650	tc_check_packets "dev $h2 ingress" 108 7
    651	check_err $? "Did not match on correct filter"
    652
    653	# Finally, verify the filters that only match on LSE depth
    654
    655	tc_check_packets "dev $h2 ingress" 109 9
    656	check_err $? "Did not match on correct filter"
    657
    658	tc_check_packets "dev $h2 ingress" 110 8
    659	check_err $? "Did not match on correct filter"
    660
    661	tc_check_packets "dev $h2 ingress" 111 1
    662	check_err $? "Did not match on correct filter"
    663
    664	tc filter del dev $h2 ingress protocol mpls_uc pref 11 handle 111 flower
    665	tc filter del dev $h2 ingress protocol mpls_uc pref 10 handle 110 flower
    666	tc filter del dev $h2 ingress protocol mpls_uc pref 9 handle 109 flower
    667	tc filter del dev $h2 ingress protocol mpls_uc pref 8 handle 108 flower
    668	tc filter del dev $h2 ingress protocol mpls_uc pref 7 handle 107 flower
    669	tc filter del dev $h2 ingress protocol mpls_uc pref 6 handle 106 flower
    670	tc filter del dev $h2 ingress protocol mpls_uc pref 5 handle 105 flower
    671	tc filter del dev $h2 ingress protocol mpls_uc pref 4 handle 104 flower
    672	tc filter del dev $h2 ingress protocol mpls_uc pref 3 handle 103 flower
    673	tc filter del dev $h2 ingress protocol mpls_uc pref 2 handle 102 flower
    674	tc filter del dev $h2 ingress protocol mpls_uc pref 1 handle 101 flower
    675
    676	log_test "mpls lse match ($tcflags)"
    677}
    678
    679setup_prepare()
    680{
    681	h1=${NETIFS[p1]}
    682	h2=${NETIFS[p2]}
    683	h1mac=$(mac_get $h1)
    684	h2mac=$(mac_get $h2)
    685
    686	vrf_prepare
    687
    688	h1_create
    689	h2_create
    690}
    691
    692cleanup()
    693{
    694	pre_cleanup
    695
    696	h2_destroy
    697	h1_destroy
    698
    699	vrf_cleanup
    700}
    701
    702trap cleanup EXIT
    703
    704setup_prepare
    705setup_wait
    706
    707tests_run
    708
    709tc_offload_check
    710if [[ $? -ne 0 ]]; then
    711	log_info "Could not test offloaded functionality"
    712else
    713	tcflags="skip_sw"
    714	tests_run
    715fi
    716
    717exit $EXIT_STATUS