| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203 |
- # bpftool(8) bash completion -*- shell-script -*-
- #
- # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
- # Copyright (C) 2017-2018 Netronome Systems, Inc.
- #
- # Author: Quentin Monnet <quentin.monnet@netronome.com>
- # Takes a list of words in argument; each one of them is added to COMPREPLY if
- # it is not already present on the command line. Returns no value.
- _bpftool_once_attr()
- {
- local w idx found
- for w in $*; do
- found=0
- for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
- if [[ $w == ${words[idx]} ]]; then
- found=1
- break
- fi
- done
- [[ $found -eq 0 ]] && \
- COMPREPLY+=( $( compgen -W "$w" -- "$cur" ) )
- done
- }
- # Takes a list of words as argument; if any of those words is present on the
- # command line, return 0. Otherwise, return 1.
- _bpftool_search_list()
- {
- local w idx
- for w in $*; do
- for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
- [[ $w == ${words[idx]} ]] && return 0
- done
- done
- return 1
- }
- # Takes a list of words in argument; adds them all to COMPREPLY if none of them
- # is already present on the command line. Returns no value.
- _bpftool_one_of_list()
- {
- _bpftool_search_list $* && return 1
- COMPREPLY+=( $( compgen -W "$*" -- "$cur" ) )
- }
- _bpftool_get_map_ids()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \
- command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- # Takes map type and adds matching map ids to the list of suggestions.
- _bpftool_get_map_ids_for_type()
- {
- local type="$1"
- COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \
- command grep -C2 "$type" | \
- command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_map_names()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \
- command sed -n 's/.*"name": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- # Takes map type and adds matching map names to the list of suggestions.
- _bpftool_get_map_names_for_type()
- {
- local type="$1"
- COMPREPLY+=( $( compgen -W "$( bpftool -jp map 2>&1 | \
- command grep -C2 "$type" | \
- command sed -n 's/.*"name": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_prog_ids()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
- command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_prog_tags()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
- command sed -n 's/.*"tag": "\(.*\)",$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_prog_names()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \
- command sed -n 's/.*"name": "\(.*\)",$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_btf_ids()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp btf 2>&1 | \
- command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_link_ids()
- {
- COMPREPLY+=( $( compgen -W "$( bpftool -jp link 2>&1 | \
- command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) )
- }
- _bpftool_get_obj_map_names()
- {
- local obj maps
- obj=$1
- maps=$(objdump -j .maps -t $obj 2>/dev/null | \
- command awk '/g . .maps/ {print $NF}')
- COMPREPLY+=( $( compgen -W "$maps" -- "$cur" ) )
- }
- _bpftool_get_obj_map_idxs()
- {
- local obj nmaps
- obj=$1
- nmaps=$(objdump -j maps -t $obj 2>/dev/null | grep -c 'g . maps')
- COMPREPLY+=( $( compgen -W "$(seq 0 $((nmaps - 1)))" -- "$cur" ) )
- }
- _sysfs_get_netdevs()
- {
- COMPREPLY+=( $( compgen -W "$( ls /sys/class/net 2>/dev/null )" -- \
- "$cur" ) )
- }
- # Retrieve type of the map that we are operating on.
- _bpftool_map_guess_map_type()
- {
- local keyword idx ref=""
- for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
- case "${words[$((idx-2))]}" in
- lookup|update)
- keyword=${words[$((idx-1))]}
- ref=${words[$((idx))]}
- ;;
- push)
- printf "stack"
- return 0
- ;;
- enqueue)
- printf "queue"
- return 0
- ;;
- esac
- done
- [[ -z $ref ]] && return 0
- local type
- type=$(bpftool -jp map show $keyword $ref | \
- command sed -n 's/.*"type": "\(.*\)",$/\1/p')
- [[ -n $type ]] && printf $type
- }
- _bpftool_map_update_get_id()
- {
- local command="$1"
- # Is it the map to update, or a map to insert into the map to update?
- # Search for "value" keyword.
- local idx value
- for (( idx=7; idx < ${#words[@]}-1; idx++ )); do
- if [[ ${words[idx]} == "value" ]]; then
- value=1
- break
- fi
- done
- if [[ $value -eq 0 ]]; then
- case "$command" in
- push)
- _bpftool_get_map_ids_for_type stack
- ;;
- enqueue)
- _bpftool_get_map_ids_for_type queue
- ;;
- *)
- _bpftool_get_map_ids
- ;;
- esac
- return 0
- fi
- # Id to complete is for a value. It can be either prog id or map id. This
- # depends on the type of the map to update.
- local type=$(_bpftool_map_guess_map_type)
- case $type in
- array_of_maps|hash_of_maps)
- _bpftool_get_map_ids
- return 0
- ;;
- prog_array)
- _bpftool_get_prog_ids
- return 0
- ;;
- *)
- return 0
- ;;
- esac
- }
- _bpftool_map_update_get_name()
- {
- local command="$1"
- # Is it the map to update, or a map to insert into the map to update?
- # Search for "value" keyword.
- local idx value
- for (( idx=7; idx < ${#words[@]}-1; idx++ )); do
- if [[ ${words[idx]} == "value" ]]; then
- value=1
- break
- fi
- done
- if [[ $value -eq 0 ]]; then
- case "$command" in
- push)
- _bpftool_get_map_names_for_type stack
- ;;
- enqueue)
- _bpftool_get_map_names_for_type queue
- ;;
- *)
- _bpftool_get_map_names
- ;;
- esac
- return 0
- fi
- # Name to complete is for a value. It can be either prog name or map name. This
- # depends on the type of the map to update.
- local type=$(_bpftool_map_guess_map_type)
- case $type in
- array_of_maps|hash_of_maps)
- _bpftool_get_map_names
- return 0
- ;;
- prog_array)
- _bpftool_get_prog_names
- return 0
- ;;
- *)
- return 0
- ;;
- esac
- }
- _bpftool()
- {
- local cur prev words cword comp_args
- local json=0
- _init_completion -- "$@" || return
- # Deal with options
- if [[ ${words[cword]} == -* ]]; then
- local c='--version --json --pretty --bpffs --mapcompat --debug \
- --use-loader --base-btf'
- COMPREPLY=( $( compgen -W "$c" -- "$cur" ) )
- return 0
- fi
- if _bpftool_search_list -j --json -p --pretty; then
- json=1
- fi
- # Deal with simplest keywords
- case $prev in
- help|hex)
- return 0
- ;;
- tag)
- _bpftool_get_prog_tags
- return 0
- ;;
- dev|offload_dev|xdpmeta_dev)
- _sysfs_get_netdevs
- return 0
- ;;
- file|pinned|-B|--base-btf)
- _filedir
- return 0
- ;;
- batch)
- COMPREPLY=( $( compgen -W 'file' -- "$cur" ) )
- return 0
- ;;
- esac
- # Remove all options so completions don't have to deal with them.
- local i pprev
- for (( i=1; i < ${#words[@]}; )); do
- if [[ ${words[i]::1} == - ]] &&
- [[ ${words[i]} != "-B" ]] && [[ ${words[i]} != "--base-btf" ]]; then
- words=( "${words[@]:0:i}" "${words[@]:i+1}" )
- [[ $i -le $cword ]] && cword=$(( cword - 1 ))
- else
- i=$(( ++i ))
- fi
- done
- cur=${words[cword]}
- prev=${words[cword - 1]}
- pprev=${words[cword - 2]}
- local object=${words[1]}
- if [[ -z $object || $cword -eq 1 ]]; then
- case $cur in
- *)
- COMPREPLY=( $( compgen -W "$( bpftool help 2>&1 | \
- command sed \
- -e '/OBJECT := /!d' \
- -e 's/.*{//' \
- -e 's/}.*//' \
- -e 's/|//g' )" -- "$cur" ) )
- COMPREPLY+=( $( compgen -W 'batch help' -- "$cur" ) )
- return 0
- ;;
- esac
- fi
- local command=${words[2]}
- [[ $command == help ]] && return 0
- local MAP_TYPE='id pinned name'
- local PROG_TYPE='id pinned tag name'
- # Completion depends on object and command in use
- case $object in
- prog)
- # Complete id and name, only for subcommands that use prog (but no
- # map) ids/names.
- case $command in
- show|list|dump|pin)
- case $prev in
- id)
- _bpftool_get_prog_ids
- return 0
- ;;
- name)
- _bpftool_get_prog_names
- return 0
- ;;
- esac
- ;;
- esac
- local METRIC_TYPE='cycles instructions l1d_loads llc_misses \
- itlb_misses dtlb_misses'
- case $command in
- show|list)
- [[ $prev != "$command" ]] && return 0
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- return 0
- ;;
- dump)
- case $prev in
- $command)
- COMPREPLY+=( $( compgen -W "xlated jited" -- \
- "$cur" ) )
- return 0
- ;;
- xlated|jited)
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \
- "$cur" ) )
- return 0
- ;;
- *)
- # "file" is not compatible with other keywords here
- if _bpftool_search_list 'file'; then
- return 0
- fi
- if ! _bpftool_search_list 'linum opcodes visual'; then
- _bpftool_once_attr 'file'
- fi
- _bpftool_once_attr 'linum opcodes'
- if _bpftool_search_list 'xlated' && [[ "$json" == 0 ]]; then
- _bpftool_once_attr 'visual'
- fi
- return 0
- ;;
- esac
- ;;
- pin)
- if [[ $prev == "$command" ]]; then
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- else
- _filedir
- fi
- return 0
- ;;
- attach|detach)
- case $cword in
- 3)
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- return 0
- ;;
- 4)
- case $prev in
- id)
- _bpftool_get_prog_ids
- ;;
- name)
- _bpftool_get_prog_names
- ;;
- pinned)
- _filedir
- ;;
- esac
- return 0
- ;;
- 5)
- local BPFTOOL_PROG_ATTACH_TYPES='sk_msg_verdict \
- sk_skb_verdict sk_skb_stream_verdict sk_skb_stream_parser \
- flow_dissector'
- COMPREPLY=( $( compgen -W "$BPFTOOL_PROG_ATTACH_TYPES" -- "$cur" ) )
- return 0
- ;;
- 6)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- 7)
- case $prev in
- id)
- _bpftool_get_map_ids
- ;;
- name)
- _bpftool_get_map_names
- ;;
- pinned)
- _filedir
- ;;
- esac
- return 0
- ;;
- esac
- ;;
- load|loadall)
- local obj
- # Propose "load/loadall" to complete "bpftool prog load",
- # or bash tries to complete "load" as a filename below.
- if [[ ${#words[@]} -eq 3 ]]; then
- COMPREPLY=( $( compgen -W "load loadall" -- "$cur" ) )
- return 0
- fi
- if [[ ${#words[@]} -lt 6 ]]; then
- _filedir
- return 0
- fi
- obj=${words[3]}
- if [[ ${words[-4]} == "map" ]]; then
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- fi
- if [[ ${words[-3]} == "map" ]]; then
- if [[ ${words[-2]} == "idx" ]]; then
- _bpftool_get_obj_map_idxs $obj
- elif [[ ${words[-2]} == "name" ]]; then
- _bpftool_get_obj_map_names $obj
- fi
- return 0
- fi
- if [[ ${words[-2]} == "map" ]]; then
- COMPREPLY=( $( compgen -W "idx name" -- "$cur" ) )
- return 0
- fi
- case $prev in
- type)
- local BPFTOOL_PROG_LOAD_TYPES='socket kprobe \
- kretprobe classifier flow_dissector \
- action tracepoint raw_tracepoint \
- xdp perf_event cgroup/skb cgroup/sock \
- cgroup/dev lwt_in lwt_out lwt_xmit \
- lwt_seg6local sockops sk_skb sk_msg lirc_mode2 \
- cgroup/bind4 cgroup/bind6 \
- cgroup/connect4 cgroup/connect6 cgroup/connect_unix \
- cgroup/getpeername4 cgroup/getpeername6 cgroup/getpeername_unix \
- cgroup/getsockname4 cgroup/getsockname6 cgroup/getsockname_unix \
- cgroup/sendmsg4 cgroup/sendmsg6 cgroup/sendmsg_unix \
- cgroup/recvmsg4 cgroup/recvmsg6 cgroup/recvmsg_unix \
- cgroup/post_bind4 cgroup/post_bind6 \
- cgroup/sysctl cgroup/getsockopt \
- cgroup/setsockopt cgroup/sock_release struct_ops \
- fentry fexit freplace sk_lookup'
- COMPREPLY=( $( compgen -W "$BPFTOOL_PROG_LOAD_TYPES" -- "$cur" ) )
- return 0
- ;;
- id)
- _bpftool_get_map_ids
- return 0
- ;;
- name)
- _bpftool_get_map_names
- return 0
- ;;
- pinned|pinmaps)
- _filedir
- return 0
- ;;
- *)
- COMPREPLY=( $( compgen -W "map" -- "$cur" ) )
- _bpftool_once_attr 'type pinmaps autoattach'
- _bpftool_one_of_list 'offload_dev xdpmeta_dev'
- return 0
- ;;
- esac
- ;;
- tracelog)
- return 0
- ;;
- profile)
- case $cword in
- 3)
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- return 0
- ;;
- 4)
- case $prev in
- id)
- _bpftool_get_prog_ids
- ;;
- name)
- _bpftool_get_prog_names
- ;;
- pinned)
- _filedir
- ;;
- esac
- return 0
- ;;
- 5)
- COMPREPLY=( $( compgen -W "$METRIC_TYPE duration" -- "$cur" ) )
- return 0
- ;;
- *)
- [[ $prev == duration ]] && return 0
- _bpftool_once_attr "$METRIC_TYPE"
- return 0
- ;;
- esac
- ;;
- run)
- if [[ ${#words[@]} -eq 4 ]]; then
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- return 0
- fi
- case $prev in
- id)
- _bpftool_get_prog_ids
- return 0
- ;;
- name)
- _bpftool_get_prog_names
- return 0
- ;;
- data_in|data_out|ctx_in|ctx_out)
- _filedir
- return 0
- ;;
- repeat|data_size_out|ctx_size_out)
- return 0
- ;;
- *)
- _bpftool_once_attr 'data_in data_out data_size_out \
- ctx_in ctx_out ctx_size_out repeat'
- return 0
- ;;
- esac
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'dump help pin attach detach \
- load loadall show list tracelog run profile' -- "$cur" ) )
- ;;
- esac
- ;;
- struct_ops)
- local STRUCT_OPS_TYPE='id name'
- case $command in
- show|list|dump|unregister)
- case $prev in
- $command)
- COMPREPLY=( $( compgen -W "$STRUCT_OPS_TYPE" -- "$cur" ) )
- ;;
- id)
- _bpftool_get_map_ids_for_type struct_ops
- ;;
- name)
- _bpftool_get_map_names_for_type struct_ops
- ;;
- esac
- return 0
- ;;
- register)
- [[ $prev == $command ]] && _filedir
- return 0
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'register unregister show list dump help' \
- -- "$cur" ) )
- ;;
- esac
- ;;
- iter)
- case $command in
- pin)
- case $prev in
- $command)
- _filedir
- ;;
- id)
- _bpftool_get_map_ids
- ;;
- name)
- _bpftool_get_map_names
- ;;
- pinned)
- _filedir
- ;;
- map)
- _bpftool_one_of_list $MAP_TYPE
- ;;
- *)
- _bpftool_once_attr 'map'
- ;;
- esac
- return 0
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'pin help' \
- -- "$cur" ) )
- ;;
- esac
- ;;
- map)
- case $command in
- show|list|dump|peek|pop|dequeue|freeze)
- case $prev in
- $command)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- id)
- case "$command" in
- peek)
- _bpftool_get_map_ids_for_type stack
- _bpftool_get_map_ids_for_type queue
- ;;
- pop)
- _bpftool_get_map_ids_for_type stack
- ;;
- dequeue)
- _bpftool_get_map_ids_for_type queue
- ;;
- *)
- _bpftool_get_map_ids
- ;;
- esac
- return 0
- ;;
- name)
- case "$command" in
- peek)
- _bpftool_get_map_names_for_type stack
- _bpftool_get_map_names_for_type queue
- ;;
- pop)
- _bpftool_get_map_names_for_type stack
- ;;
- dequeue)
- _bpftool_get_map_names_for_type queue
- ;;
- *)
- _bpftool_get_map_names
- ;;
- esac
- return 0
- ;;
- *)
- return 0
- ;;
- esac
- ;;
- create)
- case $prev in
- $command)
- _filedir
- return 0
- ;;
- type)
- local BPFTOOL_MAP_CREATE_TYPES="$(bpftool feature list_builtins map_types 2>/dev/null | \
- grep -v '^unspec$')"
- COMPREPLY=( $( compgen -W "$BPFTOOL_MAP_CREATE_TYPES" -- "$cur" ) )
- return 0
- ;;
- key|value|flags|entries)
- return 0
- ;;
- inner_map)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- id)
- _bpftool_get_map_ids
- ;;
- name)
- case $pprev in
- inner_map)
- _bpftool_get_map_names
- ;;
- *)
- return 0
- ;;
- esac
- ;;
- *)
- _bpftool_once_attr 'type key value entries name flags offload_dev'
- if _bpftool_search_list 'array_of_maps' 'hash_of_maps'; then
- _bpftool_once_attr 'inner_map'
- fi
- return 0
- ;;
- esac
- ;;
- lookup|getnext|delete)
- case $prev in
- $command)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- id)
- _bpftool_get_map_ids
- return 0
- ;;
- name)
- _bpftool_get_map_names
- return 0
- ;;
- key)
- COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) )
- ;;
- *)
- case $(_bpftool_map_guess_map_type) in
- queue|stack)
- return 0
- ;;
- esac
- _bpftool_once_attr 'key'
- return 0
- ;;
- esac
- ;;
- update|push|enqueue)
- case $prev in
- $command)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- id)
- _bpftool_map_update_get_id $command
- return 0
- ;;
- name)
- _bpftool_map_update_get_name $command
- return 0
- ;;
- key)
- COMPREPLY+=( $( compgen -W 'hex' -- "$cur" ) )
- ;;
- value)
- # We can have bytes, or references to a prog or a
- # map, depending on the type of the map to update.
- case "$(_bpftool_map_guess_map_type)" in
- array_of_maps|hash_of_maps)
- COMPREPLY+=( $( compgen -W "$MAP_TYPE" \
- -- "$cur" ) )
- return 0
- ;;
- prog_array)
- COMPREPLY+=( $( compgen -W "$PROG_TYPE" \
- -- "$cur" ) )
- return 0
- ;;
- *)
- COMPREPLY+=( $( compgen -W 'hex' \
- -- "$cur" ) )
- return 0
- ;;
- esac
- return 0
- ;;
- *)
- case $(_bpftool_map_guess_map_type) in
- queue|stack)
- _bpftool_once_attr 'value'
- return 0;
- ;;
- esac
- _bpftool_once_attr 'key'
- local UPDATE_FLAGS='any exist noexist' idx
- for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
- if [[ ${words[idx]} == 'value' ]]; then
- # 'value' is present, but is not the last
- # word i.e. we can now have UPDATE_FLAGS.
- _bpftool_one_of_list "$UPDATE_FLAGS"
- return 0
- fi
- done
- for (( idx=3; idx < ${#words[@]}-1; idx++ )); do
- if [[ ${words[idx]} == 'key' ]]; then
- # 'key' is present, but is not the last
- # word i.e. we can now have 'value'.
- _bpftool_once_attr 'value'
- return 0
- fi
- done
- return 0
- ;;
- esac
- ;;
- pin)
- case $prev in
- $command)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- ;;
- id)
- _bpftool_get_map_ids
- ;;
- name)
- _bpftool_get_map_names
- ;;
- esac
- return 0
- ;;
- event_pipe)
- case $prev in
- $command)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- id)
- _bpftool_get_map_ids_for_type perf_event_array
- return 0
- ;;
- name)
- _bpftool_get_map_names_for_type perf_event_array
- return 0
- ;;
- cpu)
- return 0
- ;;
- index)
- return 0
- ;;
- *)
- _bpftool_once_attr 'cpu index'
- return 0
- ;;
- esac
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'delete dump getnext help \
- lookup pin event_pipe show list update create \
- peek push enqueue pop dequeue freeze' -- \
- "$cur" ) )
- ;;
- esac
- ;;
- btf)
- local MAP_TYPE='id pinned name'
- case $command in
- dump)
- case $prev in
- $command)
- COMPREPLY+=( $( compgen -W "id map prog file" -- \
- "$cur" ) )
- return 0
- ;;
- prog)
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- return 0
- ;;
- map)
- COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) )
- return 0
- ;;
- id)
- case $pprev in
- prog)
- _bpftool_get_prog_ids
- ;;
- map)
- _bpftool_get_map_ids
- ;;
- $command)
- _bpftool_get_btf_ids
- ;;
- esac
- return 0
- ;;
- name)
- case $pprev in
- prog)
- _bpftool_get_prog_names
- ;;
- map)
- _bpftool_get_map_names
- ;;
- esac
- return 0
- ;;
- format)
- COMPREPLY=( $( compgen -W "c raw" -- "$cur" ) )
- ;;
- c)
- COMPREPLY=( $( compgen -W "unsorted" -- "$cur" ) )
- ;;
- *)
- # emit extra options
- case ${words[3]} in
- id|file)
- _bpftool_once_attr 'format'
- ;;
- map|prog)
- if [[ ${words[3]} == "map" ]] && [[ $cword == 6 ]]; then
- COMPREPLY+=( $( compgen -W "key value kv all" -- "$cur" ) )
- fi
- _bpftool_once_attr 'format'
- ;;
- *)
- ;;
- esac
- return 0
- ;;
- esac
- ;;
- show|list)
- case $prev in
- $command)
- COMPREPLY+=( $( compgen -W "id" -- "$cur" ) )
- ;;
- id)
- _bpftool_get_btf_ids
- ;;
- esac
- return 0
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'dump help show list' \
- -- "$cur" ) )
- ;;
- esac
- ;;
- gen)
- case $command in
- object)
- _filedir
- return 0
- ;;
- skeleton)
- case $prev in
- $command)
- _filedir
- return 0
- ;;
- *)
- _bpftool_once_attr 'name'
- return 0
- ;;
- esac
- ;;
- subskeleton)
- case $prev in
- $command)
- _filedir
- return 0
- ;;
- *)
- _bpftool_once_attr 'name'
- return 0
- ;;
- esac
- ;;
- min_core_btf)
- _filedir
- return 0
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'object skeleton subskeleton help min_core_btf' -- "$cur" ) )
- ;;
- esac
- ;;
- cgroup)
- case $command in
- show|list|tree)
- case $cword in
- 3)
- _filedir
- ;;
- 4)
- COMPREPLY=( $( compgen -W 'effective' -- "$cur" ) )
- ;;
- esac
- return 0
- ;;
- attach|detach)
- local BPFTOOL_CGROUP_ATTACH_TYPES="$(bpftool feature list_builtins attach_types 2>/dev/null | \
- grep '^cgroup_')"
- local ATTACH_FLAGS='multi override'
- # Check for $prev = $command first
- if [ $prev = $command ]; then
- _filedir
- return 0
- # Then check for attach type. This is done outside of the
- # "case $prev in" to avoid writing the whole list of attach
- # types again as pattern to match (where we cannot reuse
- # our variable).
- elif [[ $BPFTOOL_CGROUP_ATTACH_TYPES =~ $prev ]]; then
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- \
- "$cur" ) )
- return 0
- fi
- # case/esac for the other cases
- case $prev in
- id)
- _bpftool_get_prog_ids
- return 0
- ;;
- *)
- if ! _bpftool_search_list "$BPFTOOL_CGROUP_ATTACH_TYPES"; then
- COMPREPLY=( $( compgen -W \
- "$BPFTOOL_CGROUP_ATTACH_TYPES" -- "$cur" ) )
- elif [[ "$command" == "attach" ]]; then
- # We have an attach type on the command line,
- # but it is not the previous word, or
- # "id|pinned|tag|name" (we already checked for
- # that). This should only leave the case when
- # we need attach flags for "attach" commamnd.
- _bpftool_one_of_list "$ATTACH_FLAGS"
- fi
- return 0
- ;;
- esac
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'help attach detach \
- show list tree' -- "$cur" ) )
- ;;
- esac
- ;;
- perf)
- case $command in
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'help \
- show list' -- "$cur" ) )
- ;;
- esac
- ;;
- net)
- local ATTACH_TYPES='xdp xdpgeneric xdpdrv xdpoffload tcx_ingress tcx_egress'
- case $command in
- show|list)
- [[ $prev != "$command" ]] && return 0
- COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) )
- return 0
- ;;
- attach)
- case $cword in
- 3)
- COMPREPLY=( $( compgen -W "$ATTACH_TYPES" -- "$cur" ) )
- return 0
- ;;
- 4)
- COMPREPLY=( $( compgen -W "$PROG_TYPE" -- "$cur" ) )
- return 0
- ;;
- 5)
- case $prev in
- id)
- _bpftool_get_prog_ids
- ;;
- name)
- _bpftool_get_prog_names
- ;;
- pinned)
- _filedir
- ;;
- esac
- return 0
- ;;
- 6)
- COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) )
- return 0
- ;;
- 8)
- _bpftool_once_attr 'overwrite'
- return 0
- ;;
- esac
- ;;
- detach)
- case $cword in
- 3)
- COMPREPLY=( $( compgen -W "$ATTACH_TYPES" -- "$cur" ) )
- return 0
- ;;
- 4)
- COMPREPLY=( $( compgen -W 'dev' -- "$cur" ) )
- return 0
- ;;
- esac
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'help \
- show list attach detach' -- "$cur" ) )
- ;;
- esac
- ;;
- feature)
- case $command in
- probe)
- [[ $prev == "prefix" ]] && return 0
- if _bpftool_search_list 'macros'; then
- _bpftool_once_attr 'prefix'
- else
- COMPREPLY+=( $( compgen -W 'macros' -- "$cur" ) )
- fi
- _bpftool_one_of_list 'kernel dev'
- _bpftool_once_attr 'full unprivileged'
- return 0
- ;;
- list_builtins)
- [[ $prev != "$command" ]] && return 0
- COMPREPLY=( $( compgen -W 'prog_types map_types \
- attach_types link_types helpers' -- "$cur" ) )
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'help list_builtins probe' -- "$cur" ) )
- ;;
- esac
- ;;
- link)
- case $command in
- show|list|pin|detach)
- case $prev in
- id)
- _bpftool_get_link_ids
- return 0
- ;;
- esac
- ;;
- esac
- local LINK_TYPE='id pinned'
- case $command in
- show|list)
- [[ $prev != "$command" ]] && return 0
- COMPREPLY=( $( compgen -W "$LINK_TYPE" -- "$cur" ) )
- return 0
- ;;
- pin|detach)
- if [[ $prev == "$command" ]]; then
- COMPREPLY=( $( compgen -W "$LINK_TYPE" -- "$cur" ) )
- elif [[ $pprev == "$command" ]]; then
- _filedir
- fi
- return 0
- ;;
- *)
- [[ $prev == $object ]] && \
- COMPREPLY=( $( compgen -W 'help pin detach show list' -- "$cur" ) )
- ;;
- esac
- ;;
- esac
- } &&
- complete -F _bpftool bpftool
- # ex: ts=4 sw=4 et filetype=sh
|