[PATCH v8 1/1] ethdev: add support to provide link type
skori at marvell.com
skori at marvell.com
Thu Aug 21 07:32:33 CEST 2025
From: Sunil Kumar Kori <skori at marvell.com>
Adding link type parameter to provide the type
of port like twisted pair, fibre etc.
Also added an API to convert the RTE_ETH_LINK_CONNECTOR_XXX
to a readable string.
Signed-off-by: Nithin Dabilpuram <ndabilpuram at marvell.com>
Signed-off-by: Sunil Kumar Kori <skori at marvell.com>
---
v7..v8:
- Add documentation for invalid link type.
- Remove trace point from API.
- Rebase on next-net.
v6..v7:
- Replace link_type to link_connector.
- Update comments.
v5..v6:
- Fix doxygen error.
v4..v5:
- Convert link type to connector.
- Fix build error on Windows.
- Handle comsmetic review comments.
v3..v4:
- Convert #define into enum.
- Enhance comments for each port link type.
- Fix test failures.
v2..v3
- Extend link type list as per suggestion.
app/test/test_ethdev_link.c | 18 ++++++++-----
lib/ethdev/rte_ethdev.c | 45 +++++++++++++++++++++++++++++--
lib/ethdev/rte_ethdev.h | 54 +++++++++++++++++++++++++++++++++++++
3 files changed, 108 insertions(+), 9 deletions(-)
diff --git a/app/test/test_ethdev_link.c b/app/test/test_ethdev_link.c
index 47c526eb0c..359b879fae 100644
--- a/app/test/test_ethdev_link.c
+++ b/app/test/test_ethdev_link.c
@@ -17,23 +17,25 @@ test_link_status_up_default(void)
.link_speed = RTE_ETH_SPEED_NUM_2_5G,
.link_status = RTE_ETH_LINK_UP,
.link_autoneg = RTE_ETH_LINK_AUTONEG,
- .link_duplex = RTE_ETH_LINK_FULL_DUPLEX
+ .link_duplex = RTE_ETH_LINK_FULL_DUPLEX,
+ .link_connector = RTE_ETH_LINK_CONNECTOR_OTHER
};
char text[RTE_ETH_LINK_MAX_STR_LEN];
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
printf("Default link up #1: %s\n", text);
- TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 2.5 Gbps FDX Autoneg",
+ TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 2.5 Gbps FDX Autoneg Other",
text, strlen(text), "Invalid default link status string");
link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
link_status.link_autoneg = RTE_ETH_LINK_FIXED;
link_status.link_speed = RTE_ETH_SPEED_NUM_10M;
+ link_status.link_connector = RTE_ETH_LINK_CONNECTOR_SGMII;
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
printf("Default link up #2: %s\n", text);
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
- TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 10 Mbps HDX Fixed",
+ TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at 10 Mbps HDX Fixed SGMII",
text, strlen(text), "Invalid default link status "
"string with HDX");
@@ -41,7 +43,7 @@ test_link_status_up_default(void)
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
printf("Default link up #3: %s\n", text);
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
- TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Unknown HDX Fixed",
+ TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Unknown HDX Fixed SGMII",
text, strlen(text), "Invalid default link status "
"string with HDX");
@@ -49,7 +51,7 @@ test_link_status_up_default(void)
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
printf("Default link up #3: %s\n", text);
RTE_TEST_ASSERT(ret > 0, "Failed to format default string\n");
- TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at None HDX Fixed",
+ TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at None HDX Fixed SGMII",
text, strlen(text), "Invalid default link status "
"string with HDX");
@@ -57,6 +59,7 @@ test_link_status_up_default(void)
link_status.link_speed = RTE_ETH_SPEED_NUM_800G;
link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX;
link_status.link_autoneg = RTE_ETH_LINK_AUTONEG;
+ link_status.link_connector = RTE_ETH_LINK_CONNECTOR_GAUI;
ret = rte_eth_link_to_str(text, sizeof(text), &link_status);
printf("Default link up #4:len = %d, %s\n", ret, text);
RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
@@ -92,7 +95,8 @@ test_link_status_invalid(void)
.link_speed = 55555,
.link_status = RTE_ETH_LINK_UP,
.link_autoneg = RTE_ETH_LINK_AUTONEG,
- .link_duplex = RTE_ETH_LINK_FULL_DUPLEX
+ .link_duplex = RTE_ETH_LINK_FULL_DUPLEX,
+ .link_connector = RTE_ETH_LINK_CONNECTOR_OTHER
};
char text[RTE_ETH_LINK_MAX_STR_LEN];
@@ -100,7 +104,7 @@ test_link_status_invalid(void)
RTE_TEST_ASSERT(ret < RTE_ETH_LINK_MAX_STR_LEN,
"Failed to format invalid string\n");
printf("invalid link up #1: len=%d %s\n", ret, text);
- TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Invalid FDX Autoneg",
+ TEST_ASSERT_BUFFERS_ARE_EQUAL("Link up at Invalid FDX Autoneg Other",
text, strlen(text), "Incorrect invalid link status string");
return TEST_SUCCESS;
diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
index f22139cb38..60f4ca34e0 100644
--- a/lib/ethdev/rte_ethdev.c
+++ b/lib/ethdev/rte_ethdev.c
@@ -3330,18 +3330,59 @@ rte_eth_link_to_str(char *str, size_t len, const struct rte_eth_link *eth_link)
if (eth_link->link_status == RTE_ETH_LINK_DOWN)
ret = snprintf(str, len, "Link down");
else
- ret = snprintf(str, len, "Link up at %s %s %s",
+ ret = snprintf(str, len, "Link up at %s %s %s %s",
rte_eth_link_speed_to_str(eth_link->link_speed),
(eth_link->link_duplex == RTE_ETH_LINK_FULL_DUPLEX) ?
"FDX" : "HDX",
(eth_link->link_autoneg == RTE_ETH_LINK_AUTONEG) ?
- "Autoneg" : "Fixed");
+ "Autoneg" : "Fixed",
+ rte_eth_link_connector_to_str(eth_link->link_connector));
rte_eth_trace_link_to_str(len, eth_link, str, ret);
return ret;
}
+RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_connector_to_str, 25.11)
+const char *
+rte_eth_link_connector_to_str(enum rte_eth_link_connector link_connector)
+{
+ static const char * const link_connector_str[] = {
+ [RTE_ETH_LINK_CONNECTOR_NONE] = "None",
+ [RTE_ETH_LINK_CONNECTOR_TP] = "Twisted Pair",
+ [RTE_ETH_LINK_CONNECTOR_AUI] = "Attachment Unit Interface",
+ [RTE_ETH_LINK_CONNECTOR_MII] = "Media Independent Interface",
+ [RTE_ETH_LINK_CONNECTOR_FIBER] = "Fiber",
+ [RTE_ETH_LINK_CONNECTOR_BNC] = "BNC",
+ [RTE_ETH_LINK_CONNECTOR_DAC] = "Direct Attach Copper",
+ [RTE_ETH_LINK_CONNECTOR_SGMII] = "SGMII",
+ [RTE_ETH_LINK_CONNECTOR_QSGMII] = "QSGMII",
+ [RTE_ETH_LINK_CONNECTOR_XFI] = "XFI",
+ [RTE_ETH_LINK_CONNECTOR_SFI] = "SFI",
+ [RTE_ETH_LINK_CONNECTOR_XLAUI] = "XLAUI",
+ [RTE_ETH_LINK_CONNECTOR_GAUI] = "GAUI",
+ [RTE_ETH_LINK_CONNECTOR_XAUI] = "XAUI",
+ [RTE_ETH_LINK_CONNECTOR_CAUI] = "CAUI",
+ [RTE_ETH_LINK_CONNECTOR_LAUI] = "LAUI",
+ [RTE_ETH_LINK_CONNECTOR_SFP] = "SFP",
+ [RTE_ETH_LINK_CONNECTOR_SFP_DD] = "SFP-DD",
+ [RTE_ETH_LINK_CONNECTOR_SFP_PLUS] = "SFP+",
+ [RTE_ETH_LINK_CONNECTOR_SFP28] = "SFP28",
+ [RTE_ETH_LINK_CONNECTOR_QSFP] = "QSFP",
+ [RTE_ETH_LINK_CONNECTOR_QSFP_PLUS] = "QSFP+",
+ [RTE_ETH_LINK_CONNECTOR_QSFP28] = "QSFP28",
+ [RTE_ETH_LINK_CONNECTOR_QSFP56] = "QSFP56",
+ [RTE_ETH_LINK_CONNECTOR_QSFP_DD] = "QSFP-DD",
+ [RTE_ETH_LINK_CONNECTOR_OTHER] = "Other",
+ };
+ const char *str = NULL;
+
+ if (link_connector < ((enum rte_eth_link_connector)RTE_DIM(link_connector_str)))
+ str = link_connector_str[link_connector];
+
+ return str;
+}
+
RTE_EXPORT_SYMBOL(rte_eth_stats_get)
int
rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
index d23c143eed..6f5390ab43 100644
--- a/lib/ethdev/rte_ethdev.h
+++ b/lib/ethdev/rte_ethdev.h
@@ -331,6 +331,45 @@ struct rte_eth_stats {
#define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */
/**@}*/
+/**
+ * @enum rte_eth_link_connector
+ * @brief Ethernet port link connector type
+ *
+ * This enum defines the possible types of Ethernet port link connectors.
+ */
+enum rte_eth_link_connector {
+ RTE_ETH_LINK_CONNECTOR_NONE = 0, /**< Not defined */
+ RTE_ETH_LINK_CONNECTOR_TP, /**< Twisted Pair */
+ RTE_ETH_LINK_CONNECTOR_AUI, /**< Attachment Unit Interface */
+ RTE_ETH_LINK_CONNECTOR_MII, /**< Media Independent Interface */
+ RTE_ETH_LINK_CONNECTOR_FIBER, /**< Optical Fiber Link */
+ RTE_ETH_LINK_CONNECTOR_BNC, /**< BNC Link type for RF connection */
+ RTE_ETH_LINK_CONNECTOR_DAC, /**< Direct Attach copper */
+ RTE_ETH_LINK_CONNECTOR_SGMII, /**< Serial Gigabit Media Independent Interface */
+ RTE_ETH_LINK_CONNECTOR_QSGMII, /**< Link to multiplex 4 SGMII over one serial link */
+ RTE_ETH_LINK_CONNECTOR_XFI, /**< 10 Gigabit Attachment Unit Interface */
+ RTE_ETH_LINK_CONNECTOR_SFI, /**< 10 Gigabit Serial Interface for optical network */
+ RTE_ETH_LINK_CONNECTOR_XLAUI, /**< 40 Gigabit Attachment Unit Interface */
+ RTE_ETH_LINK_CONNECTOR_GAUI, /**< Gigabit Interface for 50/100/200 Gbps */
+ RTE_ETH_LINK_CONNECTOR_XAUI, /**< 10 Gigabit Attachment Unit Interface */
+ RTE_ETH_LINK_CONNECTOR_CAUI, /**< 100 Gigabit Attachment Unit Interface */
+ RTE_ETH_LINK_CONNECTOR_LAUI, /**< 50 Gigabit Attachment Unit Interface */
+ RTE_ETH_LINK_CONNECTOR_SFP, /**< Pluggable module for 1 Gigabit */
+ RTE_ETH_LINK_CONNECTOR_SFP_PLUS, /**< Pluggable module for 10 Gigabit */
+ RTE_ETH_LINK_CONNECTOR_SFP28, /**< Pluggable module for 25 Gigabit */
+ RTE_ETH_LINK_CONNECTOR_SFP_DD, /**< Pluggable module for 100 Gigabit */
+ RTE_ETH_LINK_CONNECTOR_QSFP, /**< Module to mutiplex 4 SFP i.e. 4*1=4 Gbps */
+ RTE_ETH_LINK_CONNECTOR_QSFP_PLUS, /**< Module to mutiplex 4 SFP_PLUS i.e. 4*10=40 Gbps */
+ RTE_ETH_LINK_CONNECTOR_QSFP28, /**< Module to mutiplex 4 SFP28 i.e. 4*25=100 Gbps */
+ RTE_ETH_LINK_CONNECTOR_QSFP56, /**< Module to mutiplex 4 SFP56 i.e. 4*50=200 Gbps */
+ RTE_ETH_LINK_CONNECTOR_QSFP_DD, /**< Module to mutiplex 4 SFP_DD i.e. 4*100=400 Gbps */
+ RTE_ETH_LINK_CONNECTOR_OTHER = 31, /**< non-physical interfaces like virtio, ring etc.
+ * It also includes unknown connector types,
+ * i.e. physical connectors not yet defined in this
+ * list of connector types.
+ */
+};
+
/**
* A structure used to retrieve link-level information of an Ethernet port.
*/
@@ -343,6 +382,7 @@ struct rte_eth_link {
uint16_t link_duplex : 1; /**< RTE_ETH_LINK_[HALF/FULL]_DUPLEX */
uint16_t link_autoneg : 1; /**< RTE_ETH_LINK_[AUTONEG/FIXED] */
uint16_t link_status : 1; /**< RTE_ETH_LINK_[DOWN/UP] */
+ uint16_t link_connector : 5; /**< RTE_ETH_LINK_CONNECTOR_XXX */
};
};
};
@@ -3118,6 +3158,20 @@ int rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *link)
__rte_experimental
const char *rte_eth_link_speed_to_str(uint32_t link_speed);
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * This function converts an Ethernet link type to a string.
+ *
+ * @param link_connector
+ * The link type to convert.
+ * @return
+ * NULL for invalid link connector values otherwise the string representation of the link type.
+ */
+__rte_experimental
+const char *rte_eth_link_connector_to_str(enum rte_eth_link_connector link_connector);
+
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice.
--
2.43.0
More information about the dev
mailing list