1*de1e4e89SAndroid Build Coastguard Worker# tc(8) completion -*- shell-script -*- 2*de1e4e89SAndroid Build Coastguard Worker# Copyright 2016 6WIND S.A. 3*de1e4e89SAndroid Build Coastguard Worker# Copyright 2016 Quentin Monnet <[email protected]> 4*de1e4e89SAndroid Build Coastguard Worker 5*de1e4e89SAndroid Build Coastguard WorkerQDISC_KIND=' choke codel bfifo pfifo pfifo_head_drop fq fq_codel gred hhf \ 6*de1e4e89SAndroid Build Coastguard Worker mqprio multiq netem pfifo_fast pie red rr sfb sfq tbf atm cbq drr \ 7*de1e4e89SAndroid Build Coastguard Worker dsmark hfsc htb prio qfq ' 8*de1e4e89SAndroid Build Coastguard WorkerFILTER_KIND=' basic bpf cgroup flow flower fw route rsvp tcindex u32 matchall ' 9*de1e4e89SAndroid Build Coastguard WorkerACTION_KIND=' gact mirred bpf sample ' 10*de1e4e89SAndroid Build Coastguard Worker 11*de1e4e89SAndroid Build Coastguard Worker# Takes a list of words in argument; each one of them is added to COMPREPLY if 12*de1e4e89SAndroid Build Coastguard Worker# it is not already present on the command line. Returns no value. 13*de1e4e89SAndroid Build Coastguard Worker_tc_once_attr() 14*de1e4e89SAndroid Build Coastguard Worker{ 15*de1e4e89SAndroid Build Coastguard Worker local w subcword found 16*de1e4e89SAndroid Build Coastguard Worker for w in $*; do 17*de1e4e89SAndroid Build Coastguard Worker found=0 18*de1e4e89SAndroid Build Coastguard Worker for (( subcword=3; subcword < ${#words[@]}-1; subcword++ )); do 19*de1e4e89SAndroid Build Coastguard Worker if [[ $w == ${words[subcword]} ]]; then 20*de1e4e89SAndroid Build Coastguard Worker found=1 21*de1e4e89SAndroid Build Coastguard Worker break 22*de1e4e89SAndroid Build Coastguard Worker fi 23*de1e4e89SAndroid Build Coastguard Worker done 24*de1e4e89SAndroid Build Coastguard Worker [[ $found -eq 0 ]] && \ 25*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) ) 26*de1e4e89SAndroid Build Coastguard Worker done 27*de1e4e89SAndroid Build Coastguard Worker} 28*de1e4e89SAndroid Build Coastguard Worker 29*de1e4e89SAndroid Build Coastguard Worker# Takes a list of words in argument; each one of them is added to COMPREPLY if 30*de1e4e89SAndroid Build Coastguard Worker# it is not already present on the command line from the provided index. Returns 31*de1e4e89SAndroid Build Coastguard Worker# no value. 32*de1e4e89SAndroid Build Coastguard Worker_tc_once_attr_from() 33*de1e4e89SAndroid Build Coastguard Worker{ 34*de1e4e89SAndroid Build Coastguard Worker local w subcword found from=$1 35*de1e4e89SAndroid Build Coastguard Worker shift 36*de1e4e89SAndroid Build Coastguard Worker for w in $*; do 37*de1e4e89SAndroid Build Coastguard Worker found=0 38*de1e4e89SAndroid Build Coastguard Worker for (( subcword=$from; subcword < ${#words[@]}-1; subcword++ )); do 39*de1e4e89SAndroid Build Coastguard Worker if [[ $w == ${words[subcword]} ]]; then 40*de1e4e89SAndroid Build Coastguard Worker found=1 41*de1e4e89SAndroid Build Coastguard Worker break 42*de1e4e89SAndroid Build Coastguard Worker fi 43*de1e4e89SAndroid Build Coastguard Worker done 44*de1e4e89SAndroid Build Coastguard Worker [[ $found -eq 0 ]] && \ 45*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) ) 46*de1e4e89SAndroid Build Coastguard Worker done 47*de1e4e89SAndroid Build Coastguard Worker} 48*de1e4e89SAndroid Build Coastguard Worker 49*de1e4e89SAndroid Build Coastguard Worker# Takes a list of words in argument; adds them all to COMPREPLY if none of them 50*de1e4e89SAndroid Build Coastguard Worker# is already present on the command line. Returns no value. 51*de1e4e89SAndroid Build Coastguard Worker_tc_one_of_list() 52*de1e4e89SAndroid Build Coastguard Worker{ 53*de1e4e89SAndroid Build Coastguard Worker local w subcword 54*de1e4e89SAndroid Build Coastguard Worker for w in $*; do 55*de1e4e89SAndroid Build Coastguard Worker for (( subcword=3; subcword < ${#words[@]}-1; subcword++ )); do 56*de1e4e89SAndroid Build Coastguard Worker [[ $w == ${words[subcword]} ]] && return 1 57*de1e4e89SAndroid Build Coastguard Worker done 58*de1e4e89SAndroid Build Coastguard Worker done 59*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) ) 60*de1e4e89SAndroid Build Coastguard Worker} 61*de1e4e89SAndroid Build Coastguard Worker 62*de1e4e89SAndroid Build Coastguard Worker# Takes a list of words in argument; adds them all to COMPREPLY if none of them 63*de1e4e89SAndroid Build Coastguard Worker# is already present on the command line from the provided index. Returns no 64*de1e4e89SAndroid Build Coastguard Worker# value. 65*de1e4e89SAndroid Build Coastguard Worker_tc_one_of_list_from() 66*de1e4e89SAndroid Build Coastguard Worker{ 67*de1e4e89SAndroid Build Coastguard Worker local w subcword from=$1 68*de1e4e89SAndroid Build Coastguard Worker shift 69*de1e4e89SAndroid Build Coastguard Worker for w in $*; do 70*de1e4e89SAndroid Build Coastguard Worker for (( subcword=$from; subcword < ${#words[@]}-1; subcword++ )); do 71*de1e4e89SAndroid Build Coastguard Worker [[ $w == ${words[subcword]} ]] && return 1 72*de1e4e89SAndroid Build Coastguard Worker done 73*de1e4e89SAndroid Build Coastguard Worker done 74*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) ) 75*de1e4e89SAndroid Build Coastguard Worker} 76*de1e4e89SAndroid Build Coastguard Worker 77*de1e4e89SAndroid Build Coastguard Worker# Returns "$cur ${cur}arg1 ${cur}arg2 ..." 78*de1e4e89SAndroid Build Coastguard Worker_tc_expand_units() 79*de1e4e89SAndroid Build Coastguard Worker{ 80*de1e4e89SAndroid Build Coastguard Worker [[ $cur =~ ^[0-9]+ ]] || return 1 81*de1e4e89SAndroid Build Coastguard Worker local value=${cur%%[^0-9]*} 82*de1e4e89SAndroid Build Coastguard Worker [[ $cur == $value ]] && echo $cur 83*de1e4e89SAndroid Build Coastguard Worker echo ${@/#/$value} 84*de1e4e89SAndroid Build Coastguard Worker} 85*de1e4e89SAndroid Build Coastguard Worker 86*de1e4e89SAndroid Build Coastguard Worker# Complete based on given word, usually $prev (or possibly the word before), 87*de1e4e89SAndroid Build Coastguard Worker# for when an argument or an option name has but a few possible arguments (so 88*de1e4e89SAndroid Build Coastguard Worker# tc does not take particular commands into account here). 89*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 90*de1e4e89SAndroid Build Coastguard Worker_tc_direct_complete() 91*de1e4e89SAndroid Build Coastguard Worker{ 92*de1e4e89SAndroid Build Coastguard Worker case $1 in 93*de1e4e89SAndroid Build Coastguard Worker # Command options 94*de1e4e89SAndroid Build Coastguard Worker dev) 95*de1e4e89SAndroid Build Coastguard Worker _available_interfaces 96*de1e4e89SAndroid Build Coastguard Worker return 0 97*de1e4e89SAndroid Build Coastguard Worker ;; 98*de1e4e89SAndroid Build Coastguard Worker classid) 99*de1e4e89SAndroid Build Coastguard Worker return 0 100*de1e4e89SAndroid Build Coastguard Worker ;; 101*de1e4e89SAndroid Build Coastguard Worker estimator) 102*de1e4e89SAndroid Build Coastguard Worker local list=$( _tc_expand_units 'secs' 'msecs' 'usecs' ) 103*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) 104*de1e4e89SAndroid Build Coastguard Worker return 0 105*de1e4e89SAndroid Build Coastguard Worker ;; 106*de1e4e89SAndroid Build Coastguard Worker handle) 107*de1e4e89SAndroid Build Coastguard Worker return 0 108*de1e4e89SAndroid Build Coastguard Worker ;; 109*de1e4e89SAndroid Build Coastguard Worker parent|flowid) 110*de1e4e89SAndroid Build Coastguard Worker local i iface ids cmd 111*de1e4e89SAndroid Build Coastguard Worker for (( i=3; i < ${#words[@]}-2; i++ )); do 112*de1e4e89SAndroid Build Coastguard Worker [[ ${words[i]} == dev ]] && iface=${words[i+1]} 113*de1e4e89SAndroid Build Coastguard Worker break 114*de1e4e89SAndroid Build Coastguard Worker done 115*de1e4e89SAndroid Build Coastguard Worker for cmd in qdisc class; do 116*de1e4e89SAndroid Build Coastguard Worker if [[ -n $iface ]]; then 117*de1e4e89SAndroid Build Coastguard Worker ids+=$( tc $cmd show dev $iface 2>/dev/null | \ 118*de1e4e89SAndroid Build Coastguard Worker cut -d\ -f 3 )" " 119*de1e4e89SAndroid Build Coastguard Worker else 120*de1e4e89SAndroid Build Coastguard Worker ids+=$( tc $cmd show 2>/dev/null | cut -d\ -f 3 ) 121*de1e4e89SAndroid Build Coastguard Worker fi 122*de1e4e89SAndroid Build Coastguard Worker done 123*de1e4e89SAndroid Build Coastguard Worker [[ $ids != " " ]] && \ 124*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$ids" -- "$cur" ) ) 125*de1e4e89SAndroid Build Coastguard Worker return 0 126*de1e4e89SAndroid Build Coastguard Worker ;; 127*de1e4e89SAndroid Build Coastguard Worker protocol) # list comes from lib/ll_proto.c 128*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W ' 802.1Q 802.1ad 802_2 802_3 LLDP aarp \ 129*de1e4e89SAndroid Build Coastguard Worker all aoe arp atalk atmfate atmmpoa ax25 bpq can control cust \ 130*de1e4e89SAndroid Build Coastguard Worker ddcmp dec diag dna_dl dna_rc dna_rt econet ieeepup ieeepupat \ 131*de1e4e89SAndroid Build Coastguard Worker ip ipv4 ipv6 ipx irda lat localtalk loop mobitex ppp_disc \ 132*de1e4e89SAndroid Build Coastguard Worker ppp_mp ppp_ses ppptalk pup pupat rarp sca snap tipc tr_802_2 \ 133*de1e4e89SAndroid Build Coastguard Worker wan_ppp x25' -- "$cur" ) ) 134*de1e4e89SAndroid Build Coastguard Worker return 0 135*de1e4e89SAndroid Build Coastguard Worker ;; 136*de1e4e89SAndroid Build Coastguard Worker prio) 137*de1e4e89SAndroid Build Coastguard Worker return 0 138*de1e4e89SAndroid Build Coastguard Worker ;; 139*de1e4e89SAndroid Build Coastguard Worker stab) 140*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'mtu tsize mpu overhead 141*de1e4e89SAndroid Build Coastguard Worker linklayer' -- "$cur" ) ) 142*de1e4e89SAndroid Build Coastguard Worker ;; 143*de1e4e89SAndroid Build Coastguard Worker 144*de1e4e89SAndroid Build Coastguard Worker # Qdiscs and classes options 145*de1e4e89SAndroid Build Coastguard Worker alpha|bands|beta|buckets|corrupt|debug|decrement|default|\ 146*de1e4e89SAndroid Build Coastguard Worker default_index|depth|direct_qlen|divisor|duplicate|ewma|flow_limit|\ 147*de1e4e89SAndroid Build Coastguard Worker flows|hh_limit|increment|indices|linklayer|non_hh_weight|num_tc|\ 148*de1e4e89SAndroid Build Coastguard Worker penalty_burst|penalty_rate|prio|priomap|probability|queues|r2q|\ 149*de1e4e89SAndroid Build Coastguard Worker reorder|vq|vqs) 150*de1e4e89SAndroid Build Coastguard Worker return 0 151*de1e4e89SAndroid Build Coastguard Worker ;; 152*de1e4e89SAndroid Build Coastguard Worker setup) 153*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'vqs' -- "$cur" ) ) 154*de1e4e89SAndroid Build Coastguard Worker return 0 155*de1e4e89SAndroid Build Coastguard Worker ;; 156*de1e4e89SAndroid Build Coastguard Worker hw) 157*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W '1 0' -- "$cur" ) ) 158*de1e4e89SAndroid Build Coastguard Worker return 0 159*de1e4e89SAndroid Build Coastguard Worker ;; 160*de1e4e89SAndroid Build Coastguard Worker distribution) 161*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'uniform normal pareto 162*de1e4e89SAndroid Build Coastguard Worker paretonormal' -- "$cur" ) ) 163*de1e4e89SAndroid Build Coastguard Worker return 0 164*de1e4e89SAndroid Build Coastguard Worker ;; 165*de1e4e89SAndroid Build Coastguard Worker loss) 166*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'random state gmodel' -- "$cur" ) ) 167*de1e4e89SAndroid Build Coastguard Worker return 0 168*de1e4e89SAndroid Build Coastguard Worker ;; 169*de1e4e89SAndroid Build Coastguard Worker 170*de1e4e89SAndroid Build Coastguard Worker # Qdiscs and classes options options 171*de1e4e89SAndroid Build Coastguard Worker gap|gmodel|state) 172*de1e4e89SAndroid Build Coastguard Worker return 0 173*de1e4e89SAndroid Build Coastguard Worker ;; 174*de1e4e89SAndroid Build Coastguard Worker 175*de1e4e89SAndroid Build Coastguard Worker # Filters options 176*de1e4e89SAndroid Build Coastguard Worker map) 177*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'key' -- "$cur" ) ) 178*de1e4e89SAndroid Build Coastguard Worker return 0 179*de1e4e89SAndroid Build Coastguard Worker ;; 180*de1e4e89SAndroid Build Coastguard Worker hash) 181*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'keys' -- "$cur" ) ) 182*de1e4e89SAndroid Build Coastguard Worker return 0 183*de1e4e89SAndroid Build Coastguard Worker ;; 184*de1e4e89SAndroid Build Coastguard Worker indev) 185*de1e4e89SAndroid Build Coastguard Worker _available_interfaces 186*de1e4e89SAndroid Build Coastguard Worker return 0 187*de1e4e89SAndroid Build Coastguard Worker ;; 188*de1e4e89SAndroid Build Coastguard Worker eth_type) 189*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'ipv4 ipv6' -- "$cur" ) ) 190*de1e4e89SAndroid Build Coastguard Worker return 0 191*de1e4e89SAndroid Build Coastguard Worker ;; 192*de1e4e89SAndroid Build Coastguard Worker ip_proto) 193*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'tcp udp' -- "$cur" ) ) 194*de1e4e89SAndroid Build Coastguard Worker return 0 195*de1e4e89SAndroid Build Coastguard Worker ;; 196*de1e4e89SAndroid Build Coastguard Worker 197*de1e4e89SAndroid Build Coastguard Worker # Filters options options 198*de1e4e89SAndroid Build Coastguard Worker key|keys) 199*de1e4e89SAndroid Build Coastguard Worker [[ ${words[@]} =~ graft ]] && return 1 200*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'src dst proto proto-src proto-dst iif \ 201*de1e4e89SAndroid Build Coastguard Worker priority mark nfct nfct-src nfct-dst nfct-proto-src \ 202*de1e4e89SAndroid Build Coastguard Worker nfct-proto-dst rt-classid sk-uid sk-gid vlan-tag rxhash' -- \ 203*de1e4e89SAndroid Build Coastguard Worker "$cur" ) ) 204*de1e4e89SAndroid Build Coastguard Worker return 0 205*de1e4e89SAndroid Build Coastguard Worker ;; 206*de1e4e89SAndroid Build Coastguard Worker 207*de1e4e89SAndroid Build Coastguard Worker # BPF options - used for filters, actions, and exec 208*de1e4e89SAndroid Build Coastguard Worker export|bytecode|bytecode-file|object-file) 209*de1e4e89SAndroid Build Coastguard Worker _filedir 210*de1e4e89SAndroid Build Coastguard Worker return 0 211*de1e4e89SAndroid Build Coastguard Worker ;; 212*de1e4e89SAndroid Build Coastguard Worker object-pinned|graft) # Pinned object is probably under /sys/fs/bpf/ 213*de1e4e89SAndroid Build Coastguard Worker [[ -n "$cur" ]] && _filedir && return 0 214*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -G "/sys/fs/bpf/*" -- "$cur" ) ) || _filedir 215*de1e4e89SAndroid Build Coastguard Worker compopt -o nospace 216*de1e4e89SAndroid Build Coastguard Worker return 0 217*de1e4e89SAndroid Build Coastguard Worker ;; 218*de1e4e89SAndroid Build Coastguard Worker section) 219*de1e4e89SAndroid Build Coastguard Worker if (type objdump > /dev/null 2>&1) ; then 220*de1e4e89SAndroid Build Coastguard Worker local fword objfile section_list 221*de1e4e89SAndroid Build Coastguard Worker for (( fword=3; fword < ${#words[@]}-3; fword++ )); do 222*de1e4e89SAndroid Build Coastguard Worker if [[ ${words[fword]} == object-file ]]; then 223*de1e4e89SAndroid Build Coastguard Worker objfile=${words[fword+1]} 224*de1e4e89SAndroid Build Coastguard Worker break 225*de1e4e89SAndroid Build Coastguard Worker fi 226*de1e4e89SAndroid Build Coastguard Worker done 227*de1e4e89SAndroid Build Coastguard Worker section_list=$( objdump -h $objfile 2>/dev/null | \ 228*de1e4e89SAndroid Build Coastguard Worker sed -n 's/^ *[0-9]\+ \([^ ]*\) *.*/\1/p' ) 229*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$section_list" -- "$cur" ) ) 230*de1e4e89SAndroid Build Coastguard Worker fi 231*de1e4e89SAndroid Build Coastguard Worker return 0 232*de1e4e89SAndroid Build Coastguard Worker ;; 233*de1e4e89SAndroid Build Coastguard Worker import|run) 234*de1e4e89SAndroid Build Coastguard Worker _filedir 235*de1e4e89SAndroid Build Coastguard Worker return 0 236*de1e4e89SAndroid Build Coastguard Worker ;; 237*de1e4e89SAndroid Build Coastguard Worker type) 238*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'cls act' -- "$cur" ) ) 239*de1e4e89SAndroid Build Coastguard Worker return 0 240*de1e4e89SAndroid Build Coastguard Worker ;; 241*de1e4e89SAndroid Build Coastguard Worker 242*de1e4e89SAndroid Build Coastguard Worker # Actions options 243*de1e4e89SAndroid Build Coastguard Worker random) 244*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'netrand determ' 245*de1e4e89SAndroid Build Coastguard Worker return 0 246*de1e4e89SAndroid Build Coastguard Worker ;; 247*de1e4e89SAndroid Build Coastguard Worker 248*de1e4e89SAndroid Build Coastguard Worker # Units for option arguments 249*de1e4e89SAndroid Build Coastguard Worker bandwidth|maxrate|peakrate|rate) 250*de1e4e89SAndroid Build Coastguard Worker local list=$( _tc_expand_units 'bit' \ 251*de1e4e89SAndroid Build Coastguard Worker 'kbit' 'kibit' 'kbps' 'kibps' \ 252*de1e4e89SAndroid Build Coastguard Worker 'mbit' 'mibit' 'mbps' 'mibps' \ 253*de1e4e89SAndroid Build Coastguard Worker 'gbit' 'gibit' 'gbps' 'gibps' \ 254*de1e4e89SAndroid Build Coastguard Worker 'tbit' 'tibit' 'tbps' 'tibps' ) 255*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) 256*de1e4e89SAndroid Build Coastguard Worker ;; 257*de1e4e89SAndroid Build Coastguard Worker admit_bytes|avpkt|burst|cell|initial_quantum|limit|max|min|mtu|mpu|\ 258*de1e4e89SAndroid Build Coastguard Worker overhead|quantum|redflowlist) 259*de1e4e89SAndroid Build Coastguard Worker local list=$( _tc_expand_units \ 260*de1e4e89SAndroid Build Coastguard Worker 'b' 'kbit' 'k' 'mbit' 'm' 'gbit' 'g' ) 261*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) 262*de1e4e89SAndroid Build Coastguard Worker ;; 263*de1e4e89SAndroid Build Coastguard Worker db|delay|evict_timeout|interval|latency|perturb|rehash|reset_timeout|\ 264*de1e4e89SAndroid Build Coastguard Worker target|tupdate) 265*de1e4e89SAndroid Build Coastguard Worker local list=$( _tc_expand_units 'secs' 'msecs' 'usecs' ) 266*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) 267*de1e4e89SAndroid Build Coastguard Worker ;; 268*de1e4e89SAndroid Build Coastguard Worker esac 269*de1e4e89SAndroid Build Coastguard Worker return 1 270*de1e4e89SAndroid Build Coastguard Worker} 271*de1e4e89SAndroid Build Coastguard Worker 272*de1e4e89SAndroid Build Coastguard Worker# Complete with options names for qdiscs. Each qdisc has its own set of options 273*de1e4e89SAndroid Build Coastguard Worker# and it seems we cannot really parse it from anywhere, so we add it manually 274*de1e4e89SAndroid Build Coastguard Worker# in this function. 275*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 276*de1e4e89SAndroid Build Coastguard Worker_tc_qdisc_options() 277*de1e4e89SAndroid Build Coastguard Worker{ 278*de1e4e89SAndroid Build Coastguard Worker case $1 in 279*de1e4e89SAndroid Build Coastguard Worker choke) 280*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit bandwidth ecn min max burst' 281*de1e4e89SAndroid Build Coastguard Worker return 0 282*de1e4e89SAndroid Build Coastguard Worker ;; 283*de1e4e89SAndroid Build Coastguard Worker codel) 284*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit target interval' 285*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'ecn noecn' 286*de1e4e89SAndroid Build Coastguard Worker return 0 287*de1e4e89SAndroid Build Coastguard Worker ;; 288*de1e4e89SAndroid Build Coastguard Worker bfifo|pfifo|pfifo_head_drop) 289*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit' 290*de1e4e89SAndroid Build Coastguard Worker return 0 291*de1e4e89SAndroid Build Coastguard Worker ;; 292*de1e4e89SAndroid Build Coastguard Worker fq) 293*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit flow_limit quantum initial_quantum maxrate \ 294*de1e4e89SAndroid Build Coastguard Worker buckets' 295*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'pacing nopacing' 296*de1e4e89SAndroid Build Coastguard Worker return 0 297*de1e4e89SAndroid Build Coastguard Worker ;; 298*de1e4e89SAndroid Build Coastguard Worker fq_codel) 299*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit flows target interval quantum' 300*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'ecn noecn' 301*de1e4e89SAndroid Build Coastguard Worker return 0 302*de1e4e89SAndroid Build Coastguard Worker ;; 303*de1e4e89SAndroid Build Coastguard Worker gred) 304*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'setup vqs default grio vq prio limit min max avpkt \ 305*de1e4e89SAndroid Build Coastguard Worker burst probability bandwidth' 306*de1e4e89SAndroid Build Coastguard Worker return 0 307*de1e4e89SAndroid Build Coastguard Worker ;; 308*de1e4e89SAndroid Build Coastguard Worker hhf) 309*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit quantum hh_limit reset_timeout admit_bytes \ 310*de1e4e89SAndroid Build Coastguard Worker evict_timeout non_hh_weight' 311*de1e4e89SAndroid Build Coastguard Worker return 0 312*de1e4e89SAndroid Build Coastguard Worker ;; 313*de1e4e89SAndroid Build Coastguard Worker mqprio) 314*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'num_tc map queues hw' 315*de1e4e89SAndroid Build Coastguard Worker return 0 316*de1e4e89SAndroid Build Coastguard Worker ;; 317*de1e4e89SAndroid Build Coastguard Worker netem) 318*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'delay distribution corrupt duplicate loss ecn \ 319*de1e4e89SAndroid Build Coastguard Worker reorder rate' 320*de1e4e89SAndroid Build Coastguard Worker return 0 321*de1e4e89SAndroid Build Coastguard Worker ;; 322*de1e4e89SAndroid Build Coastguard Worker pie) 323*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit target tupdate alpha beta' 324*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'bytemode nobytemode' 325*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'ecn noecn' 326*de1e4e89SAndroid Build Coastguard Worker return 0 327*de1e4e89SAndroid Build Coastguard Worker ;; 328*de1e4e89SAndroid Build Coastguard Worker red) 329*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit min max avpkt burst adaptive probability \ 330*de1e4e89SAndroid Build Coastguard Worker bandwidth ecn harddrop' 331*de1e4e89SAndroid Build Coastguard Worker return 0 332*de1e4e89SAndroid Build Coastguard Worker ;; 333*de1e4e89SAndroid Build Coastguard Worker rr|prio) 334*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'bands priomap multiqueue' 335*de1e4e89SAndroid Build Coastguard Worker return 0 336*de1e4e89SAndroid Build Coastguard Worker ;; 337*de1e4e89SAndroid Build Coastguard Worker sfb) 338*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'rehash db limit max target increment decrement \ 339*de1e4e89SAndroid Build Coastguard Worker penalty_rate penalty_burst' 340*de1e4e89SAndroid Build Coastguard Worker return 0 341*de1e4e89SAndroid Build Coastguard Worker ;; 342*de1e4e89SAndroid Build Coastguard Worker sfq) 343*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit perturb quantum divisor flows depth headdrop \ 344*de1e4e89SAndroid Build Coastguard Worker redflowlimit min max avpkt burst probability ecn harddrop' 345*de1e4e89SAndroid Build Coastguard Worker return 0 346*de1e4e89SAndroid Build Coastguard Worker ;; 347*de1e4e89SAndroid Build Coastguard Worker tbf) 348*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'limit burst rate mtu peakrate latency overhead \ 349*de1e4e89SAndroid Build Coastguard Worker linklayer' 350*de1e4e89SAndroid Build Coastguard Worker return 0 351*de1e4e89SAndroid Build Coastguard Worker ;; 352*de1e4e89SAndroid Build Coastguard Worker cbq) 353*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'bandwidth avpkt mpu cell ewma' 354*de1e4e89SAndroid Build Coastguard Worker return 0 355*de1e4e89SAndroid Build Coastguard Worker ;; 356*de1e4e89SAndroid Build Coastguard Worker dsmark) 357*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'indices default_index set_tc_index' 358*de1e4e89SAndroid Build Coastguard Worker return 0 359*de1e4e89SAndroid Build Coastguard Worker ;; 360*de1e4e89SAndroid Build Coastguard Worker hfsc) 361*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'default' 362*de1e4e89SAndroid Build Coastguard Worker return 0 363*de1e4e89SAndroid Build Coastguard Worker ;; 364*de1e4e89SAndroid Build Coastguard Worker htb) 365*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'default r2q direct_qlen debug' 366*de1e4e89SAndroid Build Coastguard Worker return 0 367*de1e4e89SAndroid Build Coastguard Worker ;; 368*de1e4e89SAndroid Build Coastguard Worker multiq|pfifo_fast|atm|drr|qfq) 369*de1e4e89SAndroid Build Coastguard Worker return 0 370*de1e4e89SAndroid Build Coastguard Worker ;; 371*de1e4e89SAndroid Build Coastguard Worker esac 372*de1e4e89SAndroid Build Coastguard Worker return 1 373*de1e4e89SAndroid Build Coastguard Worker} 374*de1e4e89SAndroid Build Coastguard Worker 375*de1e4e89SAndroid Build Coastguard Worker# Complete with options names for BPF filters or actions. 376*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 377*de1e4e89SAndroid Build Coastguard Worker_tc_bpf_options() 378*de1e4e89SAndroid Build Coastguard Worker{ 379*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} == object-file ]] && \ 380*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'section export' 381*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-5]} == object-file ]] && \ 382*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} =~ (section|export) ]] && \ 383*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'section export' 384*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'bytecode bytecode-file object-file object-pinned' 385*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'verbose index direct-action action classid' 386*de1e4e89SAndroid Build Coastguard Worker return 0 387*de1e4e89SAndroid Build Coastguard Worker} 388*de1e4e89SAndroid Build Coastguard Worker 389*de1e4e89SAndroid Build Coastguard Worker# Complete with options names for filter actions. 390*de1e4e89SAndroid Build Coastguard Worker# This function is recursive, thus allowing multiple actions statement to be 391*de1e4e89SAndroid Build Coastguard Worker# parsed. 392*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 393*de1e4e89SAndroid Build Coastguard Worker_tc_filter_action_options() 394*de1e4e89SAndroid Build Coastguard Worker{ 395*de1e4e89SAndroid Build Coastguard Worker for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); 396*de1e4e89SAndroid Build Coastguard Worker do 397*de1e4e89SAndroid Build Coastguard Worker if [[ action == ${words[acwd]} ]]; then 398*de1e4e89SAndroid Build Coastguard Worker _tc_filter_action_options $((acwd+1)) && return 0 399*de1e4e89SAndroid Build Coastguard Worker fi 400*de1e4e89SAndroid Build Coastguard Worker done 401*de1e4e89SAndroid Build Coastguard Worker 402*de1e4e89SAndroid Build Coastguard Worker local action acwd 403*de1e4e89SAndroid Build Coastguard Worker for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); do 404*de1e4e89SAndroid Build Coastguard Worker if [[ $ACTION_KIND =~ ' '${words[acwd]}' ' ]]; then 405*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list_from $acwd action 406*de1e4e89SAndroid Build Coastguard Worker _tc_action_options $acwd && return 0 407*de1e4e89SAndroid Build Coastguard Worker fi 408*de1e4e89SAndroid Build Coastguard Worker done 409*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list_from $acwd $ACTION_KIND 410*de1e4e89SAndroid Build Coastguard Worker return 0 411*de1e4e89SAndroid Build Coastguard Worker} 412*de1e4e89SAndroid Build Coastguard Worker 413*de1e4e89SAndroid Build Coastguard Worker# Complete with options names for filters. 414*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 415*de1e4e89SAndroid Build Coastguard Worker_tc_filter_options() 416*de1e4e89SAndroid Build Coastguard Worker{ 417*de1e4e89SAndroid Build Coastguard Worker 418*de1e4e89SAndroid Build Coastguard Worker for ((acwd=$1; acwd < ${#words[@]}-1; acwd++)); 419*de1e4e89SAndroid Build Coastguard Worker do 420*de1e4e89SAndroid Build Coastguard Worker if [[ action == ${words[acwd]} ]]; then 421*de1e4e89SAndroid Build Coastguard Worker _tc_filter_action_options $((acwd+1)) && return 0 422*de1e4e89SAndroid Build Coastguard Worker fi 423*de1e4e89SAndroid Build Coastguard Worker done 424*de1e4e89SAndroid Build Coastguard Worker 425*de1e4e89SAndroid Build Coastguard Worker filter=${words[$1]} 426*de1e4e89SAndroid Build Coastguard Worker case $filter in 427*de1e4e89SAndroid Build Coastguard Worker basic) 428*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'match action classid' 429*de1e4e89SAndroid Build Coastguard Worker return 0 430*de1e4e89SAndroid Build Coastguard Worker ;; 431*de1e4e89SAndroid Build Coastguard Worker bpf) 432*de1e4e89SAndroid Build Coastguard Worker _tc_bpf_options 433*de1e4e89SAndroid Build Coastguard Worker return 0 434*de1e4e89SAndroid Build Coastguard Worker ;; 435*de1e4e89SAndroid Build Coastguard Worker cgroup) 436*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'match action' 437*de1e4e89SAndroid Build Coastguard Worker return 0 438*de1e4e89SAndroid Build Coastguard Worker ;; 439*de1e4e89SAndroid Build Coastguard Worker flow) 440*de1e4e89SAndroid Build Coastguard Worker local i 441*de1e4e89SAndroid Build Coastguard Worker for (( i=5; i < ${#words[@]}-1; i++ )); do 442*de1e4e89SAndroid Build Coastguard Worker if [[ ${words[i]} =~ ^keys?$ ]]; then 443*de1e4e89SAndroid Build Coastguard Worker _tc_direct_complete 'key' 444*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'or and xor rshift addend' -- \ 445*de1e4e89SAndroid Build Coastguard Worker "$cur" ) ) 446*de1e4e89SAndroid Build Coastguard Worker break 447*de1e4e89SAndroid Build Coastguard Worker fi 448*de1e4e89SAndroid Build Coastguard Worker done 449*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'map hash divisor baseclass match action' 450*de1e4e89SAndroid Build Coastguard Worker return 0 451*de1e4e89SAndroid Build Coastguard Worker ;; 452*de1e4e89SAndroid Build Coastguard Worker matchall) 453*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'action skip_sw skip_hw' 454*de1e4e89SAndroid Build Coastguard Worker return 0 455*de1e4e89SAndroid Build Coastguard Worker ;; 456*de1e4e89SAndroid Build Coastguard Worker flower) 457*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'action classid indev dst_mac src_mac eth_type \ 458*de1e4e89SAndroid Build Coastguard Worker ip_proto dst_ip src_ip dst_port src_port' 459*de1e4e89SAndroid Build Coastguard Worker return 0 460*de1e4e89SAndroid Build Coastguard Worker ;; 461*de1e4e89SAndroid Build Coastguard Worker fw) 462*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'action classid' 463*de1e4e89SAndroid Build Coastguard Worker return 0 464*de1e4e89SAndroid Build Coastguard Worker ;; 465*de1e4e89SAndroid Build Coastguard Worker route) 466*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'from fromif' 467*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'to classid action' 468*de1e4e89SAndroid Build Coastguard Worker return 0 469*de1e4e89SAndroid Build Coastguard Worker ;; 470*de1e4e89SAndroid Build Coastguard Worker rsvp) 471*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'ipproto session sender classid action tunnelid \ 472*de1e4e89SAndroid Build Coastguard Worker tunnel flowlabel spi/ah spi/esp u8 u16 u32' 473*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} == tunnel ]] && \ 474*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'skip' -- "$cur" ) ) 475*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} =~ u(8|16|32) ]] && \ 476*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'mask' -- "$cur" ) ) 477*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} == mask ]] && \ 478*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'at' -- "$cur" ) ) 479*de1e4e89SAndroid Build Coastguard Worker return 0 480*de1e4e89SAndroid Build Coastguard Worker ;; 481*de1e4e89SAndroid Build Coastguard Worker tcindex) 482*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'hash mask shift classid action' 483*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'pass_on fall_through' 484*de1e4e89SAndroid Build Coastguard Worker return 0 485*de1e4e89SAndroid Build Coastguard Worker ;; 486*de1e4e89SAndroid Build Coastguard Worker u32) 487*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'match link classid action offset ht hashkey sample' 488*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'ip ip6 udp tcp icmp u8 u16 u32 mark \ 489*de1e4e89SAndroid Build Coastguard Worker divisor' -- "$cur" ) ) 490*de1e4e89SAndroid Build Coastguard Worker return 0 491*de1e4e89SAndroid Build Coastguard Worker ;; 492*de1e4e89SAndroid Build Coastguard Worker esac 493*de1e4e89SAndroid Build Coastguard Worker return 1 494*de1e4e89SAndroid Build Coastguard Worker} 495*de1e4e89SAndroid Build Coastguard Worker 496*de1e4e89SAndroid Build Coastguard Worker# Complete with options names for actions. 497*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 498*de1e4e89SAndroid Build Coastguard Worker_tc_action_options() 499*de1e4e89SAndroid Build Coastguard Worker{ 500*de1e4e89SAndroid Build Coastguard Worker local from=$1 501*de1e4e89SAndroid Build Coastguard Worker local action=${words[from]} 502*de1e4e89SAndroid Build Coastguard Worker case $action in 503*de1e4e89SAndroid Build Coastguard Worker bpf) 504*de1e4e89SAndroid Build Coastguard Worker _tc_bpf_options 505*de1e4e89SAndroid Build Coastguard Worker return 0 506*de1e4e89SAndroid Build Coastguard Worker ;; 507*de1e4e89SAndroid Build Coastguard Worker mirred) 508*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list_from $from 'ingress egress' 509*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list_from $from 'mirror redirect' 510*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr_from $from 'index dev' 511*de1e4e89SAndroid Build Coastguard Worker return 0 512*de1e4e89SAndroid Build Coastguard Worker ;; 513*de1e4e89SAndroid Build Coastguard Worker sample) 514*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr_from $from 'rate' 515*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr_from $from 'trunc' 516*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr_from $from 'group' 517*de1e4e89SAndroid Build Coastguard Worker return 0 518*de1e4e89SAndroid Build Coastguard Worker ;; 519*de1e4e89SAndroid Build Coastguard Worker gact) 520*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list_from $from 'reclassify drop continue pass' 521*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr_from $from 'random' 522*de1e4e89SAndroid Build Coastguard Worker return 0 523*de1e4e89SAndroid Build Coastguard Worker ;; 524*de1e4e89SAndroid Build Coastguard Worker esac 525*de1e4e89SAndroid Build Coastguard Worker return 1 526*de1e4e89SAndroid Build Coastguard Worker} 527*de1e4e89SAndroid Build Coastguard Worker 528*de1e4e89SAndroid Build Coastguard Worker# Complete with options names for exec. 529*de1e4e89SAndroid Build Coastguard Worker# Returns 0 is completion should stop after running this function, 1 otherwise. 530*de1e4e89SAndroid Build Coastguard Worker_tc_exec_options() 531*de1e4e89SAndroid Build Coastguard Worker{ 532*de1e4e89SAndroid Build Coastguard Worker case $1 in 533*de1e4e89SAndroid Build Coastguard Worker import) 534*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} == import ]] && \ 535*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'run' 536*de1e4e89SAndroid Build Coastguard Worker return 0 537*de1e4e89SAndroid Build Coastguard Worker ;; 538*de1e4e89SAndroid Build Coastguard Worker graft) 539*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'key type' -- "$cur" ) ) 540*de1e4e89SAndroid Build Coastguard Worker [[ ${words[${#words[@]}-3]} == object-file ]] && \ 541*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'type' 542*de1e4e89SAndroid Build Coastguard Worker _tc_bpf_options 543*de1e4e89SAndroid Build Coastguard Worker return 0 544*de1e4e89SAndroid Build Coastguard Worker ;; 545*de1e4e89SAndroid Build Coastguard Worker esac 546*de1e4e89SAndroid Build Coastguard Worker return 1 547*de1e4e89SAndroid Build Coastguard Worker} 548*de1e4e89SAndroid Build Coastguard Worker 549*de1e4e89SAndroid Build Coastguard Worker# Main completion function 550*de1e4e89SAndroid Build Coastguard Worker# Logic is as follows: 551*de1e4e89SAndroid Build Coastguard Worker# 1. Check if previous word is a global option; if so, propose arguments. 552*de1e4e89SAndroid Build Coastguard Worker# 2. Check if current word is a global option; if so, propose completion. 553*de1e4e89SAndroid Build Coastguard Worker# 3. Check for the presence of a main command (qdisc|class|filter|...). If 554*de1e4e89SAndroid Build Coastguard Worker# there is one, first call _tc_direct_complete to see if previous word is 555*de1e4e89SAndroid Build Coastguard Worker# waiting for a particular completion. If so, propose completion and exit. 556*de1e4e89SAndroid Build Coastguard Worker# 4. Extract main command and -- if available -- its subcommand 557*de1e4e89SAndroid Build Coastguard Worker# (add|delete|show|...). 558*de1e4e89SAndroid Build Coastguard Worker# 5. Propose completion based on main and sub- command in use. Additional 559*de1e4e89SAndroid Build Coastguard Worker# functions may be called for qdiscs, classes or filter options. 560*de1e4e89SAndroid Build Coastguard Worker_tc() 561*de1e4e89SAndroid Build Coastguard Worker{ 562*de1e4e89SAndroid Build Coastguard Worker local cur prev words cword 563*de1e4e89SAndroid Build Coastguard Worker _init_completion || return 564*de1e4e89SAndroid Build Coastguard Worker 565*de1e4e89SAndroid Build Coastguard Worker case $prev in 566*de1e4e89SAndroid Build Coastguard Worker -V|-Version) 567*de1e4e89SAndroid Build Coastguard Worker return 0 568*de1e4e89SAndroid Build Coastguard Worker ;; 569*de1e4e89SAndroid Build Coastguard Worker -b|-batch|-cf|-conf) 570*de1e4e89SAndroid Build Coastguard Worker _filedir 571*de1e4e89SAndroid Build Coastguard Worker return 0 572*de1e4e89SAndroid Build Coastguard Worker ;; 573*de1e4e89SAndroid Build Coastguard Worker -force) 574*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W '-batch' -- "$cur" ) ) 575*de1e4e89SAndroid Build Coastguard Worker return 0 576*de1e4e89SAndroid Build Coastguard Worker ;; 577*de1e4e89SAndroid Build Coastguard Worker -nm|name) 578*de1e4e89SAndroid Build Coastguard Worker [[ -r /etc/iproute2/tc_cls ]] || \ 579*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W '-conf' -- "$cur" ) ) 580*de1e4e89SAndroid Build Coastguard Worker return 0 581*de1e4e89SAndroid Build Coastguard Worker ;; 582*de1e4e89SAndroid Build Coastguard Worker -n|-net|-netns) 583*de1e4e89SAndroid Build Coastguard Worker local nslist=$( ip netns list 2>/dev/null ) 584*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$nslist" -- "$cur" ) ) 585*de1e4e89SAndroid Build Coastguard Worker return 0 586*de1e4e89SAndroid Build Coastguard Worker ;; 587*de1e4e89SAndroid Build Coastguard Worker -tshort) 588*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr '-statistics' 589*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'monitor' -- "$cur" ) ) 590*de1e4e89SAndroid Build Coastguard Worker return 0 591*de1e4e89SAndroid Build Coastguard Worker ;; 592*de1e4e89SAndroid Build Coastguard Worker -timestamp) 593*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr '-statistics -tshort' 594*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W 'monitor' -- "$cur" ) ) 595*de1e4e89SAndroid Build Coastguard Worker return 0 596*de1e4e89SAndroid Build Coastguard Worker ;; 597*de1e4e89SAndroid Build Coastguard Worker esac 598*de1e4e89SAndroid Build Coastguard Worker 599*de1e4e89SAndroid Build Coastguard Worker # Search for main commands 600*de1e4e89SAndroid Build Coastguard Worker local subcword cmd subcmd 601*de1e4e89SAndroid Build Coastguard Worker for (( subcword=1; subcword < ${#words[@]}-1; subcword++ )); do 602*de1e4e89SAndroid Build Coastguard Worker [[ ${words[subcword]} == -b?(atch) ]] && return 0 603*de1e4e89SAndroid Build Coastguard Worker [[ -n $cmd ]] && subcmd=${words[subcword]} && break 604*de1e4e89SAndroid Build Coastguard Worker [[ ${words[subcword]} != -* && \ 605*de1e4e89SAndroid Build Coastguard Worker ${words[subcword-1]} != -@(n?(et?(ns))|c?(on)f) ]] && \ 606*de1e4e89SAndroid Build Coastguard Worker cmd=${words[subcword]} 607*de1e4e89SAndroid Build Coastguard Worker done 608*de1e4e89SAndroid Build Coastguard Worker 609*de1e4e89SAndroid Build Coastguard Worker if [[ -z $cmd ]]; then 610*de1e4e89SAndroid Build Coastguard Worker case $cur in 611*de1e4e89SAndroid Build Coastguard Worker -*) 612*de1e4e89SAndroid Build Coastguard Worker local c='-Version -statistics -details -raw -pretty \ 613*de1e4e89SAndroid Build Coastguard Worker -iec -graphe -batch -name -netns -timestamp' 614*de1e4e89SAndroid Build Coastguard Worker [[ $cword -eq 1 ]] && c+=' -force' 615*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W "$c" -- "$cur" ) ) 616*de1e4e89SAndroid Build Coastguard Worker return 0 617*de1e4e89SAndroid Build Coastguard Worker ;; 618*de1e4e89SAndroid Build Coastguard Worker *) 619*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W "help $( tc help 2>&1 | \ 620*de1e4e89SAndroid Build Coastguard Worker command sed \ 621*de1e4e89SAndroid Build Coastguard Worker -e '/OBJECT := /!d' \ 622*de1e4e89SAndroid Build Coastguard Worker -e 's/.*{//' \ 623*de1e4e89SAndroid Build Coastguard Worker -e 's/}.*//' \ 624*de1e4e89SAndroid Build Coastguard Worker -e \ 's/|//g' )" -- "$cur" ) ) 625*de1e4e89SAndroid Build Coastguard Worker return 0 626*de1e4e89SAndroid Build Coastguard Worker ;; 627*de1e4e89SAndroid Build Coastguard Worker esac 628*de1e4e89SAndroid Build Coastguard Worker fi 629*de1e4e89SAndroid Build Coastguard Worker 630*de1e4e89SAndroid Build Coastguard Worker [[ $subcmd == help ]] && return 0 631*de1e4e89SAndroid Build Coastguard Worker 632*de1e4e89SAndroid Build Coastguard Worker # For this set of commands we may create COMPREPLY just by analysing the 633*de1e4e89SAndroid Build Coastguard Worker # previous word, if it expects for a specific list of options or values. 634*de1e4e89SAndroid Build Coastguard Worker if [[ $cmd =~ (qdisc|class|filter|action|exec) ]]; then 635*de1e4e89SAndroid Build Coastguard Worker _tc_direct_complete $prev && return 0 636*de1e4e89SAndroid Build Coastguard Worker if [[ ${words[${#words[@]}-3]} == estimator ]]; then 637*de1e4e89SAndroid Build Coastguard Worker local list=$( _tc_expand_units 'secs' 'msecs' 'usecs' ) 638*de1e4e89SAndroid Build Coastguard Worker COMPREPLY+=( $( compgen -W "$list" -- "$cur" ) ) && return 0 639*de1e4e89SAndroid Build Coastguard Worker fi 640*de1e4e89SAndroid Build Coastguard Worker fi 641*de1e4e89SAndroid Build Coastguard Worker 642*de1e4e89SAndroid Build Coastguard Worker # Completion depends on main command and subcommand in use. 643*de1e4e89SAndroid Build Coastguard Worker case $cmd in 644*de1e4e89SAndroid Build Coastguard Worker qdisc) 645*de1e4e89SAndroid Build Coastguard Worker case $subcmd in 646*de1e4e89SAndroid Build Coastguard Worker add|change|replace|link|del|delete) 647*de1e4e89SAndroid Build Coastguard Worker if [[ $(($cword-$subcword)) -eq 1 ]]; then 648*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) 649*de1e4e89SAndroid Build Coastguard Worker return 0 650*de1e4e89SAndroid Build Coastguard Worker fi 651*de1e4e89SAndroid Build Coastguard Worker local qdisc qdwd 652*de1e4e89SAndroid Build Coastguard Worker for ((qdwd=$subcword; qdwd < ${#words[@]}-1; qdwd++)); do 653*de1e4e89SAndroid Build Coastguard Worker if [[ $QDISC_KIND =~ ' '${words[qdwd]}' ' ]]; then 654*de1e4e89SAndroid Build Coastguard Worker qdisc=${words[qdwd]} 655*de1e4e89SAndroid Build Coastguard Worker _tc_qdisc_options $qdisc && return 0 656*de1e4e89SAndroid Build Coastguard Worker fi 657*de1e4e89SAndroid Build Coastguard Worker done 658*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list $QDISC_KIND 659*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'root ingress parent clsact' 660*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'handle estimator stab' 661*de1e4e89SAndroid Build Coastguard Worker ;; 662*de1e4e89SAndroid Build Coastguard Worker show) 663*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'dev' 664*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'ingress clsact' 665*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr '-statistics -details -raw -pretty -iec \ 666*de1e4e89SAndroid Build Coastguard Worker -graph -name' 667*de1e4e89SAndroid Build Coastguard Worker ;; 668*de1e4e89SAndroid Build Coastguard Worker help) 669*de1e4e89SAndroid Build Coastguard Worker return 0 670*de1e4e89SAndroid Build Coastguard Worker ;; 671*de1e4e89SAndroid Build Coastguard Worker *) 672*de1e4e89SAndroid Build Coastguard Worker [[ $cword -eq $subcword ]] && \ 673*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'help add delete change \ 674*de1e4e89SAndroid Build Coastguard Worker replace link show' -- "$cur" ) ) 675*de1e4e89SAndroid Build Coastguard Worker ;; 676*de1e4e89SAndroid Build Coastguard Worker esac 677*de1e4e89SAndroid Build Coastguard Worker ;; 678*de1e4e89SAndroid Build Coastguard Worker 679*de1e4e89SAndroid Build Coastguard Worker class) 680*de1e4e89SAndroid Build Coastguard Worker case $subcmd in 681*de1e4e89SAndroid Build Coastguard Worker add|change|replace|del|delete) 682*de1e4e89SAndroid Build Coastguard Worker if [[ $(($cword-$subcword)) -eq 1 ]]; then 683*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) 684*de1e4e89SAndroid Build Coastguard Worker return 0 685*de1e4e89SAndroid Build Coastguard Worker fi 686*de1e4e89SAndroid Build Coastguard Worker local qdisc qdwd 687*de1e4e89SAndroid Build Coastguard Worker for ((qdwd=$subcword; qdwd < ${#words[@]}-1; qdwd++)); do 688*de1e4e89SAndroid Build Coastguard Worker if [[ $QDISC_KIND =~ ' '${words[qdwd]}' ' ]]; then 689*de1e4e89SAndroid Build Coastguard Worker qdisc=${words[qdwd]} 690*de1e4e89SAndroid Build Coastguard Worker _tc_qdisc_options $qdisc && return 0 691*de1e4e89SAndroid Build Coastguard Worker fi 692*de1e4e89SAndroid Build Coastguard Worker done 693*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list $QDISC_KIND 694*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'root parent' 695*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'classid' 696*de1e4e89SAndroid Build Coastguard Worker ;; 697*de1e4e89SAndroid Build Coastguard Worker show) 698*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'dev' 699*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'root parent' 700*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr '-statistics -details -raw -pretty -iec \ 701*de1e4e89SAndroid Build Coastguard Worker -graph -name' 702*de1e4e89SAndroid Build Coastguard Worker ;; 703*de1e4e89SAndroid Build Coastguard Worker help) 704*de1e4e89SAndroid Build Coastguard Worker return 0 705*de1e4e89SAndroid Build Coastguard Worker ;; 706*de1e4e89SAndroid Build Coastguard Worker *) 707*de1e4e89SAndroid Build Coastguard Worker [[ $cword -eq $subcword ]] && \ 708*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'help add delete change \ 709*de1e4e89SAndroid Build Coastguard Worker replace show' -- "$cur" ) ) 710*de1e4e89SAndroid Build Coastguard Worker ;; 711*de1e4e89SAndroid Build Coastguard Worker esac 712*de1e4e89SAndroid Build Coastguard Worker ;; 713*de1e4e89SAndroid Build Coastguard Worker 714*de1e4e89SAndroid Build Coastguard Worker filter) 715*de1e4e89SAndroid Build Coastguard Worker case $subcmd in 716*de1e4e89SAndroid Build Coastguard Worker add|change|replace|del|delete) 717*de1e4e89SAndroid Build Coastguard Worker if [[ $(($cword-$subcword)) -eq 1 ]]; then 718*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) ) 719*de1e4e89SAndroid Build Coastguard Worker return 0 720*de1e4e89SAndroid Build Coastguard Worker fi 721*de1e4e89SAndroid Build Coastguard Worker local filter fltwd 722*de1e4e89SAndroid Build Coastguard Worker for ((fltwd=$subcword; fltwd < ${#words[@]}-1; fltwd++)); 723*de1e4e89SAndroid Build Coastguard Worker do 724*de1e4e89SAndroid Build Coastguard Worker if [[ $FILTER_KIND =~ ' '${words[fltwd]}' ' ]]; then 725*de1e4e89SAndroid Build Coastguard Worker _tc_filter_options $fltwd && return 0 726*de1e4e89SAndroid Build Coastguard Worker fi 727*de1e4e89SAndroid Build Coastguard Worker done 728*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list $FILTER_KIND 729*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'root ingress egress parent' 730*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'handle estimator pref protocol' 731*de1e4e89SAndroid Build Coastguard Worker ;; 732*de1e4e89SAndroid Build Coastguard Worker show) 733*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'dev' 734*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list 'root ingress egress parent' 735*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr '-statistics -details -raw -pretty -iec \ 736*de1e4e89SAndroid Build Coastguard Worker -graph -name' 737*de1e4e89SAndroid Build Coastguard Worker ;; 738*de1e4e89SAndroid Build Coastguard Worker help) 739*de1e4e89SAndroid Build Coastguard Worker return 0 740*de1e4e89SAndroid Build Coastguard Worker ;; 741*de1e4e89SAndroid Build Coastguard Worker *) 742*de1e4e89SAndroid Build Coastguard Worker [[ $cword -eq $subcword ]] && \ 743*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'help add delete change \ 744*de1e4e89SAndroid Build Coastguard Worker replace show' -- "$cur" ) ) 745*de1e4e89SAndroid Build Coastguard Worker ;; 746*de1e4e89SAndroid Build Coastguard Worker esac 747*de1e4e89SAndroid Build Coastguard Worker ;; 748*de1e4e89SAndroid Build Coastguard Worker 749*de1e4e89SAndroid Build Coastguard Worker action) 750*de1e4e89SAndroid Build Coastguard Worker case $subcmd in 751*de1e4e89SAndroid Build Coastguard Worker add|change|replace) 752*de1e4e89SAndroid Build Coastguard Worker local action acwd 753*de1e4e89SAndroid Build Coastguard Worker for ((acwd=$subcword; acwd < ${#words[@]}-1; acwd++)); do 754*de1e4e89SAndroid Build Coastguard Worker if [[ $ACTION_KIND =~ ' '${words[acwd]}' ' ]]; then 755*de1e4e89SAndroid Build Coastguard Worker _tc_action_options $acwd && return 0 756*de1e4e89SAndroid Build Coastguard Worker fi 757*de1e4e89SAndroid Build Coastguard Worker done 758*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list $ACTION_KIND 759*de1e4e89SAndroid Build Coastguard Worker ;; 760*de1e4e89SAndroid Build Coastguard Worker get|del|delete) 761*de1e4e89SAndroid Build Coastguard Worker _tc_once_attr 'index' 762*de1e4e89SAndroid Build Coastguard Worker ;; 763*de1e4e89SAndroid Build Coastguard Worker lst|list|flush|show) 764*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list $ACTION_KIND 765*de1e4e89SAndroid Build Coastguard Worker ;; 766*de1e4e89SAndroid Build Coastguard Worker *) 767*de1e4e89SAndroid Build Coastguard Worker [[ $cword -eq $subcword ]] && \ 768*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'help add delete change \ 769*de1e4e89SAndroid Build Coastguard Worker replace show list flush action' -- "$cur" ) ) 770*de1e4e89SAndroid Build Coastguard Worker ;; 771*de1e4e89SAndroid Build Coastguard Worker esac 772*de1e4e89SAndroid Build Coastguard Worker ;; 773*de1e4e89SAndroid Build Coastguard Worker 774*de1e4e89SAndroid Build Coastguard Worker monitor) 775*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'help' -- "$cur" ) ) 776*de1e4e89SAndroid Build Coastguard Worker ;; 777*de1e4e89SAndroid Build Coastguard Worker 778*de1e4e89SAndroid Build Coastguard Worker exec) 779*de1e4e89SAndroid Build Coastguard Worker case $subcmd in 780*de1e4e89SAndroid Build Coastguard Worker bpf) 781*de1e4e89SAndroid Build Coastguard Worker local excmd exwd EXEC_KIND=' import debug graft ' 782*de1e4e89SAndroid Build Coastguard Worker for ((exwd=$subcword; exwd < ${#words[@]}-1; exwd++)); do 783*de1e4e89SAndroid Build Coastguard Worker if [[ $EXEC_KIND =~ ' '${words[exwd]}' ' ]]; then 784*de1e4e89SAndroid Build Coastguard Worker excmd=${words[exwd]} 785*de1e4e89SAndroid Build Coastguard Worker _tc_exec_options $excmd && return 0 786*de1e4e89SAndroid Build Coastguard Worker fi 787*de1e4e89SAndroid Build Coastguard Worker done 788*de1e4e89SAndroid Build Coastguard Worker _tc_one_of_list $EXEC_KIND 789*de1e4e89SAndroid Build Coastguard Worker ;; 790*de1e4e89SAndroid Build Coastguard Worker *) 791*de1e4e89SAndroid Build Coastguard Worker [[ $cword -eq $subcword ]] && \ 792*de1e4e89SAndroid Build Coastguard Worker COMPREPLY=( $( compgen -W 'bpf' -- "$cur" ) ) 793*de1e4e89SAndroid Build Coastguard Worker ;; 794*de1e4e89SAndroid Build Coastguard Worker esac 795*de1e4e89SAndroid Build Coastguard Worker ;; 796*de1e4e89SAndroid Build Coastguard Worker esac 797*de1e4e89SAndroid Build Coastguard Worker} && 798*de1e4e89SAndroid Build Coastguard Workercomplete -F _tc tc 799*de1e4e89SAndroid Build Coastguard Worker 800*de1e4e89SAndroid Build Coastguard Worker# ex: ts=4 sw=4 et filetype=sh 801