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 595D4A0548; Thu, 11 Aug 2022 11:45:39 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3B34840DDE; Thu, 11 Aug 2022 11:45:39 +0200 (CEST) Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by mails.dpdk.org (Postfix) with ESMTP id 4835240DDA for ; Thu, 11 Aug 2022 11:45:37 +0200 (CEST) Received: by mail-wr1-f44.google.com with SMTP id v3so20792872wrp.0 for ; Thu, 11 Aug 2022 02:45:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=emumba-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=x3ku5I2l6vpsOS2brNQuqnXvtlMXcshso7kLGWDZdPc=; b=w+rsq/WHy4aWfrOmVq3yypbVl9pDKKATLTwetvmKjiFC6Fxyu1v/klvTXx18WEhuo7 O7AhlNvmnoY1MjrOoS3hh3FFOCX23G2Hu6MNb9PibIfzLYO6py4bFX2oRfllI1k+5iCR a00gW18E4/W5Nx6SJt8ljkcZqLL5bd1o7MXwxpUv6b+yrQFOSVcRxIiKOz9Q8gQTDS3Z EecdIxFnsAAFxBWDGpOQdfRY8xf5xg4lFtSBf3bR5rxlfsVgRJwhJOGQpQ1Kg3nEs1Hl E/GYl5Noks/gQYRefXuptUeXybrVmXzOdMSR4QmLsYRUUAM0DLpq1oMJ8zGlHRCZFqxt FfcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=x3ku5I2l6vpsOS2brNQuqnXvtlMXcshso7kLGWDZdPc=; b=zGuGBu4CyYNmkResnTIRBZXzcoyUQo0yBFqqD1GejY2zAr4oxkzw/45FzY2ej4AMBn p5Ccr+whJHzCM7I4HfFjFSQoHsYX+kEvhrK6UCp6+jOrSXHzbuYk2QL65Ya6W/uQ8FnP ROqy2/P2d8Q7NN8lALf6XOsvHPNru5VCNiCPnjmSed+qfi8xJfkQOBFkZKxj9dTKMAlj TEaQbfjkeBJ2AGbZ6S9IHFOZWw/NV+KGRnk4weSwJ2pziJlx/1OtHxtAofz8o6c1eYAL ZE7RWyLT139IZIrlnYf8fo4oc+SfXVNNNGBoOzKm+ecxiwaIvK3jidU5a7aMzw88miRz R8dQ== X-Gm-Message-State: ACgBeo0tpe3xrJqU/QUJ1XGOATeKdwC9GnGzOO9JByJCC4y/p5tmT2JU o3L+urlmyzxEZR4B6Yo7KAgrizsBk5Jmzg== X-Google-Smtp-Source: AA6agR5PbIKDcfMym8EN8u8CVSz3UrrMpG0VNTUsDmnpv+qTR/QGsICfAfr/mx8Zc/WZqsWTrY6OhQ== X-Received: by 2002:adf:f287:0:b0:220:5a73:e6df with SMTP id k7-20020adff287000000b002205a73e6dfmr18737076wro.541.1660211136721; Thu, 11 Aug 2022 02:45:36 -0700 (PDT) Received: from localhost.localdomain ([39.32.44.65]) by smtp.gmail.com with ESMTPSA id b6-20020adfee86000000b00220606afdf4sm18928199wro.43.2022.08.11.02.45.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Aug 2022 02:45:36 -0700 (PDT) From: Muhammad Jawad Hussain To: dev@dpdk.org Cc: jawad.hussain@emumba.com Subject: [PATCH v2] examples/ethtool: adds promiscuous mode functionality Date: Thu, 11 Aug 2022 14:45:08 +0500 Message-Id: <20220811094508.97467-1-jawad.hussain@emumba.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220525055042.123144-1-jawad.hussain@emumba.com> References: <20220525055042.123144-1-jawad.hussain@emumba.com> 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 | 79 ++++++++++++++++++++++++++- examples/ethtool/lib/rte_ethtool.c | 24 ++++++++ examples/ethtool/lib/rte_ethtool.h | 2 + 4 files changed, 104 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..f89e4c4cf0 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,30 @@ pcmd_quit_callback(__rte_unused void *ptr_params, cmdline_quit(ctx); } +static void pcmd_set_promisc_mode_parsed(void *ptr_params, + __rte_unused struct cmdline *ctx, + void *allports) +{ + struct cmd_set_promisc_mode_result *res = ptr_params; + int enable; + portid_t i; + if (!strcmp(res->mode, "on")) + enable = 1; + else + enable = 0; + + /* all ports */ + if (allports) { + RTE_ETH_FOREACH_DEV(i) + eth_set_promisc_mode(i, enable); + } else { + eth_set_promisc_mode(res->port_num, enable); + } + if (enable) + printf("Promisc mode Enabled\n"); + else + printf("Promisc mode Disabled\n"); +} static void pcmd_drvinfo_callback(__rte_unused void *ptr_params, @@ -869,6 +917,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 +959,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) { diff --git a/examples/ethtool/lib/rte_ethtool.h b/examples/ethtool/lib/rte_ethtool.h index d27e0102b1..2b19907b4d 100644 --- a/examples/ethtool/lib/rte_ethtool.h +++ b/examples/ethtool/lib/rte_ethtool.h @@ -408,6 +408,8 @@ int rte_ethtool_get_ringparam(uint16_t port_id, int rte_ethtool_set_ringparam(uint16_t port_id, struct ethtool_ringparam *ring_param); +int +eth_set_promisc_mode(uint16_t port, int enable); #ifdef __cplusplus } -- 2.32.0