Signed-off-by: Jianfeng Tan <jianfeng.tan at intel.com> --- drivers/net/fm10k/fm10k_ethdev.c | 60 ++++++++++++++++++++++++++++++++++++++ drivers/net/fm10k/fm10k_rxtx.c | 5 ++++ drivers/net/fm10k/fm10k_rxtx_vec.c | 5 ++++ 3 files changed, 70 insertions(+)
diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c index e4aed94..51e4fe0 100644 --- a/drivers/net/fm10k/fm10k_ethdev.c +++ b/drivers/net/fm10k/fm10k_ethdev.c @@ -1335,6 +1335,65 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev, }; } +#ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE +static int +fm10k_dev_ptype_info_get(struct rte_eth_dev *dev, uint32_t ptype_mask, + uint32_t ptypes[]) +{ + int num = 0; + if ((dev->rx_pkt_burst == fm10k_recv_pkts) || + (dev->rx_pkt_burst == fm10k_recv_scattered_pkts)) { + /* refers to rx_desc_to_ol_flags() */ + if ((ptype_mask & RTE_PTYPE_L2_MASK) == RTE_PTYPE_L2_MASK) + ptypes[num++] = RTE_PTYPE_L2_ETHER; + + if ((ptype_mask & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_MASK) { + ptypes[num++] = RTE_PTYPE_L3_IPV4; + ptypes[num++] = RTE_PTYPE_L3_IPV4_EXT; + ptypes[num++] = RTE_PTYPE_L3_IPV6; + ptypes[num++] = RTE_PTYPE_L3_IPV6_EXT; + } + + if ((ptype_mask & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_MASK) { + ptypes[num++] = RTE_PTYPE_L4_TCP; + ptypes[num++] = RTE_PTYPE_L4_UDP; + } + } else if ((dev->rx_pkt_burst == fm10k_recv_pkts_vec) || + (dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec)) { + /* refers to fm10k_desc_to_pktype_v() */ + if ((ptype_mask & RTE_PTYPE_L3_MASK) == RTE_PTYPE_L3_MASK) { + ptypes[num++] = RTE_PTYPE_L3_IPV4; + ptypes[num++] = RTE_PTYPE_L3_IPV4_EXT; + ptypes[num++] = RTE_PTYPE_L3_IPV6; + ptypes[num++] = RTE_PTYPE_L3_IPV6_EXT; + } + + if ((ptype_mask & RTE_PTYPE_L4_MASK) == RTE_PTYPE_L4_MASK) { + ptypes[num++] = RTE_PTYPE_L4_TCP; + ptypes[num++] = RTE_PTYPE_L4_UDP; + } + + if ((ptype_mask & RTE_PTYPE_TUNNEL_MASK) == RTE_PTYPE_TUNNEL_MASK) { + ptypes[num++] = RTE_PTYPE_TUNNEL_GENEVE; + ptypes[num++] = RTE_PTYPE_TUNNEL_NVGRE; + ptypes[num++] = RTE_PTYPE_TUNNEL_VXLAN; + ptypes[num++] = RTE_PTYPE_TUNNEL_GRE; + } + } else + num = -ENOTSUP; + + return num; +} +#else +static int +fm10k_dev_ptype_info_get(struct rte_eth_dev *dev __rte_unused, + uint32_t ptype_mask __rte_unused, + uint32_t ptypes[] __rte_unused) +{ + return -ENOTSUP; +} +#endif + static int fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) { @@ -2423,6 +2482,7 @@ static const struct eth_dev_ops fm10k_eth_dev_ops = { .xstats_reset = fm10k_stats_reset, .link_update = fm10k_link_update, .dev_infos_get = fm10k_dev_infos_get, + .dev_ptype_info_get = fm10k_dev_ptype_info_get, .vlan_filter_set = fm10k_vlan_filter_set, .vlan_offload_set = fm10k_vlan_offload_set, .mac_addr_add = fm10k_macaddr_add, diff --git a/drivers/net/fm10k/fm10k_rxtx.c b/drivers/net/fm10k/fm10k_rxtx.c index e958865..9b2d6f2 100644 --- a/drivers/net/fm10k/fm10k_rxtx.c +++ b/drivers/net/fm10k/fm10k_rxtx.c @@ -65,6 +65,11 @@ static inline void dump_rxd(union fm10k_rx_desc *rxd) } #endif +/* + * @note + * When this function is changed, make corresponding change to + * fm10k_dev_ptype_info_get() + */ static inline void rx_desc_to_ol_flags(struct rte_mbuf *m, const union fm10k_rx_desc *d) { diff --git a/drivers/net/fm10k/fm10k_rxtx_vec.c b/drivers/net/fm10k/fm10k_rxtx_vec.c index 2a57eef..6fc22fc 100644 --- a/drivers/net/fm10k/fm10k_rxtx_vec.c +++ b/drivers/net/fm10k/fm10k_rxtx_vec.c @@ -109,6 +109,11 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts) rx_pkts[3]->ol_flags = vol.e[3]; } +/* + * @note + * When this function is changed, make corresponding change to + * fm10k_dev_ptype_info_get() + */ static inline void fm10k_desc_to_pktype_v(__m128i descs[4], struct rte_mbuf **rx_pkts) { -- 2.1.4