* [PATCH] ethdev: add support to provide link type @ 2025-06-05 11:31 skori 2025-06-05 15:26 ` Stephen Hemminger 2025-06-06 9:28 ` [PATCH v2 1/1] " skori 0 siblings, 2 replies; 17+ messages in thread From: skori @ 2025-06-05 11:31 UTC (permalink / raw) To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko Cc: dev, Sunil Kumar Kori, Nithin Dabilpuram From: Sunil Kumar Kori <skori@marvell.com> As a port can be configured at one of the supported speed which can be part of specific link mode. Port type helps to translate speed into the respective mode. Hence add support to provide link type as part of link status if available from ethdev driver. Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> Signed-off-by: Sunil Kumar Kori <skori@marvell.com> --- lib/ethdev/ethdev_trace.h | 7 +++++ lib/ethdev/ethdev_trace_points.c | 3 +++ lib/ethdev/rte_ethdev.c | 45 ++++++++++++++++++++++++++++++-- lib/ethdev/rte_ethdev.h | 28 ++++++++++++++++++++ 4 files changed, 81 insertions(+), 2 deletions(-) diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h index c65b78590a..a060e2de03 100644 --- a/lib/ethdev/ethdev_trace.h +++ b/lib/ethdev/ethdev_trace.h @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( rte_trace_point_emit_string(ret); ) +RTE_TRACE_POINT_FP( + rte_eth_trace_link_type_to_str, + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), + rte_trace_point_emit_u8(link_type); + rte_trace_point_emit_string(ret); +); + /* Called in loop in examples/bond and examples/ethtool */ RTE_TRACE_POINT_FP( rte_eth_trace_macaddr_get, diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c index 071c508327..706acdf356 100644 --- a/lib/ethdev/ethdev_trace_points.c +++ b/lib/ethdev/ethdev_trace_points.c @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, lib.ethdev.link_to_str) +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, + lib.ethdev.link_type_to_str) + RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, lib.ethdev.stats_get) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index d4197322a0..73a38ea2ca 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3286,18 +3286,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_type_to_str(eth_link->link_type)); rte_eth_trace_link_to_str(len, eth_link, str, ret); return ret; } +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.07) +const char * +rte_eth_link_type_to_str(uint8_t link_type) +{ + const char *ret; + + switch (link_type) { + case RTE_ETH_LINK_TYPE_NONE: + ret = "None"; + break; + case RTE_ETH_LINK_TYPE_TP: + ret = "Twisted Pair"; + break; + case RTE_ETH_LINK_TYPE_AUI: + ret = "AUI"; + break; + case RTE_ETH_LINK_TYPE_MII: + ret = "MII"; + break; + case RTE_ETH_LINK_TYPE_FIBRE: + ret = "Fibre"; + break; + case RTE_ETH_LINK_TYPE_BNC: + ret = "BNC"; + break; + case RTE_ETH_LINK_TYPE_DA: + ret = "Direct Attach Copper"; + break; + case RTE_ETH_LINK_TYPE_OTHER: + ret = "Other"; + break; + default: + ret = "Invalid"; + } + + rte_eth_trace_link_type_to_str(link_type, ret); + + return ret; +} + 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 ea7f8c4a1a..19417242ca 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -329,6 +329,19 @@ struct rte_eth_stats { #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ /**@}*/ +/**@{@name PORT type + * Ethernet port type + */ +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface */ +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ +/**@}*/ + /** * A structure used to retrieve link-level information of an Ethernet port. */ @@ -341,6 +354,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ }; }; }; @@ -3113,6 +3127,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_type + * The link type to convert. + * @return + * The string representation of the link type. + */ +__rte_experimental +const char *rte_eth_link_type_to_str(uint8_t link_type); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. -- 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH] ethdev: add support to provide link type 2025-06-05 11:31 [PATCH] ethdev: add support to provide link type skori @ 2025-06-05 15:26 ` Stephen Hemminger 2025-06-06 9:28 ` [PATCH v2 1/1] " skori 1 sibling, 0 replies; 17+ messages in thread From: Stephen Hemminger @ 2025-06-05 15:26 UTC (permalink / raw) To: skori Cc: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko, dev, Nithin Dabilpuram On Thu, 5 Jun 2025 17:01:51 +0530 <skori@marvell.com> wrote: > From: Sunil Kumar Kori <skori@marvell.com> > > As a port can be configured at one of the supported speed > which can be part of specific link mode. > > Port type helps to translate speed into the respective mode. > > Hence add support to provide link type as part of link > status if available from ethdev driver. > This is hard to read English syntax. Maybe try one of the AI grammar tools to make it more readable. > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v2 1/1] ethdev: add support to provide link type 2025-06-05 11:31 [PATCH] ethdev: add support to provide link type skori 2025-06-05 15:26 ` Stephen Hemminger @ 2025-06-06 9:28 ` skori 2025-06-06 9:54 ` Morten Brørup ` (2 more replies) 1 sibling, 3 replies; 17+ messages in thread From: skori @ 2025-06-06 9:28 UTC (permalink / raw) To: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko Cc: dev, Sunil Kumar Kori, Nithin Dabilpuram From: Sunil Kumar Kori <skori@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_TYPE_XXX to a readable string. Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> Signed-off-by: Sunil Kumar Kori <skori@marvell.com> --- v1..v2: - Updated the commit message. - change release version to 25.11 lib/ethdev/ethdev_trace.h | 7 +++++ lib/ethdev/ethdev_trace_points.c | 3 +++ lib/ethdev/rte_ethdev.c | 45 ++++++++++++++++++++++++++++++-- lib/ethdev/rte_ethdev.h | 28 ++++++++++++++++++++ 4 files changed, 81 insertions(+), 2 deletions(-) diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h index c65b78590a..a060e2de03 100644 --- a/lib/ethdev/ethdev_trace.h +++ b/lib/ethdev/ethdev_trace.h @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( rte_trace_point_emit_string(ret); ) +RTE_TRACE_POINT_FP( + rte_eth_trace_link_type_to_str, + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), + rte_trace_point_emit_u8(link_type); + rte_trace_point_emit_string(ret); +); + /* Called in loop in examples/bond and examples/ethtool */ RTE_TRACE_POINT_FP( rte_eth_trace_macaddr_get, diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c index 071c508327..706acdf356 100644 --- a/lib/ethdev/ethdev_trace_points.c +++ b/lib/ethdev/ethdev_trace_points.c @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, lib.ethdev.link_to_str) +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, + lib.ethdev.link_type_to_str) + RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, lib.ethdev.stats_get) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index d4197322a0..4464ec00e6 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3286,18 +3286,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_type_to_str(eth_link->link_type)); rte_eth_trace_link_to_str(len, eth_link, str, ret); return ret; } +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.11) +const char * +rte_eth_link_type_to_str(uint8_t link_type) +{ + const char *ret; + + switch (link_type) { + case RTE_ETH_LINK_TYPE_NONE: + ret = "None"; + break; + case RTE_ETH_LINK_TYPE_TP: + ret = "Twisted Pair"; + break; + case RTE_ETH_LINK_TYPE_AUI: + ret = "AUI"; + break; + case RTE_ETH_LINK_TYPE_MII: + ret = "MII"; + break; + case RTE_ETH_LINK_TYPE_FIBRE: + ret = "Fibre"; + break; + case RTE_ETH_LINK_TYPE_BNC: + ret = "BNC"; + break; + case RTE_ETH_LINK_TYPE_DA: + ret = "Direct Attach Copper"; + break; + case RTE_ETH_LINK_TYPE_OTHER: + ret = "Other"; + break; + default: + ret = "Invalid"; + } + + rte_eth_trace_link_type_to_str(link_type, ret); + + return ret; +} + 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 ea7f8c4a1a..19417242ca 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -329,6 +329,19 @@ struct rte_eth_stats { #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ /**@}*/ +/**@{@name PORT type + * Ethernet port type + */ +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface */ +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ +/**@}*/ + /** * A structure used to retrieve link-level information of an Ethernet port. */ @@ -341,6 +354,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ }; }; }; @@ -3113,6 +3127,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_type + * The link type to convert. + * @return + * The string representation of the link type. + */ +__rte_experimental +const char *rte_eth_link_type_to_str(uint8_t link_type); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. -- 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v2 1/1] ethdev: add support to provide link type 2025-06-06 9:28 ` [PATCH v2 1/1] " skori @ 2025-06-06 9:54 ` Morten Brørup 2025-06-06 15:23 ` Stephen Hemminger 2025-08-13 8:42 ` [PATCH] " skori 2025-08-13 8:43 ` [PATCH v3 1/1] " skori 2 siblings, 1 reply; 17+ messages in thread From: Morten Brørup @ 2025-06-06 9:54 UTC (permalink / raw) To: skori, Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko Cc: dev, Nithin Dabilpuram, jerinj > From: skori@marvell.com [mailto:skori@marvell.com] > Sent: Friday, 6 June 2025 11.28 > > From: Sunil Kumar Kori <skori@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_TYPE_XXX > to a readable string. > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > --- > +/**@{@name PORT type > + * Ethernet port type > + */ > +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ > +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ > +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ > +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface > */ > +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ > +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ > +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ > +/**@}*/ I don't see the use case for this patch, when only ancient interface types are defined. How about RMII, GMII, RGMII, XGMII, XAUI, XAUI4, CAUI4, SFP, SFP+, SFP28, etc. Please don't blindly port stuff from Linux to DPDK. ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v2 1/1] ethdev: add support to provide link type 2025-06-06 9:54 ` Morten Brørup @ 2025-06-06 15:23 ` Stephen Hemminger 2025-06-10 5:02 ` [EXTERNAL] " Sunil Kumar Kori 0 siblings, 1 reply; 17+ messages in thread From: Stephen Hemminger @ 2025-06-06 15:23 UTC (permalink / raw) To: Morten Brørup Cc: skori, Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko, dev, Nithin Dabilpuram, jerinj On Fri, 6 Jun 2025 11:54:52 +0200 Morten Brørup <mb@smartsharesystems.com> wrote: > > From: skori@marvell.com [mailto:skori@marvell.com] > > Sent: Friday, 6 June 2025 11.28 > > > > From: Sunil Kumar Kori <skori@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_TYPE_XXX > > to a readable string. > > > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > > --- > > +/**@{@name PORT type > > + * Ethernet port type > > + */ > > +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ > > +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ > > +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ > > +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface > > */ > > +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ > > +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ > > +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ > > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ > > +/**@}*/ > > I don't see the use case for this patch, when only ancient interface types are defined. > How about RMII, GMII, RGMII, XGMII, XAUI, XAUI4, CAUI4, SFP, SFP+, SFP28, etc. > > Please don't blindly port stuff from Linux to DPDK. > > Agree with Morten here. Plus, it isn't really much use to user unless all drivers report it. Also, it breaks ABI (see build failures). ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [EXTERNAL] Re: [PATCH v2 1/1] ethdev: add support to provide link type 2025-06-06 15:23 ` Stephen Hemminger @ 2025-06-10 5:02 ` Sunil Kumar Kori 2025-06-10 6:45 ` Morten Brørup 0 siblings, 1 reply; 17+ messages in thread From: Sunil Kumar Kori @ 2025-06-10 5:02 UTC (permalink / raw) To: Stephen Hemminger, Morten Brørup Cc: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko, dev, Nithin Kumar Dabilpuram, Jerin Jacob > On Fri, 6 Jun 2025 11:54:52 +0200 > Morten Brørup <mb@smartsharesystems.com> wrote: > > > > From: skori@marvell.com [mailto:skori@marvell.com] > > > Sent: Friday, 6 June 2025 11.28 > > > > > > From: Sunil Kumar Kori <skori@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_TYPE_XXX to a readable > > > string. > > > > > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > > > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > > > --- > > > +/**@{@name PORT type > > > + * Ethernet port type > > > + */ > > > +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ > > > +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ > > > +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ > > > +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface > > > */ > > > +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ > > > +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ > > > +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ > > > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ /**@}*/ > > > > I don't see the use case for this patch, when only ancient interface types are > defined. > > How about RMII, GMII, RGMII, XGMII, XAUI, XAUI4, CAUI4, SFP, SFP+, SFP28, etc. > > > > Please don't blindly port stuff from Linux to DPDK. > > > > > > Agree with Morten here. > Plus, it isn't really much use to user unless all drivers report it. > Also, it breaks ABI (see build failures). Agreed. I will try to make this implementation more useful and will share next version after handling the suggestions. Thanks. ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [EXTERNAL] Re: [PATCH v2 1/1] ethdev: add support to provide link type 2025-06-10 5:02 ` [EXTERNAL] " Sunil Kumar Kori @ 2025-06-10 6:45 ` Morten Brørup 2025-08-13 7:42 ` Sunil Kumar Kori 0 siblings, 1 reply; 17+ messages in thread From: Morten Brørup @ 2025-06-10 6:45 UTC (permalink / raw) To: Sunil Kumar Kori, Stephen Hemminger Cc: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko, dev, Nithin Kumar Dabilpuram, Jerin Jacob > From: Sunil Kumar Kori [mailto:skori@marvell.com] > Sent: Tuesday, 10 June 2025 07.02 > > > On Fri, 6 Jun 2025 11:54:52 +0200 > > Morten Brørup <mb@smartsharesystems.com> wrote: > > > > > > From: skori@marvell.com [mailto:skori@marvell.com] > > > > Sent: Friday, 6 June 2025 11.28 > > > > > > > > From: Sunil Kumar Kori <skori@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_TYPE_XXX to a readable > > > > string. > > > > > > > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > > > > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > > > > --- > > > > +/**@{@name PORT type > > > > + * Ethernet port type > > > > + */ > > > > +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ > > > > +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ > > > > +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ > > > > +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface > > > > */ > > > > +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ > > > > +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ > > > > +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ > > > > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ /**@}*/ > > > > > > I don't see the use case for this patch, when only ancient interface types > are > > defined. > > > How about RMII, GMII, RGMII, XGMII, XAUI, XAUI4, CAUI4, SFP, SFP+, SFP28, > etc. > > > > > > Please don't blindly port stuff from Linux to DPDK. > > > > > > > > > > Agree with Morten here. > > Plus, it isn't really much use to user unless all drivers report it. > > Also, it breaks ABI (see build failures). > > Agreed. I will try to make this implementation more useful and will share next > version after handling the suggestions. > Thanks. If you choose to proceed with this, please note that APIs for managing PHYs and pluggable modules (SFP, etc.) would be more useful than simply indicating if dual-personality port is connected by Twisted Pair or SFP (which is the only case I can imagine for this API). A PHY API could also be used for EEE ("Green Ethernet") and POE management, cable test and similar features. Marvell makes PHYs, so please ask to your PHY people about relevant features for a PHY API. This should be driven by use cases, not by what is available in Linux APIs. ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [EXTERNAL] Re: [PATCH v2 1/1] ethdev: add support to provide link type 2025-06-10 6:45 ` Morten Brørup @ 2025-08-13 7:42 ` Sunil Kumar Kori 0 siblings, 0 replies; 17+ messages in thread From: Sunil Kumar Kori @ 2025-08-13 7:42 UTC (permalink / raw) To: Morten Brørup, Stephen Hemminger Cc: Thomas Monjalon, Ferruh Yigit, Andrew Rybchenko, dev, Nithin Kumar Dabilpuram, Jerin Jacob Hi Morten and Stephen, To address your comments, I revisited to change and concluded following points: 1. Extending Link Types Alongside Legacy: I'm aligned on extending link types while retaining legacy support — No concerns here. I will add following link type to the list. - NONE - TP - AUI - MII - FIBRE - BNC - DA - SGMII - QSGMII - XFI - SFI - XLAUI - GAUI - SFI - XAUI - XLAUI - GAUI - GBASE - CAUI - LAUI - SFP - SFP_DD - SFP_PLUS - SFP28 - QSFP - QSFP_PLUS - QSFP28 - QSFP56 - QSFP_DD - OTHER 2. ABI Breakage Concern: "I'm not entirely clear on how this change results in an ABI breakage, as the new bit field is added within the existing space. Could you please elaborate on the specific aspects that lead to ABI incompatibility ?" Worst case, since this is 25.11, API breakage is fine. 3. Reporting Link Type by Drivers: General APIs often expose capabilities, and drivers selectively implement them. Setting the link type to 0 when unsupported is a reasonable fallback. Ensuring 0 is treated as “unknown” or “not supported” rather than misleading. 4. Regarding management interfaces for PHYs or modules: This patch does not introduce any management APIs for PHYs or modules. Its sole purpose is to expose the link type as an additional attribute to the user. Any support for PHY or module management should be handled separately and is outside the scope of this change. Thanks Sunil Kumar Kori > > From: Sunil Kumar Kori [mailto:skori@marvell.com] > > Sent: Tuesday, 10 June 2025 07.02 > > > > > On Fri, 6 Jun 2025 11:54:52 +0200 > > > Morten Brørup <mb@smartsharesystems.com> wrote: > > > > > > > > From: skori@marvell.com [mailto:skori@marvell.com] > > > > > Sent: Friday, 6 June 2025 11.28 > > > > > > > > > > From: Sunil Kumar Kori <skori@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_TYPE_XXX to a > > > > > readable string. > > > > > > > > > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > > > > > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > > > > > --- > > > > > +/**@{@name PORT type > > > > > + * Ethernet port type > > > > > + */ > > > > > +#define RTE_ETH_LINK_TYPE_NONE 0x00 /**< Not defined */ > > > > > +#define RTE_ETH_LINK_TYPE_TP 0x01 /**< Twisted Pair */ > > > > > +#define RTE_ETH_LINK_TYPE_AUI 0x02 /**< Attachment Unit Interface */ > > > > > +#define RTE_ETH_LINK_TYPE_MII 0x03 /**< Media Independent Interface > > > > > */ > > > > > +#define RTE_ETH_LINK_TYPE_FIBRE 0x04 /**< Fibre */ > > > > > +#define RTE_ETH_LINK_TYPE_BNC 0x05 /**< BNC */ > > > > > +#define RTE_ETH_LINK_TYPE_DA 0x06 /**< Direct Attach copper */ > > > > > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ /**@}*/ > > > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH] ethdev: add support to provide link type 2025-06-06 9:28 ` [PATCH v2 1/1] " skori 2025-06-06 9:54 ` Morten Brørup @ 2025-08-13 8:42 ` skori 2025-08-13 8:43 ` [PATCH v3 1/1] " skori 2 siblings, 0 replies; 17+ messages in thread From: skori @ 2025-08-13 8:42 UTC (permalink / raw) To: Thomas Monjalon, Andrew Rybchenko Cc: dev, Sunil Kumar Kori, Nithin Dabilpuram From: Sunil Kumar Kori <skori@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_TYPE_XXX to a readable string. Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> Signed-off-by: Sunil Kumar Kori <skori@marvell.com> --- lib/ethdev/ethdev_trace.h | 7 +++++ lib/ethdev/ethdev_trace_points.c | 3 ++ lib/ethdev/rte_ethdev.c | 47 ++++++++++++++++++++++++++++++-- lib/ethdev/rte_ethdev.h | 47 ++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h index 482befc209..c5cba0edba 100644 --- a/lib/ethdev/ethdev_trace.h +++ b/lib/ethdev/ethdev_trace.h @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( rte_trace_point_emit_string(ret); ) +RTE_TRACE_POINT_FP( + rte_eth_trace_link_type_to_str, + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), + rte_trace_point_emit_u8(link_type); + rte_trace_point_emit_string(ret); +); + /* Called in loop in examples/bond and examples/ethtool */ RTE_TRACE_POINT_FP( rte_eth_trace_macaddr_get, diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c index 071c508327..706acdf356 100644 --- a/lib/ethdev/ethdev_trace_points.c +++ b/lib/ethdev/ethdev_trace_points.c @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, lib.ethdev.link_to_str) +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, + lib.ethdev.link_type_to_str) + RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, lib.ethdev.stats_get) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index dd7c00bc94..0cf4a805b7 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3285,18 +3285,61 @@ 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_type_to_str(eth_link->link_type)); rte_eth_trace_link_to_str(len, eth_link, str, ret); return ret; } +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.11) +const char * +rte_eth_link_type_to_str(uint8_t link_type) +{ + static const char * const link_type_str[] = { + [RTE_ETH_LINK_TYPE_NONE] = "None", + [RTE_ETH_LINK_TYPE_TP] = "Twisted Pair", + [RTE_ETH_LINK_TYPE_AUI] = "Attachment Unit Interface", + [RTE_ETH_LINK_TYPE_MII] = "Media Independent Interface", + [RTE_ETH_LINK_TYPE_FIBRE] = "Fibre", + [RTE_ETH_LINK_TYPE_BNC] = "BNC", + [RTE_ETH_LINK_TYPE_DA] = "Direct Attach Copper", + [RTE_ETH_LINK_TYPE_SGMII] = "SGMII", + [RTE_ETH_LINK_TYPE_QSGMII] = "QSGMII", + [RTE_ETH_LINK_TYPE_XFI] = "XFI", + [RTE_ETH_LINK_TYPE_SFI] = "SFI", + [RTE_ETH_LINK_TYPE_XLAUI] = "XLAUI", + [RTE_ETH_LINK_TYPE_GAUI] = "GAUI", + [RTE_ETH_LINK_TYPE_XAUI] = "XAUI", + [RTE_ETH_LINK_TYPE_GBASE] = "GBASE", + [RTE_ETH_LINK_TYPE_CAUI] = "CAUI", + [RTE_ETH_LINK_TYPE_LAUI] = "LAUI", + [RTE_ETH_LINK_TYPE_SFP] = "SFP", + [RTE_ETH_LINK_TYPE_SFP_DD] = "SFP_DD", + [RTE_ETH_LINK_TYPE_SFP_PLUS] = "SFP_PLUS", + [RTE_ETH_LINK_TYPE_SFP28] = "SFP28", + [RTE_ETH_LINK_TYPE_QSFP] = "QSFP", + [RTE_ETH_LINK_TYPE_QSFP_PLUS] = "QSFP_PLUS", + [RTE_ETH_LINK_TYPE_QSFP28] = "QSFP28", + [RTE_ETH_LINK_TYPE_QSFP56] = "QSFP56", + [RTE_ETH_LINK_TYPE_QSFP_DD] = "QSFP_DD", + [RTE_ETH_LINK_TYPE_OTHER] = "Unknown" + }; + const char *str = NULL; + + if ((link_type < RTE_DIM(link_type_str)) && link_type_str[link_type]) + str = link_type_str[link_type]; + + rte_eth_trace_link_type_to_str(link_type, str); + 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 f9fb6ae549..e82e50017f 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -329,6 +329,38 @@ struct rte_eth_stats { #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ /**@}*/ +/**@{@name PORT type + * Ethernet port type + */ +#define RTE_ETH_LINK_TYPE_NONE 0 /**< Not defined */ +#define RTE_ETH_LINK_TYPE_TP 1 /**< Twisted Pair */ +#define RTE_ETH_LINK_TYPE_AUI 2 /**< Attachment Unit Interface */ +#define RTE_ETH_LINK_TYPE_MII 3 /**< Media Independent Interface */ +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ +#define RTE_ETH_LINK_TYPE_BNC 5 /**< BNC */ +#define RTE_ETH_LINK_TYPE_DA 6 /**< Direct Attach copper */ +#define RTE_ETH_LINK_TYPE_SGMII 7 /**< SGMII */ +#define RTE_ETH_LINK_TYPE_QSGMII 8 /**< QSGMII */ +#define RTE_ETH_LINK_TYPE_XFI 9 /**< XFI */ +#define RTE_ETH_LINK_TYPE_SFI 10 /**< SFI */ +#define RTE_ETH_LINK_TYPE_XLAUI 11 /**< XLAUI */ +#define RTE_ETH_LINK_TYPE_GAUI 12 /**< GAUI */ +#define RTE_ETH_LINK_TYPE_XAUI 13 /**< XAUI */ +#define RTE_ETH_LINK_TYPE_GBASE 14 /**< GBASE */ +#define RTE_ETH_LINK_TYPE_CAUI 15 /**< CAUI */ +#define RTE_ETH_LINK_TYPE_LAUI 16 /**< LAUI */ +#define RTE_ETH_LINK_TYPE_SFP 17 /**< SFP */ +#define RTE_ETH_LINK_TYPE_SFP_DD 18 /**< SFP_DD */ +#define RTE_ETH_LINK_TYPE_SFP_PLUS 19 /**< SFP_PLUS */ +#define RTE_ETH_LINK_TYPE_SFP28 20 /**< SFP28 */ +#define RTE_ETH_LINK_TYPE_QSFP 21 /**< QSFP */ +#define RTE_ETH_LINK_TYPE_QSFP_PLUS 22 /**< QSFP_PLUS */ +#define RTE_ETH_LINK_TYPE_QSFP28 23 /**< QSFP28 */ +#define RTE_ETH_LINK_TYPE_QSFP56 24 /**< QSFP56 */ +#define RTE_ETH_LINK_TYPE_QSFP_DD 25 /**< QSFP_DD */ +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ +/**@}*/ + /** * A structure used to retrieve link-level information of an Ethernet port. */ @@ -341,6 +373,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ }; }; }; @@ -3116,6 +3149,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_type + * The link type to convert. + * @return + * The string representation of the link type. + */ +__rte_experimental +const char *rte_eth_link_type_to_str(uint8_t link_type); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. -- 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v3 1/1] ethdev: add support to provide link type 2025-06-06 9:28 ` [PATCH v2 1/1] " skori 2025-06-06 9:54 ` Morten Brørup 2025-08-13 8:42 ` [PATCH] " skori @ 2025-08-13 8:43 ` skori 2025-08-13 10:25 ` Thomas Monjalon ` (2 more replies) 2 siblings, 3 replies; 17+ messages in thread From: skori @ 2025-08-13 8:43 UTC (permalink / raw) To: Thomas Monjalon, Andrew Rybchenko Cc: dev, Sunil Kumar Kori, Nithin Dabilpuram From: Sunil Kumar Kori <skori@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_TYPE_XXX to a readable string. Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> Signed-off-by: Sunil Kumar Kori <skori@marvell.com> --- v2..v3 - Extend link type list as per suggestion lib/ethdev/ethdev_trace.h | 7 +++++ lib/ethdev/ethdev_trace_points.c | 3 ++ lib/ethdev/rte_ethdev.c | 47 ++++++++++++++++++++++++++++++-- lib/ethdev/rte_ethdev.h | 47 ++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 2 deletions(-) diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h index 482befc209..c5cba0edba 100644 --- a/lib/ethdev/ethdev_trace.h +++ b/lib/ethdev/ethdev_trace.h @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( rte_trace_point_emit_string(ret); ) +RTE_TRACE_POINT_FP( + rte_eth_trace_link_type_to_str, + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), + rte_trace_point_emit_u8(link_type); + rte_trace_point_emit_string(ret); +); + /* Called in loop in examples/bond and examples/ethtool */ RTE_TRACE_POINT_FP( rte_eth_trace_macaddr_get, diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c index 071c508327..706acdf356 100644 --- a/lib/ethdev/ethdev_trace_points.c +++ b/lib/ethdev/ethdev_trace_points.c @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, lib.ethdev.link_to_str) +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, + lib.ethdev.link_type_to_str) + RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, lib.ethdev.stats_get) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index dd7c00bc94..0cf4a805b7 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3285,18 +3285,61 @@ 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_type_to_str(eth_link->link_type)); rte_eth_trace_link_to_str(len, eth_link, str, ret); return ret; } +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.11) +const char * +rte_eth_link_type_to_str(uint8_t link_type) +{ + static const char * const link_type_str[] = { + [RTE_ETH_LINK_TYPE_NONE] = "None", + [RTE_ETH_LINK_TYPE_TP] = "Twisted Pair", + [RTE_ETH_LINK_TYPE_AUI] = "Attachment Unit Interface", + [RTE_ETH_LINK_TYPE_MII] = "Media Independent Interface", + [RTE_ETH_LINK_TYPE_FIBRE] = "Fibre", + [RTE_ETH_LINK_TYPE_BNC] = "BNC", + [RTE_ETH_LINK_TYPE_DA] = "Direct Attach Copper", + [RTE_ETH_LINK_TYPE_SGMII] = "SGMII", + [RTE_ETH_LINK_TYPE_QSGMII] = "QSGMII", + [RTE_ETH_LINK_TYPE_XFI] = "XFI", + [RTE_ETH_LINK_TYPE_SFI] = "SFI", + [RTE_ETH_LINK_TYPE_XLAUI] = "XLAUI", + [RTE_ETH_LINK_TYPE_GAUI] = "GAUI", + [RTE_ETH_LINK_TYPE_XAUI] = "XAUI", + [RTE_ETH_LINK_TYPE_GBASE] = "GBASE", + [RTE_ETH_LINK_TYPE_CAUI] = "CAUI", + [RTE_ETH_LINK_TYPE_LAUI] = "LAUI", + [RTE_ETH_LINK_TYPE_SFP] = "SFP", + [RTE_ETH_LINK_TYPE_SFP_DD] = "SFP_DD", + [RTE_ETH_LINK_TYPE_SFP_PLUS] = "SFP_PLUS", + [RTE_ETH_LINK_TYPE_SFP28] = "SFP28", + [RTE_ETH_LINK_TYPE_QSFP] = "QSFP", + [RTE_ETH_LINK_TYPE_QSFP_PLUS] = "QSFP_PLUS", + [RTE_ETH_LINK_TYPE_QSFP28] = "QSFP28", + [RTE_ETH_LINK_TYPE_QSFP56] = "QSFP56", + [RTE_ETH_LINK_TYPE_QSFP_DD] = "QSFP_DD", + [RTE_ETH_LINK_TYPE_OTHER] = "Unknown" + }; + const char *str = NULL; + + if ((link_type < RTE_DIM(link_type_str)) && link_type_str[link_type]) + str = link_type_str[link_type]; + + rte_eth_trace_link_type_to_str(link_type, str); + 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 f9fb6ae549..e82e50017f 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -329,6 +329,38 @@ struct rte_eth_stats { #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ /**@}*/ +/**@{@name PORT type + * Ethernet port type + */ +#define RTE_ETH_LINK_TYPE_NONE 0 /**< Not defined */ +#define RTE_ETH_LINK_TYPE_TP 1 /**< Twisted Pair */ +#define RTE_ETH_LINK_TYPE_AUI 2 /**< Attachment Unit Interface */ +#define RTE_ETH_LINK_TYPE_MII 3 /**< Media Independent Interface */ +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ +#define RTE_ETH_LINK_TYPE_BNC 5 /**< BNC */ +#define RTE_ETH_LINK_TYPE_DA 6 /**< Direct Attach copper */ +#define RTE_ETH_LINK_TYPE_SGMII 7 /**< SGMII */ +#define RTE_ETH_LINK_TYPE_QSGMII 8 /**< QSGMII */ +#define RTE_ETH_LINK_TYPE_XFI 9 /**< XFI */ +#define RTE_ETH_LINK_TYPE_SFI 10 /**< SFI */ +#define RTE_ETH_LINK_TYPE_XLAUI 11 /**< XLAUI */ +#define RTE_ETH_LINK_TYPE_GAUI 12 /**< GAUI */ +#define RTE_ETH_LINK_TYPE_XAUI 13 /**< XAUI */ +#define RTE_ETH_LINK_TYPE_GBASE 14 /**< GBASE */ +#define RTE_ETH_LINK_TYPE_CAUI 15 /**< CAUI */ +#define RTE_ETH_LINK_TYPE_LAUI 16 /**< LAUI */ +#define RTE_ETH_LINK_TYPE_SFP 17 /**< SFP */ +#define RTE_ETH_LINK_TYPE_SFP_DD 18 /**< SFP_DD */ +#define RTE_ETH_LINK_TYPE_SFP_PLUS 19 /**< SFP_PLUS */ +#define RTE_ETH_LINK_TYPE_SFP28 20 /**< SFP28 */ +#define RTE_ETH_LINK_TYPE_QSFP 21 /**< QSFP */ +#define RTE_ETH_LINK_TYPE_QSFP_PLUS 22 /**< QSFP_PLUS */ +#define RTE_ETH_LINK_TYPE_QSFP28 23 /**< QSFP28 */ +#define RTE_ETH_LINK_TYPE_QSFP56 24 /**< QSFP56 */ +#define RTE_ETH_LINK_TYPE_QSFP_DD 25 /**< QSFP_DD */ +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ +/**@}*/ + /** * A structure used to retrieve link-level information of an Ethernet port. */ @@ -341,6 +373,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ }; }; }; @@ -3116,6 +3149,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_type + * The link type to convert. + * @return + * The string representation of the link type. + */ +__rte_experimental +const char *rte_eth_link_type_to_str(uint8_t link_type); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. -- 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 1/1] ethdev: add support to provide link type 2025-08-13 8:43 ` [PATCH v3 1/1] " skori @ 2025-08-13 10:25 ` Thomas Monjalon 2025-08-13 12:16 ` Ivan Malov 2025-08-14 5:09 ` [EXTERNAL] " Sunil Kumar Kori 2025-08-13 15:04 ` Stephen Hemminger 2025-08-14 8:10 ` [PATCH v4 " skori 2 siblings, 2 replies; 17+ messages in thread From: Thomas Monjalon @ 2025-08-13 10:25 UTC (permalink / raw) To: Sunil Kumar Kori Cc: Andrew Rybchenko, dev, Nithin Dabilpuram, Stephen Hemminger, David Marchand, Bruce Richardson 13/08/2025 10:43, skori@marvell.com: > + * Ethernet port type You mean "link port type" > + */ > +#define RTE_ETH_LINK_TYPE_NONE 0 /**< Not defined */ > +#define RTE_ETH_LINK_TYPE_TP 1 /**< Twisted Pair */ > +#define RTE_ETH_LINK_TYPE_AUI 2 /**< Attachment Unit Interface */ > +#define RTE_ETH_LINK_TYPE_MII 3 /**< Media Independent Interface */ > +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ In general we use the US word "fiber", but we are not very consistent, so it is not a strong opinion. > +#define RTE_ETH_LINK_TYPE_BNC 5 /**< BNC */ > +#define RTE_ETH_LINK_TYPE_DA 6 /**< Direct Attach copper */ > +#define RTE_ETH_LINK_TYPE_SGMII 7 /**< SGMII */ > +#define RTE_ETH_LINK_TYPE_QSGMII 8 /**< QSGMII */ > +#define RTE_ETH_LINK_TYPE_XFI 9 /**< XFI */ > +#define RTE_ETH_LINK_TYPE_SFI 10 /**< SFI */ > +#define RTE_ETH_LINK_TYPE_XLAUI 11 /**< XLAUI */ > +#define RTE_ETH_LINK_TYPE_GAUI 12 /**< GAUI */ > +#define RTE_ETH_LINK_TYPE_XAUI 13 /**< XAUI */ > +#define RTE_ETH_LINK_TYPE_GBASE 14 /**< GBASE */ > +#define RTE_ETH_LINK_TYPE_CAUI 15 /**< CAUI */ > +#define RTE_ETH_LINK_TYPE_LAUI 16 /**< LAUI */ > +#define RTE_ETH_LINK_TYPE_SFP 17 /**< SFP */ > +#define RTE_ETH_LINK_TYPE_SFP_DD 18 /**< SFP_DD */ You should use more full words in comments, at least for DD. > +#define RTE_ETH_LINK_TYPE_SFP_PLUS 19 /**< SFP_PLUS */ Please add more spaces to allow a correct alignment. > +#define RTE_ETH_LINK_TYPE_SFP28 20 /**< SFP28 */ > +#define RTE_ETH_LINK_TYPE_QSFP 21 /**< QSFP */ > +#define RTE_ETH_LINK_TYPE_QSFP_PLUS 22 /**< QSFP_PLUS */ > +#define RTE_ETH_LINK_TYPE_QSFP28 23 /**< QSFP28 */ > +#define RTE_ETH_LINK_TYPE_QSFP56 24 /**< QSFP56 */ > +#define RTE_ETH_LINK_TYPE_QSFP_DD 25 /**< QSFP_DD */ > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ Why the last one is in hexadecimal? and why 1F? Is there a logic in the order and numbering for this list? Why not using an enum? Thanks ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 1/1] ethdev: add support to provide link type 2025-08-13 10:25 ` Thomas Monjalon @ 2025-08-13 12:16 ` Ivan Malov 2025-08-13 14:17 ` Stephen Hemminger 2025-08-14 5:09 ` [EXTERNAL] " Sunil Kumar Kori 1 sibling, 1 reply; 17+ messages in thread From: Ivan Malov @ 2025-08-13 12:16 UTC (permalink / raw) To: Thomas Monjalon Cc: Sunil Kumar Kori, Andrew Rybchenko, dev, Nithin Dabilpuram, Stephen Hemminger, David Marchand, Bruce Richardson Hi Thomas, On Wed, 13 Aug 2025, Thomas Monjalon wrote: > 13/08/2025 10:43, skori@marvell.com: >> + * Ethernet port type > > You mean "link port type" > >> + */ >> +#define RTE_ETH_LINK_TYPE_NONE 0 /**< Not defined */ >> +#define RTE_ETH_LINK_TYPE_TP 1 /**< Twisted Pair */ >> +#define RTE_ETH_LINK_TYPE_AUI 2 /**< Attachment Unit Interface */ >> +#define RTE_ETH_LINK_TYPE_MII 3 /**< Media Independent Interface */ >> +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ > > In general we use the US word "fiber", > but we are not very consistent, so it is not a strong opinion. To me, "fibre" reads more natural. Not a strong opinion either. > >> +#define RTE_ETH_LINK_TYPE_BNC 5 /**< BNC */ >> +#define RTE_ETH_LINK_TYPE_DA 6 /**< Direct Attach copper */ >> +#define RTE_ETH_LINK_TYPE_SGMII 7 /**< SGMII */ >> +#define RTE_ETH_LINK_TYPE_QSGMII 8 /**< QSGMII */ >> +#define RTE_ETH_LINK_TYPE_XFI 9 /**< XFI */ >> +#define RTE_ETH_LINK_TYPE_SFI 10 /**< SFI */ >> +#define RTE_ETH_LINK_TYPE_XLAUI 11 /**< XLAUI */ >> +#define RTE_ETH_LINK_TYPE_GAUI 12 /**< GAUI */ >> +#define RTE_ETH_LINK_TYPE_XAUI 13 /**< XAUI */ >> +#define RTE_ETH_LINK_TYPE_GBASE 14 /**< GBASE */ >> +#define RTE_ETH_LINK_TYPE_CAUI 15 /**< CAUI */ >> +#define RTE_ETH_LINK_TYPE_LAUI 16 /**< LAUI */ >> +#define RTE_ETH_LINK_TYPE_SFP 17 /**< SFP */ >> +#define RTE_ETH_LINK_TYPE_SFP_DD 18 /**< SFP_DD */ > > You should use more full words in comments, at least for DD. +1 > >> +#define RTE_ETH_LINK_TYPE_SFP_PLUS 19 /**< SFP_PLUS */ > > Please add more spaces to allow a correct alignment. > >> +#define RTE_ETH_LINK_TYPE_SFP28 20 /**< SFP28 */ >> +#define RTE_ETH_LINK_TYPE_QSFP 21 /**< QSFP */ >> +#define RTE_ETH_LINK_TYPE_QSFP_PLUS 22 /**< QSFP_PLUS */ >> +#define RTE_ETH_LINK_TYPE_QSFP28 23 /**< QSFP28 */ >> +#define RTE_ETH_LINK_TYPE_QSFP56 24 /**< QSFP56 */ >> +#define RTE_ETH_LINK_TYPE_QSFP_DD 25 /**< QSFP_DD */ >> +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ > > Why the last one is in hexadecimal? and why 1F? I take it this is just maximum value for 'uint16_t link_type : 5;'. > > Is there a logic in the order and numbering for this list? > > Why not using an enum? May be RTE_LEN2MASK() or something? Thank you. > > Thanks > > > > > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 1/1] ethdev: add support to provide link type 2025-08-13 12:16 ` Ivan Malov @ 2025-08-13 14:17 ` Stephen Hemminger 0 siblings, 0 replies; 17+ messages in thread From: Stephen Hemminger @ 2025-08-13 14:17 UTC (permalink / raw) To: Ivan Malov Cc: Thomas Monjalon, Sunil Kumar Kori, Andrew Rybchenko, dev, Nithin Dabilpuram, David Marchand, Bruce Richardson On Wed, 13 Aug 2025 16:16:29 +0400 (+04) Ivan Malov <ivan.malov@arknetworks.am> wrote: > >> +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ > > > > In general we use the US word "fiber", > > but we are not very consistent, so it is not a strong opinion. > > To me, "fibre" reads more natural. Not a strong opinion either. What word does IEEE standard use? That is what matters. ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [EXTERNAL] Re: [PATCH v3 1/1] ethdev: add support to provide link type 2025-08-13 10:25 ` Thomas Monjalon 2025-08-13 12:16 ` Ivan Malov @ 2025-08-14 5:09 ` Sunil Kumar Kori 1 sibling, 0 replies; 17+ messages in thread From: Sunil Kumar Kori @ 2025-08-14 5:09 UTC (permalink / raw) To: Thomas Monjalon Cc: Andrew Rybchenko, dev, Nithin Kumar Dabilpuram, Stephen Hemminger, David Marchand, Bruce Richardson > 13/08/2025 10:43, skori@marvell.com: > > + * Ethernet port type > > You mean "link port type" > Ack. > > + */ > > +#define RTE_ETH_LINK_TYPE_NONE 0 /**< Not defined */ > > +#define RTE_ETH_LINK_TYPE_TP 1 /**< Twisted Pair */ > > +#define RTE_ETH_LINK_TYPE_AUI 2 /**< Attachment Unit Interface */ > > +#define RTE_ETH_LINK_TYPE_MII 3 /**< Media Independent Interface */ > > +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ > > In general we use the US word "fiber", > but we are not very consistent, so it is not a strong opinion. > Ack. I will change it. > > +#define RTE_ETH_LINK_TYPE_BNC 5 /**< BNC */ > > +#define RTE_ETH_LINK_TYPE_DA 6 /**< Direct Attach copper */ > > +#define RTE_ETH_LINK_TYPE_SGMII 7 /**< SGMII */ > > +#define RTE_ETH_LINK_TYPE_QSGMII 8 /**< QSGMII */ > > +#define RTE_ETH_LINK_TYPE_XFI 9 /**< XFI */ > > +#define RTE_ETH_LINK_TYPE_SFI 10 /**< SFI */ > > +#define RTE_ETH_LINK_TYPE_XLAUI 11 /**< XLAUI */ > > +#define RTE_ETH_LINK_TYPE_GAUI 12 /**< GAUI */ > > +#define RTE_ETH_LINK_TYPE_XAUI 13 /**< XAUI */ > > +#define RTE_ETH_LINK_TYPE_GBASE 14 /**< GBASE */ > > +#define RTE_ETH_LINK_TYPE_CAUI 15 /**< CAUI */ > > +#define RTE_ETH_LINK_TYPE_LAUI 16 /**< LAUI */ > > +#define RTE_ETH_LINK_TYPE_SFP 17 /**< SFP */ > > +#define RTE_ETH_LINK_TYPE_SFP_DD 18 /**< SFP_DD */ > > You should use more full words in comments, at least for DD. I thought that these are standard and well known. So didn't add but there is no harm in adding comments. I will add that. > > > +#define RTE_ETH_LINK_TYPE_SFP_PLUS 19 /**< SFP_PLUS */ > > Please add more spaces to allow a correct alignment. > Ack. > > +#define RTE_ETH_LINK_TYPE_SFP28 20 /**< SFP28 */ > > +#define RTE_ETH_LINK_TYPE_QSFP 21 /**< QSFP */ > > +#define RTE_ETH_LINK_TYPE_QSFP_PLUS 22 /**< QSFP_PLUS */ #define > > +RTE_ETH_LINK_TYPE_QSFP28 23 /**< QSFP28 */ #define > > +RTE_ETH_LINK_TYPE_QSFP56 24 /**< QSFP56 */ #define > > +RTE_ETH_LINK_TYPE_QSFP_DD 25 /**< QSFP_DD */ #define > > +RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ > > Why the last one is in hexadecimal? and why 1F? > > Is there a logic in the order and numbering for this list? > > Why not using an enum? > - As struct rte_eth_link:: link_type is a 5 bits field. Hence used the last value as other/unknown link type. We can change it to decimal value. - I have no reasoning for numbering. - Yes, It be kept in enum. No strong opinion on this. > Thanks > > > > ^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH v3 1/1] ethdev: add support to provide link type 2025-08-13 8:43 ` [PATCH v3 1/1] " skori 2025-08-13 10:25 ` Thomas Monjalon @ 2025-08-13 15:04 ` Stephen Hemminger 2025-08-14 8:10 ` [PATCH v4 " skori 2 siblings, 0 replies; 17+ messages in thread From: Stephen Hemminger @ 2025-08-13 15:04 UTC (permalink / raw) To: skori; +Cc: Thomas Monjalon, Andrew Rybchenko, dev, Nithin Dabilpuram On Wed, 13 Aug 2025 14:13:56 +0530 <skori@marvell.com> wrote: > From: Sunil Kumar Kori <skori@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_TYPE_XXX > to a readable string. > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > --- > v2..v3 > - Extend link type list as per suggestion > > lib/ethdev/ethdev_trace.h | 7 +++++ > lib/ethdev/ethdev_trace_points.c | 3 ++ > lib/ethdev/rte_ethdev.c | 47 ++++++++++++++++++++++++++++++-- > lib/ethdev/rte_ethdev.h | 47 ++++++++++++++++++++++++++++++++ > 4 files changed, 102 insertions(+), 2 deletions(-) > > diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h > index 482befc209..c5cba0edba 100644 > --- a/lib/ethdev/ethdev_trace.h > +++ b/lib/ethdev/ethdev_trace.h > @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( > rte_trace_point_emit_string(ret); > ) > > +RTE_TRACE_POINT_FP( > + rte_eth_trace_link_type_to_str, > + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), > + rte_trace_point_emit_u8(link_type); > + rte_trace_point_emit_string(ret); > +); > + > /* Called in loop in examples/bond and examples/ethtool */ > RTE_TRACE_POINT_FP( > rte_eth_trace_macaddr_get, > diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c > index 071c508327..706acdf356 100644 > --- a/lib/ethdev/ethdev_trace_points.c > +++ b/lib/ethdev/ethdev_trace_points.c > @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, > RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, > lib.ethdev.link_to_str) > > +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, > + lib.ethdev.link_type_to_str) > + > RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, > lib.ethdev.stats_get) > > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index dd7c00bc94..0cf4a805b7 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -3285,18 +3285,61 @@ 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_type_to_str(eth_link->link_type)); > > rte_eth_trace_link_to_str(len, eth_link, str, ret); > > return ret; > } > > +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.11) > +const char * > +rte_eth_link_type_to_str(uint8_t link_type) > +{ > + static const char * const link_type_str[] = { > + [RTE_ETH_LINK_TYPE_NONE] = "None", > + [RTE_ETH_LINK_TYPE_TP] = "Twisted Pair", > + [RTE_ETH_LINK_TYPE_AUI] = "Attachment Unit Interface", > + [RTE_ETH_LINK_TYPE_MII] = "Media Independent Interface", > + [RTE_ETH_LINK_TYPE_FIBRE] = "Fibre", > + [RTE_ETH_LINK_TYPE_BNC] = "BNC", > + [RTE_ETH_LINK_TYPE_DA] = "Direct Attach Copper", > + [RTE_ETH_LINK_TYPE_SGMII] = "SGMII", > + [RTE_ETH_LINK_TYPE_QSGMII] = "QSGMII", > + [RTE_ETH_LINK_TYPE_XFI] = "XFI", > + [RTE_ETH_LINK_TYPE_SFI] = "SFI", > + [RTE_ETH_LINK_TYPE_XLAUI] = "XLAUI", > + [RTE_ETH_LINK_TYPE_GAUI] = "GAUI", > + [RTE_ETH_LINK_TYPE_XAUI] = "XAUI", > + [RTE_ETH_LINK_TYPE_GBASE] = "GBASE", > + [RTE_ETH_LINK_TYPE_CAUI] = "CAUI", > + [RTE_ETH_LINK_TYPE_LAUI] = "LAUI", > + [RTE_ETH_LINK_TYPE_SFP] = "SFP", > + [RTE_ETH_LINK_TYPE_SFP_DD] = "SFP_DD", > + [RTE_ETH_LINK_TYPE_SFP_PLUS] = "SFP_PLUS", > + [RTE_ETH_LINK_TYPE_SFP28] = "SFP28", > + [RTE_ETH_LINK_TYPE_QSFP] = "QSFP", > + [RTE_ETH_LINK_TYPE_QSFP_PLUS] = "QSFP_PLUS", > + [RTE_ETH_LINK_TYPE_QSFP28] = "QSFP28", > + [RTE_ETH_LINK_TYPE_QSFP56] = "QSFP56", > + [RTE_ETH_LINK_TYPE_QSFP_DD] = "QSFP_DD", > + [RTE_ETH_LINK_TYPE_OTHER] = "Unknown" > + }; > + const char *str = NULL; > + > + if ((link_type < RTE_DIM(link_type_str)) && link_type_str[link_type]) > + str = link_type_str[link_type]; > + > + rte_eth_trace_link_type_to_str(link_type, str); > + 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 f9fb6ae549..e82e50017f 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -329,6 +329,38 @@ struct rte_eth_stats { > #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ > /**@}*/ > > +/**@{@name PORT type > + * Ethernet port type > + */ > +#define RTE_ETH_LINK_TYPE_NONE 0 /**< Not defined */ > +#define RTE_ETH_LINK_TYPE_TP 1 /**< Twisted Pair */ > +#define RTE_ETH_LINK_TYPE_AUI 2 /**< Attachment Unit Interface */ > +#define RTE_ETH_LINK_TYPE_MII 3 /**< Media Independent Interface */ > +#define RTE_ETH_LINK_TYPE_FIBRE 4 /**< Fibre */ > +#define RTE_ETH_LINK_TYPE_BNC 5 /**< BNC */ > +#define RTE_ETH_LINK_TYPE_DA 6 /**< Direct Attach copper */ > +#define RTE_ETH_LINK_TYPE_SGMII 7 /**< SGMII */ > +#define RTE_ETH_LINK_TYPE_QSGMII 8 /**< QSGMII */ > +#define RTE_ETH_LINK_TYPE_XFI 9 /**< XFI */ > +#define RTE_ETH_LINK_TYPE_SFI 10 /**< SFI */ > +#define RTE_ETH_LINK_TYPE_XLAUI 11 /**< XLAUI */ > +#define RTE_ETH_LINK_TYPE_GAUI 12 /**< GAUI */ > +#define RTE_ETH_LINK_TYPE_XAUI 13 /**< XAUI */ > +#define RTE_ETH_LINK_TYPE_GBASE 14 /**< GBASE */ > +#define RTE_ETH_LINK_TYPE_CAUI 15 /**< CAUI */ > +#define RTE_ETH_LINK_TYPE_LAUI 16 /**< LAUI */ > +#define RTE_ETH_LINK_TYPE_SFP 17 /**< SFP */ > +#define RTE_ETH_LINK_TYPE_SFP_DD 18 /**< SFP_DD */ > +#define RTE_ETH_LINK_TYPE_SFP_PLUS 19 /**< SFP_PLUS */ > +#define RTE_ETH_LINK_TYPE_SFP28 20 /**< SFP28 */ > +#define RTE_ETH_LINK_TYPE_QSFP 21 /**< QSFP */ > +#define RTE_ETH_LINK_TYPE_QSFP_PLUS 22 /**< QSFP_PLUS */ > +#define RTE_ETH_LINK_TYPE_QSFP28 23 /**< QSFP28 */ > +#define RTE_ETH_LINK_TYPE_QSFP56 24 /**< QSFP56 */ > +#define RTE_ETH_LINK_TYPE_QSFP_DD 25 /**< QSFP_DD */ > +#define RTE_ETH_LINK_TYPE_OTHER 0x1F /**< Other type */ > +/**@}*/ > + > /** > * A structure used to retrieve link-level information of an Ethernet port. > */ > @@ -341,6 +373,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ > }; > }; > }; > @@ -3116,6 +3149,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_type > + * The link type to convert. > + * @return > + * The string representation of the link type. > + */ > +__rte_experimental > +const char *rte_eth_link_type_to_str(uint8_t link_type); > + > /** > * @warning > * @b EXPERIMENTAL: this API may change without prior notice. This is causing test failures. I suspect that since resulting string changed, the test expectations are off. Need to fix tests as well. ^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH v4 1/1] ethdev: add support to provide link type 2025-08-13 8:43 ` [PATCH v3 1/1] " skori 2025-08-13 10:25 ` Thomas Monjalon 2025-08-13 15:04 ` Stephen Hemminger @ 2025-08-14 8:10 ` skori 2025-08-14 9:04 ` Morten Brørup 2 siblings, 1 reply; 17+ messages in thread From: skori @ 2025-08-14 8:10 UTC (permalink / raw) To: Thomas Monjalon, Andrew Rybchenko Cc: dev, Sunil Kumar Kori, Nithin Dabilpuram From: Sunil Kumar Kori <skori@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_TYPE_XXX to a readable string. Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> Signed-off-by: Sunil Kumar Kori <skori@marvell.com> --- 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/ethdev_trace.h | 7 +++++ lib/ethdev/ethdev_trace_points.c | 3 ++ lib/ethdev/rte_ethdev.c | 46 ++++++++++++++++++++++++++++-- lib/ethdev/rte_ethdev.h | 48 ++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 9 deletions(-) diff --git a/app/test/test_ethdev_link.c b/app/test/test_ethdev_link.c index f063a5fe26..5d1a784208 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_type = RTE_ETH_LINK_TYPE_NONE }; 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 None", 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_type = RTE_ETH_LINK_TYPE_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_400G; link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; link_status.link_autoneg = RTE_ETH_LINK_AUTONEG; + link_status.link_type = RTE_ETH_LINK_TYPE_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_type = RTE_ETH_LINK_TYPE_UNKNOWN }; 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 Unknown", text, strlen(text), "Incorrect invalid link status string"); return TEST_SUCCESS; diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h index 482befc209..c5cba0edba 100644 --- a/lib/ethdev/ethdev_trace.h +++ b/lib/ethdev/ethdev_trace.h @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( rte_trace_point_emit_string(ret); ) +RTE_TRACE_POINT_FP( + rte_eth_trace_link_type_to_str, + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), + rte_trace_point_emit_u8(link_type); + rte_trace_point_emit_string(ret); +); + /* Called in loop in examples/bond and examples/ethtool */ RTE_TRACE_POINT_FP( rte_eth_trace_macaddr_get, diff --git a/lib/ethdev/ethdev_trace_points.c b/lib/ethdev/ethdev_trace_points.c index 071c508327..706acdf356 100644 --- a/lib/ethdev/ethdev_trace_points.c +++ b/lib/ethdev/ethdev_trace_points.c @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, lib.ethdev.link_to_str) +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, + lib.ethdev.link_type_to_str) + RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, lib.ethdev.stats_get) diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c index dd7c00bc94..db496d70c4 100644 --- a/lib/ethdev/rte_ethdev.c +++ b/lib/ethdev/rte_ethdev.c @@ -3285,18 +3285,60 @@ 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_type_to_str(eth_link->link_type)); rte_eth_trace_link_to_str(len, eth_link, str, ret); return ret; } +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.11) +const char * +rte_eth_link_type_to_str(enum rte_eth_link_type link_type) +{ + static const char * const link_type_str[] = { + [RTE_ETH_LINK_TYPE_NONE] = "None", + [RTE_ETH_LINK_TYPE_TP] = "Twisted Pair", + [RTE_ETH_LINK_TYPE_AUI] = "Attachment Unit Interface", + [RTE_ETH_LINK_TYPE_MII] = "Media Independent Interface", + [RTE_ETH_LINK_TYPE_FIBER] = "Fiber", + [RTE_ETH_LINK_TYPE_BNC] = "BNC", + [RTE_ETH_LINK_TYPE_DA] = "Direct Attach Copper", + [RTE_ETH_LINK_TYPE_SGMII] = "SGMII", + [RTE_ETH_LINK_TYPE_QSGMII] = "QSGMII", + [RTE_ETH_LINK_TYPE_XFI] = "XFI", + [RTE_ETH_LINK_TYPE_SFI] = "SFI", + [RTE_ETH_LINK_TYPE_XLAUI] = "XLAUI", + [RTE_ETH_LINK_TYPE_GAUI] = "GAUI", + [RTE_ETH_LINK_TYPE_XAUI] = "XAUI", + [RTE_ETH_LINK_TYPE_CAUI] = "CAUI", + [RTE_ETH_LINK_TYPE_LAUI] = "LAUI", + [RTE_ETH_LINK_TYPE_SFP] = "SFP", + [RTE_ETH_LINK_TYPE_SFP_DD] = "SFP_DD", + [RTE_ETH_LINK_TYPE_SFP_PLUS] = "SFP_PLUS", + [RTE_ETH_LINK_TYPE_SFP28] = "SFP28", + [RTE_ETH_LINK_TYPE_QSFP] = "QSFP", + [RTE_ETH_LINK_TYPE_QSFP_PLUS] = "QSFP_PLUS", + [RTE_ETH_LINK_TYPE_QSFP28] = "QSFP28", + [RTE_ETH_LINK_TYPE_QSFP56] = "QSFP56", + [RTE_ETH_LINK_TYPE_QSFP_DD] = "QSFP_DD", + [RTE_ETH_LINK_TYPE_UNKNOWN] = "Unknown" + }; + const char *str = NULL; + + if ((link_type < RTE_DIM(link_type_str)) && link_type_str[link_type]) + str = link_type_str[link_type]; + + rte_eth_trace_link_type_to_str(link_type, str); + 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 f9fb6ae549..92d1ded51f 100644 --- a/lib/ethdev/rte_ethdev.h +++ b/lib/ethdev/rte_ethdev.h @@ -329,6 +329,39 @@ struct rte_eth_stats { #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ /**@}*/ +/**@{@name PORT type + * Ethernet port link type + */ +enum rte_eth_link_type { + RTE_ETH_LINK_TYPE_NONE = 0, /**< Not defined */ + RTE_ETH_LINK_TYPE_TP, /**< Twisted Pair */ + RTE_ETH_LINK_TYPE_AUI, /**< Attachment Unit Interface */ + RTE_ETH_LINK_TYPE_MII, /**< Media Independent Interface */ + RTE_ETH_LINK_TYPE_FIBER, /**< Optical Fiber Link */ + RTE_ETH_LINK_TYPE_BNC, /**< BNC Link type for RF connection */ + RTE_ETH_LINK_TYPE_DA, /**< Direct Attach copper */ + RTE_ETH_LINK_TYPE_SGMII, /**< Serial Gigabit Media Independent Interface */ + RTE_ETH_LINK_TYPE_QSGMII, /**< Link to multiplex 4 SGMII over one serial link */ + RTE_ETH_LINK_TYPE_XFI, /**< 10 Gigabit Attachment Unit Interface */ + RTE_ETH_LINK_TYPE_SFI, /**< 10 Gigabit Serial Interface for optical networking */ + RTE_ETH_LINK_TYPE_XLAUI, /**< 40 Gigabit Attachment Unit Interface */ + RTE_ETH_LINK_TYPE_GAUI, /**< Gigabit Interface for bandwidth like 50/100/200 Gbps */ + RTE_ETH_LINK_TYPE_XAUI, /**< 10 Gigabit Attachment Unit Interface */ + RTE_ETH_LINK_TYPE_CAUI, /**< 100 Gigabit Attachment Unit Interface */ + RTE_ETH_LINK_TYPE_LAUI, /**< 50 Gigabit Attachment Unit Interface */ + RTE_ETH_LINK_TYPE_SFP, /**< Pluggable module for 1 Gigabit */ + RTE_ETH_LINK_TYPE_SFP_PLUS, /**< Pluggable module for 10 Gigabit */ + RTE_ETH_LINK_TYPE_SFP28, /**< Pluggable module for 25 Gigabit */ + RTE_ETH_LINK_TYPE_SFP_DD, /**< Pluggable module for 100 Gigabit */ + RTE_ETH_LINK_TYPE_QSFP, /**< Module to mutiplex 4 SFP i.e. 4*1=4 Gigabit */ + RTE_ETH_LINK_TYPE_QSFP_PLUS,/**< Module to mutiplex 4 SFP_PLUS i.e. 4*10=40 Gigabit */ + RTE_ETH_LINK_TYPE_QSFP28, /**< Module to mutiplex 4 SFP28 i.e. 4*25=100 Gigabit */ + RTE_ETH_LINK_TYPE_QSFP56, /**< Module to mutiplex 4 SFP56 i.e. 4*50=200 Gigabit */ + RTE_ETH_LINK_TYPE_QSFP_DD, /**< Module to mutiplex 4 SFP_DD i.e. 4*100=400 Gigabit */ + RTE_ETH_LINK_TYPE_UNKNOWN = 31, /**< Unknown Link Type */ +}; +/**@}*/ + /** * A structure used to retrieve link-level information of an Ethernet port. */ @@ -341,6 +374,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ }; }; }; @@ -3116,6 +3150,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_type + * The link type to convert. + * @return + * The string representation of the link type. + */ +__rte_experimental +const char *rte_eth_link_type_to_str(enum rte_eth_link_type link_type); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. -- 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
* RE: [PATCH v4 1/1] ethdev: add support to provide link type 2025-08-14 8:10 ` [PATCH v4 " skori @ 2025-08-14 9:04 ` Morten Brørup 0 siblings, 0 replies; 17+ messages in thread From: Morten Brørup @ 2025-08-14 9:04 UTC (permalink / raw) To: skori, Thomas Monjalon, Andrew Rybchenko; +Cc: dev, Nithin Dabilpuram > From: skori@marvell.com [mailto:skori@marvell.com] > Sent: Thursday, 14 August 2025 10.10 > > 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_TYPE_XXX > to a readable string. Please consider if "connector" is a better name than "link type", if this is related to physical interfaces only. E.g. is there an "LACP" link type for link aggregates (bonded links)? Also, should a "virtual" link type (or connector) be added for TAP/Virtio/VMXNET3/ring and similar non-physical interfaces? More comments inline below. > > Signed-off-by: Nithin Dabilpuram <ndabilpuram@marvell.com> > Signed-off-by: Sunil Kumar Kori <skori@marvell.com> > --- > 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/ethdev_trace.h | 7 +++++ > lib/ethdev/ethdev_trace_points.c | 3 ++ > lib/ethdev/rte_ethdev.c | 46 ++++++++++++++++++++++++++++-- > lib/ethdev/rte_ethdev.h | 48 ++++++++++++++++++++++++++++++++ > 5 files changed, 113 insertions(+), 9 deletions(-) > > diff --git a/app/test/test_ethdev_link.c b/app/test/test_ethdev_link.c > index f063a5fe26..5d1a784208 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_type = RTE_ETH_LINK_TYPE_NONE RTE_ETH_LINK_TYPE_UNKNOWN > }; > 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 None", "Link up at 2.5 Gbps FDX Autoneg Unknown" > 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_type = RTE_ETH_LINK_TYPE_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_400G; > link_status.link_duplex = RTE_ETH_LINK_HALF_DUPLEX; > link_status.link_autoneg = RTE_ETH_LINK_AUTONEG; > + link_status.link_type = RTE_ETH_LINK_TYPE_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_type = RTE_ETH_LINK_TYPE_UNKNOWN > }; > 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 Unknown", > text, strlen(text), "Incorrect invalid link status string"); > > return TEST_SUCCESS; > diff --git a/lib/ethdev/ethdev_trace.h b/lib/ethdev/ethdev_trace.h > index 482befc209..c5cba0edba 100644 > --- a/lib/ethdev/ethdev_trace.h > +++ b/lib/ethdev/ethdev_trace.h > @@ -2110,6 +2110,13 @@ RTE_TRACE_POINT_FP( > rte_trace_point_emit_string(ret); > ) > > +RTE_TRACE_POINT_FP( > + rte_eth_trace_link_type_to_str, > + RTE_TRACE_POINT_ARGS(uint8_t link_type, const char *ret), > + rte_trace_point_emit_u8(link_type); > + rte_trace_point_emit_string(ret); > +); > + > /* Called in loop in examples/bond and examples/ethtool */ > RTE_TRACE_POINT_FP( > rte_eth_trace_macaddr_get, > diff --git a/lib/ethdev/ethdev_trace_points.c > b/lib/ethdev/ethdev_trace_points.c > index 071c508327..706acdf356 100644 > --- a/lib/ethdev/ethdev_trace_points.c > +++ b/lib/ethdev/ethdev_trace_points.c > @@ -206,6 +206,9 @@ RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_speed_to_str, > RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_to_str, > lib.ethdev.link_to_str) > > +RTE_TRACE_POINT_REGISTER(rte_eth_trace_link_type_to_str, > + lib.ethdev.link_type_to_str) > + > RTE_TRACE_POINT_REGISTER(rte_eth_trace_stats_get, > lib.ethdev.stats_get) > > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > index dd7c00bc94..db496d70c4 100644 > --- a/lib/ethdev/rte_ethdev.c > +++ b/lib/ethdev/rte_ethdev.c > @@ -3285,18 +3285,60 @@ 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_type_to_str(eth_link->link_type)); > > rte_eth_trace_link_to_str(len, eth_link, str, ret); > > return ret; > } > > +RTE_EXPORT_EXPERIMENTAL_SYMBOL(rte_eth_link_type_to_str, 25.11) > +const char * > +rte_eth_link_type_to_str(enum rte_eth_link_type link_type) > +{ > + static const char * const link_type_str[] = { > + [RTE_ETH_LINK_TYPE_NONE] = "None", > + [RTE_ETH_LINK_TYPE_TP] = "Twisted Pair", > + [RTE_ETH_LINK_TYPE_AUI] = "Attachment Unit Interface", > + [RTE_ETH_LINK_TYPE_MII] = "Media Independent Interface", > + [RTE_ETH_LINK_TYPE_FIBER] = "Fiber", > + [RTE_ETH_LINK_TYPE_BNC] = "BNC", > + [RTE_ETH_LINK_TYPE_DA] = "Direct Attach Copper", RTE_ETH_LINK_TYPE_DAC > + [RTE_ETH_LINK_TYPE_SGMII] = "SGMII", > + [RTE_ETH_LINK_TYPE_QSGMII] = "QSGMII", > + [RTE_ETH_LINK_TYPE_XFI] = "XFI", > + [RTE_ETH_LINK_TYPE_SFI] = "SFI", > + [RTE_ETH_LINK_TYPE_XLAUI] = "XLAUI", > + [RTE_ETH_LINK_TYPE_GAUI] = "GAUI", > + [RTE_ETH_LINK_TYPE_XAUI] = "XAUI", > + [RTE_ETH_LINK_TYPE_CAUI] = "CAUI", > + [RTE_ETH_LINK_TYPE_LAUI] = "LAUI", > + [RTE_ETH_LINK_TYPE_SFP] = "SFP", > + [RTE_ETH_LINK_TYPE_SFP_DD] = "SFP_DD", "SFP-DD" > + [RTE_ETH_LINK_TYPE_SFP_PLUS] = "SFP_PLUS", "SFP+" > + [RTE_ETH_LINK_TYPE_SFP28] = "SFP28", > + [RTE_ETH_LINK_TYPE_QSFP] = "QSFP", > + [RTE_ETH_LINK_TYPE_QSFP_PLUS] = "QSFP_PLUS", "QSFP+" > + [RTE_ETH_LINK_TYPE_QSFP28] = "QSFP28", > + [RTE_ETH_LINK_TYPE_QSFP56] = "QSFP56", > + [RTE_ETH_LINK_TYPE_QSFP_DD] = "QSFP_DD", "QSFP-DD" > + [RTE_ETH_LINK_TYPE_UNKNOWN] = "Unknown" > + }; > + const char *str = NULL; > + > + if ((link_type < RTE_DIM(link_type_str)) && link_type_str[link_type]) > + str = link_type_str[link_type]; > + > + rte_eth_trace_link_type_to_str(link_type, str); > + 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 f9fb6ae549..92d1ded51f 100644 > --- a/lib/ethdev/rte_ethdev.h > +++ b/lib/ethdev/rte_ethdev.h > @@ -329,6 +329,39 @@ struct rte_eth_stats { > #define RTE_ETH_SPEED_NUM_UNKNOWN UINT32_MAX /**< Unknown */ > /**@}*/ > > +/**@{@name PORT type > + * Ethernet port link type > + */ > +enum rte_eth_link_type { > + RTE_ETH_LINK_TYPE_NONE = 0, /**< Not defined */ > + RTE_ETH_LINK_TYPE_TP, /**< Twisted Pair */ > + RTE_ETH_LINK_TYPE_AUI, /**< Attachment Unit Interface */ > + RTE_ETH_LINK_TYPE_MII, /**< Media Independent Interface */ > + RTE_ETH_LINK_TYPE_FIBER, /**< Optical Fiber Link */ > + RTE_ETH_LINK_TYPE_BNC, /**< BNC Link type for RF connection */ > + RTE_ETH_LINK_TYPE_DA, /**< Direct Attach copper */ > + RTE_ETH_LINK_TYPE_SGMII, /**< Serial Gigabit Media Independent > Interface */ > + RTE_ETH_LINK_TYPE_QSGMII, /**< Link to multiplex 4 SGMII over one > serial link */ > + RTE_ETH_LINK_TYPE_XFI, /**< 10 Gigabit Attachment Unit Interface */ > + RTE_ETH_LINK_TYPE_SFI, /**< 10 Gigabit Serial Interface for optical > networking */ > + RTE_ETH_LINK_TYPE_XLAUI, /**< 40 Gigabit Attachment Unit Interface */ > + RTE_ETH_LINK_TYPE_GAUI, /**< Gigabit Interface for bandwidth like > 50/100/200 Gbps */ > + RTE_ETH_LINK_TYPE_XAUI, /**< 10 Gigabit Attachment Unit Interface */ > + RTE_ETH_LINK_TYPE_CAUI, /**< 100 Gigabit Attachment Unit Interface > */ > + RTE_ETH_LINK_TYPE_LAUI, /**< 50 Gigabit Attachment Unit Interface */ > + RTE_ETH_LINK_TYPE_SFP, /**< Pluggable module for 1 Gigabit */ > + RTE_ETH_LINK_TYPE_SFP_PLUS, /**< Pluggable module for 10 Gigabit */ > + RTE_ETH_LINK_TYPE_SFP28, /**< Pluggable module for 25 Gigabit */ > + RTE_ETH_LINK_TYPE_SFP_DD, /**< Pluggable module for 100 Gigabit */ > + RTE_ETH_LINK_TYPE_QSFP, /**< Module to mutiplex 4 SFP i.e. 4*1=4 > Gigabit */ > + RTE_ETH_LINK_TYPE_QSFP_PLUS,/**< Module to mutiplex 4 SFP_PLUS i.e. > 4*10=40 Gigabit */ > + RTE_ETH_LINK_TYPE_QSFP28, /**< Module to mutiplex 4 SFP28 i.e. > 4*25=100 Gigabit */ > + RTE_ETH_LINK_TYPE_QSFP56, /**< Module to mutiplex 4 SFP56 i.e. > 4*50=200 Gigabit */ > + RTE_ETH_LINK_TYPE_QSFP_DD, /**< Module to mutiplex 4 SFP_DD i.e. > 4*100=400 Gigabit */ > + RTE_ETH_LINK_TYPE_UNKNOWN = 31, /**< Unknown Link Type */ For reference, we do have both RTE_ETH_SPEED_NUM_NONE and RTE_ETH_SPEED_NUM_UNKNOWN, where RTE_ETH_SPEED_NUM_NONE represents "link down, zero speed", and RTE_ETH_SPEED_NUM_UNKNOWN represents "link up, unknown speed". But I doubt we need both RTE_ETH_LINK_TYPE_NONE and RTE_ETH_LINK_TYPE_UNKNOWN... I agree that we need a value to represent "connector type unknown", but do we also need a value to represent "connector not present"? When can a port have no connector? > +}; > +/**@}*/ > + > /** > * A structure used to retrieve link-level information of an Ethernet port. > */ > @@ -341,6 +374,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_type : 5; /**< RTE_ETH_LINK_TYPE_XXX */ > }; > }; > }; > @@ -3116,6 +3150,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_type > + * The link type to convert. > + * @return > + * The string representation of the link type. > + */ > +__rte_experimental > +const char *rte_eth_link_type_to_str(enum rte_eth_link_type link_type); > + > /** > * @warning > * @b EXPERIMENTAL: this API may change without prior notice. > -- > 2.43.0 ^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2025-08-14 9:04 UTC | newest] Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-06-05 11:31 [PATCH] ethdev: add support to provide link type skori 2025-06-05 15:26 ` Stephen Hemminger 2025-06-06 9:28 ` [PATCH v2 1/1] " skori 2025-06-06 9:54 ` Morten Brørup 2025-06-06 15:23 ` Stephen Hemminger 2025-06-10 5:02 ` [EXTERNAL] " Sunil Kumar Kori 2025-06-10 6:45 ` Morten Brørup 2025-08-13 7:42 ` Sunil Kumar Kori 2025-08-13 8:42 ` [PATCH] " skori 2025-08-13 8:43 ` [PATCH v3 1/1] " skori 2025-08-13 10:25 ` Thomas Monjalon 2025-08-13 12:16 ` Ivan Malov 2025-08-13 14:17 ` Stephen Hemminger 2025-08-14 5:09 ` [EXTERNAL] " Sunil Kumar Kori 2025-08-13 15:04 ` Stephen Hemminger 2025-08-14 8:10 ` [PATCH v4 " skori 2025-08-14 9:04 ` Morten Brørup
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).