_virtnet_completion()
{
    local curr prev

    COMPREPLY=()
    cmd=${COMP_WORDS[1]}
    curr=${COMP_WORDS[COMP_CWORD]}
    prev=${COMP_WORDS[COMP_CWORD-1]}
    preprev=${COMP_WORDS[COMP_CWORD-2]}

    opts="hotplug unplug list query modify log version update debug restart health"
    if [[ ${COMP_CWORD} -eq 1 ]]; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${curr}) )
    fi

    case "${cmd}" in
        "hotplug")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --ib_device -i --mac -m --mtu -t --max_queues -n --max_queue_size -s --features -f --legacy -l" -- ${curr}) )
            ;;
        "unplug")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --pf -p --vuid -u" -- ${curr}) )
            ;;
        "list")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h" -- ${curr}) )
            ;;
        "query")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --all -a --pf -p --vf -v --vuid -u --brief -b" -- ${curr}) )
            ;;
        "modify")
            case "$preprev" in
                "-p" | "--pf")
                    COMPREPLY=( $(compgen -W "device queue --vf -v" -- ${curr}) )
                    ;;
                "-v" | "--vf" | "-u" | "--vuid")
                    COMPREPLY=( $(compgen -W "device queue" -- ${curr}) )
                    ;;
                *)
                    [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --pf -p --vf -v --vuid -u" -- ${curr}) )
                    ;;
            esac

            subcmd=
            for i in "${COMP_WORDS[@]}"; do
                [[ $i == "device" || $i == "queue" ]] && subcmd=$i
            done

            case "$subcmd" in
                "device")
                    [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --ib_device -i --mac -m --mtu -t --msix_num -n --state -s --features -f --link -l --rx_mode -r --max_queue_size -q" -- ${curr}) )
                    ;;
                "queue")
                    [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --period_mode -e --period -n --max_count -c" -- ${curr}) )
                    ;;
                *)
                    ;;
            esac
            ;;
        "debug")
            case "$preprev" in
                "-p" | "--pf")
                    COMPREPLY=( $(compgen -W "mem ring trigger options --vf -v" -- ${curr}) )
                    ;;
                "-v" | "--vf" | "-u" | "--vuid")
                    COMPREPLY=( $(compgen -W "mem ring trigger options" -- ${curr}) )
                    ;;
                *)
                    [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --pf -p --vf -v --vuid -u coredump" -- ${curr}) )
                    ;;
            esac

            subcmd=
            for i in "${COMP_WORDS[@]}"; do
                [[ $i == "mem" || $i == "ring" || $i == "trigger" || $i == "options" || $i == "coredump" ]] && subcmd=$i
            done

            case "$subcmd" in
                "mem" | "ring" | "trigger" | "options" | "coredump")
                    [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h" -- ${curr}) )
                    ;;
                *)
                    ;;
            esac
            ;;
        "log")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --level -l" -- ${curr}) )
            ;;
        "validate")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --file -f" -- ${curr}) )
            ;;
        "update")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --start -s --status -t" -- ${curr}) )
            ;;
        "version")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h" -- ${curr}) )
            ;;
        "restart")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h" -- ${curr}) )
            ;;
        "health")
            [[ $prev != -* ]] && COMPREPLY=( $(compgen -W "--help -h --all -a --pf -p --vf -v --vuid -u show" -- ${curr}) )
            ;;
        *)
            ;;
    esac
}

complete -F _virtnet_completion virtnet