On 10/15/2019 9:22 AM, Alfredo Cardigliano wrote:
> Add support for TX checksumming.
> 
> Signed-off-by: Alfredo Cardigliano <cardigli...@ntop.org>
> Reviewed-by: Shannon Nelson <snel...@pensando.io>

<...>

> +static void
> +ionic_tx_tcp_pseudo_csum(struct rte_mbuf *txm)
> +{
> +     struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(txm, struct ether_hdr *);
> +     char *l3_hdr = ((char *)eth_hdr) + txm->l2_len;
> +     struct rte_tcp_hdr *tcp_hdr = (struct rte_tcp_hdr *)
> +                     (l3_hdr + txm->l3_len);
> +
> +     if (txm->ol_flags & PKT_TX_IP_CKSUM) {
> +             struct rte_ipv4_hdr *ipv4_hdr = (struct rte_ipv4_hdr *)l3_hdr;
> +             ipv4_hdr->hdr_checksum = 0;
> +             tcp_hdr->cksum = 0;
> +             tcp_hdr->cksum = rte_ipv4_udptcp_cksum(ipv4_hdr, tcp_hdr);
> +     } else {
> +             struct rte_ipv6_hdr *ipv6_hdr = (struct rte_ipv6_hdr *)l3_hdr;
> +             tcp_hdr->cksum = 0;
> +             tcp_hdr->cksum = rte_ipv6_udptcp_cksum(ipv6_hdr, tcp_hdr);
> +     }
> +}
> +
> +static void
> +ionic_tx_tcp_inner_pseudo_csum(struct rte_mbuf *txm)
> +{
> +     struct ether_hdr *eth_hdr = rte_pktmbuf_mtod(txm, struct ether_hdr *);
> +     char *l3_hdr = ((char *)eth_hdr) + txm->outer_l2_len +
> +                     txm->outer_l3_len + txm->l2_len;
> +     struct rte_tcp_hdr *tcp_hdr = (struct rte_tcp_hdr *)
> +                     (l3_hdr + txm->l3_len);
> +
> +     if (txm->ol_flags & PKT_TX_IPV4) {
> +             struct rte_ipv4_hdr *ipv4_hdr = (struct rte_ipv4_hdr *)l3_hdr;
> +             ipv4_hdr->hdr_checksum = 0;
> +             tcp_hdr->cksum = 0;
> +             tcp_hdr->cksum = rte_ipv4_udptcp_cksum(ipv4_hdr, tcp_hdr);
> +     } else {
> +             struct rte_ipv6_hdr *ipv6_hdr = (struct rte_ipv6_hdr *)l3_hdr;
> +             tcp_hdr->cksum = 0;
> +             tcp_hdr->cksum = rte_ipv6_udptcp_cksum(ipv6_hdr, tcp_hdr);
> +     }
> +}

I think the intestion of 'tx_pkt_prepare' dev_ops is for above operations, if
you want to seperate these from regular Tx path, you can call them from
'tx_pkt_prepare', but if you need them always can keep as it is I think.


Reply via email to