From: Bogdan Pricope <bogdan.pric...@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.pric...@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: d22c949cc466bf28de559855a1cb525740578137
 ** Merge commit sha: 3ee6c4da5a3b375e5eb87b9e656668e4fd6c8d73
 **/
 platform/linux-generic/pktio/dpdk.c | 41 +++++++++++++++++++++++++++----------
 1 file changed, 30 insertions(+), 11 deletions(-)

diff --git a/platform/linux-generic/pktio/dpdk.c 
b/platform/linux-generic/pktio/dpdk.c
index 9782d60c4..301ca10cb 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -503,7 +503,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)
@@ -519,11 +523,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;
@@ -566,6 +580,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)))) {
@@ -586,8 +602,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);
        }
@@ -679,6 +695,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;
 
@@ -696,8 +714,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;
@@ -719,8 +737,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));
                        }

Reply via email to