From patchwork Wed Jan 16 19:10:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stanislav Fomichev X-Patchwork-Id: 1026134 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=google.com header.i=@google.com header.b="T9ZcBQjo"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43fxcQ6ChKz9sDP for ; Thu, 17 Jan 2019 06:10:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730319AbfAPTK3 (ORCPT ); Wed, 16 Jan 2019 14:10:29 -0500 Received: from mail-pf1-f202.google.com ([209.85.210.202]:56008 "EHLO mail-pf1-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730036AbfAPTK2 (ORCPT ); Wed, 16 Jan 2019 14:10:28 -0500 Received: by mail-pf1-f202.google.com with SMTP id s71so5334518pfi.22 for ; Wed, 16 Jan 2019 11:10:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc; bh=wn6DoMeKEVe1e7lFX64iYTRDDGIq0sr3zamlR5la+7U=; b=T9ZcBQjov6YVBXJRjB8tYnZSOE9cjTHNlp6Nr53NNxkaLK6jEKjYB+KfDHztxDiovq ETv25pET2+MlzgIgdAsUtf09tOaP8x/6nZ0Sf77CJzGB7PLmxl90+G/mNgjOO/xR0mU2 W2KAPf1M/b9uYKoTif+NmGM4SclRoMi2Xw4suYNOBcDOC8UoczD3UosZubYf1JtJFc1X eZap4cSm1LPx8j7yUHEuMCE8rcTM13KuwNw7wBG+rKTIBX8h9gDCd4EMBl2XDl7Z5in6 4F+VURSWSNI6JXNu9lhoTyPjC2gmlI4mirpsf621X4Ssd/Q/1gstW8QiZ/OITwIBsgVN wqaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=wn6DoMeKEVe1e7lFX64iYTRDDGIq0sr3zamlR5la+7U=; b=mafWnq1xzJUe1q2+PWFjDfB2JEUwJGYGgBoECtH2CwIkbkOVZq5rRNWvX5wFPgLVfM 9eiQoWsVIojSiExSV6vQN9PSB4YTzwDLTOfw8fcwkvc11oQO+pu0894M+AJrSFY7gn+F uJ5wAZxxh8P7PZAMfJB+a4yNbNTg9y9miHNs4M9WKt+hPNonE78B3mXq06pb96c2owq2 hyBBtCdbZ/RA93utE6oyK8d/sMsZFcu70FuqcM+sHMJPgNi17v+7KAYYglE5TW707182 3NV6RCzisuKntiG3r6rtHFrMRUKQYcVEcaIRTy7c2Ro7XZRsB/Hco+3i/Wu0EdFJKjYW KU8w== X-Gm-Message-State: AJcUukdTzld7G4n2/QLI7kOaw+n9eakeAcaikoEdxPLwZSB73VkXRGGi VvBiDpLHyljHg8wJxwdjSg3sofJgsWjAEkgN1e1sS3VSu9AVGGtrGbwECWshFvsNJsi1BNHP3Om AximO32pYzz+7WeiLFHQmoruGDI16qk/3lPfkmwlctJPHKBv0ltWUxw== X-Google-Smtp-Source: ALg8bN5XEPzESi2rl4boys0jrYdu3NkoZSWuatPIatzU/OY2mXMxQVpLqdTJEteF093oXjL4afT2/kY= X-Received: by 2002:a17:902:5e3:: with SMTP id f90mr3185480plf.51.1547665827443; Wed, 16 Jan 2019 11:10:27 -0800 (PST) Date: Wed, 16 Jan 2019 11:10:05 -0800 In-Reply-To: <20190116191005.164355-1-sdf@google.com> Message-Id: <20190116191005.164355-8-sdf@google.com> Mime-Version: 1.0 References: <20190116191005.164355-1-sdf@google.com> X-Mailer: git-send-email 2.20.1.97.g81188d93c3-goog Subject: [PATCH bpf-next v2 7/7] bpftool: add bash completion for peek/push/enqueue/pop/dequeue From: Stanislav Fomichev To: netdev@vger.kernel.org Cc: davem@davemloft.net, ast@kernel.org, daniel@iogearbox.net, jakub.kicinski@netronome.com, quentin.monnet@netronome.com, Stanislav Fomichev Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org bpftool map peek id - suggests only queue and stack map ids bpftool map pop id - suggests only stack map ids bpftool map dequeue id - suggests only queue map ids bpftool map push id - suggests only stack map ids bpftool map enqueue id - suggests only queue map ids bpftool map push id 1 - suggests 'value', not 'key' bpftool map enqueue id 2 - suggests 'value', not 'key' bpftool map update id - suggests 'value', not 'key' bpftool map lookup id - suggests nothing Signed-off-by: Stanislav Fomichev --- tools/bpf/bpftool/bash-completion/bpftool | 91 ++++++++++++++++++----- 1 file changed, 73 insertions(+), 18 deletions(-) diff --git a/tools/bpf/bpftool/bash-completion/bpftool b/tools/bpf/bpftool/bash-completion/bpftool index e4e4fab1b8c7..47143d793b33 100644 --- a/tools/bpf/bpftool/bash-completion/bpftool +++ b/tools/bpf/bpftool/bash-completion/bpftool @@ -50,14 +50,15 @@ _bpftool_get_map_ids() command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) } -_bpftool_get_perf_map_ids() +# 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 perf_event_array | \ + command grep -C2 "$type" | \ command sed -n 's/.*"id": \(.*\),$/\1/p' )" -- "$cur" ) ) } - _bpftool_get_prog_ids() { COMPREPLY+=( $( compgen -W "$( bpftool -jp prog 2>&1 | \ @@ -99,15 +100,25 @@ _sysfs_get_netdevs() "$cur" ) ) } -# For bpftool map update: retrieve type of the map to update. -_bpftool_map_update_map_type() +# Retrieve type of the map that we are operating on. +_bpftool_map_guess_map_type() { local keyword ref for (( idx=3; idx < ${#words[@]}-1; idx++ )); do - if [[ ${words[$((idx-2))]} == "update" ]]; then - keyword=${words[$((idx-1))]} - ref=${words[$((idx))]} - fi + 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 @@ -119,6 +130,8 @@ _bpftool_map_update_map_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 @@ -128,11 +141,24 @@ _bpftool_map_update_get_id() break fi done - [[ $value -eq 0 ]] && _bpftool_get_map_ids && return 0 + 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_update_map_type) + local type=$(_bpftool_map_guess_map_type) case $type in array_of_maps|hash_of_maps) _bpftool_get_map_ids @@ -382,14 +408,28 @@ _bpftool() map) local MAP_TYPE='id pinned' case $command in - show|list|dump) + show|list|dump|peek|pop|dequeue) case $prev in $command) COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) return 0 ;; id) - _bpftool_get_map_ids + 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 ;; *) @@ -447,19 +487,25 @@ _bpftool() 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) + update|push|enqueue) case $prev in $command) COMPREPLY=( $( compgen -W "$MAP_TYPE" -- "$cur" ) ) return 0 ;; id) - _bpftool_map_update_get_id + _bpftool_map_update_get_id $command return 0 ;; key) @@ -468,7 +514,7 @@ _bpftool() 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_update_map_type) in + case "$(_bpftool_map_guess_map_type)" in array_of_maps|hash_of_maps) local MAP_TYPE='id pinned' COMPREPLY+=( $( compgen -W "$MAP_TYPE" \ @@ -490,6 +536,13 @@ _bpftool() 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' for (( idx=3; idx < ${#words[@]}-1; idx++ )); do @@ -508,6 +561,7 @@ _bpftool() return 0 fi done + return 0 ;; esac @@ -527,7 +581,7 @@ _bpftool() return 0 ;; id) - _bpftool_get_perf_map_ids + _bpftool_get_map_ids_for_type perf_event_array return 0 ;; cpu) @@ -546,7 +600,8 @@ _bpftool() *) [[ $prev == $object ]] && \ COMPREPLY=( $( compgen -W 'delete dump getnext help \ - lookup pin event_pipe show list update create' -- \ + lookup pin event_pipe show list update create \ + peek push enqueue pop dequeue' -- \ "$cur" ) ) ;; esac