Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <alee@solarflare.com>
Reviewed-by: Robert Stonehouse <rstonehouse@solarflare.com>
Flow control = Y
L3 checksum offload = Y
L4 checksum offload = Y
Flow control = Y
L3 checksum offload = Y
L4 checksum offload = Y
Basic stats = Y
Extended stats = Y
BSD nic_uio = Y
Basic stats = Y
Extended stats = Y
BSD nic_uio = Y
- IPv4/IPv6 TCP/UDP receive checksum offload
- IPv4/IPv6 TCP/UDP receive checksum offload
+- Received packet type information
+
Non-supported Features
----------------------
Non-supported Features
----------------------
dev_info->tx_desc_lim.nb_align = EFX_TXQ_MINNDESCS;
}
dev_info->tx_desc_lim.nb_align = EFX_TXQ_MINNDESCS;
}
+static const uint32_t *
+sfc_dev_supported_ptypes_get(struct rte_eth_dev *dev)
+{
+ static const uint32_t ptypes[] = {
+ RTE_PTYPE_L2_ETHER,
+ RTE_PTYPE_L3_IPV4_EXT_UNKNOWN,
+ RTE_PTYPE_L3_IPV6_EXT_UNKNOWN,
+ RTE_PTYPE_L4_TCP,
+ RTE_PTYPE_L4_UDP,
+ RTE_PTYPE_UNKNOWN
+ };
+
+ if (dev->rx_pkt_burst == sfc_recv_pkts)
+ return ptypes;
+
+ return NULL;
+}
+
static int
sfc_dev_configure(struct rte_eth_dev *dev)
{
static int
sfc_dev_configure(struct rte_eth_dev *dev)
{
.xstats_get = sfc_xstats_get,
.xstats_get_names = sfc_xstats_get_names,
.dev_infos_get = sfc_dev_infos_get,
.xstats_get = sfc_xstats_get,
.xstats_get_names = sfc_xstats_get_names,
.dev_infos_get = sfc_dev_infos_get,
+ .dev_supported_ptypes_get = sfc_dev_supported_ptypes_get,
.mtu_set = sfc_dev_set_mtu,
.rx_queue_setup = sfc_rx_queue_setup,
.rx_queue_release = sfc_rx_queue_release,
.mtu_set = sfc_dev_set_mtu,
.rx_queue_setup = sfc_rx_queue_setup,
.rx_queue_release = sfc_rx_queue_release,
+static uint32_t
+sfc_rx_desc_flags_to_packet_type(const unsigned int desc_flags)
+{
+ return RTE_PTYPE_L2_ETHER |
+ ((desc_flags & EFX_PKT_IPV4) ?
+ RTE_PTYPE_L3_IPV4_EXT_UNKNOWN : 0) |
+ ((desc_flags & EFX_PKT_IPV6) ?
+ RTE_PTYPE_L3_IPV6_EXT_UNKNOWN : 0) |
+ ((desc_flags & EFX_PKT_TCP) ? RTE_PTYPE_L4_TCP : 0) |
+ ((desc_flags & EFX_PKT_UDP) ? RTE_PTYPE_L4_UDP : 0);
+}
+
uint16_t
sfc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
{
uint16_t
sfc_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
{
rte_pktmbuf_pkt_len(m) = seg_len;
m->ol_flags = sfc_rx_desc_flags_to_offload_flags(desc_flags);
rte_pktmbuf_pkt_len(m) = seg_len;
m->ol_flags = sfc_rx_desc_flags_to_offload_flags(desc_flags);
- m->packet_type = RTE_PTYPE_L2_ETHER;
+ m->packet_type = sfc_rx_desc_flags_to_packet_type(desc_flags);
*rx_pkts++ = m;
done_pkts++;
*rx_pkts++ = m;
done_pkts++;