From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id B10F8A00C2; Thu, 6 Oct 2022 01:23:49 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BCD5042BB6; Thu, 6 Oct 2022 01:22:31 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id D7D6F42BA3 for ; Thu, 6 Oct 2022 01:22:28 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1004) id 92F2020C3334; Wed, 5 Oct 2022 16:22:28 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 92F2020C3334 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1665012148; bh=yxvA1W7NQNv1Xvgj93pTI3WuvORHat04TQ2WyDTyp0I=; h=From:To:Cc:Subject:Date:In-Reply-To:References:Reply-To:From; b=Bm23S3+ne6DyvbbHPHGpLiezCr8hAs9Y5s9EwAInfj8ZyVC7wnB3/wKy62HmQHVtW Dgvl3V5Gi4DI41gcy1NQ6r2TgFgVGH9tLxezTAIGeBrsuAw+h3CBwnIu7kjOO10h6M l5Oo6b8xQslhkoeNGD89ZF19UdwxUEMqxrjy0utc= From: longli@linuxonhyperv.com To: Ferruh Yigit Cc: dev@dpdk.org, Ajay Sharma , Stephen Hemminger , Long Li Subject: [Patch v10 14/18] net/mana: receive packets Date: Wed, 5 Oct 2022 16:22:04 -0700 Message-Id: <1665012128-20520-15-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1665012128-20520-1-git-send-email-longli@linuxonhyperv.com> References: <1663987546-15982-1-git-send-email-longli@linuxonhyperv.com> <1665012128-20520-1-git-send-email-longli@linuxonhyperv.com> X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: longli@microsoft.com Errors-To: dev-bounces@dpdk.org From: Long Li With all the RX queues created, MANA can use those queues to receive packets. Signed-off-by: Long Li --- Change log: v2: Add mana_ to all function names. Rename a camel case. v8: Fix coding style to function definitions. v10: Rearrange the order in doc/guides/nics/features/mana.ini doc/guides/nics/features/mana.ini | 2 + drivers/net/mana/mana.h | 37 +++++++++++ drivers/net/mana/mp.c | 2 + drivers/net/mana/rx.c | 105 ++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+) diff --git a/doc/guides/nics/features/mana.ini b/doc/guides/nics/features/mana.ini index 821443b292..1b826b0f8f 100644 --- a/doc/guides/nics/features/mana.ini +++ b/doc/guides/nics/features/mana.ini @@ -4,6 +4,8 @@ ; Refer to default.ini for the full list of available PMD features. ; [Features] +L3 checksum offload = Y +L4 checksum offload = Y Link status = P Linux = Y Multiprocess aware = Y diff --git a/drivers/net/mana/mana.h b/drivers/net/mana/mana.h index 01a3177a19..117967d856 100644 --- a/drivers/net/mana/mana.h +++ b/drivers/net/mana/mana.h @@ -172,6 +172,11 @@ struct gdma_work_request { enum mana_cqe_type { CQE_INVALID = 0, + + CQE_RX_OKAY = 1, + CQE_RX_COALESCED_4 = 2, + CQE_RX_OBJECT_FENCE = 3, + CQE_RX_TRUNCATED = 4, }; struct mana_cqe_header { @@ -196,6 +201,35 @@ struct mana_cqe_header { (NDIS_HASH_TCP_IPV4 | NDIS_HASH_UDP_IPV4 | NDIS_HASH_TCP_IPV6 | \ NDIS_HASH_UDP_IPV6 | NDIS_HASH_TCP_IPV6_EX | NDIS_HASH_UDP_IPV6_EX) +struct mana_rx_comp_per_packet_info { + uint32_t packet_length : 16; + uint32_t reserved0 : 16; + uint32_t reserved1; + uint32_t packet_hash; +}; /* HW DATA */ +#define RX_COM_OOB_NUM_PACKETINFO_SEGMENTS 4 + +struct mana_rx_comp_oob { + struct mana_cqe_header cqe_hdr; + + uint32_t rx_vlan_id : 12; + uint32_t rx_vlan_tag_present : 1; + uint32_t rx_outer_ip_header_checksum_succeeded : 1; + uint32_t rx_outer_ip_header_checksum_failed : 1; + uint32_t reserved : 1; + uint32_t rx_hash_type : 9; + uint32_t rx_ip_header_checksum_succeeded : 1; + uint32_t rx_ip_header_checksum_failed : 1; + uint32_t rx_tcp_checksum_succeeded : 1; + uint32_t rx_tcp_checksum_failed : 1; + uint32_t rx_udp_checksum_succeeded : 1; + uint32_t rx_udp_checksum_failed : 1; + uint32_t reserved1 : 1; + struct mana_rx_comp_per_packet_info + packet_info[RX_COM_OOB_NUM_PACKETINFO_SEGMENTS]; + uint32_t received_wqe_offset; +}; /* HW DATA */ + struct gdma_wqe_dma_oob { uint32_t reserved:24; uint32_t last_v_bytes:8; @@ -363,6 +397,9 @@ int gdma_post_work_request(struct mana_gdma_queue *queue, struct gdma_posted_wqe_info *wqe_info); uint8_t *gdma_get_wqe_pointer(struct mana_gdma_queue *queue); +uint16_t mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **rx_pkts, + uint16_t pkts_n); + uint16_t mana_rx_burst_removed(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n); diff --git a/drivers/net/mana/mp.c b/drivers/net/mana/mp.c index a3b5ede559..feda30623a 100644 --- a/drivers/net/mana/mp.c +++ b/drivers/net/mana/mp.c @@ -141,6 +141,8 @@ mana_mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer) case MANA_MP_REQ_START_RXTX: DRV_LOG(INFO, "Port %u starting datapath", dev->data->port_id); + dev->rx_pkt_burst = mana_rx_burst; + rte_mb(); res->result = 0; diff --git a/drivers/net/mana/rx.c b/drivers/net/mana/rx.c index 513c542763..2f4d7e15f5 100644 --- a/drivers/net/mana/rx.c +++ b/drivers/net/mana/rx.c @@ -352,3 +352,108 @@ mana_start_rx_queues(struct rte_eth_dev *dev) mana_stop_rx_queues(dev); return ret; } + +uint16_t +mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) +{ + uint16_t pkt_received = 0, cqe_processed = 0; + struct mana_rxq *rxq = dpdk_rxq; + struct mana_priv *priv = rxq->priv; + struct gdma_comp comp; + struct rte_mbuf *mbuf; + int ret; + + while (pkt_received < pkts_n && + gdma_poll_completion_queue(&rxq->gdma_cq, &comp) == 1) { + struct mana_rxq_desc *desc; + struct mana_rx_comp_oob *oob = + (struct mana_rx_comp_oob *)&comp.completion_data[0]; + + if (comp.work_queue_number != rxq->gdma_rq.id) { + DRV_LOG(ERR, "rxq comp id mismatch wqid=0x%x rcid=0x%x", + comp.work_queue_number, rxq->gdma_rq.id); + rxq->stats.errors++; + break; + } + + desc = &rxq->desc_ring[rxq->desc_ring_tail]; + rxq->gdma_rq.tail += desc->wqe_size_in_bu; + mbuf = desc->pkt; + + switch (oob->cqe_hdr.cqe_type) { + case CQE_RX_OKAY: + /* Proceed to process mbuf */ + break; + + case CQE_RX_TRUNCATED: + DRV_LOG(ERR, "Drop a truncated packet"); + rxq->stats.errors++; + rte_pktmbuf_free(mbuf); + goto drop; + + case CQE_RX_COALESCED_4: + DRV_LOG(ERR, "RX coalescing is not supported"); + continue; + + default: + DRV_LOG(ERR, "Unknown RX CQE type %d", + oob->cqe_hdr.cqe_type); + continue; + } + + DRV_LOG(DEBUG, "mana_rx_comp_oob CQE_RX_OKAY rxq %p", rxq); + + mbuf->data_off = RTE_PKTMBUF_HEADROOM; + mbuf->nb_segs = 1; + mbuf->next = NULL; + mbuf->pkt_len = oob->packet_info[0].packet_length; + mbuf->data_len = oob->packet_info[0].packet_length; + mbuf->port = priv->port_id; + + if (oob->rx_ip_header_checksum_succeeded) + mbuf->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD; + + if (oob->rx_ip_header_checksum_failed) + mbuf->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD; + + if (oob->rx_outer_ip_header_checksum_failed) + mbuf->ol_flags |= RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD; + + if (oob->rx_tcp_checksum_succeeded || + oob->rx_udp_checksum_succeeded) + mbuf->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD; + + if (oob->rx_tcp_checksum_failed || + oob->rx_udp_checksum_failed) + mbuf->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_BAD; + + if (oob->rx_hash_type == MANA_HASH_L3 || + oob->rx_hash_type == MANA_HASH_L4) { + mbuf->ol_flags |= RTE_MBUF_F_RX_RSS_HASH; + mbuf->hash.rss = oob->packet_info[0].packet_hash; + } + + pkts[pkt_received++] = mbuf; + rxq->stats.packets++; + rxq->stats.bytes += mbuf->data_len; + +drop: + rxq->desc_ring_tail++; + if (rxq->desc_ring_tail >= rxq->num_desc) + rxq->desc_ring_tail = 0; + + cqe_processed++; + + /* Post another request */ + ret = mana_alloc_and_post_rx_wqe(rxq); + if (ret) { + DRV_LOG(ERR, "failed to post rx wqe ret=%d", ret); + break; + } + } + + if (cqe_processed) + mana_rq_ring_doorbell(rxq); + + return pkt_received; +} -- 2.17.1