diff mbox series

[API-NEXT,v4,10/11] linux-gen: packet: add flag for UDP-encapsulated IPsec packets

Message ID 1511575212-10926-11-git-send-email-odpbot@yandex.ru
State Superseded
Headers show
Series [API-NEXT,v4,1/11] validation: ipsec: add ipv4 name parts | expand

Commit Message

Github ODP bot Nov. 25, 2017, 2 a.m. UTC
From: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>


Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

---
/** Email created from pull request 304 (lumag:ipsec-ipv6-2)
 ** https://github.com/Linaro/odp/pull/304
 ** Patch: https://github.com/Linaro/odp/pull/304.patch
 ** Base sha: b95e7d08043ba45d12635c5afaa3fbf3a07ecc90
 ** Merge commit sha: 9985269a954a3e183d4f19860e20e4f9b497cfdf
 **/
 platform/linux-generic/include/odp/api/plat/packet_types.h | 1 +
 platform/linux-generic/odp_ipsec.c                         | 2 +-
 platform/linux-generic/odp_packet.c                        | 7 +++++++
 3 files changed, 9 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/platform/linux-generic/include/odp/api/plat/packet_types.h b/platform/linux-generic/include/odp/api/plat/packet_types.h
index 82fc66e53..128e83148 100644
--- a/platform/linux-generic/include/odp/api/plat/packet_types.h
+++ b/platform/linux-generic/include/odp/api/plat/packet_types.h
@@ -151,6 +151,7 @@  typedef union {
 
 		uint64_t l3_chksum_done:1; /**< L3 checksum validation done */
 		uint64_t l4_chksum_done:1; /**< L4 checksum validation done */
+		uint64_t ipsec_udp:1; /**< UDP-encapsulated IPsec packet */
 	};
 
 } _odp_packet_input_flags_t;
diff --git a/platform/linux-generic/odp_ipsec.c b/platform/linux-generic/odp_ipsec.c
index 0dffd98cf..31b5e687e 100644
--- a/platform/linux-generic/odp_ipsec.c
+++ b/platform/linux-generic/odp_ipsec.c
@@ -472,7 +472,7 @@  static int ipsec_in_esp_post(odp_packet_t pkt,
 				 ipsec_padding, esptrl.pad_len) != 0)
 		return -1;
 
-	if (udp_encap) {
+	if (_ODP_IPPROTO_UDP == state->ip_next_hdr) {
 		state->ip_hdr_len -= _ODP_UDPHDR_LEN;
 		state->in.hdr_len += _ODP_UDPHDR_LEN;
 	}
diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c
index bdcb482fa..6919c71aa 100644
--- a/platform/linux-generic/odp_packet.c
+++ b/platform/linux-generic/odp_packet.c
@@ -2141,6 +2141,13 @@  static inline void parse_udp(packet_parser_t *prs,
 	if (odp_unlikely(udplen < sizeof(_odp_udphdr_t)))
 		prs->error_flags.udp_err = 1;
 
+	if (odp_cpu_to_be_16(_ODP_UDP_IPSEC_PORT) == udp->dst_port &&
+	    udplen > 4 &&
+	    *(const uint32_t *)(udp + 1) != 0) {
+		prs->input_flags.ipsec = 1;
+		prs->input_flags.ipsec_udp = 1;
+	}
+
 	if (offset)
 		*offset   += sizeof(_odp_udphdr_t);
 	*parseptr += sizeof(_odp_udphdr_t);