> -----Original Message----- > From: Akhil Goyal [mailto:akhil.go...@nxp.com] > Sent: Monday, January 15, 2018 12:48 PM > To: dev@dpdk.org > Cc: De Lara Guarch, Pablo <pablo.de.lara.gua...@intel.com>; > hemant.agra...@nxp.com; Nicolau, Radu <radu.nico...@intel.com> > Subject: Re: [PATCH] examples/ipsec-secgw: update incremental checksum > > On 1/15/2018 6:12 PM, Akhil Goyal wrote: > > When TTL is decremented or ecn is updated in IP header before > > forwarding the packet, checksum needs to be updated. > > > > In this patch an incremental checksum is added for ipv4 case. > > > > Signed-off-by: Akhil Goyal <akhil.go...@nxp.com> > > --- > This patch is an update to a very old patch which was rejected earlier. > http://dpdk.org/dev/patchwork/patch/16113/ > > > examples/ipsec-secgw/ipip.h | 19 ++++++++++++++++++- > > 1 file changed, 18 insertions(+), 1 deletion(-) > > > > diff --git a/examples/ipsec-secgw/ipip.h b/examples/ipsec-secgw/ipip.h > > index fb6a6fa..13b8455 100644 > > --- a/examples/ipsec-secgw/ipip.h > > +++ b/examples/ipsec-secgw/ipip.h > > @@ -27,6 +27,10 @@ ipip_outbound(struct rte_mbuf *m, uint32_t offset, > uint32_t is_ipv6, > > if (inip4->ip_v == IPVERSION) { > > /* XXX This should be done by the forwarding engine instead > */ > > inip4->ip_ttl -= 1; > > + if (inip4->ip_sum >= rte_cpu_to_be_16(0xffff - 0x100)) > > + inip4->ip_sum += rte_cpu_to_be_16(0x100) + 1; > > + else > > + inip4->ip_sum += rte_cpu_to_be_16(0x100); > > ds_ecn = inip4->ip_tos; > > } else { > > inip6 = (struct ip6_hdr *)inip4; > > @@ -95,8 +99,17 @@ ip6ip_outbound(struct rte_mbuf *m, uint32_t offset, > > static inline void > > ip4_ecn_setup(struct ip *ip4) > > { > > - if (ip4->ip_tos & IPTOS_ECN_MASK) > > + if (ip4->ip_tos & IPTOS_ECN_MASK) { > > + unsigned long sum; > > + uint8_t old; > > + > > + old = ip4->ip_tos; > > ip4->ip_tos |= IPTOS_ECN_CE; > > + sum = old + (~(*(uint8_t *)&ip4->ip_tos) & 0xff); > > + sum += rte_be_to_cpu_16(ip4->ip_sum); > > + sum = (sum & 0xffff) + (sum >> 16); > > + ip4->ip_sum = rte_cpu_to_be_16(sum + (sum >> 16)); > > + } > > } > > > > static inline void > > @@ -140,6 +153,10 @@ ipip_inbound(struct rte_mbuf *m, uint32_t offset) > > ip4_ecn_setup(inip4); > > /* XXX This should be done by the forwarding engine instead > */ > > inip4->ip_ttl -= 1; > > + if (inip4->ip_sum >= rte_cpu_to_be_16(0xffff - 0x100)) > > + inip4->ip_sum += rte_cpu_to_be_16(0x100) + 1; > > + else > > + inip4->ip_sum += rte_cpu_to_be_16(0x100); > > m->packet_type &= ~RTE_PTYPE_L4_MASK; > > if (inip4->ip_p == IPPROTO_UDP) > > m->packet_type |= RTE_PTYPE_L4_UDP; > >
I think instead of manipulating the checksum in this way it will be better to use rte_ipv4_cksum to re-compute it, unless the performance penalty is too significant.