diff mbox series

[API-NEXT,v3,2/2] linux-gen: pktio: dpdk: implement checksum insertion override

Message ID 1510563614-7352-3-git-send-email-odpbot@yandex.ru
State New
Headers show
Series [API-NEXT,v3,1/2] linux-gen: chksum: implement checksum insertion override functions | expand

Commit Message

Github ODP bot Nov. 13, 2017, 9 a.m. UTC
From: Bogdan Pricope <bogdan.pricope@linaro.org>


Add checksum insertion override functionality to dpdk pktio.
Override is applied based on L3/L4 checksum insert override output flags
from the packet.

Signed-off-by: Bogdan Pricope <bogdan.pricope@linaro.org>

---
/** Email created from pull request 245 (bogdanPricope:api_next_ovr_csum_ref_pr)
 ** https://github.com/Linaro/odp/pull/245
 ** Patch: https://github.com/Linaro/odp/pull/245.patch
 ** Base sha: a908a4dead95321e84d6a8a23de060051dcd8969
 ** Merge commit sha: 53e4dcc080039e61dbb9b6b46f7f06a8306631e0
 **/
 platform/linux-generic/pktio/dpdk.c | 41 +++++++++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 11 deletions(-)
diff mbox series

Patch

diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index 764ed37d4..99b79e32e 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -526,7 +526,11 @@  static inline uint16_t phdr_csum(odp_bool_t ipv4, void *l3_hdr,
 		return rte_ipv6_phdr_cksum(l3_hdr, ol_flags);
 }
 
+#define OL_TX_CHKSUM_PKT(_cfg, _capa, _proto, _ovr_set, _ovr) \
+	(_capa && _proto && (_ovr_set ? _ovr : _cfg))
+
 static inline void pkt_set_ol_tx(odp_pktout_config_opt_t *pktout_cfg,
+				 odp_pktout_config_opt_t *pktout_capa,
 				 odp_packet_hdr_t *pkt_hdr,
 				 struct rte_mbuf *mbuf,
 				 char *mbuf_data)
@@ -542,11 +546,21 @@  static inline void pkt_set_ol_tx(odp_pktout_config_opt_t *pktout_cfg,
 	if (check_proto(l3_hdr, &l3_proto_v4, &l4_proto))
 		return;
 
-	ipv4_chksum_pkt = pktout_cfg->bit.ipv4_chksum && l3_proto_v4;
-	udp_chksum_pkt =  pktout_cfg->bit.udp_chksum &&
-		(l4_proto == _ODP_IPPROTO_UDP);
-	tcp_chksum_pkt = pktout_cfg->bit.tcp_chksum &&
-			(l4_proto == _ODP_IPPROTO_TCP);
+	ipv4_chksum_pkt = OL_TX_CHKSUM_PKT(pktout_cfg->bit.ipv4_chksum,
+					   pktout_capa->bit.ipv4_chksum,
+					   l3_proto_v4,
+					   pkt_p->output_flags.l3_chksum_set,
+					   pkt_p->output_flags.l3_chksum);
+	udp_chksum_pkt =  OL_TX_CHKSUM_PKT(pktout_cfg->bit.udp_chksum,
+					   pktout_capa->bit.udp_chksum,
+					   (l4_proto == _ODP_IPPROTO_UDP),
+					   pkt_p->output_flags.l4_chksum_set,
+					   pkt_p->output_flags.l4_chksum);
+	tcp_chksum_pkt =  OL_TX_CHKSUM_PKT(pktout_cfg->bit.tcp_chksum,
+					   pktout_capa->bit.tcp_chksum,
+					   (l4_proto == _ODP_IPPROTO_TCP),
+					   pkt_p->output_flags.l4_chksum_set,
+					   pkt_p->output_flags.l4_chksum);
 
 	if (!ipv4_chksum_pkt && !udp_chksum_pkt && !tcp_chksum_pkt)
 			return;
@@ -589,6 +603,8 @@  static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry,
 	char *data;
 	uint16_t pkt_len;
 	odp_pktout_config_opt_t *pktout_cfg = &pktio_entry->s.config.pktout;
+	odp_pktout_config_opt_t *pktout_capa =
+		&pktio_entry->s.pkt_dpdk.capa.config.pktout;
 
 	if (odp_unlikely((rte_pktmbuf_alloc_bulk(pkt_dpdk->pkt_pool,
 						 mbuf_table, num)))) {
@@ -609,8 +625,8 @@  static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry,
 
 		odp_packet_copy_to_mem(pkt_table[i], 0, pkt_len, data);
 
-		if (pktout_cfg->all_bits)
-			pkt_set_ol_tx(pktout_cfg,
+		if (pktout_capa->all_bits)
+			pkt_set_ol_tx(pktout_cfg, pktout_capa,
 				      odp_packet_hdr(pkt_table[i]),
 				      mbuf_table[i], data);
 	}
@@ -702,6 +718,8 @@  static inline int pkt_to_mbuf_zero(pktio_entry_t *pktio_entry,
 {
 	pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk;
 	odp_pktout_config_opt_t *pktout_cfg = &pktio_entry->s.config.pktout;
+	odp_pktout_config_opt_t *pktout_capa =
+		&pktio_entry->s.pkt_dpdk.capa.config.pktout;
 	int i;
 	*copy_count = 0;
 
@@ -719,8 +737,8 @@  static inline int pkt_to_mbuf_zero(pktio_entry_t *pktio_entry,
 			       pkt_hdr->extra_type == PKT_EXTRA_TYPE_DPDK)) {
 			mbuf_update(mbuf, pkt_hdr, pkt_len);
 
-			if (pktout_cfg->all_bits)
-				pkt_set_ol_tx(pktout_cfg, pkt_hdr,
+			if (pktout_capa->all_bits)
+				pkt_set_ol_tx(pktout_cfg, pktout_capa, pkt_hdr,
 					      mbuf, odp_packet_data(pkt));
 		} else {
 			pool_t *pool_entry = pkt_hdr->buf_hdr.pool_ptr;
@@ -742,8 +760,9 @@  static inline int pkt_to_mbuf_zero(pktio_entry_t *pktio_entry,
 				mbuf_init((struct rte_mempool *)
 					  pool_entry->ext_desc, mbuf, pkt_hdr);
 				mbuf_update(mbuf, pkt_hdr, pkt_len);
-				if (pktout_cfg->all_bits)
-					pkt_set_ol_tx(pktout_cfg, pkt_hdr,
+				if (pktout_capa->all_bits)
+					pkt_set_ol_tx(pktout_cfg, pktout_capa,
+						      pkt_hdr,
 						      mbuf,
 						      odp_packet_data(pkt));
 			}