get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/139093/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 139093,
    "url": "https://patches.dpdk.org/api/patches/139093/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20240403225333.16260-1-mpazdan@arista.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240403225333.16260-1-mpazdan@arista.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240403225333.16260-1-mpazdan@arista.com",
    "date": "2024-04-03T22:53:32",
    "name": "dpdk-testpmd: call get/set link settings interface",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "1b8cedb61f8ff8896d85ec0fc49b429670490850",
    "submitter": {
        "id": 3302,
        "url": "https://patches.dpdk.org/api/people/3302/?format=api",
        "name": "Marek Pazdan",
        "email": "mpazdan@arista.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20240403225333.16260-1-mpazdan@arista.com/mbox/",
    "series": [
        {
            "id": 31675,
            "url": "https://patches.dpdk.org/api/series/31675/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31675",
            "date": "2024-04-03T22:53:32",
            "name": "dpdk-testpmd: call get/set link settings interface",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/31675/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/139093/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/139093/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 00D2143DF6;\n\tThu,  4 Apr 2024 09:48:21 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id C6D4B402D8;\n\tThu,  4 Apr 2024 09:48:15 +0200 (CEST)",
            "from mail-pf1-f225.google.com (mail-pf1-f225.google.com\n [209.85.210.225])\n by mails.dpdk.org (Postfix) with ESMTP id E11974027B\n for <dev@dpdk.org>; Thu,  4 Apr 2024 00:53:36 +0200 (CEST)",
            "by mail-pf1-f225.google.com with SMTP id\n d2e1a72fcca58-6e6fb9a494aso337481b3a.0\n for <dev@dpdk.org>; Wed, 03 Apr 2024 15:53:36 -0700 (PDT)",
            "from smtp.aristanetworks.com ([74.123.28.25])\n by smtp-relay.gmail.com with ESMTPS id\n sd7-20020a17090b514700b0029c77d83fa5sm26934pjb.10.2024.04.03.15.53.35\n (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128);\n Wed, 03 Apr 2024 15:53:35 -0700 (PDT)",
            "from mpazdan-autoneg-dpdk-0.sjc.aristanetworks.com\n (jhall-thisprojectnameisexactly64charspad-us183.sjc.aristanetworks.com\n [10.243.132.215])\n by smtp.aristanetworks.com (Postfix) with ESMTP id 04D6A402016;\n Wed,  3 Apr 2024 15:53:35 -0700 (PDT)"
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20230601; t=1712184816; x=1712789616;\n h=content-transfer-encoding:message-id:date:subject:cc:to:from\n :dkim-signature:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=aIz/cEroY9gR6hApGt5GM4/qEDM7amFJ3JX6/7kOkNk=;\n b=mza3BsPS3eIbQdUKORbEFpyXwd5ktWUU7HbM1nFwcXxEwmkBvAGQYM5fol1PaLFHhW\n RpjO4audhEgj/To1Z6rOAnppChwBInZiQXXyzK4F8/pk2iBBgD6u6mk89ITeoOfNajZE\n 2aHD7Ceyhsj8vnG5gd/jMfyYz0r9CutyDXHKjg8TuW8PoVc67Oul3OPJzemcNLCFyb9V\n Z3zddHoTmc3U0xmku9IzH75PFlHWAZPH5PqGo7iiQd2/ChEjG6pAtALPVjJd6vkMXzSI\n ZXbxpcOF03gkbbeS4XZ8NqnxWrndeh12/JdI85SKa7SxySdYu4GXU7TtdHVCMNH61Woj\n +OPg==",
        "X-Gm-Message-State": "AOJu0YzosXejvISheOOKneKyaFLXbf1BOk7CRLB8eB1P3Y4gV8uKYxQc\n uu4nvZQbKlwXuhhAxL3VjqwTbqVvr0t/7Lcl5hsjvo3oJrzRLJi/HG45jvSnQTdoyArP9FE1spr\n irPo78p0aErWmQYJBMwA6qB4PWhKEfwsBcVWd6g==",
        "X-Google-Smtp-Source": "\n AGHT+IG+QUMiEYZc8oZF1fm4s+P3m+w/jTPHojnX/QjgOLIlL2K81VSCGSq25Q5g2faO3Cyevkr2ptt5meVS",
        "X-Received": "by 2002:a05:6a20:d81a:b0:1a3:ae18:f1e4 with SMTP id\n iv26-20020a056a20d81a00b001a3ae18f1e4mr1463380pzb.34.1712184815872;\n Wed, 03 Apr 2024 15:53:35 -0700 (PDT)",
        "X-Relaying-Domain": "arista.com",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=arista.com;\n s=Arista-A; t=1712184815;\n bh=aIz/cEroY9gR6hApGt5GM4/qEDM7amFJ3JX6/7kOkNk=;\n h=From:To:Cc:Subject:Date:From;\n b=Rt19imrLTVWcAoV8KlBhqF76z8cnUWV6mZLTKH8vT2OZ1WwqEnv+xg/oVfnen+v7s\n wQmjNrfoqZcyJSVl7FYxNrJToANcXgi3L6lAIFLqg06hIyASMzZsRSY0CEH9EssgCC\n I/JNOo8H6ojIBpIExuEqx214hr5ZYtfhoiPCrTDZwuU4d+24VmUSyaQIV7a6vP7LGS\n E4FzW+yJ+Wx2g814ATd1UDlE9t9kOVL8BG0rExFKNbg1uZbhq/8LCrA6rdt38Ju5JJ\n SvQM9wsW2g03Fqov3GDCulS/pnhmO+ptMXVqSqy15Aqy4CciLa6cakmVe9V2W1hy0a\n emuaxdUrznGig==",
        "X-SMTP-Authentication": [
            "Allow-List-permitted",
            "Allow-List-permitted"
        ],
        "From": "Marek Pazdan <mpazdan@arista.com>",
        "To": "Aman Singh <aman.deep.singh@intel.com>,\n Yuying Zhang <yuying.zhang@intel.com>",
        "Cc": "dev@dpdk.org,\n\tMarek Pazdan <mpazdan@arista.com>",
        "Subject": "[PATCH] dpdk-testpmd: call get/set link settings interface",
        "Date": "Wed,  3 Apr 2024 15:53:32 -0700",
        "Message-ID": "<20240403225333.16260-1-mpazdan@arista.com>",
        "Content-Transfer-Encoding": "8bit",
        "X-Mailman-Approved-At": "Thu, 04 Apr 2024 09:48:12 +0200",
        "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>,\n <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>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "Add cmdline options for utilizing get/set link settings API\nadded before in patch this patch depends on. Purpose of this\nchange is to provide mechanism for testing link settings interface\nAPI.\n\nSigned-off-by: Marek Pazdan <mpazdan@arista.com>\n---\nDepends-on: patch-139082 (\"lib: add get/set link settings interface\")\n---\n app/test-pmd/cmdline.c          |   9 +\n app/test-pmd/cmdline_settings.c | 516 ++++++++++++++++++++++++++++++++\n app/test-pmd/cmdline_settings.h |  14 +\n app/test-pmd/meson.build        |   1 +\n app/test-pmd/testpmd.h          |   1 +\n app/test-pmd/util.c             |  10 +\n 6 files changed, 551 insertions(+)\n create mode 100644 app/test-pmd/cmdline_settings.c\n create mode 100644 app/test-pmd/cmdline_settings.h",
    "diff": "diff --git a/app/test-pmd/cmdline.c b/app/test-pmd/cmdline.c\nindex b7759e38a8..7fdd134467 100644\n--- a/app/test-pmd/cmdline.c\n+++ b/app/test-pmd/cmdline.c\n@@ -65,6 +65,7 @@\n #include \"cmdline_cman.h\"\n #include \"cmdline_mtr.h\"\n #include \"cmdline_tm.h\"\n+#include \"cmdline_settings.h\"\n #include \"bpf_cmd.h\"\n \n static struct cmdline *testpmd_cl;\n@@ -255,6 +256,9 @@ static void cmd_help_long_parsed(void *parsed_result,\n \t\t\t\"show port (port_id) flow_ctrl\"\n \t\t\t\"\tShow flow control info of a port.\\n\\n\"\n \n+\t\t\t\"show port (port_id) link settings\"\n+\t\t\t\"\tShow link settings of a port.\\n\\n\"\n+\n \t\t\t\"dump_physmem\\n\"\n \t\t\t\"    Dumps all physical memory segment layouts\\n\\n\"\n \n@@ -661,6 +665,9 @@ static void cmd_help_long_parsed(void *parsed_result,\n \t\t\t\"(max_thresh) (prob_inv)]\\n\"\n \t\t\t\"    Set congestion management configuration\\n\\n\"\n \n+\t\t\t\"set port (port_id) link settings advertising (bitmap_str)\"\n+\t\t\t\"\tSet link advertising settings of a port.\\n\\n\"\n+\n \t\t\t, list_pkt_forwarding_modes()\n \t\t);\n \t}\n@@ -13219,6 +13226,8 @@ static cmdline_parse_ctx_t builtin_ctx[] = {\n \t(cmdline_parse_inst_t *)&cmd_link_flow_control_set_macfwd,\n \t(cmdline_parse_inst_t *)&cmd_link_flow_control_set_autoneg,\n \t(cmdline_parse_inst_t *)&cmd_link_flow_control_show,\n+\t(cmdline_parse_inst_t *)&cmd_link_settings_show,\n+\t(cmdline_parse_inst_t *)&cmd_link_settings_set_advertising,\n \t(cmdline_parse_inst_t *)&cmd_priority_flow_control_set,\n \t(cmdline_parse_inst_t *)&cmd_queue_priority_flow_control_set,\n \t(cmdline_parse_inst_t *)&cmd_config_dcb,\ndiff --git a/app/test-pmd/cmdline_settings.c b/app/test-pmd/cmdline_settings.c\nnew file mode 100644\nindex 0000000000..4db6bd4e9a\n--- /dev/null\n+++ b/app/test-pmd/cmdline_settings.c\n@@ -0,0 +1,516 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2024 Arista Networks, Inc.  All rights reserved.\n+ * Arista Networks, Inc. Confidential and Proprietary\n+ */\n+\n+#include <stdio.h>\n+#include <rte_ethdev.h>\n+\n+#include <cmdline_parse_string.h>\n+#include <cmdline_parse_num.h>\n+\n+#include \"testpmd.h\"\n+\n+/* *** GET CURRENT ETHERNET LINK SETTINGS *** */\n+struct cmd_link_settings_show {\n+\tcmdline_fixed_string_t show;\n+\tcmdline_fixed_string_t port;\n+\tportid_t port_id;\n+\tcmdline_fixed_string_t link;\n+\tcmdline_fixed_string_t settings;\n+};\n+\n+cmdline_parse_token_string_t cmd_ls_show_show =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_show,\n+\t\t\t\tshow, \"show\");\n+cmdline_parse_token_string_t cmd_ls_show_port =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_show,\n+\t\t\t\tport, \"port\");\n+cmdline_parse_token_num_t cmd_ls_show_portid =\n+\tTOKEN_NUM_INITIALIZER(struct cmd_link_settings_show,\n+\t\t\t\tport_id, RTE_UINT16);\n+cmdline_parse_token_string_t cmd_ls_show_link =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_show,\n+\t\t\t\tlink, \"link\");\n+cmdline_parse_token_string_t cmd_ls_show_settings =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_show,\n+\t\t\t\tsettings, \"settings\");\n+\n+/* Print link capability flags (supported, advertised or lp_advertised).\n+ * Assumes that the corresponding SUPPORTED and ADVERTISED flags are equal.\n+ */\n+static void dump_link_caps(const char *prefix, const char *an_prefix,\n+\t\tconst uint32_t *mask, int link_mode_only)\n+{\n+\tstatic const struct {\n+\t\tint same_line; /* print on same line as previous */\n+\t\tunsigned int bit_index;\n+\t\tconst char *name;\n+\t} mode_defs[] = {\n+\t\t{ 0, RTE_LINK_MODE_10baseT_Half_BIT,\n+\t\t  \"10baseT/Half\" },\n+\t\t{ 1, RTE_LINK_MODE_10baseT_Full_BIT,\n+\t\t  \"10baseT/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100baseT_Half_BIT,\n+\t\t  \"100baseT/Half\" },\n+\t\t{ 1, RTE_LINK_MODE_100baseT_Full_BIT,\n+\t\t  \"100baseT/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100baseT1_Full_BIT,\n+\t\t  \"100baseT1/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_1000baseT_Half_BIT,\n+\t\t  \"1000baseT/Half\" },\n+\t\t{ 1, RTE_LINK_MODE_1000baseT_Full_BIT,\n+\t\t  \"1000baseT/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_1000baseT1_Full_BIT,\n+\t\t  \"1000baseT1/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_1000baseKX_Full_BIT,\n+\t\t  \"1000baseKX/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_2500baseX_Full_BIT,\n+\t\t  \"2500baseX/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseT_Full_BIT,\n+\t\t  \"10000baseT/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseKX4_Full_BIT,\n+\t\t  \"10000baseKX4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseKR_Full_BIT,\n+\t\t  \"10000baseKR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseR_FEC_BIT,\n+\t\t  \"10000baseR_FEC\" },\n+\t\t{ 0, RTE_LINK_MODE_20000baseMLD2_Full_BIT,\n+\t\t  \"20000baseMLD2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_20000baseKR2_Full_BIT,\n+\t\t  \"20000baseKR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_40000baseKR4_Full_BIT,\n+\t\t  \"40000baseKR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_40000baseCR4_Full_BIT,\n+\t\t  \"40000baseCR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_40000baseSR4_Full_BIT,\n+\t\t  \"40000baseSR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_40000baseLR4_Full_BIT,\n+\t\t  \"40000baseLR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_56000baseKR4_Full_BIT,\n+\t\t  \"56000baseKR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_56000baseCR4_Full_BIT,\n+\t\t  \"56000baseCR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_56000baseSR4_Full_BIT,\n+\t\t  \"56000baseSR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_56000baseLR4_Full_BIT,\n+\t\t  \"56000baseLR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_25000baseCR_Full_BIT,\n+\t\t  \"25000baseCR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_25000baseKR_Full_BIT,\n+\t\t  \"25000baseKR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_25000baseSR_Full_BIT,\n+\t\t  \"25000baseSR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseCR2_Full_BIT,\n+\t\t  \"50000baseCR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseKR2_Full_BIT,\n+\t\t  \"50000baseKR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseKR4_Full_BIT,\n+\t\t  \"100000baseKR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseSR4_Full_BIT,\n+\t\t  \"100000baseSR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseCR4_Full_BIT,\n+\t\t  \"100000baseCR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseLR4_ER4_Full_BIT,\n+\t\t  \"100000baseLR4_ER4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseSR2_Full_BIT,\n+\t\t  \"50000baseSR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_1000baseX_Full_BIT,\n+\t\t  \"1000baseX/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseCR_Full_BIT,\n+\t\t  \"10000baseCR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseSR_Full_BIT,\n+\t\t  \"10000baseSR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseLR_Full_BIT,\n+\t\t  \"10000baseLR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseLRM_Full_BIT,\n+\t\t  \"10000baseLRM/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_10000baseER_Full_BIT,\n+\t\t  \"10000baseER/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_2500baseT_Full_BIT,\n+\t\t  \"2500baseT/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_5000baseT_Full_BIT,\n+\t\t  \"5000baseT/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseKR_Full_BIT,\n+\t\t  \"50000baseKR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseSR_Full_BIT,\n+\t\t  \"50000baseSR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseCR_Full_BIT,\n+\t\t  \"50000baseCR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseLR_ER_FR_Full_BIT,\n+\t\t  \"50000baseLR_ER_FR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_50000baseDR_Full_BIT,\n+\t\t  \"50000baseDR/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseKR2_Full_BIT,\n+\t\t  \"100000baseKR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseSR2_Full_BIT,\n+\t\t  \"100000baseSR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseCR2_Full_BIT,\n+\t\t  \"100000baseCR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT,\n+\t\t  \"100000baseLR2_ER2_FR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_100000baseDR2_Full_BIT,\n+\t\t  \"100000baseDR2/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_200000baseKR4_Full_BIT,\n+\t\t  \"200000baseKR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_200000baseSR4_Full_BIT,\n+\t\t  \"200000baseSR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT,\n+\t\t  \"200000baseLR4_ER4_FR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_200000baseDR4_Full_BIT,\n+\t\t  \"200000baseDR4/Full\" },\n+\t\t{ 0, RTE_LINK_MODE_200000baseCR4_Full_BIT,\n+\t\t  \"200000baseCR4/Full\" },\n+\t};\n+\tint indent;\n+\tint did1;\n+\tint new_line_pend;\n+\tint fecreported = 0;\n+\n+\t/* Indent just like the separate functions used to */\n+\tindent = strlen(prefix) + 14;\n+\tif (indent < 24)\n+\t\tindent = 24;\n+\n+\tfprintf(stdout, \"       %s link modes:%*s\", prefix,\n+\t\tindent - (int)strlen(prefix) - 12, \"\");\n+\tdid1 = 0;\n+\tnew_line_pend = 0;\n+\tfor (uint32_t i = 0; i < RTE_DIM(mode_defs); i++) {\n+\t\tif (did1 && !mode_defs[i].same_line)\n+\t\t\tnew_line_pend = 1;\n+\t\tif (get_bit(mask, mode_defs[i].bit_index)) {\n+\t\t\tif (new_line_pend) {\n+\t\t\t\tfprintf(stdout, \"\\n\");\n+\t\t\t\tfprintf(stdout, \"       %*s\", indent, \"\");\n+\t\t\t\tnew_line_pend = 0;\n+\t\t\t}\n+\t\t\tdid1++;\n+\t\t\tfprintf(stdout, \"%s \", mode_defs[i].name);\n+\t\t}\n+\t}\n+\tif (did1 == 0)\n+\t\tfprintf(stdout, \"Not reported\");\n+\tfprintf(stdout, \"\\n\");\n+\n+\tif (!link_mode_only) {\n+\t\tfprintf(stdout, \"       %s pause frame use: \", prefix);\n+\t\tif (get_bit(mask, RTE_LINK_MODE_Pause_BIT)) {\n+\t\t\tfprintf(stdout, \"Symmetric\");\n+\t\t\tif (get_bit(mask, RTE_LINK_MODE_Asym_Pause_BIT))\n+\t\t\t\tfprintf(stdout, \" Receive-only\");\n+\t\t\tfprintf(stdout, \"\\n\");\n+\t\t} else {\n+\t\t\tif (get_bit(mask, RTE_LINK_MODE_Asym_Pause_BIT))\n+\t\t\t\tfprintf(stdout, \"Transmit-only\\n\");\n+\t\t\telse\n+\t\t\t\tfprintf(stdout, \"No\\n\");\n+\t\t}\n+\n+\t\tfprintf(stdout, \"       %s auto-negotiation: \", an_prefix);\n+\t\tif (get_bit(mask, RTE_LINK_MODE_Autoneg_BIT))\n+\t\t\tfprintf(stdout, \"Yes\\n\");\n+\t\telse\n+\t\t\tfprintf(stdout, \"No\\n\");\n+\n+\t\tfprintf(stdout, \"       %s FEC modes:\", prefix);\n+\t\tif (get_bit(mask, RTE_LINK_MODE_FEC_NONE_BIT)) {\n+\t\t\tfprintf(stdout, \" None\");\n+\t\t\tfecreported = 1;\n+\t\t}\n+\t\tif (get_bit(mask, RTE_LINK_MODE_FEC_BASER_BIT)) {\n+\t\t\tfprintf(stdout, \" BaseR\");\n+\t\t\tfecreported = 1;\n+\t\t}\n+\t\tif (get_bit(mask, RTE_LINK_MODE_FEC_RS_BIT)) {\n+\t\t\tfprintf(stdout, \" RS\");\n+\t\t\tfecreported = 1;\n+\t\t}\n+\t\tif (!fecreported)\n+\t\t\tfprintf(stdout, \" Not reported\");\n+\t\tfprintf(stdout, \"\\n\");\n+\t}\n+}\n+\n+static void\n+dump_supported(const struct rte_link_settings *link_settings)\n+{\n+\tfprintf(stdout, \"       Supported ports: [ \");\n+\tif (get_bit(link_settings->link_modes.supported,\n+\t\t    RTE_LINK_MODE_TP_BIT))\n+\t\tfprintf(stdout, \"TP \");\n+\tif (get_bit(link_settings->link_modes.supported,\n+\t\t    RTE_LINK_MODE_AUI_BIT))\n+\t\tfprintf(stdout, \"AUI \");\n+\tif (get_bit(link_settings->link_modes.supported,\n+\t\t    RTE_LINK_MODE_BNC_BIT))\n+\t\tfprintf(stdout, \"BNC \");\n+\tif (get_bit(link_settings->link_modes.supported,\n+\t\t    RTE_LINK_MODE_MII_BIT))\n+\t\tfprintf(stdout, \"MII \");\n+\tif (get_bit(link_settings->link_modes.supported,\n+\t\t    RTE_LINK_MODE_FIBRE_BIT))\n+\t\tfprintf(stdout, \"FIBRE \");\n+\tif (get_bit(link_settings->link_modes.supported,\n+\t\t    RTE_LINK_MODE_Backplane_BIT))\n+\t\tfprintf(stdout, \"Backplane \");\n+\tfprintf(stdout, \"]\\n\");\n+\n+\tdump_link_caps(\"Supported\", \"Supports\",\n+\t\t       link_settings->link_modes.supported, 0);\n+}\n+\n+\n+\n+static void\n+cmd_link_settings_show_parsed(void *parsed_result,\n+\t\t\t      __rte_unused struct cmdline *cl,\n+\t\t\t      __rte_unused void *data)\n+{\n+\tstruct cmd_link_settings_show *res = parsed_result;\n+\tstatic const char *info_border = \"*********************\";\n+\tstruct rte_link_settings link_settings;\n+\tint ret;\n+\n+\tmemset(&link_settings, 0x00, sizeof(link_settings));\n+\tret = rte_eth_dev_get_link_settings(res->port_id, &link_settings);\n+\tif (ret != 0) {\n+\t\tfprintf(stderr,\n+\t\t\t\"Failed to get current link settings: err = %d\\n\",\n+\t\t\tret);\n+\t\treturn;\n+\t}\n+\n+\tprintf(\"\\n%s Link settings for port %-2d %s\\n\",\n+\t\tinfo_border, res->port_id, info_border);\n+\n+\tdump_supported(&link_settings);\n+\tdump_link_caps(\"Advertised\", \"Advertised\",\n+\t\t\tlink_settings.link_modes.advertising, 0);\n+\n+\tbool show_lp_advertising = false;\n+\tfor (uint32_t idx = 0; idx < RTE_DIM(link_settings.link_modes.lp_advertising); idx++) {\n+\t\tif (link_settings.link_modes.lp_advertising[idx] != 0) {\n+\t\t\tshow_lp_advertising = true;\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (show_lp_advertising) {\n+\t\tdump_link_caps(\"Link partner advertised\",\n+\t\t\t\t\"Link partner advertised\",\n+\t\t\t\tlink_settings.link_modes.lp_advertising, 0);\n+\t}\n+\n+\tfprintf(stdout, \"       Speed: \");\n+\tif (link_settings.base.link.link_speed == 0\n+\t    || link_settings.base.link.link_speed == (uint16_t)(-1)\n+\t    || link_settings.base.link.link_speed == (uint32_t)(-1))\n+\t\tfprintf(stdout, \"Unknown!\\n\");\n+\telse\n+\t\tfprintf(stdout, \"%uMb/s\\n\", link_settings.base.link.link_speed);\n+\n+\tfprintf(stdout, \"       Duplex: \");\n+\tswitch (link_settings.base.link.link_duplex) {\n+\tcase RTE_ETH_LINK_HALF_DUPLEX:\n+\t\tfprintf(stdout, \"Half\\n\");\n+\t\tbreak;\n+\tcase RTE_ETH_LINK_FULL_DUPLEX:\n+\t\tfprintf(stdout, \"Full\\n\");\n+\t\tbreak;\n+\tdefault:\n+\t\tfprintf(stdout, \"Unknown! (%i)\\n\", link_settings.base.link.link_duplex);\n+\t\tbreak;\n+\t};\n+\n+\tfprintf(stdout, \"       Port: \");\n+\tswitch (link_settings.base.port) {\n+\tcase RTE_PORT_TP:\n+\t\tfprintf(stdout, \"Twisted Pair\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_AUI:\n+\t\tfprintf(stdout, \"AUI\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_BNC:\n+\t\tfprintf(stdout, \"BNC\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_MII:\n+\t\tfprintf(stdout, \"MII\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_FIBRE:\n+\t\tfprintf(stdout, \"FIBRE\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_DA:\n+\t\tfprintf(stdout, \"Direct Attach Copper\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_NONE:\n+\t\tfprintf(stdout, \"None\\n\");\n+\t\tbreak;\n+\tcase RTE_PORT_OTHER:\n+\t\tfprintf(stdout, \"Other\\n\");\n+\t\tbreak;\n+\tdefault:\n+\t\tfprintf(stdout, \"Unknown! (%i)\\n\", link_settings.base.port);\n+\t\tbreak;\n+\t};\n+\n+\tfprintf(stdout, \"       PHYAD: %d\\n\", link_settings.base.phy_address);\n+\n+\tfprintf(stdout, \"       Auto-negotiation: %s\\n\",\n+\t\t(link_settings.base.link.link_autoneg == RTE_AUTONEG_DISABLE) ?\n+\t\t\"off\" : \"on\");\n+\n+\tif (link_settings.base.port == RTE_PORT_TP) {\n+\t\tfprintf(stdout, \"       MDI-X: \");\n+\t\tif (link_settings.base.eth_tp_mdix_ctrl == RTE_TP_MDI) {\n+\t\t\tfprintf(stdout, \"off (forced)\\n\");\n+\t\t} else if (link_settings.base.eth_tp_mdix_ctrl\n+\t\t\t   == RTE_TP_MDI_X) {\n+\t\t\tfprintf(stdout, \"on (forced)\\n\");\n+\t\t} else {\n+\t\t\tswitch (link_settings.base.eth_tp_mdix) {\n+\t\t\tcase RTE_TP_MDI:\n+\t\t\t\tfprintf(stdout, \"off\");\n+\t\t\t\tbreak;\n+\t\t\tcase RTE_TP_MDI_X:\n+\t\t\t\tfprintf(stdout, \"on\");\n+\t\t\t\tbreak;\n+\t\t\tdefault:\n+\t\t\t\tfprintf(stdout, \"Unknown\");\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tif (link_settings.base.eth_tp_mdix_ctrl\n+\t\t\t    == RTE_TP_MDI_AUTO)\n+\t\t\t\tfprintf(stdout, \" (auto)\");\n+\t\t\tfprintf(stdout, \"\\n\");\n+\t\t}\n+\t}\n+}\n+\n+cmdline_parse_inst_t cmd_link_settings_show = {\n+\t.f = cmd_link_settings_show_parsed,\n+\t.data = NULL,\n+\t.help_str = \"show port <port_id> link settings\",\n+\t.tokens = {\n+\t\t(void *)&cmd_ls_show_show,\n+\t\t(void *)&cmd_ls_show_port,\n+\t\t(void *)&cmd_ls_show_portid,\n+\t\t(void *)&cmd_ls_show_link,\n+\t\t(void *)&cmd_ls_show_settings,\n+\t\tNULL,\n+\t},\n+};\n+\n+static int parse_hex_u32_bitmap(const char *s,\n+\t\t\t\tunsigned int nbits, uint32_t *result)\n+{\n+\tconst unsigned int nwords = RTE_DIV_ROUND_UP(nbits, 32);\n+\tsize_t slen = strlen(s);\n+\tsize_t i;\n+\n+\t/* ignore optional '0x' prefix */\n+\tif ((slen > 2) && (strncasecmp(s, \"0x\", 2) == 0)) {\n+\t\tslen -= 2;\n+\t\ts += 2;\n+\t}\n+\n+\tif (slen > 8 * nwords)  /* up to 2 digits per byte */\n+\t\treturn -1;\n+\n+\tmemset(result, 0, 4 * nwords);\n+\tfor (i = 0; i < slen; ++i) {\n+\t\tconst unsigned int shift = (slen - 1 - i) * 4;\n+\t\tuint32_t *dest = &result[shift / 32];\n+\t\tuint32_t nibble;\n+\n+\t\tif ('a' <= s[i] && s[i] <= 'f')\n+\t\t\tnibble = 0xa + (s[i] - 'a');\n+\t\telse if ('A' <= s[i] && s[i] <= 'F')\n+\t\t\tnibble = 0xa + (s[i] - 'A');\n+\t\telse if ('0' <= s[i] && s[i] <= '9')\n+\t\t\tnibble = (s[i] - '0');\n+\t\telse\n+\t\t\treturn -1;\n+\n+\t\t*dest |= (nibble << (shift % 32));\n+\t}\n+\n+\treturn 0;\n+}\n+\n+/* *** SET ETHERNET LINK SETTINGS *** */\n+struct cmd_link_settings_set {\n+\tcmdline_fixed_string_t set;\n+\tcmdline_fixed_string_t port;\n+\tportid_t port_id;\n+\tcmdline_fixed_string_t link;\n+\tcmdline_fixed_string_t settings;\n+\tcmdline_fixed_string_t advertising;\n+\tcmdline_multi_string_t bitmap_str;\n+};\n+\n+cmdline_parse_token_string_t cmd_ls_set_set =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tset, \"set\");\n+cmdline_parse_token_string_t cmd_ls_set_port =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tport, \"port\");\n+cmdline_parse_token_num_t cmd_ls_set_portid =\n+\tTOKEN_NUM_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tport_id, RTE_UINT16);\n+cmdline_parse_token_string_t cmd_ls_set_link =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tlink, \"link\");\n+cmdline_parse_token_string_t cmd_ls_set_settings =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tsettings, \"settings\");\n+cmdline_parse_token_string_t cmd_ls_set_advertising =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tadvertising, \"advertising\");\n+cmdline_parse_token_string_t cmd_ls_set_bitmap_str =\n+\tTOKEN_STRING_INITIALIZER(struct cmd_link_settings_set,\n+\t\t\t\tbitmap_str, TOKEN_STRING_MULTI);\n+\n+static void\n+cmd_link_settings_set_advertising_parsed(void *parsed_result,\n+\t\t\t      __rte_unused struct cmdline *cl,\n+\t\t\t      __rte_unused void *data)\n+{\n+\tstruct cmd_link_settings_set *res = parsed_result;\n+\tstruct rte_link_settings link_settings;\n+\tint ret;\n+\n+\tif (parse_hex_u32_bitmap(res->bitmap_str,\n+\t\t\t\t__RTE_LINK_MODE_MASK_NBITS,\n+\t\t\t\tlink_settings.link_modes.advertising)) {\n+\t\tfprintf(stderr, \"cannot parse bitmap_str\\n\");\n+\t\treturn;\n+\n+\t}\n+\n+\tlink_settings.base.link.link_autoneg = RTE_AUTONEG_ENABLE;\n+\n+\tret = rte_eth_dev_set_link_settings(res->port_id, &link_settings);\n+\tif (ret != 0) {\n+\t\tfprintf(stderr,\n+\t\t\t\"Failed to set link settings: err = %d\\n\",\n+\t\t\tret);\n+\t}\n+}\n+\n+cmdline_parse_inst_t cmd_link_settings_set_advertising = {\n+\t.f = cmd_link_settings_set_advertising_parsed,\n+\t.data = NULL,\n+\t.help_str = \"set port <port_id> link settings advertising <bitmap_str>\"\n+\t\t\" Bitmap_str - bitmap respresentation of advertising speeds\",\n+\t.tokens = {\n+\t\t(void *)&cmd_ls_set_set,\n+\t\t(void *)&cmd_ls_set_port,\n+\t\t(void *)&cmd_ls_set_portid,\n+\t\t(void *)&cmd_ls_set_link,\n+\t\t(void *)&cmd_ls_set_settings,\n+\t\t(void *)&cmd_ls_set_advertising,\n+\t\t(void *)&cmd_ls_set_bitmap_str,\n+\t\tNULL,\n+\t},\n+};\ndiff --git a/app/test-pmd/cmdline_settings.h b/app/test-pmd/cmdline_settings.h\nnew file mode 100644\nindex 0000000000..1bcd75f7ef\n--- /dev/null\n+++ b/app/test-pmd/cmdline_settings.h\n@@ -0,0 +1,14 @@\n+/* SPDX-License-Identifier: BSD-3-Clause\n+ * Copyright (c) 2024 Arista Networks, Inc.  All rights reserved.\n+ * Arista Networks, Inc. Confidential and Proprietary\n+ */\n+\n+#ifndef _CMDLINE_SETTINGS_H\n+#define _CMDLINE_SETTINGS_H\n+\n+/* Link settings CLI */\n+extern cmdline_parse_inst_t cmd_link_settings_show;\n+extern cmdline_parse_inst_t cmd_link_settings_set_advertising;\n+\n+#endif /* _CMDLINE_SETTINGS_H */\n+\ndiff --git a/app/test-pmd/meson.build b/app/test-pmd/meson.build\nindex 719f875be0..7aadc2ec42 100644\n--- a/app/test-pmd/meson.build\n+++ b/app/test-pmd/meson.build\n@@ -11,6 +11,7 @@ sources = files(\n         'cmdline_flow.c',\n         'cmdline_mtr.c',\n         'cmdline_tm.c',\n+        'cmdline_settings.c',\n         'cmd_flex_item.c',\n         'config.c',\n         'csumonly.c',\ndiff --git a/app/test-pmd/testpmd.h b/app/test-pmd/testpmd.h\nindex 0afae7d771..1873b45d23 100644\n--- a/app/test-pmd/testpmd.h\n+++ b/app/test-pmd/testpmd.h\n@@ -1187,6 +1187,7 @@ void eth_set_allmulticast_mode(uint16_t port, int enable);\n int eth_link_get_nowait_print_err(uint16_t port_id, struct rte_eth_link *link);\n int eth_macaddr_get_print_err(uint16_t port_id,\n \t\t\tstruct rte_ether_addr *mac_addr);\n+int get_bit(const uint32_t *ptr, uint32_t pos);\n \n /* Functions to display the set of MAC addresses added to a port*/\n void show_macs(portid_t port_id);\ndiff --git a/app/test-pmd/util.c b/app/test-pmd/util.c\nindex bf9b639d95..4d26776cc7 100644\n--- a/app/test-pmd/util.c\n+++ b/app/test-pmd/util.c\n@@ -17,6 +17,8 @@\n \n #define MAX_STRING_LEN 8192\n \n+#define UINT_32_BIT_WIDTH (CHAR_BIT * sizeof(uint32_t))\n+\n #define MKDUMPSTR(buf, buf_size, cur_len, ...) \\\n do { \\\n \tif (cur_len >= buf_size) \\\n@@ -525,3 +527,11 @@ eth_macaddr_get_print_err(uint16_t port_id, struct rte_ether_addr *mac_addr)\n \n \treturn ret;\n }\n+\n+int\n+get_bit(const uint32_t *ptr, uint32_t pos)\n+{\n+\tuint32_t byte_idx = pos / UINT_32_BIT_WIDTH;\n+\tuint32_t bit_idx = pos % UINT_32_BIT_WIDTH;\n+\treturn (ptr[byte_idx] >> bit_idx) & 0x1;\n+}\n",
    "prefixes": []
}