(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:MY_DIR) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(dirname)} {($ VSub_Number "$0")})]) left_token: <Left_CommandSub "$("> spids: [5 9] ) } spids: [4] ) ] spids: [4] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:BPF_CGRP2_ARRAY_NAME) op: Equal rhs: {(SQ <test_cgrp2_array_pin>)} spids: [14] ) ] spids: [14] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:BPF_PROG) op: Equal rhs: {(DQ ($ VSub_Name "$MY_DIR") (/test_cgrp2_tc_kern.o))} spids: [19] ) ] spids: [19] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:BPF_SECTION) op:Equal rhs:{(SQ <filter>)} spids:[25])] spids: [25] ) (AndOr children: [ (C {(Lit_Other "[")} {(-z)} {(DQ ($ VSub_Name "$TC"))} {(Lit_Other "]")}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:TC) op:Equal rhs:{(SQ <tc>)} spids:[43])] spids: [43] ) ] op_id: Op_DAmp ) (AndOr children: [ (C {(Lit_Other "[")} {(-z)} {(DQ ($ VSub_Name "$IP"))} {(Lit_Other "]")}) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:IP) op:Equal rhs:{(SQ <ip>)} spids:[60])] spids: [60] ) ] op_id: Op_DAmp ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:HOST_IFC) op:Equal rhs:{(SQ <ve>)} spids:[69])] spids: [69] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:NS_IFC) op:Equal rhs:{(SQ <vens>)} spids:[74])] spids: [74] ) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:NS) op:Equal rhs:{(SQ <ns>)} spids:[79])] spids: [79] ) (FuncDef name: find_mnt body: (BraceGroup children: [ (Pipeline children: [ (C {(cat)} {(/proc/mounts)}) (C {(awk)} {(SQ <"{ if ($3 == \"">) ($ VSub_Number "$1") (SQ <"\" && mnt == \"\") { mnt = $2 }} END { print mnt }">) } ) ] negated: False ) ] spids: [89] ) spids: [85 88] ) (FuncDef name: init_cgrp2_vars body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CGRP2_ROOT) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(find_mnt)} {(cgroup2)})]) left_token: <Left_CommandSub "$("> spids: [124 128] ) } spids: [123] ) ] spids: [123] ) (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(-z)} {(DQ ($ VSub_Name "$CGRP2_ROOT"))} {(Lit_Other "]")}) ] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CGRP2_ROOT) op: Equal rhs: {(SQ </mnt/cgroup2>)} spids: [147] ) ] spids: [147] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:MOUNT_CGRP2) op: Equal rhs: {(DQ (yes))} spids: [153] ) ] spids: [153] ) ] spids: [-1 144] ) ] spids: [-1 159] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CGRP2_TC) op: Equal rhs: {(DQ ($ VSub_Name "$CGRP2_ROOT") (/tc))} spids: [162] ) ] spids: [162] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:CGRP2_TC_LEAF) op: Equal rhs: {(DQ ($ VSub_Name "$CGRP2_TC") (/leaf))} spids: [169] ) ] spids: [169] ) ] spids: [120] ) spids: [116 119] ) (FuncDef name: init_bpf_fs_vars body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:bpf_fs_root) op: Equal rhs: { (CommandSubPart command_list: (CommandList children:[(C {(find_mnt)} {(bpf)})]) left_token: <Left_CommandSub "$("> spids: [191 195] ) } spids: [190] ) ] spids: [188] ) (AndOr children: [ (C {(Lit_Other "[")} {(-n)} {(DQ ($ VSub_Name "$bpf_fs_root"))} {(Lit_Other "]")}) (ControlFlow token:<ControlFlow_Return return> arg_word:{(-1)}) ] op_id: Op_DPipe ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:BPF_FS_TC_SHARE) op: Equal rhs: {(DQ ($ VSub_Name "$bpf_fs_root") (/tc/globals))} spids: [215] ) ] spids: [215] ) ] spids: [185] ) spids: [181 184] ) (FuncDef name: setup_cgrp2 body: (BraceGroup children: [ (Case to_match: {($ VSub_Number "$1")} arms: [ (case_arm pat_list: [{(start)}] action: [ (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$MOUNT_CGRP2"))} {(Lit_Other "=") (Lit_Other "=")} {(SQ <yes>)} {(Lit_Other "]")} ) ] action: [ (AndOr children: [ (C {(Lit_Other "[")} {(-d)} {($ VSub_Name "$CGRP2_ROOT")} {(Lit_Other "]")} ) (C {(mkdir)} {(-p)} {($ VSub_Name "$CGRP2_ROOT")}) ] op_id: Op_DPipe ) (AndOr children: [ (C {(mount)} {(-t)} {(cgroup2)} {(none)} {($ VSub_Name "$CGRP2_ROOT")}) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) ] spids: [-1 260] ) ] spids: [-1 297] ) (C {(mkdir)} {(-p)} {($ VSub_Name "$CGRP2_TC_LEAF")}) ] spids: [238 239 307 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (AndOr children: [ (C {(rmdir)} {($ VSub_Name "$CGRP2_TC_LEAF")}) (C {(rmdir)} {($ VSub_Name "$CGRP2_TC")}) ] op_id: Op_DAmp ) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$MOUNT_CGRP2"))} {(Lit_Other "=") (Lit_Other "=")} {(SQ <yes>)} {(Lit_Other "]")} ) (C {(umount)} {($ VSub_Name "$CGRP2_ROOT")}) ] op_id: Op_DAmp ) ] spids: [310 311 347 -1] ) ] spids: [231 235 350] ) ] spids: [228] ) spids: [224 227] ) (FuncDef name: setup_bpf_cgrp2_array body: (BraceGroup children: [ (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:bpf_cgrp2_array) op: Equal rhs: {(DQ ($ VSub_Name "$BPF_FS_TC_SHARE") (/) ($ VSub_Name "$BPF_CGRP2_ARRAY_NAME"))} spids: [364] ) ] spids: [362] ) (Case to_match: {($ VSub_Number "$1")} arms: [ (case_arm pat_list: [{(start)}] action: [ (C {($ VSub_Name "$MY_DIR") (/test_cgrp2_array_pin)} {(-U)} {($ VSub_Name "$bpf_cgrp2_array")} {(-v)} {($ VSub_Name "$CGRP2_TC")} ) ] spids: [379 380 395 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (AndOr children: [ (C {(Lit_Other "[")} {(-d)} {(DQ ($ VSub_Name "$BPF_FS_TC_SHARE"))} {(Lit_Other "]")} ) (C {(rm)} {(-f)} {($ VSub_Name "$bpf_cgrp2_array")}) ] op_id: Op_DAmp ) ] spids: [398 399 421 -1] ) ] spids: [372 376 424] ) ] spids: [359] ) spids: [355 358] ) (FuncDef name: setup_net body: (BraceGroup children: [ (Case to_match: {($ VSub_Number "$1")} arms: [ (case_arm pat_list: [{(start)}] action: [ (AndOr children: [ (C {($ VSub_Name "$IP")} {(link)} {(add)} {($ VSub_Name "$HOST_IFC")} {(type)} {(veth)} {(peer)} {(name)} {($ VSub_Name "$NS_IFC")} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (AndOr children: [ (C {($ VSub_Name "$IP")} {(link)} {(set)} {(dev)} {($ VSub_Name "$HOST_IFC")} {(up)} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (C {(sysctl)} {(-q)} {(net.ipv6.conf.) ($ VSub_Name "$HOST_IFC") (.accept_dad) (Lit_Other "=") (0)} ) (AndOr children: [ (C {($ VSub_Name "$IP")} {(netns)} {(add)} {(ns)}) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (AndOr children: [ (C {($ VSub_Name "$IP")} {(link)} {(set)} {(dev)} {($ VSub_Name "$NS_IFC")} {(netns)} {(ns)} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (AndOr children: [ (C {($ VSub_Name "$IP")} {(-n)} {($ VSub_Name "$NS")} {(link)} {(set)} {(dev)} {($ VSub_Name "$NS_IFC")} {(up)} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (C {($ VSub_Name "$IP")} {(netns)} {(exec)} {($ VSub_Name "$NS")} {(sysctl)} {(-q)} {(net.ipv6.conf.) ($ VSub_Name "$NS_IFC") (.accept_dad) (Lit_Other "=") (0)} ) (AndOr children: [ (C {($ VSub_Name "$TC")} {(qdisc)} {(add)} {(dev)} {($ VSub_Name "$HOST_IFC")} {(clsact)} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) (AndOr children: [ (C {($ VSub_Name "$TC")} {(filter)} {(add)} {(dev)} {($ VSub_Name "$HOST_IFC")} {(egress)} {(bpf)} {(da)} {(obj)} {($ VSub_Name "$BPF_PROG")} {(sec)} {($ VSub_Name "$BPF_SECTION")} ) (ControlFlow token: <ControlFlow_Return return> arg_word: {($ VSub_QMark "$?")} ) ] op_id: Op_DPipe ) ] spids: [443 444 631 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (C {($ VSub_Name "$IP")} {(netns)} {(del)} {($ VSub_Name "$NS")}) (C {($ VSub_Name "$IP")} {(link)} {(del)} {($ VSub_Name "$HOST_IFC")}) ] spids: [634 635 656 -1] ) ] spids: [436 440 659] ) ] spids: [433] ) spids: [429 432] ) (FuncDef name: run_in_cgrp body: (BraceGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:cmd) op: Equal rhs: {(SQ <"echo $$ > ">)} spids: [679] ) ] spids: [679] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:cmd) op: Equal rhs: { (DQ ($ VSub_Name "$cmd") (" ") ($ VSub_Number "$1") ("/cgroup.procs; exec ") ($ VSub_Number "$2") ) } spids: [685] ) ] spids: [685] ) (C {(bash)} {(-c)} {(DQ ($ VSub_Name "$cmd"))}) ] spids: [668] ) spids: [664 667] ) (FuncDef name: do_test body: (BraceGroup children: [ (C {(run_in_cgrp)} {($ VSub_Name "$CGRP2_TC_LEAF")} {(DQ ("ping -6 -c3 ff02::1%") ($ VSub_Name "$HOST_IFC") (" >& /dev/null"))} ) (Assignment keyword: Assign_Local pairs: [ (assign_pair lhs: (LhsName name:dropped) op: Equal rhs: { (CommandSubPart command_list: (CommandList children: [ (Pipeline children: [ (C {($ VSub_Name "$TC")} {(-s)} {(qdisc)} {(show)} {(dev)} {($ VSub_Name "$HOST_IFC")} ) (C {(tail)} {(-3)}) (C {(awk)} {(SQ <"/drop/{print substr($7, 0, index($7, \",\")-1)}">)}) ] negated: False ) ] ) left_token: <Left_CommandSub "$("> spids: [727 755] ) } spids: [726] ) ] spids: [724] ) (If arms: [ (if_arm cond: [ (DBracket expr: (BoolBinary op_id: BoolBinary_eq left: {($ VSub_Name "$dropped")} right: {(0)} ) ) ] action: [ (C {(echo)} {(DQ (FAIL))}) (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)}) ] spids: [-1 771] ) ] else_action: [ (C {(echo)} {(DQ ("Successfully filtered ") ($ VSub_Name "$dropped") (" packets"))}) (ControlFlow token:<ControlFlow_Return return> arg_word:{(0)}) ] spids: [786 803] ) ] spids: [710] ) spids: [706 709] ) (FuncDef name: do_exit body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$DEBUG"))} {(Lit_Other "=") (Lit_Other "=")} {(DQ (yes))} {(Lit_Other "]")} ) (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$MODE"))} {(KW_Bang "!") (Lit_Other "=")} {(SQ <cleanuponly>)} {(Lit_Other "]")} ) ] op_id: Op_DAmp ) ] action: [ (C {(echo)} {(DQ ("------ DEBUG ------"))}) (Sentence child: (C {(echo)} {(DQ ("mount: "))}) terminator: <Op_Semi ";"> ) (Sentence child: (Pipeline children: [(C {(mount)}) (C {(egrep)} {(SQ <"(cgroup2|bpf)">)})] negated: False ) terminator: <Op_Semi ";"> ) (C {(echo)}) (Sentence child: (C {(echo)} {(DQ ($ VSub_Name "$CGRP2_TC_LEAF") (": "))}) terminator: <Op_Semi ";"> ) (Sentence child: (C {(ls)} {(-l)} {($ VSub_Name "$CGRP2_TC_LEAF")}) terminator: <Op_Semi ";"> ) (C {(echo)}) (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(-d)} {(DQ ($ VSub_Name "$BPF_FS_TC_SHARE"))} {(Lit_Other "]")} ) ] action: [ (Sentence child: (C {(echo)} {(DQ ($ VSub_Name "$BPF_FS_TC_SHARE") (": "))}) terminator: <Op_Semi ";"> ) (Sentence child: (C {(ls)} {(-l)} {($ VSub_Name "$BPF_FS_TC_SHARE")}) terminator: <Op_Semi ";"> ) (C {(echo)}) ] spids: [-1 912] ) ] spids: [-1 933] ) (C {(echo)} {(DQ ("Host net:"))}) (C {($ VSub_Name "$IP")} {(netns)}) (C {($ VSub_Name "$IP")} {(link)} {(show)} {(dev)} {($ VSub_Name "$HOST_IFC")}) (C {($ VSub_Name "$IP")} {(-6)} {(a)} {(show)} {(dev)} {($ VSub_Name "$HOST_IFC")}) (C {($ VSub_Name "$TC")} {(-s)} {(qdisc)} {(show)} {(dev)} {($ VSub_Name "$HOST_IFC")}) (C {(echo)}) (C {(echo)} {(DQ ($ VSub_Name "$NS") (" net:"))}) (C {($ VSub_Name "$IP")} {(-n)} {($ VSub_Name "$NS")} {(link)} {(show)} {(dev)} {($ VSub_Name "$NS_IFC")} ) (C {($ VSub_Name "$IP")} {(-n)} {($ VSub_Name "$NS")} {(-6)} {(link)} {(show)} {(dev)} {($ VSub_Name "$NS_IFC")} ) (C {(echo)} {(DQ ("------ DEBUG ------"))}) (C {(echo)}) ] spids: [-1 850] ) ] spids: [-1 1038] ) (If arms: [ (if_arm cond: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$MODE"))} {(KW_Bang "!") (Lit_Other "=")} {(SQ <nocleanup>)} {(Lit_Other "]")} ) ] action: [ (C {(setup_net)} {(stop)}) (C {(setup_bpf_cgrp2_array)} {(stop)}) (C {(setup_cgrp2)} {(stop)}) ] spids: [-1 1060] ) ] spids: [-1 1078] ) ] spids: [812] ) spids: [808 811] ) (C {(init_cgrp2_vars)}) (C {(init_bpf_fs_vars)}) (While cond: [(DBracket expr:(BoolBinary op_id:BoolBinary_ge left:{($ VSub_Pound "$#")} right:{(1)}))] body: (DoGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:a) op: Equal rhs: {(DQ ($ VSub_Number "$1"))} spids: [1103] ) ] spids: [1103] ) (Case to_match: {($ VSub_Name "$a")} arms: [ (case_arm pat_list: [{(debug)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:DEBUG) op: Equal rhs: {(SQ <yes>)} spids: [1120] ) ] spids: [1120] ) (C {(shift)} {(1)}) ] spids: [1116 1117 1131 -1] ) (case_arm pat_list: [{(cleanup-only)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:MODE) op: Equal rhs: {(SQ <cleanuponly>)} spids: [1138] ) ] spids: [1138] ) (C {(shift)} {(1)}) ] spids: [1134 1135 1149 -1] ) (case_arm pat_list: [{(no-cleanup)}] action: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:MODE) op: Equal rhs: {(SQ <nocleanup>)} spids: [1156] ) ] spids: [1156] ) (C {(shift)} {(1)}) ] spids: [1152 1153 1167 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (C {(echo)} {(DQ ("test_cgrp2_tc [debug] [cleanup-only | no-cleanup]"))}) (C {(echo)} {(DQ (" debug: Print cgrp and network setup details at the end of the test"))} ) (C {(echo)} { (DQ ( " cleanup-only: Try to cleanup things from last test. No test will be run" ) ) } ) (C {(echo)} {(DQ (" no-cleanup: Run the test but don't do cleanup at the end"))}) (C {(echo)} { (DQ ( "[Note: If no arg is given, it will run the test and do cleanup at the end]" ) ) } ) (C {(echo)}) (C {(exit)} {(-1)}) ] spids: [1170 1171 1217 -1] ) ] spids: [1109 1113 1220] ) ] spids: [1100 1222] ) ) (C {(trap)} {(do_exit)} {(0)}) (AndOr children: [ (C {(Lit_Other "[")} {(DQ ($ VSub_Name "$MODE"))} {(Lit_Other "=") (Lit_Other "=")} {(SQ <cleanuponly>)} {(Lit_Other "]")} ) (C {(exit)}) ] op_id: Op_DAmp ) (AndOr children: [(C {(setup_cgrp2)} {(start)}) (C {(exit)} {($ VSub_QMark "$?")})] op_id: Op_DPipe ) (AndOr children: [(C {(setup_net)} {(start)}) (C {(exit)} {($ VSub_QMark "$?")})] op_id: Op_DPipe ) (AndOr children:[(C {(init_bpf_fs_vars)})(C {(exit)} {($ VSub_QMark "$?")})] op_id:Op_DPipe) (AndOr children: [(C {(setup_bpf_cgrp2_array)} {(start)}) (C {(exit)} {($ VSub_QMark "$?")})] op_id: Op_DPipe ) (C {(do_test)}) (C {(echo)}) ] )