All of lore.kernel.org
 help / color / mirror / Atom feed
From: bugzilla@dpdk.org
To: dev@dpdk.org
Subject: [dpdk-dev] [Bug 835] Previous patch introduced bugs in rte_ipv4_fragment_packet functions
Date: Mon, 25 Oct 2021 07:44:39 +0000	[thread overview]
Message-ID: <bug-835-3@http.bugs.dpdk.org/> (raw)

https://bugs.dpdk.org/show_bug.cgi?id=835

            Bug ID: 835
           Summary: Previous patch introduced bugs in
                    rte_ipv4_fragment_packet functions
           Product: DPDK
           Version: unspecified
          Hardware: All
                OS: All
            Status: UNCONFIRMED
          Severity: critical
          Priority: High
         Component: other
          Assignee: dev@dpdk.org
          Reporter: chcchc88@163.com
                CC: konstantin.ananyev@intel.com
  Target Milestone: ---

Overview:
The patch 567473433b7e("ip_frag: fix fragmenting IPv4 fragment") introduces
a bug and needs to be rolled back. This is because the patch
and variables "flag_offset" conflict with each other.

>> 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);

"flag_offset" or “fofs” contains all the information about fragment,so this
patch is no longer needed.

flag_offset = rte_cpu_to_be_16(in_hdr->fragment_offset);

static inline void __fill_ipv4hdr_frag(struct rte_ipv4_hdr *dst,
                const struct rte_ipv4_hdr *src, uint16_t header_len,
                uint16_t len, uint16_t fofs, uint16_t dofs, uint32_t mf)
{
        rte_memcpy(dst, src, header_len);
        fofs = (uint16_t)(fofs + (dofs >> RTE_IPV4_HDR_FO_SHIFT));
        fofs = (uint16_t)(fofs | mf << RTE_IPV4_HDR_MF_SHIFT);
        dst->fragment_offset = rte_cpu_to_be_16(fofs);
        dst->total_length = rte_cpu_to_be_16(len);
        dst->hdr_checksum = 0;
}

Steps to Reproduce:
1) Use a fragment that is not the last fragment to test
rte_ipv4_fragment_packet function:MTU is 68,ip pkt_size is 104(not include ip
header len), MF is 1,fragment_offset is 13.
2) Start the test to see the fragmenting results: the values of fragment number
and fragment_offset.

Actual Results:
fragment number: 3
fragment_offset: 0x201A 0x2020 0x2026

Expected Results:
fragment number: 3
fragment_offset: 0x200D 0x2013 0x2019

Build Date & Hardware:
Build 2021-10-25 on Linux OS 3.10.0

-- 
You are receiving this mail because:
You are the assignee for the bug.

                 reply	other threads:[~2021-10-25  7:44 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=bug-835-3@http.bugs.dpdk.org/ \
    --to=bugzilla@dpdk.org \
    --cc=dev@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.