DPDK patches and discussions
 help / color / mirror / Atom feed
From: Akhil Goyal <akhil.goyal@nxp.com>
To: <dev@dpdk.org>
Cc: <pablo.de.lara.guarch@intel.com>, <hemant.agrawal@nxp.com>,
	<radu.nicolau@intel.com>, Akhil Goyal <akhil.goyal@nxp.com>
Subject: [dpdk-dev] [PATCH] examples/ipsec-secgw: update incremental checksum
Date: Mon, 15 Jan 2018 18:12:12 +0530	[thread overview]
Message-ID: <20180115124212.7011-1-akhil.goyal@nxp.com> (raw)

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.goyal@nxp.com>
---
 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;
-- 
2.9.3

             reply	other threads:[~2018-01-15 12:46 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-15 12:42 Akhil Goyal [this message]
2018-01-15 12:48 ` Akhil Goyal
2018-01-15 14:40   ` Nicolau, Radu
2018-01-16  6:29     ` Akhil Goyal
2018-01-16 10:56       ` Nicolau, Radu
2018-01-16 17:17         ` De Lara Guarch, Pablo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180115124212.7011-1-akhil.goyal@nxp.com \
    --to=akhil.goyal@nxp.com \
    --cc=dev@dpdk.org \
    --cc=hemant.agrawal@nxp.com \
    --cc=pablo.de.lara.guarch@intel.com \
    --cc=radu.nicolau@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).