DPDK patches and discussions
 help / color / mirror / Atom feed
From: huichao cai <chcchc88@163.com>
To: dev@dpdk.org
Cc: konstantin.ananyev@intel.com, stable@dpdk.org
Subject: [dpdk-dev] [PATCH v2] ip_frag: fix fragmenting IPv4 fragment
Date: Sat,  9 Oct 2021 15:27:04 +0800	[thread overview]
Message-ID: <1633764424-17370-1-git-send-email-chcchc88@163.com> (raw)
In-Reply-To: <1632737174-86870-1-git-send-email-caihc1@chinatelecom.cn>

Current implementation of rte_ipv4_fragment_packet() doesn’t take
into account offset and flag values of the given packet, but blindly
assumes they are always zero (original packet is not fragmented).
According to RFC791, fragment and flag values for new fragment
should take into account values provided in the original IPv4 packet.

Fixes: 4c38e5532a07 ("ip_frag: refactor IPv4 fragmentation into a proper library")
Cc: stable@dpdk.org

Signed-off-by: huichao cai <chcchc88@163.com>
---
v2:
* Reword commit message.

 lib/ip_frag/rte_ipv4_fragmentation.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lib/ip_frag/rte_ipv4_fragmentation.c b/lib/ip_frag/rte_ipv4_fragmentation.c
index 2e7739d..fead5a9 100644
--- a/lib/ip_frag/rte_ipv4_fragmentation.c
+++ b/lib/ip_frag/rte_ipv4_fragmentation.c
@@ -75,7 +75,7 @@ static inline void __free_fragments(struct rte_mbuf *mb[], uint32_t num)
 	uint32_t out_pkt_pos, in_seg_data_pos;
 	uint32_t more_in_segs;
 	uint16_t fragment_offset, flag_offset, frag_size, header_len;
-	uint16_t frag_bytes_remaining;
+	uint16_t frag_bytes_remaining, not_last_frag;
 
 	/*
 	 * Formal parameter checking.
@@ -116,7 +116,9 @@ static inline void __free_fragments(struct rte_mbuf *mb[], uint32_t num)
 	in_seg = pkt_in;
 	in_seg_data_pos = header_len;
 	out_pkt_pos = 0;
-	fragment_offset = 0;
+	fragment_offset = (uint16_t)((flag_offset &
+	    RTE_IPV4_HDR_OFFSET_MASK) << RTE_IPV4_HDR_FO_SHIFT);
+	not_last_frag = (uint16_t)(flag_offset & IPV4_HDR_MF_MASK);
 
 	more_in_segs = 1;
 	while (likely(more_in_segs)) {
@@ -186,7 +188,8 @@ static inline void __free_fragments(struct rte_mbuf *mb[], uint32_t num)
 
 		__fill_ipv4hdr_frag(out_hdr, in_hdr, header_len,
 		    (uint16_t)out_pkt->pkt_len,
-		    flag_offset, fragment_offset, more_in_segs);
+		    flag_offset, fragment_offset,
+		    not_last_frag || more_in_segs);
 
 		fragment_offset = (uint16_t)(fragment_offset +
 		    out_pkt->pkt_len - header_len);
-- 
1.8.3.1


  parent reply	other threads:[~2021-10-09  7:27 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-27 10:06 [dpdk-dev] [PATCH] ip_frag: modify the fragment offset and mf huichao cai
2021-10-07 17:26 ` Ananyev, Konstantin
2021-10-08  8:05   ` 蔡慧超
2021-10-08  8:33     ` Ananyev, Konstantin
2021-10-08  9:37       ` 蔡慧超
2021-10-08 10:24         ` Ananyev, Konstantin
2021-10-09  7:27 ` huichao cai [this message]
2021-10-12 10:16   ` [dpdk-dev] [PATCH v2] ip_frag: fix fragmenting IPv4 fragment Ananyev, Konstantin
2021-10-13  6:53     ` 蔡慧超
2021-10-13  9:12       ` Ananyev, Konstantin
2021-10-13  9:50         ` 蔡慧超
2021-10-14  6:51     ` Thomas Monjalon
2021-10-13 21:11   ` [dpdk-dev] [dpdk-stable] " Thomas Monjalon
2021-10-14  3:30     ` 蔡慧超

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=1633764424-17370-1-git-send-email-chcchc88@163.com \
    --to=chcchc88@163.com \
    --cc=dev@dpdk.org \
    --cc=konstantin.ananyev@intel.com \
    --cc=stable@dpdk.org \
    /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).