1*1668a55aSZahari Doychev#!/bin/bash 2*1668a55aSZahari Doychev# SPDX-License-Identifier: GPL-2.0 3*1668a55aSZahari Doychev 4*1668a55aSZahari DoychevALL_TESTS="match_cfm_opcode match_cfm_level match_cfm_level_and_opcode" 5*1668a55aSZahari DoychevNUM_NETIFS=2 6*1668a55aSZahari Doychevsource tc_common.sh 7*1668a55aSZahari Doychevsource lib.sh 8*1668a55aSZahari Doychev 9*1668a55aSZahari Doychevh1_create() 10*1668a55aSZahari Doychev{ 11*1668a55aSZahari Doychev simple_if_init $h1 12*1668a55aSZahari Doychev} 13*1668a55aSZahari Doychev 14*1668a55aSZahari Doychevh1_destroy() 15*1668a55aSZahari Doychev{ 16*1668a55aSZahari Doychev simple_if_fini $h1 17*1668a55aSZahari Doychev} 18*1668a55aSZahari Doychev 19*1668a55aSZahari Doychevh2_create() 20*1668a55aSZahari Doychev{ 21*1668a55aSZahari Doychev simple_if_init $h2 22*1668a55aSZahari Doychev tc qdisc add dev $h2 clsact 23*1668a55aSZahari Doychev} 24*1668a55aSZahari Doychev 25*1668a55aSZahari Doychevh2_destroy() 26*1668a55aSZahari Doychev{ 27*1668a55aSZahari Doychev tc qdisc del dev $h2 clsact 28*1668a55aSZahari Doychev simple_if_fini $h2 29*1668a55aSZahari Doychev} 30*1668a55aSZahari Doychev 31*1668a55aSZahari Doychevu8_to_hex() 32*1668a55aSZahari Doychev{ 33*1668a55aSZahari Doychev local u8=$1; shift 34*1668a55aSZahari Doychev 35*1668a55aSZahari Doychev printf "%02x" $u8 36*1668a55aSZahari Doychev} 37*1668a55aSZahari Doychev 38*1668a55aSZahari Doychevgenerate_cfm_hdr() 39*1668a55aSZahari Doychev{ 40*1668a55aSZahari Doychev local mdl=$1; shift 41*1668a55aSZahari Doychev local op=$1; shift 42*1668a55aSZahari Doychev local flags=$1; shift 43*1668a55aSZahari Doychev local tlv_offset=$1; shift 44*1668a55aSZahari Doychev 45*1668a55aSZahari Doychev local cfm_hdr=$(: 46*1668a55aSZahari Doychev )"$(u8_to_hex $((mdl << 5))):"$( : MD level and Version 47*1668a55aSZahari Doychev )"$(u8_to_hex $op):"$( : OpCode 48*1668a55aSZahari Doychev )"$(u8_to_hex $flags):"$( : Flags 49*1668a55aSZahari Doychev )"$(u8_to_hex $tlv_offset)"$( : TLV offset 50*1668a55aSZahari Doychev ) 51*1668a55aSZahari Doychev 52*1668a55aSZahari Doychev echo $cfm_hdr 53*1668a55aSZahari Doychev} 54*1668a55aSZahari Doychev 55*1668a55aSZahari Doychevmatch_cfm_opcode() 56*1668a55aSZahari Doychev{ 57*1668a55aSZahari Doychev local ethtype="89 02"; readonly ethtype 58*1668a55aSZahari Doychev RET=0 59*1668a55aSZahari Doychev 60*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \ 61*1668a55aSZahari Doychev flower cfm op 47 action drop 62*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 102 \ 63*1668a55aSZahari Doychev flower cfm op 43 action drop 64*1668a55aSZahari Doychev 65*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 7 47 0 32)" 66*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 67*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 6 5 0 4)" 68*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 69*1668a55aSZahari Doychev 70*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 101 1 71*1668a55aSZahari Doychev check_err $? "Did not match on correct opcode" 72*1668a55aSZahari Doychev 73*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 102 0 74*1668a55aSZahari Doychev check_err $? "Matched on the wrong opcode" 75*1668a55aSZahari Doychev 76*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 0 43 0 12)" 77*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 78*1668a55aSZahari Doychev 79*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 101 1 80*1668a55aSZahari Doychev check_err $? "Matched on the wrong opcode" 81*1668a55aSZahari Doychev 82*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 102 1 83*1668a55aSZahari Doychev check_err $? "Did not match on correct opcode" 84*1668a55aSZahari Doychev 85*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower 86*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower 87*1668a55aSZahari Doychev 88*1668a55aSZahari Doychev log_test "CFM opcode match test" 89*1668a55aSZahari Doychev} 90*1668a55aSZahari Doychev 91*1668a55aSZahari Doychevmatch_cfm_level() 92*1668a55aSZahari Doychev{ 93*1668a55aSZahari Doychev local ethtype="89 02"; readonly ethtype 94*1668a55aSZahari Doychev RET=0 95*1668a55aSZahari Doychev 96*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \ 97*1668a55aSZahari Doychev flower cfm mdl 5 action drop 98*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 102 \ 99*1668a55aSZahari Doychev flower cfm mdl 3 action drop 100*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 103 \ 101*1668a55aSZahari Doychev flower cfm mdl 0 action drop 102*1668a55aSZahari Doychev 103*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 5 42 0 12)" 104*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 105*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 6 1 0 70)" 106*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 107*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 0 1 0 70)" 108*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 109*1668a55aSZahari Doychev 110*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 101 1 111*1668a55aSZahari Doychev check_err $? "Did not match on correct level" 112*1668a55aSZahari Doychev 113*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 102 0 114*1668a55aSZahari Doychev check_err $? "Matched on the wrong level" 115*1668a55aSZahari Doychev 116*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 103 1 117*1668a55aSZahari Doychev check_err $? "Did not match on correct level" 118*1668a55aSZahari Doychev 119*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 3 0 0 4)" 120*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 121*1668a55aSZahari Doychev 122*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 101 1 123*1668a55aSZahari Doychev check_err $? "Matched on the wrong level" 124*1668a55aSZahari Doychev 125*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 102 1 126*1668a55aSZahari Doychev check_err $? "Did not match on correct level" 127*1668a55aSZahari Doychev 128*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 103 1 129*1668a55aSZahari Doychev check_err $? "Matched on the wrong level" 130*1668a55aSZahari Doychev 131*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower 132*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower 133*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 103 flower 134*1668a55aSZahari Doychev 135*1668a55aSZahari Doychev log_test "CFM level match test" 136*1668a55aSZahari Doychev} 137*1668a55aSZahari Doychev 138*1668a55aSZahari Doychevmatch_cfm_level_and_opcode() 139*1668a55aSZahari Doychev{ 140*1668a55aSZahari Doychev local ethtype="89 02"; readonly ethtype 141*1668a55aSZahari Doychev RET=0 142*1668a55aSZahari Doychev 143*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \ 144*1668a55aSZahari Doychev flower cfm mdl 5 op 41 action drop 145*1668a55aSZahari Doychev tc filter add dev $h2 ingress protocol cfm pref 1 handle 102 \ 146*1668a55aSZahari Doychev flower cfm mdl 7 op 42 action drop 147*1668a55aSZahari Doychev 148*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 5 41 0 4)" 149*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 150*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 7 3 0 4)" 151*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 152*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 3 42 0 12)" 153*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 154*1668a55aSZahari Doychev 155*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 101 1 156*1668a55aSZahari Doychev check_err $? "Did not match on correct level and opcode" 157*1668a55aSZahari Doychev 158*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 102 0 159*1668a55aSZahari Doychev check_err $? "Matched on the wrong level and opcode" 160*1668a55aSZahari Doychev 161*1668a55aSZahari Doychev pkt="$ethtype $(generate_cfm_hdr 7 42 0 12)" 162*1668a55aSZahari Doychev $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q 163*1668a55aSZahari Doychev 164*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 101 1 165*1668a55aSZahari Doychev check_err $? "Matched on the wrong level and opcode" 166*1668a55aSZahari Doychev 167*1668a55aSZahari Doychev tc_check_packets "dev $h2 ingress" 102 1 168*1668a55aSZahari Doychev check_err $? "Did not match on correct level and opcode" 169*1668a55aSZahari Doychev 170*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower 171*1668a55aSZahari Doychev tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower 172*1668a55aSZahari Doychev 173*1668a55aSZahari Doychev log_test "CFM opcode and level match test" 174*1668a55aSZahari Doychev} 175*1668a55aSZahari Doychev 176*1668a55aSZahari Doychevsetup_prepare() 177*1668a55aSZahari Doychev{ 178*1668a55aSZahari Doychev h1=${NETIFS[p1]} 179*1668a55aSZahari Doychev h2=${NETIFS[p2]} 180*1668a55aSZahari Doychev h1mac=$(mac_get $h1) 181*1668a55aSZahari Doychev h2mac=$(mac_get $h2) 182*1668a55aSZahari Doychev 183*1668a55aSZahari Doychev vrf_prepare 184*1668a55aSZahari Doychev 185*1668a55aSZahari Doychev h1_create 186*1668a55aSZahari Doychev h2_create 187*1668a55aSZahari Doychev} 188*1668a55aSZahari Doychev 189*1668a55aSZahari Doychevcleanup() 190*1668a55aSZahari Doychev{ 191*1668a55aSZahari Doychev pre_cleanup 192*1668a55aSZahari Doychev 193*1668a55aSZahari Doychev h2_destroy 194*1668a55aSZahari Doychev h1_destroy 195*1668a55aSZahari Doychev 196*1668a55aSZahari Doychev vrf_cleanup 197*1668a55aSZahari Doychev} 198*1668a55aSZahari Doychev 199*1668a55aSZahari Doychevtrap cleanup EXIT 200*1668a55aSZahari Doychev 201*1668a55aSZahari Doychevsetup_prepare 202*1668a55aSZahari Doychevsetup_wait 203*1668a55aSZahari Doychev 204*1668a55aSZahari Doychevtests_run 205*1668a55aSZahari Doychev 206*1668a55aSZahari Doychevexit $EXIT_STATUS 207