xref: /aosp_15_r20/external/iproute2/bash-completion/tc (revision de1e4e894b0c224df933550f0afdecc354b238c4)
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