1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun# Uncomment to see generated bytecode 5*4882a593Smuzhiyun#VERBOSE=verbose 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunNS1=lwt_ns1 8*4882a593SmuzhiyunNS2=lwt_ns2 9*4882a593SmuzhiyunVETH0=tst_lwt1a 10*4882a593SmuzhiyunVETH1=tst_lwt1b 11*4882a593SmuzhiyunVETH2=tst_lwt2a 12*4882a593SmuzhiyunVETH3=tst_lwt2b 13*4882a593SmuzhiyunIPVETH0="192.168.254.1" 14*4882a593SmuzhiyunIPVETH1="192.168.254.2" 15*4882a593SmuzhiyunIPVETH1b="192.168.254.3" 16*4882a593Smuzhiyun 17*4882a593SmuzhiyunIPVETH2="192.168.111.1" 18*4882a593SmuzhiyunIPVETH3="192.168.111.2" 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunIP_LOCAL="192.168.99.1" 21*4882a593Smuzhiyun 22*4882a593SmuzhiyunTRACE_ROOT=/sys/kernel/debug/tracing 23*4882a593Smuzhiyun 24*4882a593Smuzhiyunfunction lookup_mac() 25*4882a593Smuzhiyun{ 26*4882a593Smuzhiyun set +x 27*4882a593Smuzhiyun if [ ! -z "$2" ]; then 28*4882a593Smuzhiyun MAC=$(ip netns exec $2 ip link show $1 | grep ether | awk '{print $2}') 29*4882a593Smuzhiyun else 30*4882a593Smuzhiyun MAC=$(ip link show $1 | grep ether | awk '{print $2}') 31*4882a593Smuzhiyun fi 32*4882a593Smuzhiyun MAC="${MAC//:/}" 33*4882a593Smuzhiyun echo "0x${MAC:10:2}${MAC:8:2}${MAC:6:2}${MAC:4:2}${MAC:2:2}${MAC:0:2}" 34*4882a593Smuzhiyun set -x 35*4882a593Smuzhiyun} 36*4882a593Smuzhiyun 37*4882a593Smuzhiyunfunction cleanup { 38*4882a593Smuzhiyun set +ex 39*4882a593Smuzhiyun rm test_lwt_bpf.o 2> /dev/null 40*4882a593Smuzhiyun ip link del $VETH0 2> /dev/null 41*4882a593Smuzhiyun ip link del $VETH1 2> /dev/null 42*4882a593Smuzhiyun ip link del $VETH2 2> /dev/null 43*4882a593Smuzhiyun ip link del $VETH3 2> /dev/null 44*4882a593Smuzhiyun ip netns exec $NS1 killall netserver 45*4882a593Smuzhiyun ip netns delete $NS1 2> /dev/null 46*4882a593Smuzhiyun ip netns delete $NS2 2> /dev/null 47*4882a593Smuzhiyun set -ex 48*4882a593Smuzhiyun} 49*4882a593Smuzhiyun 50*4882a593Smuzhiyunfunction setup_one_veth { 51*4882a593Smuzhiyun ip netns add $1 52*4882a593Smuzhiyun ip link add $2 type veth peer name $3 53*4882a593Smuzhiyun ip link set dev $2 up 54*4882a593Smuzhiyun ip addr add $4/24 dev $2 55*4882a593Smuzhiyun ip link set $3 netns $1 56*4882a593Smuzhiyun ip netns exec $1 ip link set dev $3 up 57*4882a593Smuzhiyun ip netns exec $1 ip addr add $5/24 dev $3 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun if [ "$6" ]; then 60*4882a593Smuzhiyun ip netns exec $1 ip addr add $6/32 dev $3 61*4882a593Smuzhiyun fi 62*4882a593Smuzhiyun} 63*4882a593Smuzhiyun 64*4882a593Smuzhiyunfunction get_trace { 65*4882a593Smuzhiyun set +x 66*4882a593Smuzhiyun cat ${TRACE_ROOT}/trace | grep -v '^#' 67*4882a593Smuzhiyun set -x 68*4882a593Smuzhiyun} 69*4882a593Smuzhiyun 70*4882a593Smuzhiyunfunction cleanup_routes { 71*4882a593Smuzhiyun ip route del ${IPVETH1}/32 dev $VETH0 2> /dev/null || true 72*4882a593Smuzhiyun ip route del table local local ${IP_LOCAL}/32 dev lo 2> /dev/null || true 73*4882a593Smuzhiyun} 74*4882a593Smuzhiyun 75*4882a593Smuzhiyunfunction install_test { 76*4882a593Smuzhiyun cleanup_routes 77*4882a593Smuzhiyun cp /dev/null ${TRACE_ROOT}/trace 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun OPTS="encap bpf headroom 14 $1 obj test_lwt_bpf.o section $2 $VERBOSE" 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun if [ "$1" == "in" ]; then 82*4882a593Smuzhiyun ip route add table local local ${IP_LOCAL}/32 $OPTS dev lo 83*4882a593Smuzhiyun else 84*4882a593Smuzhiyun ip route add ${IPVETH1}/32 $OPTS dev $VETH0 85*4882a593Smuzhiyun fi 86*4882a593Smuzhiyun} 87*4882a593Smuzhiyun 88*4882a593Smuzhiyunfunction remove_prog { 89*4882a593Smuzhiyun if [ "$1" == "in" ]; then 90*4882a593Smuzhiyun ip route del table local local ${IP_LOCAL}/32 dev lo 91*4882a593Smuzhiyun else 92*4882a593Smuzhiyun ip route del ${IPVETH1}/32 dev $VETH0 93*4882a593Smuzhiyun fi 94*4882a593Smuzhiyun} 95*4882a593Smuzhiyun 96*4882a593Smuzhiyunfunction filter_trace { 97*4882a593Smuzhiyun # Add newline to allow starting EXPECT= variables on newline 98*4882a593Smuzhiyun NL=$'\n' 99*4882a593Smuzhiyun echo "${NL}$*" | sed -e 's/^.*: : //g' 100*4882a593Smuzhiyun} 101*4882a593Smuzhiyun 102*4882a593Smuzhiyunfunction expect_fail { 103*4882a593Smuzhiyun set +x 104*4882a593Smuzhiyun echo "FAIL:" 105*4882a593Smuzhiyun echo "Expected: $1" 106*4882a593Smuzhiyun echo "Got: $2" 107*4882a593Smuzhiyun set -x 108*4882a593Smuzhiyun exit 1 109*4882a593Smuzhiyun} 110*4882a593Smuzhiyun 111*4882a593Smuzhiyunfunction match_trace { 112*4882a593Smuzhiyun set +x 113*4882a593Smuzhiyun RET=0 114*4882a593Smuzhiyun TRACE=$1 115*4882a593Smuzhiyun EXPECT=$2 116*4882a593Smuzhiyun GOT="$(filter_trace "$TRACE")" 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun [ "$GOT" != "$EXPECT" ] && { 119*4882a593Smuzhiyun expect_fail "$EXPECT" "$GOT" 120*4882a593Smuzhiyun RET=1 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun set -x 123*4882a593Smuzhiyun return $RET 124*4882a593Smuzhiyun} 125*4882a593Smuzhiyun 126*4882a593Smuzhiyunfunction test_start { 127*4882a593Smuzhiyun set +x 128*4882a593Smuzhiyun echo "----------------------------------------------------------------" 129*4882a593Smuzhiyun echo "Starting test: $*" 130*4882a593Smuzhiyun echo "----------------------------------------------------------------" 131*4882a593Smuzhiyun set -x 132*4882a593Smuzhiyun} 133*4882a593Smuzhiyun 134*4882a593Smuzhiyunfunction failure { 135*4882a593Smuzhiyun get_trace 136*4882a593Smuzhiyun echo "FAIL: $*" 137*4882a593Smuzhiyun exit 1 138*4882a593Smuzhiyun} 139*4882a593Smuzhiyun 140*4882a593Smuzhiyunfunction test_ctx_xmit { 141*4882a593Smuzhiyun test_start "test_ctx on lwt xmit" 142*4882a593Smuzhiyun install_test xmit test_ctx 143*4882a593Smuzhiyun ping -c 3 $IPVETH1 || { 144*4882a593Smuzhiyun failure "test_ctx xmit: packets are dropped" 145*4882a593Smuzhiyun } 146*4882a593Smuzhiyun match_trace "$(get_trace)" " 147*4882a593Smuzhiyunlen 84 hash 0 protocol 8 148*4882a593Smuzhiyuncb 1234 ingress_ifindex 0 ifindex $DST_IFINDEX 149*4882a593Smuzhiyunlen 84 hash 0 protocol 8 150*4882a593Smuzhiyuncb 1234 ingress_ifindex 0 ifindex $DST_IFINDEX 151*4882a593Smuzhiyunlen 84 hash 0 protocol 8 152*4882a593Smuzhiyuncb 1234 ingress_ifindex 0 ifindex $DST_IFINDEX" || exit 1 153*4882a593Smuzhiyun remove_prog xmit 154*4882a593Smuzhiyun} 155*4882a593Smuzhiyun 156*4882a593Smuzhiyunfunction test_ctx_out { 157*4882a593Smuzhiyun test_start "test_ctx on lwt out" 158*4882a593Smuzhiyun install_test out test_ctx 159*4882a593Smuzhiyun ping -c 3 $IPVETH1 || { 160*4882a593Smuzhiyun failure "test_ctx out: packets are dropped" 161*4882a593Smuzhiyun } 162*4882a593Smuzhiyun match_trace "$(get_trace)" " 163*4882a593Smuzhiyunlen 84 hash 0 protocol 0 164*4882a593Smuzhiyuncb 1234 ingress_ifindex 0 ifindex 0 165*4882a593Smuzhiyunlen 84 hash 0 protocol 0 166*4882a593Smuzhiyuncb 1234 ingress_ifindex 0 ifindex 0 167*4882a593Smuzhiyunlen 84 hash 0 protocol 0 168*4882a593Smuzhiyuncb 1234 ingress_ifindex 0 ifindex 0" || exit 1 169*4882a593Smuzhiyun remove_prog out 170*4882a593Smuzhiyun} 171*4882a593Smuzhiyun 172*4882a593Smuzhiyunfunction test_ctx_in { 173*4882a593Smuzhiyun test_start "test_ctx on lwt in" 174*4882a593Smuzhiyun install_test in test_ctx 175*4882a593Smuzhiyun ping -c 3 $IP_LOCAL || { 176*4882a593Smuzhiyun failure "test_ctx out: packets are dropped" 177*4882a593Smuzhiyun } 178*4882a593Smuzhiyun # We will both request & reply packets as the packets will 179*4882a593Smuzhiyun # be from $IP_LOCAL => $IP_LOCAL 180*4882a593Smuzhiyun match_trace "$(get_trace)" " 181*4882a593Smuzhiyunlen 84 hash 0 protocol 8 182*4882a593Smuzhiyuncb 1234 ingress_ifindex 1 ifindex 1 183*4882a593Smuzhiyunlen 84 hash 0 protocol 8 184*4882a593Smuzhiyuncb 1234 ingress_ifindex 1 ifindex 1 185*4882a593Smuzhiyunlen 84 hash 0 protocol 8 186*4882a593Smuzhiyuncb 1234 ingress_ifindex 1 ifindex 1 187*4882a593Smuzhiyunlen 84 hash 0 protocol 8 188*4882a593Smuzhiyuncb 1234 ingress_ifindex 1 ifindex 1 189*4882a593Smuzhiyunlen 84 hash 0 protocol 8 190*4882a593Smuzhiyuncb 1234 ingress_ifindex 1 ifindex 1 191*4882a593Smuzhiyunlen 84 hash 0 protocol 8 192*4882a593Smuzhiyuncb 1234 ingress_ifindex 1 ifindex 1" || exit 1 193*4882a593Smuzhiyun remove_prog in 194*4882a593Smuzhiyun} 195*4882a593Smuzhiyun 196*4882a593Smuzhiyunfunction test_data { 197*4882a593Smuzhiyun test_start "test_data on lwt $1" 198*4882a593Smuzhiyun install_test $1 test_data 199*4882a593Smuzhiyun ping -c 3 $IPVETH1 || { 200*4882a593Smuzhiyun failure "test_data ${1}: packets are dropped" 201*4882a593Smuzhiyun } 202*4882a593Smuzhiyun match_trace "$(get_trace)" " 203*4882a593Smuzhiyunsrc: 1fea8c0 dst: 2fea8c0 204*4882a593Smuzhiyunsrc: 1fea8c0 dst: 2fea8c0 205*4882a593Smuzhiyunsrc: 1fea8c0 dst: 2fea8c0" || exit 1 206*4882a593Smuzhiyun remove_prog $1 207*4882a593Smuzhiyun} 208*4882a593Smuzhiyun 209*4882a593Smuzhiyunfunction test_data_in { 210*4882a593Smuzhiyun test_start "test_data on lwt in" 211*4882a593Smuzhiyun install_test in test_data 212*4882a593Smuzhiyun ping -c 3 $IP_LOCAL || { 213*4882a593Smuzhiyun failure "test_data in: packets are dropped" 214*4882a593Smuzhiyun } 215*4882a593Smuzhiyun # We will both request & reply packets as the packets will 216*4882a593Smuzhiyun # be from $IP_LOCAL => $IP_LOCAL 217*4882a593Smuzhiyun match_trace "$(get_trace)" " 218*4882a593Smuzhiyunsrc: 163a8c0 dst: 163a8c0 219*4882a593Smuzhiyunsrc: 163a8c0 dst: 163a8c0 220*4882a593Smuzhiyunsrc: 163a8c0 dst: 163a8c0 221*4882a593Smuzhiyunsrc: 163a8c0 dst: 163a8c0 222*4882a593Smuzhiyunsrc: 163a8c0 dst: 163a8c0 223*4882a593Smuzhiyunsrc: 163a8c0 dst: 163a8c0" || exit 1 224*4882a593Smuzhiyun remove_prog in 225*4882a593Smuzhiyun} 226*4882a593Smuzhiyun 227*4882a593Smuzhiyunfunction test_cb { 228*4882a593Smuzhiyun test_start "test_cb on lwt $1" 229*4882a593Smuzhiyun install_test $1 test_cb 230*4882a593Smuzhiyun ping -c 3 $IPVETH1 || { 231*4882a593Smuzhiyun failure "test_cb ${1}: packets are dropped" 232*4882a593Smuzhiyun } 233*4882a593Smuzhiyun match_trace "$(get_trace)" " 234*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 235*4882a593Smuzhiyuncb3: 0 cb4: 0 236*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 237*4882a593Smuzhiyuncb3: 0 cb4: 0 238*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 239*4882a593Smuzhiyuncb3: 0 cb4: 0" || exit 1 240*4882a593Smuzhiyun remove_prog $1 241*4882a593Smuzhiyun} 242*4882a593Smuzhiyun 243*4882a593Smuzhiyunfunction test_cb_in { 244*4882a593Smuzhiyun test_start "test_cb on lwt in" 245*4882a593Smuzhiyun install_test in test_cb 246*4882a593Smuzhiyun ping -c 3 $IP_LOCAL || { 247*4882a593Smuzhiyun failure "test_cb in: packets are dropped" 248*4882a593Smuzhiyun } 249*4882a593Smuzhiyun # We will both request & reply packets as the packets will 250*4882a593Smuzhiyun # be from $IP_LOCAL => $IP_LOCAL 251*4882a593Smuzhiyun match_trace "$(get_trace)" " 252*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 253*4882a593Smuzhiyuncb3: 0 cb4: 0 254*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 255*4882a593Smuzhiyuncb3: 0 cb4: 0 256*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 257*4882a593Smuzhiyuncb3: 0 cb4: 0 258*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 259*4882a593Smuzhiyuncb3: 0 cb4: 0 260*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 261*4882a593Smuzhiyuncb3: 0 cb4: 0 262*4882a593Smuzhiyuncb0: 0 cb1: 0 cb2: 0 263*4882a593Smuzhiyuncb3: 0 cb4: 0" || exit 1 264*4882a593Smuzhiyun remove_prog in 265*4882a593Smuzhiyun} 266*4882a593Smuzhiyun 267*4882a593Smuzhiyunfunction test_drop_all { 268*4882a593Smuzhiyun test_start "test_drop_all on lwt $1" 269*4882a593Smuzhiyun install_test $1 drop_all 270*4882a593Smuzhiyun ping -c 3 $IPVETH1 && { 271*4882a593Smuzhiyun failure "test_drop_all ${1}: Unexpected success of ping" 272*4882a593Smuzhiyun } 273*4882a593Smuzhiyun match_trace "$(get_trace)" " 274*4882a593Smuzhiyundropping with: 2 275*4882a593Smuzhiyundropping with: 2 276*4882a593Smuzhiyundropping with: 2" || exit 1 277*4882a593Smuzhiyun remove_prog $1 278*4882a593Smuzhiyun} 279*4882a593Smuzhiyun 280*4882a593Smuzhiyunfunction test_drop_all_in { 281*4882a593Smuzhiyun test_start "test_drop_all on lwt in" 282*4882a593Smuzhiyun install_test in drop_all 283*4882a593Smuzhiyun ping -c 3 $IP_LOCAL && { 284*4882a593Smuzhiyun failure "test_drop_all in: Unexpected success of ping" 285*4882a593Smuzhiyun } 286*4882a593Smuzhiyun match_trace "$(get_trace)" " 287*4882a593Smuzhiyundropping with: 2 288*4882a593Smuzhiyundropping with: 2 289*4882a593Smuzhiyundropping with: 2" || exit 1 290*4882a593Smuzhiyun remove_prog in 291*4882a593Smuzhiyun} 292*4882a593Smuzhiyun 293*4882a593Smuzhiyunfunction test_push_ll_and_redirect { 294*4882a593Smuzhiyun test_start "test_push_ll_and_redirect on lwt xmit" 295*4882a593Smuzhiyun install_test xmit push_ll_and_redirect 296*4882a593Smuzhiyun ping -c 3 $IPVETH1 || { 297*4882a593Smuzhiyun failure "Redirected packets appear to be dropped" 298*4882a593Smuzhiyun } 299*4882a593Smuzhiyun match_trace "$(get_trace)" " 300*4882a593Smuzhiyunredirected to $DST_IFINDEX 301*4882a593Smuzhiyunredirected to $DST_IFINDEX 302*4882a593Smuzhiyunredirected to $DST_IFINDEX" || exit 1 303*4882a593Smuzhiyun remove_prog xmit 304*4882a593Smuzhiyun} 305*4882a593Smuzhiyun 306*4882a593Smuzhiyunfunction test_no_l2_and_redirect { 307*4882a593Smuzhiyun test_start "test_no_l2_and_redirect on lwt xmit" 308*4882a593Smuzhiyun install_test xmit fill_garbage_and_redirect 309*4882a593Smuzhiyun ping -c 3 $IPVETH1 && { 310*4882a593Smuzhiyun failure "Unexpected success despite lack of L2 header" 311*4882a593Smuzhiyun } 312*4882a593Smuzhiyun match_trace "$(get_trace)" " 313*4882a593Smuzhiyunredirected to $DST_IFINDEX 314*4882a593Smuzhiyunredirected to $DST_IFINDEX 315*4882a593Smuzhiyunredirected to $DST_IFINDEX" || exit 1 316*4882a593Smuzhiyun remove_prog xmit 317*4882a593Smuzhiyun} 318*4882a593Smuzhiyun 319*4882a593Smuzhiyunfunction test_rewrite { 320*4882a593Smuzhiyun test_start "test_rewrite on lwt xmit" 321*4882a593Smuzhiyun install_test xmit test_rewrite 322*4882a593Smuzhiyun ping -c 3 $IPVETH1 || { 323*4882a593Smuzhiyun failure "Rewritten packets appear to be dropped" 324*4882a593Smuzhiyun } 325*4882a593Smuzhiyun match_trace "$(get_trace)" " 326*4882a593Smuzhiyunout: rewriting from 2fea8c0 to 3fea8c0 327*4882a593Smuzhiyunout: rewriting from 2fea8c0 to 3fea8c0 328*4882a593Smuzhiyunout: rewriting from 2fea8c0 to 3fea8c0" || exit 1 329*4882a593Smuzhiyun remove_prog out 330*4882a593Smuzhiyun} 331*4882a593Smuzhiyun 332*4882a593Smuzhiyunfunction test_fill_garbage { 333*4882a593Smuzhiyun test_start "test_fill_garbage on lwt xmit" 334*4882a593Smuzhiyun install_test xmit fill_garbage 335*4882a593Smuzhiyun ping -c 3 $IPVETH1 && { 336*4882a593Smuzhiyun failure "test_drop_all ${1}: Unexpected success of ping" 337*4882a593Smuzhiyun } 338*4882a593Smuzhiyun match_trace "$(get_trace)" " 339*4882a593SmuzhiyunSet initial 96 bytes of header to FF 340*4882a593SmuzhiyunSet initial 96 bytes of header to FF 341*4882a593SmuzhiyunSet initial 96 bytes of header to FF" || exit 1 342*4882a593Smuzhiyun remove_prog xmit 343*4882a593Smuzhiyun} 344*4882a593Smuzhiyun 345*4882a593Smuzhiyunfunction test_netperf_nop { 346*4882a593Smuzhiyun test_start "test_netperf_nop on lwt xmit" 347*4882a593Smuzhiyun install_test xmit nop 348*4882a593Smuzhiyun netperf -H $IPVETH1 -t TCP_STREAM || { 349*4882a593Smuzhiyun failure "packets appear to be dropped" 350*4882a593Smuzhiyun } 351*4882a593Smuzhiyun match_trace "$(get_trace)" ""|| exit 1 352*4882a593Smuzhiyun remove_prog xmit 353*4882a593Smuzhiyun} 354*4882a593Smuzhiyun 355*4882a593Smuzhiyunfunction test_netperf_redirect { 356*4882a593Smuzhiyun test_start "test_netperf_redirect on lwt xmit" 357*4882a593Smuzhiyun install_test xmit push_ll_and_redirect_silent 358*4882a593Smuzhiyun netperf -H $IPVETH1 -t TCP_STREAM || { 359*4882a593Smuzhiyun failure "Rewritten packets appear to be dropped" 360*4882a593Smuzhiyun } 361*4882a593Smuzhiyun match_trace "$(get_trace)" ""|| exit 1 362*4882a593Smuzhiyun remove_prog xmit 363*4882a593Smuzhiyun} 364*4882a593Smuzhiyun 365*4882a593Smuzhiyuncleanup 366*4882a593Smuzhiyunsetup_one_veth $NS1 $VETH0 $VETH1 $IPVETH0 $IPVETH1 $IPVETH1b 367*4882a593Smuzhiyunsetup_one_veth $NS2 $VETH2 $VETH3 $IPVETH2 $IPVETH3 368*4882a593Smuzhiyunip netns exec $NS1 netserver 369*4882a593Smuzhiyunecho 1 > ${TRACE_ROOT}/tracing_on 370*4882a593Smuzhiyun 371*4882a593SmuzhiyunDST_MAC=$(lookup_mac $VETH1 $NS1) 372*4882a593SmuzhiyunSRC_MAC=$(lookup_mac $VETH0) 373*4882a593SmuzhiyunDST_IFINDEX=$(cat /sys/class/net/$VETH0/ifindex) 374*4882a593Smuzhiyun 375*4882a593SmuzhiyunCLANG_OPTS="-O2 -target bpf -I ../include/" 376*4882a593SmuzhiyunCLANG_OPTS+=" -DSRC_MAC=$SRC_MAC -DDST_MAC=$DST_MAC -DDST_IFINDEX=$DST_IFINDEX" 377*4882a593Smuzhiyunclang $CLANG_OPTS -c test_lwt_bpf.c -o test_lwt_bpf.o 378*4882a593Smuzhiyun 379*4882a593Smuzhiyuntest_ctx_xmit 380*4882a593Smuzhiyuntest_ctx_out 381*4882a593Smuzhiyuntest_ctx_in 382*4882a593Smuzhiyuntest_data "xmit" 383*4882a593Smuzhiyuntest_data "out" 384*4882a593Smuzhiyuntest_data_in 385*4882a593Smuzhiyuntest_cb "xmit" 386*4882a593Smuzhiyuntest_cb "out" 387*4882a593Smuzhiyuntest_cb_in 388*4882a593Smuzhiyuntest_drop_all "xmit" 389*4882a593Smuzhiyuntest_drop_all "out" 390*4882a593Smuzhiyuntest_drop_all_in 391*4882a593Smuzhiyuntest_rewrite 392*4882a593Smuzhiyuntest_push_ll_and_redirect 393*4882a593Smuzhiyuntest_no_l2_and_redirect 394*4882a593Smuzhiyuntest_fill_garbage 395*4882a593Smuzhiyuntest_netperf_nop 396*4882a593Smuzhiyuntest_netperf_redirect 397*4882a593Smuzhiyun 398*4882a593Smuzhiyuncleanup 399*4882a593Smuzhiyunecho 0 > ${TRACE_ROOT}/tracing_on 400*4882a593Smuzhiyunexit 0 401