<div dir="ltr">Hi,<div>The following test is failing on my patch and its is not related to my changes, can u please re-run it.</div><div>test: </div><div>ci/iol-x86_64-unit-testing<br></div><div><br></div><div>Thanks</div><div><br></div><div>Regards,</div><div>Jawad</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Aug 11, 2022 at 2:45 PM Muhammad Jawad Hussain <<a href="mailto:jawad.hussain@emumba.com">jawad.hussain@emumba.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">ethtool did not have promiscuous mode functioality previously<br>
which is needed for viewing broadcast and multicast packets.<br>
This patch allows user to turn on/off promiscuous mode on<br>
each port through command line.<br>
<br>
Signed-off-by: Muhammad Jawad Hussain <<a href="mailto:jawad.hussain@emumba.com" target="_blank">jawad.hussain@emumba.com</a>><br>
---<br>
 doc/guides/sample_app_ug/ethtool.rst  |  1 +<br>
 examples/ethtool/ethtool-app/ethapp.c | 79 ++++++++++++++++++++++++++-<br>
 examples/ethtool/lib/rte_ethtool.c    | 24 ++++++++<br>
 examples/ethtool/lib/rte_ethtool.h    |  2 +<br>
 4 files changed, 104 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/doc/guides/sample_app_ug/ethtool.rst b/doc/guides/sample_app_ug/ethtool.rst<br>
index 159e9e0639..6edd9940b8 100644<br>
--- a/doc/guides/sample_app_ug/ethtool.rst<br>
+++ b/doc/guides/sample_app_ug/ethtool.rst<br>
@@ -54,6 +54,7 @@ they do as follows:<br>
 * ``regs``: Dump port register(s) to file<br>
 * ``ringparam``: Get/set ring parameters<br>
 * ``rxmode``: Toggle port Rx mode<br>
+* ``set promisc``: Enable/Disable promiscuous mode on ports<br>
 * ``stop``: Stop port<br>
 * ``validate``: Check that given MAC address is valid unicast address<br>
 * ``vlan``: Add/remove VLAN id<br>
diff --git a/examples/ethtool/ethtool-app/ethapp.c b/examples/ethtool/ethtool-app/ethapp.c<br>
index 78e86534e8..f89e4c4cf0 100644<br>
--- a/examples/ethtool/ethtool-app/ethapp.c<br>
+++ b/examples/ethtool/ethtool-app/ethapp.c<br>
@@ -13,8 +13,16 @@<br>
 #include "ethapp.h"<br>
<br>
 #define EEPROM_DUMP_CHUNKSIZE 1024<br>
-<br>
-<br>
+typedef uint16_t portid_t;<br>
+<br>
+/* *** PROMISC_MODE *** */<br>
+struct cmd_set_promisc_mode_result {<br>
+       cmdline_fixed_string_t set;<br>
+       cmdline_fixed_string_t promisc;<br>
+       cmdline_fixed_string_t port_all; /* valid if "allports" argument == 1 */<br>
+       uint16_t port_num;               /* valid if "allports" argument == 0 */<br>
+       cmdline_fixed_string_t mode;<br>
+};<br>
 struct pcmd_get_params {<br>
        cmdline_fixed_string_t cmd;<br>
 };<br>
@@ -133,6 +141,22 @@ cmdline_parse_token_string_t pcmd_vlan_token_mode =<br>
 cmdline_parse_token_num_t pcmd_vlan_token_vid =<br>
        TOKEN_NUM_INITIALIZER(struct pcmd_vlan_params, vid, RTE_UINT16);<br>
<br>
+/* promisc mode */<br>
+<br>
+cmdline_parse_token_string_t cmd_setpromisc_set =<br>
+       TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, set, "set");<br>
+cmdline_parse_token_string_t cmd_setpromisc_promisc =<br>
+       TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, promisc,<br>
+                                "promisc");<br>
+cmdline_parse_token_string_t cmd_setpromisc_portall =<br>
+       TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, port_all,<br>
+                                "all");<br>
+cmdline_parse_token_num_t cmd_setpromisc_portnum =<br>
+       TOKEN_NUM_INITIALIZER(struct cmd_set_promisc_mode_result, port_num,<br>
+                             RTE_UINT16);<br>
+cmdline_parse_token_string_t cmd_setpromisc_mode =<br>
+       TOKEN_STRING_INITIALIZER(struct cmd_set_promisc_mode_result, mode,<br>
+                                "on#off");<br>
<br>
 static void<br>
 pcmd_quit_callback(__rte_unused void *ptr_params,<br>
@@ -142,6 +166,30 @@ pcmd_quit_callback(__rte_unused void *ptr_params,<br>
        cmdline_quit(ctx);<br>
 }<br>
<br>
+static void pcmd_set_promisc_mode_parsed(void *ptr_params,<br>
+                                       __rte_unused struct cmdline *ctx,<br>
+                                       void *allports)<br>
+{<br>
+       struct cmd_set_promisc_mode_result *res = ptr_params;<br>
+       int enable;<br>
+       portid_t i;<br>
+       if (!strcmp(res->mode, "on"))<br>
+               enable = 1;<br>
+       else<br>
+               enable = 0;<br>
+<br>
+       /* all ports */<br>
+       if (allports) {<br>
+               RTE_ETH_FOREACH_DEV(i)<br>
+                       eth_set_promisc_mode(i, enable);<br>
+       } else {<br>
+               eth_set_promisc_mode(res->port_num, enable);<br>
+       }<br>
+       if (enable)<br>
+               printf("Promisc mode Enabled\n");<br>
+       else<br>
+               printf("Promisc mode Disabled\n");<br>
+}<br>
<br>
 static void<br>
 pcmd_drvinfo_callback(__rte_unused void *ptr_params,<br>
@@ -869,6 +917,31 @@ cmdline_parse_inst_t pcmd_vlan = {<br>
        },<br>
 };<br>
<br>
+cmdline_parse_inst_t cmd_set_promisc_mode_all = {<br>
+       .f = pcmd_set_promisc_mode_parsed,<br>
+       .data = (void *)1,<br>
+       .help_str = "set promisc all <on|off>\n     Set promisc mode for all ports",<br>
+       .tokens = {<br>
+               (void *)&cmd_setpromisc_set,<br>
+               (void *)&cmd_setpromisc_promisc,<br>
+               (void *)&cmd_setpromisc_portall,<br>
+               (void *)&cmd_setpromisc_mode,<br>
+               NULL,<br>
+       },<br>
+};<br>
+<br>
+cmdline_parse_inst_t cmd_set_promisc_mode_one = {<br>
+       .f = pcmd_set_promisc_mode_parsed,<br>
+       .data = (void *)0,<br>
+       .help_str = "set promisc <port_id> <on|off>\n     Set promisc mode on port_id",<br>
+       .tokens = {<br>
+               (void *)&cmd_setpromisc_set,<br>
+               (void *)&cmd_setpromisc_promisc,<br>
+               (void *)&cmd_setpromisc_portnum,<br>
+               (void *)&cmd_setpromisc_mode,<br>
+               NULL,<br>
+       },<br>
+};<br>
<br>
 cmdline_parse_ctx_t list_prompt_commands[] = {<br>
        (cmdline_parse_inst_t *)&pcmd_drvinfo,<br>
@@ -886,6 +959,8 @@ cmdline_parse_ctx_t list_prompt_commands[] = {<br>
        (cmdline_parse_inst_t *)&pcmd_ringparam,<br>
        (cmdline_parse_inst_t *)&pcmd_ringparam_set,<br>
        (cmdline_parse_inst_t *)&pcmd_rxmode,<br>
+       (cmdline_parse_inst_t *)&cmd_set_promisc_mode_one,<br>
+       (cmdline_parse_inst_t *)&cmd_set_promisc_mode_all,<br>
        (cmdline_parse_inst_t *)&pcmd_stop,<br>
        (cmdline_parse_inst_t *)&pcmd_validate,<br>
        (cmdline_parse_inst_t *)&pcmd_vlan,<br>
diff --git a/examples/ethtool/lib/rte_ethtool.c b/examples/ethtool/lib/rte_ethtool.c<br>
index ffaad96498..2fb47471cb 100644<br>
--- a/examples/ethtool/lib/rte_ethtool.c<br>
+++ b/examples/ethtool/lib/rte_ethtool.c<br>
@@ -18,6 +18,30 @@<br>
 #define PKTPOOL_CACHE 32<br>
<br>
<br>
+int<br>
+eth_set_promisc_mode(uint16_t port, int enable)<br>
+{<br>
+       int ret;<br>
+<br>
+<br>
+       if (enable)<br>
+               ret = rte_eth_promiscuous_enable(port);<br>
+       else<br>
+               ret = rte_eth_promiscuous_disable(port);<br>
+<br>
+       if (ret != 0) {<br>
+               fprintf(stderr,<br>
+                       "Error during %s promiscuous mode for port %u: %s\n",<br>
+                       enable ? "enabling" : "disabling",<br>
+                       port, rte_strerror(-ret));<br>
+                       return 0;<br>
+       } else<br>
+               return 1;<br>
+}<br>
+<br>
+<br>
+<br>
+<br>
 int<br>
 rte_ethtool_get_drvinfo(uint16_t port_id, struct ethtool_drvinfo *drvinfo)<br>
 {<br>
diff --git a/examples/ethtool/lib/rte_ethtool.h b/examples/ethtool/lib/rte_ethtool.h<br>
index d27e0102b1..2b19907b4d 100644<br>
--- a/examples/ethtool/lib/rte_ethtool.h<br>
+++ b/examples/ethtool/lib/rte_ethtool.h<br>
@@ -408,6 +408,8 @@ int rte_ethtool_get_ringparam(uint16_t port_id,<br>
 int rte_ethtool_set_ringparam(uint16_t port_id,<br>
        struct ethtool_ringparam *ring_param);<br>
<br>
+int<br>
+eth_set_promisc_mode(uint16_t port, int enable);<br>
<br>
 #ifdef __cplusplus<br>
 }<br>
-- <br>
2.32.0<br>
<br>
</blockquote></div>