From: Gregory Etelson Date: Sun, 13 Mar 2022 09:01:23 +0000 (+0200) Subject: app/testpmd: fix GTP header parsing in checksum engine X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=a058de216ceb6581dac213d7a37d9fb9fad05a9b;p=dpdk.git app/testpmd: fix GTP header parsing in checksum engine GTP header can be followed by an optional 32 bits extension. GTP notifies about the extension presence through the E, S or PN header bits. Csum GTP header parser did not check the extension bits value. The patch updates GTP header length if at-least one of the extension bits is set. Fixes: d8e5e69f3a9b ("app/testpmd: add GTP parsing and Tx checksum offload") Cc: stable@dpdk.org Signed-off-by: Gregory Etelson Acked-by: Aman Singh --- diff --git a/app/test-pmd/csumonly.c b/app/test-pmd/csumonly.c index dbddd20a07..cdb1920763 100644 --- a/app/test-pmd/csumonly.c +++ b/app/test-pmd/csumonly.c @@ -223,15 +223,14 @@ parse_gtp(struct rte_udp_hdr *udp_hdr, gtp_hdr = (struct rte_gtp_hdr *)((char *)udp_hdr + sizeof(struct rte_udp_hdr)); - + if (gtp_hdr->e || gtp_hdr->s || gtp_hdr->pn) + gtp_len += sizeof(struct rte_gtp_hdr_ext_word); /* * Check message type. If message type is 0xff, it is * a GTP data packet. If not, it is a GTP control packet */ if (gtp_hdr->msg_type == 0xff) { - ip_ver = *(uint8_t *)((char *)udp_hdr + - sizeof(struct rte_udp_hdr) + - sizeof(struct rte_gtp_hdr)); + ip_ver = *(uint8_t *)((char *)gtp_hdr + gtp_len); ip_ver = (ip_ver) & 0xf0; if (ip_ver == RTE_GTP_TYPE_IPV4) {