JFIF   ( %!1!%)+...383,7(-.+  ++-+++++-++-++--+--+-+-------+-++-+--+---+++--+7+-+"F!1AQaq"2BRb#3Sr$CDsT&!Q1Aa"2Rbq ?򉄘ǷLR HR,nNb .&W)fJbMOYxj-\bT2(4CQ"qiC/ " %0Jl"e2V  0SDd2@TV^{cW&F͉x9#l,.XɳvRZ C8S 6ml!@!E! `FS!M #(d)Q lml1ml Ų&x(ʨ2NFmj@D<dN5UN˄uTB emLAy#` ` ` I!I 6āHBxL & J#7BQ.$hv h q+tC"EJ) 8R e2U2Y@j%6PF^4LnNBp"8)4JI-ֲvK ^؊)hz[T5˗",Rҥf8ڤS4ʘ!`D ` X+ L,(hl)*S##`6[`0*L T H*HA@I&&r1kr*r*)N$#L  1#ZFSl `[( ("((he`4 Ch [="A R / 0I`twCDcWh"i) cLad\BcLKHZ"ZEW$Ƚ@A~i^`S *A&h:+c Y6vϕGClRPs.`H`(@<$qDe pL@DpLX, E2MP A  `II m& AQ "AT rbg# g2!SiLj*3L \ G;TFL`K BMy 2S`YLh1 d >-"ZfD^Q DH" RAbEV#Lfq,(rETp64-IJ!*p4F$q;G8DQ/TKP2$jp3KW]FtLtƉ1ol]VBgػJH6 )h61GJR7Nj.Z4piJRDd]t]0dP]:N.b'⹙SvDSz]L,_#ugT&[~?cS^"{Bh{/=ۑxOk̳O59o dar793`)SeYM@\ "$E(Tm&)N2Ih)F5EDed(FS,Pa @!@#@lea HCD$11jCLJqcod S3yd*,lL+QEfsgW1nw)cT#dS HXkFJB"6(ʝH)H"#EZh:Y`khݳh%Sc<mlAko2]gDqQtro=3OƸU9_-t8UvW3sGəg*#:c)><"wc\ASmT|6Ę>9~#1Ƈ~ڒE1vVi# I MM#u$8W 5ǍfƬΜg*Qpi1ȩFOf۔S,/⎯(Lrմ`(Z LsbA \6 6dm[I=!r:REI.wgzG)ԇSbӑxuׇTyyL^e'x^ty4Z&eB]I|v59Jjhm;Ng񷫳n<ϞҼѝjk;׹DlY^ҍ\+x9V!j([cmS.NO6jxNζrm&oײizT$N>?~ Sl-:iڥk\at#E!CL`.O0a*w/WV7/r)DŽt7'Nĵ#7O1 ]{[/-2bA<$&Gm_4t)_>)mjG;V^'k59o>ɌM,ؾf9z6 4v_3T.5V/RD-5 %T5XTޫ4TaZ`U *ƱUƲ UG"5+sJJ2E9#܎kr2G3Bb,XM6H: ?@p!'\4V02aԙ) hbZ]:` ev3ʘ'}!ohȒ*TJjr[RFyQ*#{h{R]J]Lr-.D-.җfo$D ?X0%~1P.Og{cWϫ22&Ϭ_V.W3nmiOl}+!˫#`kR33aUb0-g:qmsέ+0HO|&nhOn+}n5QF_"gvLm/z'+r'n_oC语i|1}Gi|}_D~9JZ_%DVQp\koۅjAs~/c0ksUJi^W9W5!>?O:q|ˣSIB/&K<(lg(%Wg$|LW7vߤW߇q|jef3D H\S6(eJb*@&sTKTW/*@v:.N- @ITʓ1Zg&-eꓝM r]EMס{q$b]'7Z7N:O~lNlP7iͲk)$O^퉢<YSD*hr'Z#5e6t[Fdh AJǔP9P 1\R).Il+jI*,(ܢ22N*OwKFX gc?\mB7iA+εe8 "ġ/p5pW-$މ-[a 5ViAW/V{/&UsF./՞ҕ*)rZg.^_+gt_z-oAbqQn*WlHyZ*\TaEewlLR3ԹȭN}MM}aih"5ܕRT$:~'TcT|*)xGC>n+r{XU xuF"<~67у'fxlf`r3D*#Z1ђfH`2dIWo/qB| 63xxW6^m%Kvg>\>x>!H5Nr8J/FJ9Wx(Hou" S'kWاC\9ְ#^OaҮ+~gnkuЉ,aWU*1 읍jnb|e= :2.UL`Q}YS&gI.c=a`%j:C%2@^>])25/ܙ<lzwɛ)ݣS4h3=J tyϬ.E7 8ڞGZu\_JHsݢϑ}IZ"ӳ=X<Ɖ2{a:{7L+>V}c)*lo Yv&+|L;>+/Sj26K+澡*;>-s"}M2] Ig5aCL*r"&\} #^R.7_Mgf}.ߌy(}Z\gP&ʠHj%</{.]rߙQ`>;5g;u6dԛ %xb|oՋTJ5Ϥ(]XqP>f{Jk2,8'~ZU6tMQsg XKg^2ϓ3},[wo۴I|ܷ%[Ol\Pkr]Y//cg6U⧻/VПi8ys_n<\~cze!!H~x;QJZKȮ^ȧG|cS~8ji,Fo+,y~?pk)u /in3JmkX(Mj1N 4c Epc>BO *LfQO&` c;LjcYf 1ɻ)CLsY^Y5" lP/wuEln&dav,(;'W9ej ku`-KHI՟%ԁʁ 1\}?OjsF^Xn$Ё.օC>D:?I @aGE.ĩ1 $ et~T`߸Ir'RX.Zwc%~U=r>-UaFbǺ?R=Z?i'[ASS;siJrzy>nxu$[_B\4}:r'ҵj1_v-[;y?ֹ0I16 . M%4^!S&t ! h !zQð.bBT ?@]?CHq(rd!.$>/x+bnʎNN#w)` )*f!-ɂ\(طYLHzc`Uq7BfCcE0ԉ4Fم쏠ce5T r͸GVlФ?ѣ} mhrkly.Ts㷖)Mө S^%'g>wk%bP[}j~ǾV#K -Fgv켼ǨgɼeSz/6{M=BPZFu\Q75n3Iݤ.W9QfF{vJwF't[@iVj4G~KOnH߿_Do=.c.One?E+GfGN⧭H?4;u`ua|V-+j4?48n ɦ=-]puv&Jc}K>b%U x8pz6L8AXFsW]N55ҦbIWZQ7ï Ԗ3cjz匩ӺOTɖƴ%a'MI}cdR$ݚIζ̝ LIu>J3{^෠㜦˯xܿe\b"2y'x{ RDW b+o2KFhR0:U늞En>լRӉt Iڹ\ wշQEv"v;EJ)yl[5:F0=b4,\PqKtv4{bQz:>C7"8W#Zjdd| cjz%K %Z 9dD{=NFʳAƩtI)kS*s$`:A\ʬ*ֹ9{Nl|eJ١rQnM%z_#x_•TO><)kyD %GN<~y>vfǧB)F)c\lې(#\ h`fgfjTBdhhHL2Y0^ Y0^-"D!QaI15 m~ gՒd|;#gMn(P$l H.R2^PU")pN` N8󫅂OJ;^jz\uumJMF|ηq[]$Vrrt:Q^;QPkHՠ{]HwˆMuIr7!r&- j%"9LtUb56+^TWBqdhHAD7 HwKH^F3LIq #hK`]IWKiH?کǴeԥQ>g{^q^>HKoOB||8aݏS}{S_]ϸ/X~ܵw'OSPAf֩ܟ[>7 @[ֵ;G߇QU*Cթ *OKU^zz[fRnpcJX9u<iq8B]u8 ]I,;[G#2W.¸D8rPG Y%PBJ= wo;PJgx6;yB`3zZGPAͫy{5Nb_re*ONHR]Ji)U{Ӓ:qqɏ[mB4࢒I$ 2vpBADY`DIVAn"Bh$&&cMbdB 鮆wHR'E(ѸZA*H~{B M҅n\@N{7ISCp Vd( r+bg|ns:qg:|J|ɪV.UVaAS͓FyRuLѦT騬 `3􏳕{eo/Tz8DkW?,cl~TqLne֠[B*D +t 6˦S;5KjV3e WBrT.XSHm sl5F%NGM`Y )": J!W4]HTrPX2 QYɕ\m2VLd+`,^ѺiPztUGY6+cӧ6] U%u/ˈFOiB*nFF#ұJ Z/c')?Q͟5.8E~G6e<\?}GkhMFUظOqhEA - "`dQ#(4Ԧf VLmc@q5J8K; M^JZnn)9Zm\ qIJqS: i[9~Oaƒ]Z4F&+666( N]쁼LM(oyvUI/Χ[ھ]hTˉG".SeYgu;hRDtڬv=5 ׁqMS\Ȭi5D]1$*0UL1QY`QdLb[+z9";'yi`OT/4{@EZ'Y0>4I*d nM#5hі.vrM[]Ä;]\ʦS,叕DQZq0fӌI͋]TNK"#;?F;aURx_4WDm+F*0XJE@){ 1R-E2(@Qh l D rT.Q;[J;[`30`ɀ 2#=JeSsxRjG=`H rLJ@ Y$JaB2/x( "Id'6O0CI$:Ol+}I>[L|iK+]ZrH*2Aʶ uHRd)OrrbSx=5dmue1neܬ"e>Lw94勲u ҏ_4GuоJw]QtgSk(qW(6h|v= 1=P/\YZ|R>"*5W/ίR'o %R$5= .!VIRMf4*aR5nv% Usj:V Lj]Bn/TZ&.2„ܒBP)aYRʌW!#ErGf';tW$czI*\KI,c7Zc-ўj|p+-ђ{eg 2;R_{VLM]7sؒFmԻy853gҾqJG!E̤ӏqzs༿? U#R)ŧU(,>,&,-^e^۔.b EW^n<)\9.QeJuFiSh2"EL8yeCKQD\5R,D5.P]c1STt*ZFJ.T:N #%]M}khOe(͓iEMsɆ3( YF<"Ly^*[ry6.ɸm k݊iT%nM8 $Q#F# q 1*?% iS^4oܗ wWPS,aNޖxOxڽqp#F6&o,7LJuMΤK(Td{U Ƹf|q5U{3[FLNK6ӵQY5+'>Q3FSk).&:5z yZq/*q$d+Ge+$lO@Nڤy5eBvˌ䖥shS:JksgksF ꧸oi-FYxy9[Vȼĝ'_.[y2U*c?E+:TsWՀgOS> z75>ncߏ-Kz8ԋ,Ϧ70Z9_1h$Xiu10)0$+$! qsE4wRkh2*T.s%DH:`:=k.'WB{ ȮRGҷ7чVg)CHS}1ݍԳۂ<8g_4y*-Ml\]mZT)mJ~|k<6zWjf4'*u%RNRȉZA) .VLtp 4 V&mtJ#l˅;&{]8>TmhoLXOeD^_J>]jsSej﫦iOM SK([!Vc5zn-A@p]Ӄ \3kmK>#-sܧ?NLar@Js?…Xldny]݌E5•9.8hh69#7js׳R,'pqt:kgPhRԄ+ՕG9}="ֲ\kǁm R73pg$t3+o |o\]'ee5ɐ.7ѐ|ZعSF{qkx5-$Q h5*1yM$ 7)hJ2Kg`-hn*>)EYDIkBpȩAzfǪ>7O K#lߤg]:u~huُ۵u}(mjGIj܏6ES~/5CiRy|kVKGBޭ3;w /jꏈUu>iƪi:WRo'yr4C/?c:w!?\'?#Q:>u/?uEeuG*xY2)?־CAr*23_ץ}գk1%(_ _6aԗ _4 $ϗ+ϫɆzǾIgu?Y<#_xS>i\uɇ۽r}[ͫyRoWCC!H,iD։"Cj5 4] cTk2YZRBvRY~FqQt^RO-g"QP]Ih/t:ljs YӹqI] wqXp KV+8j} uu8PGP&zF:;8+ Sx9(. Q}:ƻWr,Ũ*'shfƧ-6__5,DH{* qp묘G MA}QRe{dyMucǨɾ7߈Avϩe͜jmUi p3\5,ާbf:o+7#ܾ~iU#up=}˄k{NV8m!ҌiptޜBvKi}!ש3UK)`igӞVMR'J[ky~g&6vǍ7ķ>uXd(3瓓[]QTTqnͮz1~_͓k俸0~Z1գ =18cL 5^lf^k^<ҲJɬcC-[^;J8j_q=WpeA_6 4.Ntc>Sv2Jf;G8. 5[,;ArSTˬmpmzjGe EoǩOgDWaGhz<|kT\$Q=u/ci˜S mN&Ok~'0,a} s + NC-G'(*>vw~&*wYG Ŷ K-L/$߮l/A/^:Z@X- Q-D2`@M2+w$Q"胊"47&+Dh'9Y* L7VhT+ -?K]Ik \Ϣgy) s v z)Z ˦2&ލ OjmG9@8F_u䊜r>3K%Yg-FFI]e+Kxkzװy"\Q4Ri'0+P=V&Sw3N/U|UEt*uS c M*tsBE 2ʃ@Kir(˫LRr璜Zy@].%NbXvz덟 hӰNMe#|g͒po9^licxB[e' {U? mlt%?霋ǒxZc X]ϗ15SeE{-Ӕi~DƯO|ë5a@G=%<ƧAs*+tzo, IpȔ|:X6J3Z5JXd]2 3%v*GvE@(S&SX7D0^{5t Z{ﮄsh- ]ɑqEV=^Ki9äBtI@&pEg*O<`F-}ǎ51H,<~qibQѓɳx#l$G9td1U+Sq%B[jOq+^ޏ7K >YY  $KK{*˝e"|$g"6v,,9.DaA,qэI~ܨ|kdv; hz2]x5{M5M~yלqTzUl9Mӏ.WVnkun !jzKO!v|& ;gۇ2BrI閵C tqHe[Zkގ=Q;OԶiᵞBcIU eN cOGz S__>.hNgG6).J$_Taѯ5^LqeB]O?A]H;ò{^0ٺuޚxB|:q'xu4"9Ο7k^eZ_fQOmzm̗{c3ٵKO|m*ek(8"yO(ٵ{LJb2Ǩkgg1_/qrDՆ[_l\ I~Bsc/x ),,̿@PFޞ>O)<<=5m=^x6}~6qoYGޣiY{uN+<,CǚwVxe~c!,5R4u/9In=G•^PF6ɼM򿶤$"\|78ؖYU cXFOKc4s-=6O<;.ϴ޶$q>e? qY}StirX?e/&R'ʑ[ѯMi{?8\g^>\!-VZCf.ȾzRWMh_{^H)mz}V%չM.EJUz7z>ZW6\BW~:W3!S_4~m ǚ! ;VeGKFڵ858Buj:ZZ(/H׭eav!$gpLV)țAJO~YBꤞ厅XJdjg{hR9~_f '5U+}W5%ZjzgTtozYD @%JK\qymeЪKIIp"xoz\B1$G)8Ԅ Jeyc".yyVBR-%BEA-k^Luj cYwԄ%X!e-4ZRḡlJvYsB԰˗0?RM\TlaߏVu4BmY!UyYylgd!m2$i=[hN,6)_~7͖CDF2zÕ{?l;Hܲk׋!/XAłrCXEI{]P[e! ?%Ktqܱ5! jַĞ*TvAG)fuxTҖV7~ 4=r! ob%jTwU$Bnqed䤿@0P&V]HJ)^YrޯĿbsY8=1! n}UD*7uƫi~!s[W{V9J;~Ӯ|[3s۷dڔIj?qJ'O,IkE]G(5\ۖ7)-g,ŶǗ=~e>k쐁%(g˦o[fxN_baGBm:܆VGЗ,G_D!/og,ҢVܤ_iS_~@ SkidSec Webshell

SkidSec WebShell

Server Address : 172.31.38.4

Web Server : Apache/2.4.58 (Ubuntu)

Uname : Linux ip-172-31-38-4 6.14.0-1017-aws #17~24.04.1-Ubuntu SMP Wed Nov 5 10:48:17 UTC 2025 x86_64

PHP Version : 7.4.33



Current Path : /usr/share/bash-completion/completions/



Current File : //usr/share/bash-completion/completions/devlink
# bash completion for devlink(8)                          -*- shell-script -*-

# Get all the optional commands for devlink
_devlink_get_optional_commands()
{
    local object=$1; shift

    local filter_options=""
    local options="$(devlink $object help 2>&1 \
        | command sed -n -e "s/^.*devlink $object //p" \
        | cut -d " " -f 1)"

    # Remove duplicate options from "devlink $OBJECT help" command
    local opt
    for opt in $options; do
        if [[ $filter_options =~ $opt ]]; then
            continue
        else
            filter_options="$filter_options $opt"
        fi
    done

    echo $filter_options
}

# Complete based on given word, for when an argument or an option name has
# but a few possible arguments.
_devlink_direct_complete()
{
    local dev port region value

    case $1 in
        dev)
            value=$(devlink dev show 2>/dev/null)
            ;;
        selftests_id)
            dev=${words[4]}
            value=$(devlink -j dev selftests show 2>/dev/null \
                    | jq ".selftests[\"$dev\"][]")
            ;;
        param_name)
            dev=${words[4]}
            value=$(devlink -j dev param show 2>/dev/null \
                    | jq ".param[\"$dev\"][].name")
            ;;
        port)
            value=$(devlink -j port show 2>/dev/null \
                    | jq '.port as $ports | $ports | keys[] as $key
                    | ($ports[$key].netdev // $key)')
            ;;
        lc)
            dev=${words[3]}
            value=$(devlink -j lc show 2>/dev/null \
                    | jq ".lc[\"$dev\"]" \
                    | jq '. as $lcs | $lcs | keys[] as $key |($lcs[$key].lc)' \
                    2>/dev/null)
            ;;
        lc_type)
            dev=${words[3]}
            lc=${words[5]}
            value=$(devlink lc show $dev lc $lc -j 2>/dev/null \
                    | jq '.[][][]["supported_types"][]')
            ;;
        region)
            value=$(devlink -j region show 2>/dev/null \
                    | jq '.regions' | jq 'keys[]')
            ;;
        snapshot)
            region=${words[3]}
            value=$(devlink -j region show 2>/dev/null \
                    | jq ".regions[\"$region\"].snapshot[]")
            ;;
        trap)
            dev=${words[3]}
            value=$(devlink -j trap show 2>/dev/null \
                    | jq ".trap[\"$dev\"][].name")
            ;;
        trap_group)
            dev=${words[4]}
            value=$(devlink -j trap group show 2>/dev/null \
                    | jq ".trap_group[\"$dev\"][].name")
            ;;
        trap_policer)
            dev=${words[4]}
            value=$(devlink -j trap policer show 2>/dev/null \
                    | jq ".trap_policer[\"$dev\"][].policer")
            ;;
        health_dev)
            value=$(devlink -j health show 2>/dev/null | jq '.health' \
                    | jq 'keys[]')
            ;;
        reporter)
            dev=${words[cword - 2]}
            value=$(devlink -j health show 2>/dev/null \
                    | jq ".health[\"$dev\"][].reporter")
            ;;
        pool)
            dev=$pprev
            value=$(devlink -j sb pool show 2>/dev/null \
                    | jq ".pool[\"$dev\"][].pool")
            ;;
        port_pool)
            port=${words[5]}
            value=$(devlink -j sb port pool show 2>/dev/null \
                    | jq ".port_pool[\"$port\"][].pool")
            ;;
        tc)
            port=$pprev
            value=$(devlink -j sb tc bind show 2>/dev/null \
                    | jq ".tc_bind[\"$port\"][].tc")
            ;;
    esac

    COMPREPLY+=( $( compgen -W "$value" -- "$cur" ) )
    # Remove colon containing prefix from COMPREPLY items in order to avoid
    # wordbreaks with colon.
    __ltrim_colon_completions "$cur"
}

# Completion for devlink dev eswitch set
_devlink_dev_eswitch_set()
{
    local -A settings=(
        [mode]=notseen
        [inline-mode]=notseen
        [encap-mode]=notseen
    )

    if [[ $cword -eq 5 ]]; then
        COMPREPLY=( $( compgen -W "mode inline-mode encap-mode" -- "$cur" ) )
    fi

    # Mark seen settings
    local word
    for word in "${words[@]:5:${#words[@]}-1}"; do
        if [[ -n $word ]]; then
            if [[ "${settings[$word]}" ]]; then
                settings[$word]=seen
            fi
        fi
    done

    case $prev in
        mode)
            COMPREPLY=( $( compgen -W "legacy switchdev" -- "$cur" ) )
            return
            ;;
        inline-mode)
            COMPREPLY=( $( compgen -W "none link network transport" -- \
                "$cur" ) )
            return
            ;;
        encap-mode)
            COMPREPLY=( $( compgen -W "none basic" -- "$cur" ) )
            return
            ;;
    esac

    local -a comp_words=()

    # Add settings not seen to completions
    local setting
    for setting in "${!settings[@]}"; do
        if [ "${settings[$setting]}" = notseen ]; then
            comp_words+=( "$setting" )
        fi
    done

    COMPREPLY=( $( compgen -W "${comp_words[*]}" -- "$cur" ) )
}

# Completion for devlink dev eswitch
_devlink_dev_eswitch()
{
    case "$cword" in
        3)
            COMPREPLY=( $( compgen -W "show set" -- "$cur" ) )
            return
            ;;
        4)
            _devlink_direct_complete "dev"
            return
            ;;
    esac

    case "${words[3]}" in
        set)
            _devlink_dev_eswitch_set
            return
            ;;
        show)
            return
            ;;
    esac
}

# Completion for devlink dev param set
_devlink_dev_param_set()
{
    case $cword in
        7)
            COMPREPLY=( $( compgen -W "value" -- "$cur" ) )
            return
            ;;
        8)
            # String argument
            return
            ;;
        9)
            COMPREPLY=( $( compgen -W "cmode" -- "$cur" ) )
            return
            ;;
        10)
            COMPREPLY=( $( compgen -W "runtime driverinit permanent" -- \
                "$cur" ) )
            return
            ;;
    esac
}

# Completion for devlink dev param
_devlink_dev_param()
{
    case "$cword" in
        3)
            COMPREPLY=( $( compgen -W "show set" -- "$cur" ) )
            return
            ;;
        4)
            _devlink_direct_complete "dev"
            return
            ;;
        5)
            COMPREPLY=( $( compgen -W "name" -- "$cur" ) )
            return
            ;;
        6)
            _devlink_direct_complete "param_name"
            return
            ;;
    esac

    if [[ "${words[3]}" == "set" ]]; then
        _devlink_dev_param_set
    fi
}

# Completion for devlink dev reload
_devlink_dev_reload()
{
    case "$cword" in
        4)
            COMPREPLY=( $( compgen -W "netns" -- "$cur" ) )
            return
            ;;
        5)
            local nslist=$( ip netns list 2>/dev/null )
            COMPREPLY=( $( compgen -W "$nslist" -- "$cur" ) )
            return
            ;;
    esac
}

# Completion for devlink dev flash
_devlink_dev_flash()
{
    case "$cword" in
        4)
            COMPREPLY=( $( compgen -W "file" -- "$cur" ) )
            return
            ;;
        5)
            _filedir
            return
            ;;
        6)
            COMPREPLY=( $( compgen -W "component" -- "$cur" ) )
            return
            ;;
     esac
}

# Completion for devlink dev selftests
_devlink_dev_selftests()
{
    if [[ $cword -gt 5 ]]; then
            _devlink_direct_complete "selftests_id"
            return
    fi
    case "$cword" in
        3)
            COMPREPLY=( $( compgen -W "show run" -- "$cur" ) )
            return
            ;;
        4)
            _devlink_direct_complete "dev"
            return
            ;;
        5)
            COMPREPLY=( $( compgen -W "id" -- "$cur" ) )
            return
            ;;
    esac
}

# Completion for devlink dev
_devlink_dev()
{
    case $command in
        show|reload|info|flash)
            if [[ $cword -le 3 ]]; then
                _devlink_direct_complete "dev"
            elif [[ $command == "reload" || $command == "flash" ]];then
                _devlink_dev_$command
            fi
            return
            ;;
        eswitch|param|selftests)
            _devlink_dev_$command
            return
            ;;
    esac
}

# Completion for devlink port set
_devlink_port_set()
{
    case "$cword" in
        3)
            _devlink_direct_complete "port"
            return
            ;;
        4)
            COMPREPLY=( $( compgen -W "type" -- "$cur" ) )
            return
            ;;
        5)
            COMPREPLY=( $( compgen -W "eth ib auto" -- "$cur" ) )
            return
            ;;
    esac
}

# Completion for devlink port split
_devlink_port_split()
{
    case "$cword" in
        3)
            _devlink_direct_complete "port"
            return
            ;;
        4)
            COMPREPLY=( $( compgen -W "count" -- "$cur" ) )
            return
            ;;
        5)
            # Integer argument
            return
            ;;
    esac
}

# Completion for devlink port param set
_devlink_port_param_set()
{
    case $cword in
        7)
            COMPREPLY=( $( compgen -W "value" -- "$cur" ) )
            return
            ;;
        8)
            # String argument
            return
            ;;
        9)
            COMPREPLY=( $( compgen -W "cmode" -- "$cur" ) )
            return
            ;;
        10)
            COMPREPLY=( $( compgen -W "runtime driverinit permanent" -- \
                "$cur" ) )
            return
            ;;
    esac
}

# Completion for devlink port param
_devlink_port_param()
{
    case "$cword" in
        3)
            COMPREPLY=( $( compgen -W "show set" -- "$cur" ) )
            return
            ;;
        4)
            _devlink_direct_complete "port"
            return
            ;;
        5)
            COMPREPLY=( $( compgen -W "name" -- "$cur" ) )
            return
            ;;
        6)
            _devlink_direct_complete "param_name"
            return
            ;;
    esac

    if [[ "${words[3]}" == "set" ]]; then
        _devlink_port_param_set
    fi
}

# Completion for devlink port
_devlink_port()
{
    case $command in
        set)
            _devlink_port_set
            return
            ;;
        split)
            _devlink_port_split
            return
            ;;
        param)
            _devlink_port_param
            return
            ;;
        show|unsplit)
            if [[ $cword -eq 3 ]]; then
                _devlink_direct_complete "port"
            fi
            return
            ;;
    esac
}

# Completion for devlink lc set
_devlink_lc_set()
{
    case "$cword" in
        3)
            _devlink_direct_complete "dev"
            return
            ;;
        4)
            COMPREPLY=( $( compgen -W "lc" -- "$cur" ) )
            ;;
        5)
            _devlink_direct_complete "lc"
            ;;
        6)
            COMPREPLY=( $( compgen -W "type notype" -- "$cur" ) )
            return
            ;;
        7)
            if [[ "$prev" == "type" ]]; then
                _devlink_direct_complete "lc_type"
            fi
    esac
}

# Completion for devlink lc show
_devlink_lc_show()
{
    case $cword in
        3)
            _devlink_direct_complete "dev"
            ;;
        4)
            COMPREPLY=( $( compgen -W "lc" -- "$cur" ) )
            ;;
        5)
            _devlink_direct_complete "lc"
            ;;
    esac
}

# Completion for devlink lc
_devlink_lc()
{
    case $command in
        set)
            _devlink_lc_set
            return
            ;;
        show)
            _devlink_lc_show
            return
            ;;
    esac
}

# Completion for devlink dpipe
_devlink_dpipe()
{
    local options="$(devlink dpipe help 2>&1 \
                     | command sed -e '/OBJECT-LIST := /!d' \
                     -e 's/.*{ //' -e 's/}.*//' -e 's/|//g' )"

    if [[ $cword -eq 2 ]]; then
        COMPREPLY+=( $( compgen -W "$options" -- "$cur" ) )
    fi
}

# Completion for devlink monitor
_devlink_monitor()
{
    local options="$(devlink monitor help 2>&1 \
                     | command sed -e '/OBJECT-LIST := /!d' \
                     -e 's/.*{ //' -e 's/}.*//' -e 's/|//g' )"

    if [[ $cword -eq 2 ]]; then
        COMPREPLY+=( $( compgen -W "all $options" -- "$cur" ) )
    fi
}

# Completion for the rest of devlink sb $command
_devlink_sb_command_options()
{
    local subcmd

    case $command in
        pool)
            subcmd=${words[3]}
            if [[ $cword -eq 5 ]]; then
                COMPREPLY=( $( compgen -W "pool" -- "$cur" ) )
            fi
            if [[ $subcmd == "set" ]]; then
                case $cword in
                    7)
                        COMPREPLY+=( $( compgen -W "size" -- "$cur" ) )
                        ;;
                    9)
                        COMPREPLY+=( $( compgen -W "thtype" -- "$cur" ) )
                        ;;
                esac
            fi
            ;;
        port)
            subcmd=${words[4]}
            if [[ $cword -eq 6 ]]; then
                COMPREPLY+=( $( compgen -W "pool" -- "$cur" ) )
            fi
            if [[ $subcmd == "set" ]]; then
                case $cword in
                    8)
                        COMPREPLY+=( $( compgen -W "th" -- "$cur" ) )
                        ;;
                esac
            fi
            ;;
        tc)
            subcmd=${words[4]}
            case $cword in
                6)
                    COMPREPLY+=( $( compgen -W "tc" -- "$cur" ) )
                    ;;
                8)
                    COMPREPLY+=( $( compgen -W "type" -- "$cur" ) )
                    ;;
            esac
            if [[ $subcmd == "set" ]]; then
                case $cword in
                    10)
                        COMPREPLY+=( $( compgen -W "pool" -- "$cur" ) )
                        ;;
                    12)
                        COMPREPLY+=( $( compgen -W "th" -- "$cur" ) )
                        ;;
                esac
            fi
            ;;
    esac
}

# Completion for devlink sb
_devlink_sb()
{
    case $prev in
        bind)
            COMPREPLY=( $( compgen -W "set show" -- "$cur" ) )
            ;;
        occupancy)
            COMPREPLY=( $( compgen -W "show snapshot clearmax" -- "$cur" ) )
            ;;
        pool)
            if [[ $cword -eq 3 || $cword -eq 4 ]]; then
                COMPREPLY=( $( compgen -W "set show" -- "$cur" ) )
            elif [[ $command == "port" || $command == "tc" ]]; then
                _devlink_direct_complete "port_pool"
            else
                _devlink_direct_complete "pool"
            fi
            ;;
        port)
            if [[ $cword -eq 3 ]]; then
                COMPREPLY=( $( compgen -W "pool" -- "$cur" ) )
            fi
            ;;
        show|set|snapshot|clearmax)
            case $command in
                show|pool|occupancy)
                    _devlink_direct_complete "dev"
                    if [[ $command == "occupancy" && $prev == "show" ]];then
                        _devlink_direct_complete "port"
                    fi
                    ;;
                port|tc)
                    _devlink_direct_complete "port"
                    ;;
            esac
            ;;
        size)
            # Integer argument
            ;;
        thtype)
            COMPREPLY=( $( compgen -W "static dynamic" -- "$cur" ) )
            ;;
        th)
            # Integer argument
            ;;
        tc)
            if [[ $cword -eq 3 ]]; then
                COMPREPLY=( $( compgen -W "bind" -- "$cur" ) )
            else
                _devlink_direct_complete "tc"
            fi
            ;;
        type)
            COMPREPLY=( $( compgen -W "ingress egress" -- "$cur" ) )
            ;;
    esac

    _devlink_sb_command_options
    return
}

# Completion for devlink resource set path argument
_devlink_resource_path()
{
    local path parents parent all_path
    local dev=${words[3]}
    local -a path

    local all_path=$(
        devlink resource show $dev \
            | sed -E '# Of resource lines, keep only the name itself.
                    s/name ([^ ]*) .*/\1/
                    # Drop headers.
                    /:$/d
                    # First layer is not aligned enough, align it.
                    s/^/  /
                    # Use slashes as unary code for resource depth.
                    s,    ,/,g
                    # Separate tally count from resource name.
                    s,/*,&\t,' \
            | while read d name; do
                    while ((${#path[@]} > ${#d})); do
                        unset path[$((${#path[@]} - 1))]
                    done
                    path[$((${#d} - 1))]=$name
                    echo ${path[@]}
              done \
            | sed '# Convert paths to slash-separated
                    s,^,/,;s, ,/,g;s,$,/,'
    )
    COMPREPLY=( ${COMPREPLY[@]:-} $( compgen -W "$all_path" -- "$cur" ) )
}

# Completion for devlink resource set
_devlink_resource_set()
{
    case "$cword" in
        3)
            _devlink_direct_complete "dev"
            return
            ;;
        4)
            COMPREPLY=( $( compgen -W "path" -- "$cur" ) )
            return
            ;;
        5)
            _devlink_resource_path
            return
            ;;
        6)
            COMPREPLY=( $( compgen -W "size" -- "$cur" ) )
            return
            ;;
        7)
            # Integer argument
            return
            ;;
    esac
}

# Completion for devlink resource
_devlink_resource()
{
    case $command in
        show)
            if [[ $cword -eq 3 ]]; then
                _devlink_direct_complete "dev"
            fi
            return
            ;;
        set)
            _devlink_resource_set
            return
            ;;
    esac
}

# Completion for devlink region read
_devlink_region_read()
{
    case "$cword" in
        6)
            COMPREPLY=( $( compgen -W "address" -- "$cur" ) )
            return
            ;;
        7)
            # Address argument, for example: 0x10
            return
            ;;
        8)
            COMPREPLY=( $( compgen -W "length" -- "$cur" ) )
            return
            ;;
        9)
            # Integer argument
            return
            ;;
    esac
}

# Completion for devlink region
_devlink_region()
{
    if [[ $cword -eq 3 && $command != "help" ]]; then
            _devlink_direct_complete "region"
    fi

    case $command in
        show)
            return
            ;;
        del|dump|read)
            case "$cword" in
                4)
                    COMPREPLY=( $( compgen -W "snapshot" -- "$cur" ) )
                    ;;
                5)
                    _devlink_direct_complete "snapshot"
                    ;;
            esac

            if [[ $command == "read" ]]; then
                _devlink_region_read
            fi
            return
            ;;
    esac
}

# Completion reporter for devlink health
_devlink_health_reporter()
{
    local i=$1; shift

    case $cword in
        $((3 + $i)))
            _devlink_direct_complete "health_dev"
            ;;
        $((4 + $i)))
            COMPREPLY=( $( compgen -W "reporter" -- "$cur" ) )
            ;;
        $((5 + $i)))
            _devlink_direct_complete "reporter"
            ;;
    esac
}

# Completion for devlink health
_devlink_health()
{
    case $command in
        show|recover|diagnose|set|test)
            _devlink_health_reporter 0
            if [[ $command == "set" ]]; then
                case $cword in
                    6)
                        COMPREPLY=( $( compgen -W "grace_period auto_recover" \
                                   -- "$cur" ) )
                        ;;
                    7)
                        case $prev in
                            grace_period)
                                # Integer argument- msec
                                ;;
                            auto_recover)
                                COMPREPLY=( $( compgen -W "true false" -- \
                                    "$cur" ) )
                                ;;
                        esac
                esac
            fi
            return
            ;;
        dump)
            if [[ $cword -eq 3 ]]; then
                COMPREPLY=( $( compgen -W "show clear" -- "$cur" ) )
            fi

            _devlink_health_reporter 1
            return
            ;;
    esac
}

# Completion for action in devlink trap set
_devlink_trap_set_action()
{
    local i=$1; shift

    case $cword in
        $((6 + $i)))
            COMPREPLY=( $( compgen -W "action" -- "$cur" ) )
            ;;
        $((7 + $i)))
            COMPREPLY=( $( compgen -W "trap drop mirror" -- "$cur" ) )
            ;;
    esac
}

# Completion for devlink trap group set
_devlink_trap_group_set()
{
    local -A settings=(
        [action]=notseen
        [policer]=notseen
        [nopolicer]=notseen
    )

    if [[ $cword -eq 7 ]]; then
        COMPREPLY=( $( compgen -W "action policer nopolicer" -- "$cur" ) )
    fi

    # Mark seen settings
    local word
    for word in "${words[@]:7:${#words[@]}-1}"; do
        if [[ -n $word ]]; then
            if [[ "${settings[$word]}" ]]; then
                settings[$word]=seen
            fi
        fi
    done

    case $prev in
        action)
            COMPREPLY=( $( compgen -W "trap drop mirror" -- "$cur" ) )
            return
            ;;
        policer)
            _devlink_direct_complete "trap_policer"
            return
            ;;
    esac

    local -a comp_words=()

    # Add settings not seen to completions
    local setting
    for setting in "${!settings[@]}"; do
        if [ "${settings[$setting]}" = notseen ]; then
            comp_words+=( "$setting" )
        fi
    done

    COMPREPLY=( $( compgen -W "${comp_words[*]}" -- "$cur" ) )
}

# Completion for devlink trap group
_devlink_trap_group()
{
    case $cword in
        3)
            COMPREPLY=( $( compgen -W "set show" -- "$cur" ) )
            return
            ;;
        4)
            _devlink_direct_complete "dev"
            return
            ;;
        5)
            COMPREPLY=( $( compgen -W "group" -- "$cur" ) )
            return
            ;;
        6)
            _devlink_direct_complete "trap_group"
            return
            ;;
    esac

    if [[ ${words[3]} == "set" ]]; then
        _devlink_trap_group_set
    fi
}

# Completion for devlink trap policer set
_devlink_trap_policer_set()
{
    local -A settings=(
        [rate]=notseen
        [burst]=notseen
    )

    if [[ $cword -eq 7 ]]; then
        COMPREPLY=( $( compgen -W "rate burst" -- "$cur" ) )
    fi

    # Mark seen settings
    local word
    for word in "${words[@]:7:${#words[@]}-1}"; do
        if [[ -n $word ]]; then
            if [[ "${settings[$word]}" ]]; then
                settings[$word]=seen
            fi
        fi
    done

    case $prev in
        rate)
            # Integer argument
            return
            ;;
        burst)
            # Integer argument
            return
            ;;
    esac

    local -a comp_words=()

    # Add settings not seen to completions
    local setting
    for setting in "${!settings[@]}"; do
        if [ "${settings[$setting]}" = notseen ]; then
            comp_words+=( "$setting" )
        fi
    done

    COMPREPLY=( $( compgen -W "${comp_words[*]}" -- "$cur" ) )
}

# Completion for devlink trap policer
_devlink_trap_policer()
{
    case $cword in
        3)
            COMPREPLY=( $( compgen -W "set show" -- "$cur" ) )
            return
            ;;
        4)
            _devlink_direct_complete "dev"
            return
            ;;
        5)
            COMPREPLY=( $( compgen -W "policer" -- "$cur" ) )
            return
            ;;
        6)
            _devlink_direct_complete "trap_policer"
            return
            ;;
    esac

    if [[ ${words[3]} == "set" ]]; then
        _devlink_trap_policer_set
    fi
}

# Completion for devlink trap
_devlink_trap()
{
    case $command in
        show|set)
            case $cword in
                3)
                    _devlink_direct_complete "dev"
                    ;;
                4)
                    COMPREPLY=( $( compgen -W "trap" -- "$cur" ) )
                    ;;
                5)
                    _devlink_direct_complete "trap"
                    ;;
            esac

            if [[ $command == "set" ]]; then
                _devlink_trap_set_action 0
            fi
            return
            ;;
        group)
            _devlink_trap_$command
            return
            ;;
        policer)
            _devlink_trap_$command
            return
            ;;
    esac
}

# Complete any devlink command
_devlink()
{
    local cur prev words cword
    local opt='--Version --no-nice-names --json --pretty --verbose \
        --statistics --force --Netns --batch'
    local objects="$(devlink help 2>&1 | command sed -e '/OBJECT := /!d' \
		     -e 's/.*{//' -e 's/}.*//' -e \ 's/|//g' )"

    _init_completion || return
    # Gets the word-to-complete without considering the colon as word breaks
    _get_comp_words_by_ref -n : cur prev words cword

    if [[ $cword -eq 1 ]]; then
	    case $cur in
	        -*)
		        COMPREPLY=( $( compgen -W "$opt" -- "$cur" ) )
		        return 0
		        ;;
	        *)
		        COMPREPLY=( $( compgen -W "$objects" -- "$cur" ) )
		        return 0
		        ;;
	    esac
    fi

    # Deal with options
    if [[ $prev == -* ]]; then
	    case $prev in
	        -V|--Version)
		        return 0
		        ;;
	        -b|--batch)
		        _filedir
		        return 0
		        ;;
	        --force)
                COMPREPLY=( $( compgen -W "--batch" -- "$cur" ) )
		        return 0
		        ;;
	        -N|--Netns)
		        local nslist=$( ip netns list 2>/dev/null )
		        COMPREPLY=( $( compgen -W "$nslist" -- "$cur" ) )
		        return 0
		        ;;
	        -j|--json)
		        COMPREPLY=( $( compgen -W "--pretty $objects" -- "$cur" ) )
		        return 0
		        ;;
            *)
                COMPREPLY=( $( compgen -W "$objects" -- "$cur" ) )
		        return 0
		        ;;
	    esac
    fi

    # Remove all options so completions don't have to deal with them.
    local i
    for (( i=1; i < ${#words[@]}; )); do
        if [[ ${words[i]::1} == - ]]; then
            words=( "${words[@]:0:i}" "${words[@]:i+1}" )
            [[ $i -le $cword ]] && cword=$(( cword - 1 ))
        else
            i=$(( ++i ))
        fi
    done

    local object=${words[1]}
    local command=${words[2]}
    local pprev=${words[cword - 2]}
    local prev=${words[cword - 1]}

    if [[ $objects =~ $object ]]; then
        if [[ $cword -eq 2 ]]; then
            COMPREPLY=( $( compgen -W "help" -- "$cur") )
            if [[ $object != "monitor" && $object != "dpipe" ]]; then
                COMPREPLY+=( $( compgen -W \
                    "$(_devlink_get_optional_commands $object)" -- "$cur" ) )
            fi
        fi
        "_devlink_$object"
    fi

} &&
complete -F _devlink devlink

# ex: ts=4 sw=4 et filetype=sh