From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id AF4824596A;
	Thu, 12 Sep 2024 08:11:10 +0200 (CEST)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 9170C40DF6;
	Thu, 12 Sep 2024 08:11:00 +0200 (CEST)
Received: from NAM04-MW2-obe.outbound.protection.outlook.com
 (mail-mw2nam04on2090.outbound.protection.outlook.com [40.107.101.90])
 by mails.dpdk.org (Postfix) with ESMTP id 5D2BE40144
 for <dev@dpdk.org>; Thu, 12 Sep 2024 08:10:57 +0200 (CEST)
ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;
 b=k9/TDmSfELNdCQL8nAawpnVlryCQQTf9YpfvEq5jHEKCS3oalV7fK+AIolPZlkMrq/cNV4aQ1VWfX/Tf4G4I8sWvG7Du31NPkvWRGfSBrJxStKXbUvKGxVY/YRSWn0PGOul0c0peq3Uq+myS5+0rOk4iAPfx/Qll68jtj6L4DonMiLoM5GGeNqDUd3tWlB/P2Pr7UXiiCfFqy69UbtJtqsYGyTRg71jUQB+cVjLW+8H0TJElI03SHUiCSNxoSx8RROx/jHc9XknP3abSP9Jg1WT6yux+ACjIsbCuaqFa1+vcaloxNMxtlxUEQjZgEpha4nhKQGh1fIGIvbK3NUvNLQ==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; 
 s=arcselector10001;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;
 bh=BJ0+myunz980l3iaArR4GUuUy2ezMhjSggacD0kgTkc=;
 b=l2jIkmsI7WZ3lofMfYsXwjZRyUM1n9NAvyZQ/Bcly871IsAklHQ/dZyky3RJzVHSC0Og5LGIBP1zD7EWL7YycC3Xa59q419yuy+czadF6rAZyYcSsxTt7P0d0sn2XtPlC0klNxVXk2HF8jhX998JWmLmhMnY3RhHWAemQ+mUOHkfGjJcq9dnuvp1/K+Cfogw6ejigI3t1HsoV2EZmdejNTGGXaZSqF4eAcpIenFjclKrD2megCsPAYwErqzjXQ2p93VfsdwrWZ/gELrC2SY9txRW923vz9kfAMORZ11FJ5Ed3zSy38MN4DYjsNqjC0fHfCzntyk0sxZuO3ctPuf8fg==
ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass
 smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;
 dkim=pass header.d=corigine.com; arc=none
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=BJ0+myunz980l3iaArR4GUuUy2ezMhjSggacD0kgTkc=;
 b=sBUE7Fdu7bEdeaLcGz1gzwP3k6Xi0U9gD5oPNEsBTL6EkxyG+X4tNaXOvRsVHco7CxELRRM+JX6LCmyR1+/CQjWkiCOsfOiWhdkKBPlSfJjkCmQCy2BeAhgeIvMCFRa98l6AmBsgEahNQx/XKiK8jlB+9TFhgghTnP5TekDI4CM=
Authentication-Results: dkim=none (message not signed)
 header.d=none;dmarc=none action=none header.from=corigine.com;
Received: from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)
 by LV3PR13MB6454.namprd13.prod.outlook.com (2603:10b6:408:19c::9)
 with Microsoft SMTP Server (version=TLS1_2,
 cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7939.25; Thu, 12 Sep
 2024 06:10:55 +0000
Received: from SJ0PR13MB5545.namprd13.prod.outlook.com
 ([fe80::b900:5f05:766f:833]) by SJ0PR13MB5545.namprd13.prod.outlook.com
 ([fe80::b900:5f05:766f:833%4]) with mapi id 15.20.7939.022; Thu, 12 Sep 2024
 06:10:55 +0000
From: Chaoyong He <chaoyong.he@corigine.com>
To: dev@dpdk.org
Cc: oss-drivers@corigine.com, James Hershaw <james.hershaw@corigine.com>,
 Chaoyong He <chaoyong.he@corigine.com>
Subject: [PATCH 2/2] app/testpmd: add set dev led on/off command
Date: Thu, 12 Sep 2024 14:10:30 +0800
Message-Id: <20240912061030.2834034-3-chaoyong.he@corigine.com>
X-Mailer: git-send-email 2.39.1
In-Reply-To: <20240912061030.2834034-1-chaoyong.he@corigine.com>
References: <20240912061030.2834034-1-chaoyong.he@corigine.com>
Content-Transfer-Encoding: 8bit
Content-Type: text/plain
X-ClientProxiedBy: SG2PR04CA0163.apcprd04.prod.outlook.com (2603:1096:4::25)
 To SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)
MIME-Version: 1.0
X-MS-PublicTrafficType: Email
X-MS-TrafficTypeDiagnostic: SJ0PR13MB5545:EE_|LV3PR13MB6454:EE_
X-MS-Office365-Filtering-Correlation-Id: d4cae6c3-c697-4a26-00ff-08dcd2f1a955
X-MS-Exchange-SenderADCheck: 1
X-MS-Exchange-AntiSpam-Relay: 0
X-Microsoft-Antispam: BCL:0;
 ARA:13230040|376014|1800799024|52116014|366016|38350700014; 
X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?vWhSFlpWoGh9DRXo73cquwN0rb++wZBOmzpTsia//brcNeOdIJRbtQnHSsHj?=
 =?us-ascii?Q?EFOSOUZEMC8I4Qi4OWNPk4FZARpFfTQHNSEAnH+UwWmJjpseSMOtW9ft7zpu?=
 =?us-ascii?Q?eMDX/xLc/sLki8VDAWq7VRer0vDDSBi3D+sB7ofeEb793JiNbYuo05SXK/+9?=
 =?us-ascii?Q?7Mumir9PeqfWuigZeKWtxY9SL5YQ/g8dLUFaDHtJu8jaOc05783p+e2dHmOJ?=
 =?us-ascii?Q?nB6gnQyeZSEgUO45wos9M0ue2LXwPLG8ayVoaCN4q8FxAOQJLjN5kURQj6if?=
 =?us-ascii?Q?rZVgwxPu6f4xZSddZP9GRGNnEgQHPmu/UzEAeVVrGFX8IicMA5+z0eayRd3k?=
 =?us-ascii?Q?q8+V6oyKVLfDprRP/Wjj1ee1LKPahS9VbHqJsDfdWzi61Jw00JgMSwP6Epfk?=
 =?us-ascii?Q?yqL5lvh1nTDaoYFNt7pTxzIDb45wyCwjvsl9/X9xAmad+ZKMtc00VvqAwuPi?=
 =?us-ascii?Q?ddBY+6pIDbSMuwC1GAYznEjz1Y02lEgXoDKQzkcsOi4cjMZF2tp0Xi4R6kZE?=
 =?us-ascii?Q?dX7QWUrt/Il+nL90G+y6Hi8mYT4rn1gII1rcrmUpjls71U57FtBi9MfnPotP?=
 =?us-ascii?Q?LEmzHfWpmxGa3l85Cozah4i6vuX07DIOMRHTOybTlRMoSIVOu+IXb9AZFk0R?=
 =?us-ascii?Q?8+drxWBDT0feFWfuXSJXr9kTiKID3j8zsi6OItYkRtbhVFzuCMbZAJkl8cQs?=
 =?us-ascii?Q?rZcSW+s8jOXKLcMpF4S/5oZZUQfCxMdQ7M50D9jJrL1wkk5jEAeUJoGDGkwR?=
 =?us-ascii?Q?QealtY+2XdjjQ44X0D0oIzi3T/tbQDnRP6dd3/LOwBld6e/2nB2g6xOlH0uW?=
 =?us-ascii?Q?7Cm0676+JM0CF9X29NY8Na+6BrQ1if2TVslSD58SHvbahPTVTMt9aCxejWE6?=
 =?us-ascii?Q?oPyyEpasRj0QwLcV0YK+KdLTVFlbYPA8Pu8U5rr36LuzfvvCUnBSmu4UHD4+?=
 =?us-ascii?Q?JZ2QvzNHEKNlEEKdlUZK7dA+R+39KorSxhROkPVP5f4XO4S8kDftCfeU/LeY?=
 =?us-ascii?Q?ilHgwVFrr1gLgAkH04ni/VC2J79hPkBMQlS40+j7CoU3VAD2sIKWkwrnv2Ho?=
 =?us-ascii?Q?d2+H163XdjsoqVoZQfZ708jgW/Ue85QfAYaVU7zr5qQ6vNVwiCM57NxFxGBp?=
 =?us-ascii?Q?fQMFZDMujcOY3MJiZr0Hk1qtJ/ftCE7YQsqkIrc4uKPdTB9x7r/oXzI7D/QF?=
 =?us-ascii?Q?W/VZdEABViWsP3RefX+mNum1yPVAyQXnG0ceRp7nRhnQjiZrxF5GMlxukqJd?=
 =?us-ascii?Q?wO1WeeDP8SwOnTkBMRUIsiG7N4iI2vGHO5PgLwn8/f1PPfmHoCuUZlGtvM6P?=
 =?us-ascii?Q?S9kCKEcpVnQ0wBPnKHLKaJoKfxogglLanYwkG1v0sxurjq28xI1H/rcHFa0C?=
 =?us-ascii?Q?XlKGWbu1CVzk6i6Nw+JMiXVVC51h2ERxGsmpQ0EtTyD99Elajg=3D=3D?=
X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;
 IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;
 SFS:(13230040)(376014)(1800799024)(52116014)(366016)(38350700014); DIR:OUT;
 SFP:1102; 
X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1
X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?bEJgXWNEO9MYUV/E64d2uFfKdso5WK7Z6KYBl1xihzz0IVnaw4LFCitLO7ha?=
 =?us-ascii?Q?3Y1jOvj+R6Rqs+JwQDgYVsHuunfj1BkMVBvvUUScBGSaC7AQ2U47OkJbgOov?=
 =?us-ascii?Q?dnpTpHUJogM+AMcDBzMrl4guoeD9keeyPoGUaasrwr/Elf2mXPTwqzSOUtLz?=
 =?us-ascii?Q?B9Mp2Da056F3oD8IvjRXGMMXnIjdje2+yHdxFLRTduGP1pekqC/FqOM3xUHM?=
 =?us-ascii?Q?EOHOltP7HVEllFtKS/J46cwdG1VTXGpmsharF43ls9iFz9O27pId5y+56s2w?=
 =?us-ascii?Q?3swPCHMwVMBu42tLQcn5osn0DkL3OAYVyHWgZ5cN1QZ7QqWzUyAI88EtI3UP?=
 =?us-ascii?Q?ShY0cfath2rg2tWK1ixlAaVE0x0SZOdi3cQcEzya+nIMkC7788t4ZRiCrMvC?=
 =?us-ascii?Q?zYY2crA7boznXtBDd63rnZmXfHirWaTZvDltjh+qJI3i1q4nSsQqZ6GijoQs?=
 =?us-ascii?Q?MuSpLgMaaa3a0BtqOp42i3YuckcRZV3VKgfXO9H/oiV3Y36ZmeDx7RoqsH2E?=
 =?us-ascii?Q?AVprH10B0Cl+7qxVn/EKZah33+DTNklK6aBAe7s+ZUtx5VkL6T55k2Qrqe9r?=
 =?us-ascii?Q?h8Ptt1ng150gXALo5tKzG9zW4DiDb4iENYC5Qh/IlOcyTRI9oqhvmM4y9HwB?=
 =?us-ascii?Q?d4vNSJA3gQuZEcST7ABJvYBl6NO+cVAYvqcABNwWKVHku7DDaqgcQ+4KUW+f?=
 =?us-ascii?Q?wns/iF7/KoM1unbOSTM4PGqwwUVTd2Ymyrr7pFZL9TGUDsq1dSwont7k7kBP?=
 =?us-ascii?Q?Xmo0UkVrvd6MriAMGNtrGmUrBlGgYUppGWXCK/efdUpEgDB6A1ZpBXhAnJ1z?=
 =?us-ascii?Q?dH8mZAN/FMEMq1PeLSD6MOA4BDtHD/oiOOxu14n8Xi2ERXCluzcLk7HrbCAF?=
 =?us-ascii?Q?ZtCRSwq9ABqbRNdbncQFEN7B70B7tnH2gSOJmBKWHmiHvae8BrmkWq1Xny7l?=
 =?us-ascii?Q?HMySSTWLzHNiWAIJHphICTgag97l/AYr0YIZfo6GA3xjDi0LA6JcZohb6iPN?=
 =?us-ascii?Q?TUvd4ZrRkHQr4fdGhMDeBy91TLMs4KvqMmyfEtlwQqCSIEZEchnz3sVAWBwv?=
 =?us-ascii?Q?S5KoRFGxloSDt35t+T0PrzHSoDAZ/7F+pxzdMPZOU/QcfDu/5bpBhjMfZilm?=
 =?us-ascii?Q?TG6Nvlj+npE2GOgs9qhW8eXQFsYE05cg1pkyl6Iq1ARVeOtOe60qavW7u76S?=
 =?us-ascii?Q?sSPVuZUIWZFYn/8mXlp1jULq2JmXDZuqJ7Qw9xZpdjds2NY8UqyDJWO+WiT8?=
 =?us-ascii?Q?+Df4rmgU11NgLiwFOmnO5P1nJvIU5HfILB5aUpF6LfOrzvQ0cti1toqIYZz/?=
 =?us-ascii?Q?OvpOUBd2p5im9tpKHI7pBOnyIZVRRTUKTBuGVUz4i6Kg17YQJdcOR7pYORQ5?=
 =?us-ascii?Q?Kol8vUosaQT+MeNEQPUoo9pU2LMDm5IbMpw/fRS5Aml/WMhs6AQ3vfYXtlXj?=
 =?us-ascii?Q?xOwb6B02u7lZJyaTX3hSzjDcjiuTk745eWTiYUJdq6Gl1opyb0wcX4rnjxpY?=
 =?us-ascii?Q?uLtvTCEoyg/yzlTh2NwY9u3gqt6p+RQVPHuEHIKy7K8e/4skTn3r9JN2y3HE?=
 =?us-ascii?Q?QazIwumD/YXaDQKvtKQz5b2UhMY0mlALRWdqWVz11R8xyMZaDvBKXuOAWE4B?=
 =?us-ascii?Q?ig=3D=3D?=
X-OriginatorOrg: corigine.com
X-MS-Exchange-CrossTenant-Network-Message-Id: d4cae6c3-c697-4a26-00ff-08dcd2f1a955
X-MS-Exchange-CrossTenant-AuthSource: SJ0PR13MB5545.namprd13.prod.outlook.com
X-MS-Exchange-CrossTenant-AuthAs: Internal
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Sep 2024 06:10:55.1185 (UTC)
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: fe128f2c-073b-4c20-818e-7246a585940c
X-MS-Exchange-CrossTenant-MailboxType: HOSTED
X-MS-Exchange-CrossTenant-UserPrincipalName: oYu4QzL0NQTzsWPtlO9GykMypEIgSmma7FLlOLsEuYw32t3nQTd46x5XkVAUrZ+f5EKLqaF30/03kaEH12N9QfEwiV/6xcxL3q5dWSc6P8c=
X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR13MB6454
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

From: James Hershaw <james.hershaw@corigine.com>

Add command to change the state of a controllable LED on an ethdev port
to on/off. This is for the purpose of identifying which physical port is
associated with an ethdev.

usage:
  testpmd> set port <port-id> led <on/off>

Signed-off-by: James Hershaw <james.hershaw@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
---
 app/test-pmd/cmdline.c                      | 61 +++++++++++++++++++++
 app/test-pmd/config.c                       | 19 +++++++
 app/test-pmd/testpmd.h                      |  1 +
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |  9 +++
 4 files changed, 90 insertions(+)

diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c
index ebc5a9a361..3898c125c2 100644
--- a/app/test-pmd/cmdline.c
+++ b/app/test-pmd/cmdline.c
@@ -518,6 +518,10 @@ static void cmd_help_long_parsed(void *parsed_result,
 			" value (value) offset (offset)/n"
 			"    Set the device eeprom for certain port.\n\n"
 
+			"set port (port_id) led (on|off)\n"
+			"    set a controllable LED associated with a certain\n"
+			"    port on or off.\n\n"
+
 			"set port (port_id) uta (mac_address|all) (on|off)\n"
 			"    Add/Remove a or all unicast hash filter(s)"
 			"from port X.\n\n"
@@ -7589,6 +7593,62 @@ static cmdline_parse_inst_t cmd_seteeprom = {
 		(void *)&cmd_seteeprom_magic,
 		(void *)&cmd_seteeprom_value,
 		(void *)&cmd_seteeprom_token_str,
+				NULL,
+	},
+};
+
+/* *** SET THE LED FOR CERTAIN PORT TO ON/OFF *** */
+struct cmd_dev_led_result {
+	cmdline_fixed_string_t set;
+	cmdline_fixed_string_t port;
+	portid_t port_id;
+	cmdline_fixed_string_t led;
+	cmdline_fixed_string_t led_state;
+};
+
+static void cmd_set_dev_led_parsed(void *parsed_result,
+			__rte_unused struct cmdline *cl,
+			__rte_unused void *data)
+{
+		struct cmd_dev_led_result *res = parsed_result;
+
+		if (test_done == 0) {
+			fprintf(stderr, "Please stop forwarding first\n");
+			return;
+		}
+
+		if (strcmp(res->led, "led") != 0)
+			return;
+
+		if (strcmp(res->led_state, "on") == 0)
+			set_dev_led(res->port_id, true);
+		else if (strcmp(res->led_state, "off") == 0)
+			set_dev_led(res->port_id, false);
+		else
+			fprintf(stderr, "Invalid option for LED state\n");
+}
+
+static cmdline_parse_token_string_t cmd_dev_led_set =
+	TOKEN_STRING_INITIALIZER(struct cmd_dev_led_result, set, "set");
+static cmdline_parse_token_string_t cmd_dev_led_port =
+	TOKEN_STRING_INITIALIZER(struct cmd_dev_led_result, port, "port");
+static cmdline_parse_token_num_t cmd_dev_led_port_id =
+	TOKEN_NUM_INITIALIZER(struct cmd_dev_led_result, port_id, RTE_UINT16);
+static cmdline_parse_token_string_t cmd_dev_led =
+	TOKEN_STRING_INITIALIZER(struct cmd_dev_led_result, led, "led");
+static cmdline_parse_token_string_t cmd_dev_led_state =
+	TOKEN_STRING_INITIALIZER(struct cmd_dev_led_result, led_state, NULL);
+
+static cmdline_parse_inst_t cmd_set_dev_led = {
+	.f = cmd_set_dev_led_parsed,
+	.data = NULL,
+	.help_str = "set port <port_id> led <on/off>",
+	.tokens = {
+		(void *)&cmd_dev_led_set,
+		(void *)&cmd_dev_led_port,
+		(void *)&cmd_dev_led_port_id,
+		(void *)&cmd_dev_led,
+		(void *)&cmd_dev_led_state,
 		NULL,
 	},
 };
@@ -13332,6 +13392,7 @@ static cmdline_parse_ctx_t builtin_ctx[] = {
 	&cmd_stop,
 	&cmd_mac_addr,
 	&cmd_set_fwd_eth_peer,
+	&cmd_set_dev_led,
 	&cmd_set_qmap,
 	&cmd_set_xstats_hide_zero,
 	&cmd_set_record_core_cycles,
diff --git a/app/test-pmd/config.c b/app/test-pmd/config.c
index fb1a1485e2..9673f9f207 100644
--- a/app/test-pmd/config.c
+++ b/app/test-pmd/config.c
@@ -5385,6 +5385,25 @@ set_fwd_eth_peer(portid_t port_id, char *peer_addr)
 	peer_eth_addrs[port_id] = new_peer_addr;
 }
 
+void
+set_dev_led(portid_t port_id, bool active)
+{
+	int ret;
+
+	if (!rte_eth_dev_is_valid_port(port_id)) {
+		fprintf(stderr, "Error: Invalid port number %i\n", port_id);
+		return;
+	}
+
+	if (active)
+		ret = rte_eth_led_on(port_id);
+	else
+		ret = rte_eth_led_off(port_id);
+
+	if (ret < 0)
+		fprintf(stderr, "Error: Unable to change LED state for port %i\n", port_id);
+}
+
 int
 set_fwd_lcores_list(unsigned int *lcorelist, unsigned int nb_lc)
 {
diff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h
index 1292d1a0a7..aa1f0e9dd1 100644
--- a/app/test-pmd/testpmd.h
+++ b/app/test-pmd/testpmd.h
@@ -944,6 +944,7 @@ int init_fwd_streams(void);
 void update_fwd_ports(portid_t new_pid);
 
 void set_fwd_eth_peer(portid_t port_id, char *peer_addr);
+void set_dev_led(portid_t port_id, bool active);
 
 void port_mtu_set(portid_t port_id, uint16_t mtu);
 int port_action_handle_create(portid_t port_id, uint32_t id, bool indirect_list,
diff --git a/doc/guides/testpmd_app_ug/testpmd_funcs.rst b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
index 3aa214ef9f..1a360d9bab 100644
--- a/doc/guides/testpmd_app_ug/testpmd_funcs.rst
+++ b/doc/guides/testpmd_app_ug/testpmd_funcs.rst
@@ -1359,6 +1359,7 @@ Set the forwarding peer address for certain port::
 
 This is equivalent to the ``--eth-peer`` command-line option.
 
+<<<<<<< HEAD
 set eeprom
 ~~~~~~~~~~
 
@@ -1369,6 +1370,14 @@ Write a value to the device eeprom of a port at a specific offset::
 Value should be given in the form of a hex-as-string, with no leading ``0x``.
 The offset field here is optional, if not specified then the offset will default
 to 0.
+=======
+set port led
+~~~~~~~~~~~~
+
+Set a controllable LED associated with a certain port on or off::
+
+   testpmd> set port (port_id) led (on|off)
+>>>>>>> 38280ecd32 (app/testpmd: add set dev led on/off command)
 
 set port-uta
 ~~~~~~~~~~~~
-- 
2.39.1