From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id EEB48A0548; Wed, 25 May 2022 07:50:58 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D46E2400EF; Wed, 25 May 2022 07:50:58 +0200 (CEST) Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by mails.dpdk.org (Postfix) with ESMTP id A30F1400D6 for ; Wed, 25 May 2022 07:50:57 +0200 (CEST) Received: by mail-wm1-f47.google.com with SMTP id 206-20020a1c02d7000000b00397345f2c6fso26002wmc.4 for ; Tue, 24 May 2022 22:50:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=emumba-com.20210112.gappssmtp.com; s=20210112; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=OzFwqiIAo/BN79PZY2EsEhAi3YnDrEDv7yI1vio3ryo=; b=Y97uaU8+z0DE6g4+fmVJYUzuRufmDvP1kLnIjL14y02Y4QO9uS7NNnEmORa7Pd6JYO IXQNms/ytNXKFYzRyTCkKiP8DUN91jC69L/mLGgZVWGKNjGBPeU2Iyyfgzxyf0nE5EXc HeNe8OKayQAct/OlH6TCTqRXaPyTguwDSr8Bib1L2pIKs1lFMHVhlo/f46XXZwMtK5ie kL1EZ4b0rf8EWLdo6bj3wAFiBYIUWBNn8PGxLaaySKhLBpia3ufcdRz36U1je0Qm05g9 ZU9iJlMwyQNXALIiD25pi7t2+iz2WJg7aedu/xooXS/uHX89keRUwPg/ila2nhFp4+rk +wOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=OzFwqiIAo/BN79PZY2EsEhAi3YnDrEDv7yI1vio3ryo=; b=mr9vd0GDjmoz8FOIR2cB6FqRfYFym1aPsX350mmzBHIuxU7HHirQ8ihkUcQUmmzPqN gC0E6FhVf/hj1tmlc2M/b0ZW5oWUs6Y7G+2ZizAKXVGvP5GwI73T/z6dJN6Me6BSIpkf TEFB5Oy+jrCXkDsVsRq0N45uV17FQsJ2QK7wgQ6CX9oWqsUfP4Y+kA+OPeVKLjZmhKtA i5Tox1nlmWU4Jgjm9P2xGQIY/mvIKR+rUmbhPZjv7Wo8fYF1nNG6xSiJe8WMp+IXz0F9 5bllrWqprMexzSCnLO0ixFb8P33QWHhrsr8+L+pb3Q/23ApyWCvPkegRRddQTN3CAwzb rYrw== X-Gm-Message-State: AOAM532OPnoHZ7vfzkLIBPKF7xXgGLwfclfRrMx/3zQ5qWJn45zpUk1x 0u0gPID0R4oXcrQlko4/xutqRmDa6Sm2Ag== X-Google-Smtp-Source: ABdhPJyprp9RrTgCLQDFmuUIj+gbfnbTN18+Ttw/kvU+kF/WAmh4cFx396VQ0w4mKlXX57ll4uo14w== X-Received: by 2002:a05:600c:3512:b0:394:7c3b:53d1 with SMTP id h18-20020a05600c351200b003947c3b53d1mr6592821wmq.197.1653457857131; Tue, 24 May 2022 22:50:57 -0700 (PDT) Received: from localhost.localdomain ([39.32.39.45]) by smtp.gmail.com with ESMTPSA id z1-20020a5d4d01000000b0020c5253d8edsm1076569wrt.57.2022.05.24.22.50.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 May 2022 22:50:56 -0700 (PDT) From: Muhammad Jawad Hussain To: dev@dpdk.org Cc: jawad.hussain@emumba.com Subject: [PATCH] examples/ethtool: adds promiscuous mode functionality Date: Wed, 25 May 2022 10:50:42 +0500 Message-Id: <20220525055042.123144-1-jawad.hussain@emumba.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org ethtool did not have promiscuous mode functioality previously which is needed for viewing broadcast and multicast packets. This patch allows user to turn on/off promiscuous mode on each port through command line. Signed-off-by: Muhammad Jawad Hussain --- doc/guides/sample_app_ug/ethtool.rst | 1 + examples/ethtool/ethtool-app/ethapp.c | 83 ++++++++++++++++++++++++++- examples/ethtool/lib/rte_ethtool.c | 24 ++++++++ 3 files changed, 106 insertions(+), 2 deletions(-) diff --git a/doc/guides/sample_app_ug/ethtool.rst b/doc/guides/sample_app_ug/ethtool.rst index 159e9e0639..6edd9940b8 100644 --- a/doc/guides/sample_app_ug/ethtool.rst +++ b/doc/guides/sample_app_ug/ethtool.rst @@ -54,6 +54,7 @@ they do as follows: * ``regs``: Dump port register(s) to file * ``ringparam``: Get/set ring parameters * ``rxmode``: Toggle port Rx mode +* ``set promisc``: Enable/Disable promiscuous mode on ports * ``stop``: Stop port * ``validate``: Check that given MAC address is valid unicast address * ``vlan``: Add/remove VLAN id diff --git a/examples/ethtool/ethtool-app/ethapp.c b/examples/ethtool/ethtool-app/ethapp.c index 78e86534e8..d6e121bd5d 100644 --- a/examples/ethtool/ethtool-app/ethapp.c +++ b/examples/ethtool/ethtool-app/ethapp.c @@ -13,8 +13,16 @@ #include "ethapp.h" #define EEPROM_DUMP_CHUNKSIZE 1024 - - +typedef uint16_t portid_t; + +/* *** PROMISC_MODE *** */ +struct cmd_set_promisc_mode_result { + cmdline_fixed_string_t set; + cmdline_fixed_string_t promisc; + cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */ + uint16_t port_num; /* valid if "allports" argument == 0 */ + cmdline_fixed_string_t mode; +}; struct pcmd_get_params { cmdline_fixed_string_t cmd; }; @@ -133,6 +141,22 @@ cmdline_parse_token_string_t pcmd_vlan_token_mode = cmdline_parse_token_num_t pcmd_vlan_token_vid = TOKEN_NUM_INITIALIZER(struct pcmd_vlan_params, vid, RTE_UINT16); +/* promisc mode */ + +cmdline_parse_token_string_t cmd_setpromisc_set = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, set, "set"); +cmdline_parse_token_string_t cmd_setpromisc_promisc = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, promisc, + "promisc"); +cmdline_parse_token_string_t cmd_setpromisc_portall = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, port_all, + "all"); +cmdline_parse_token_num_t cmd_setpromisc_portnum = + TOKEN_NUM_INITIALIZER(struct cmd_set_promisc_mode_result, port_num, + RTE_UINT16); +cmdline_parse_token_string_t cmd_setpromisc_mode = + TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, mode, + "on#off"); static void pcmd_quit_callback(__rte_unused void *ptr_params, @@ -142,6 +166,34 @@ pcmd_quit_callback(__rte_unused void *ptr_params, cmdline_quit(ctx); } +static void pcmd_set_promisc_mode_parsed(void *parsed_result, + __rte_unused struct cmdline *cl, + void *allports) +{ + struct cmd_set_promisc_mode_result *res = parsed_result; + int enable; + int ret; + portid_t i; + if (!strcmp(res->mode, "on")) + enable = 1; + else + enable = 0; + + /* all ports */ + if (allports) { + RTE_ETH_FOREACH_DEV(i) + ret = eth_set_promisc_mode(i, enable); + } else { + ret = eth_set_promisc_mode(res->port_num, enable); + } + if (ret) { + if (enable) + printf("Promisc mode Enabled\n"); + else + printf("Promisc mode Disabled\n"); + } else + printf("Error while updating promisc mode"); +} static void pcmd_drvinfo_callback(__rte_unused void *ptr_params, @@ -869,6 +921,31 @@ cmdline_parse_inst_t pcmd_vlan = { }, }; +cmdline_parse_inst_t cmd_set_promisc_mode_all = { + .f = pcmd_set_promisc_mode_parsed, + .data = (void *)1, + .help_str = "set promisc all \n Set promisc mode for all ports", + .tokens = { + (void *)&cmd_setpromisc_set, + (void *)&cmd_setpromisc_promisc, + (void *)&cmd_setpromisc_portall, + (void *)&cmd_setpromisc_mode, + NULL, + }, +}; + +cmdline_parse_inst_t cmd_set_promisc_mode_one = { + .f = pcmd_set_promisc_mode_parsed, + .data = (void *)0, + .help_str = "set promisc \n Set promisc mode on port_id", + .tokens = { + (void *)&cmd_setpromisc_set, + (void *)&cmd_setpromisc_promisc, + (void *)&cmd_setpromisc_portnum, + (void *)&cmd_setpromisc_mode, + NULL, + }, +}; cmdline_parse_ctx_t list_prompt_commands[] = { (cmdline_parse_inst_t *)&pcmd_drvinfo, @@ -886,6 +963,8 @@ cmdline_parse_ctx_t list_prompt_commands[] = { (cmdline_parse_inst_t *)&pcmd_ringparam, (cmdline_parse_inst_t *)&pcmd_ringparam_set, (cmdline_parse_inst_t *)&pcmd_rxmode, + (cmdline_parse_inst_t *)&cmd_set_promisc_mode_one, + (cmdline_parse_inst_t *)&cmd_set_promisc_mode_all, (cmdline_parse_inst_t *)&pcmd_stop, (cmdline_parse_inst_t *)&pcmd_validate, (cmdline_parse_inst_t *)&pcmd_vlan, diff --git a/examples/ethtool/lib/rte_ethtool.c b/examples/ethtool/lib/rte_ethtool.c index ffaad96498..2fb47471cb 100644 --- a/examples/ethtool/lib/rte_ethtool.c +++ b/examples/ethtool/lib/rte_ethtool.c @@ -18,6 +18,30 @@ #define PKTPOOL_CACHE 32 +int +eth_set_promisc_mode(uint16_t port, int enable) +{ + int ret; + + + if (enable) + ret = rte_eth_promiscuous_enable(port); + else + ret = rte_eth_promiscuous_disable(port); + + if (ret != 0) { + fprintf(stderr, + "Error during %s promiscuous mode for port %u: %s\n", + enable ? "enabling" : "disabling", + port, rte_strerror(-ret)); + return 0; + } else + return 1; +} + + + + int rte_ethtool_get_drvinfo(uint16_t port_id, struct ethtool_drvinfo *drvinfo) { -- 2.32.0