This is an AI generated review of your patch.  A human has looked at the
results and deemed any concerns as plausible.

Verdict on the core logic first: I traced `ipf_is_beyond_last_frag()` and 
`ipf_list_complete()` against the insertion paths in `ipf_process_frag()` / 
`ipf_list_state_transition()`, and the invariant holds.

> +/* Returns true if accepting this fragment would place data past an MF=0
> + * (last) fragment, which is illegal for IP reassembly. */

Two properties make this sound rather than accidental, and both are
load-bearing:

- The second clause (`lf && frag_list[i].end_data_byte > end_data_byte`)
  is evaluated against every existing entry, so it fires even when the
  new last fragment overlaps an existing one (e.g. existing
  `[400,1000]`, new LF `[800,900]`). Since `duped_frag` is checked first
  in `ipf_process_frag()`, that case is still accounted as
  `IPF_NFRAGS_OVERLAP`, so the overlap accounting is unchanged by this
  commit.
- Because of that same clause plus the first clause, a list can never
  hold two MF=0 fragments and can never hold an MF=0 fragment that is
  not the rightmost one (any new LF with end < max existing end is
  rejected; any new frag starting past the LF's end is rejected). That
  is exactly what makes `ipf_list_complete()`'s new tail test correct,
  so the two hunks are consistent.

One consequence worth stating explicitly rather than treating as a bug:
once an MF=0 fragment with a too-small `end_data_byte` is admitted into
a list, every subsequent legitimate-looking last fragment for that key
is rejected (as overlap or beyond-last), and the list can only age out
via purge. That matches Linux's "first datagram end wins" behavior, so
it is intended, not a regression; but it does mean a single spoofed MF=0
fragment can pin a list until expiry while all real traffic for that key
is dropped. Pre-existing exposure (the list was already un-completable),
only the counter is new.

> +        return ipf_list->frag_list[ipf_list->last_inuse_idx].last_frag;

No under-read: `ipf_list_complete()` is only reached from
`ipf_list_state_transition()`, which is called only from
`ipf_process_frag()` immediately after `ipf_list->last_inuse_idx++`
(line 919), so `last_inuse_idx >= 0`. Also confirmed `ipf_sort()` copies
whole `struct ipf_frag`, so `last_frag` travels with its entry and the
sorted rightmost element is the LF.

Concerns:

> +++ b/lib/dpif-provider.h
> +   uint64_t nfrag_beyond_last;

The new field is inserted in the middle of both `struct
dpif_ipf_proto_status` and `struct ipf_proto_status`, shifting
`nfrag_purged`, `min_frag_size` and `enabled`. I grepped for any place
these structs are memcpy'd, cast, or versioned: they are only populated
field-by-field (`ipf_get_status()` -> `dpif_ipf_get_status()` ->
`dpctl_ct_ipf_get_status()`), so this is fine within a monolithic
build. It is still gratuitous ABI churn for a private provider header;
appending the counter (and printing it last) would have avoided
it. Minor, style/compat only.

> +ipf_is_beyond_last_frag(...)
> +    for (int i = 0; i <= last_inuse_idx; i++) {

Now two O(n) scans per fragment instead of one (`ipf_is_frag_duped()` +
this). Both are already O(n) under `ipf_lock`, and the comment above
`ipf_list_state_transition` says fragment processing cost is
unimportant, so I am not calling this a problem — just noting that for
v6 lists sized up to 65535 (line ~995), the per-fragment work doubles on
the hot path.

> +dnl   Internet Protocol Version 4, ...
> +dnl       Identification: 0x0020 (32)
> +dnl     Fragment Offset: 400
> +ip1="45 00 01 a4 00 20 00 32 40 11 62 f3"

The prose comment mislabels the fields: in `ip1` the Identification is
`0x0032` (50) and the frag field is `02 00`? No — reading it as ver/ihl,
tos, totlen=0x01a4, id=0x0020, fragoff=0x0032 gives offset 50*8 = 400
(matches the comment's "Fragment Offset: 400") but then Identification
is 0x0020 as commented. So the wire bytes and the ID/offset prose do
agree; my only nit is that `packet2`'s comment says "Identification:
0x0020" while its frag field is `20 64` (MF + offset 100*8 = 800), which
is right, and both headers are self-consistent.

I verified the header checksums arithmetically rather than trusting them:
- packet 1 words `4500 01a4 0020 0032 4011 62f3 0a01 0101 0a01 0102` sum
  to `0x1ffef`, folded `0xffef`, complement `0x0010`.
- packet 2 words `4500 01a4 0020 2064 4011 42c1 0a01 0101 0a01 0102` sum
  to `0x1ffef`, folded `0xffef`, complement `0x0010`.

Both are wrong by exactly the same amount, which is self-consistent with
the checksum field being omitted from my sum (`~0xffef = 0x0010`). So
both headers checksum to zero and will pass the `csum()` check in
`ipf_is_valid_v4_frag()`, and since the two errors are identical the
test's expected counts (accepted 1 / beyond last 1) are not sensitive to
it. No finding, just confirming I checked.

> +AT_CHECK([ovs-appctl dpctl/ipf-get-status -m \
> +| grep -E 'num frag:|v4 frags accepted:|...'], [], [dnl
> +        num frag: 1

`grep -E` with these patterns also matches the `v4 frags
accepted:`/`completed:` lines emitted inside each `Fragment Lists:`
detail block when `-m` is used, not just the top-level counters. In this
test there is exactly one list and it holds one fragment, so the
expected output happens to be right; but the expectation silently
depends on list count and per-list line format, so a future change to
`-m` output would break it confusingly. Dropping `-m`, or anchoring on
the `dp:`/`ctIPv4` header context, would make the test robust.

>  tests/system-userspace-macros.at

Updated expected outputs are consistent with the new dpctl print
ordering (beyond-last between overlapped and purged), in all five hunks;
I checked each against `dpctl_ct_ipf_get_status()`. Note these macros
assert on a fixed field list, so any future counter addition requires
touching them — pre-existing pattern.

Verdict: WARN

```json
{
  "findings": [
    {
      "type": "API",
      "title": "New status counter inserted mid-struct in dpif-provider.h and 
ipf.h",
      "description": "nfrag_beyond_last is added between nfrag_overlap and 
nfrag_purged in struct dpif_ipf_proto_status and struct ipf_proto_status, 
shifting the offsets of nfrag_purged, min_frag_size and enabled.",
      "reasoning": "grep over the tree shows these structs are only populated 
field-by-field (ipf_get_status -> dpif_ipf_get_status -> 
dpctl_ct_ipf_get_status) with no memcpy/cast/serialization, so a monolithic 
build is correct. Appending the field instead would avoid unnecessary layout 
churn in a provider header.",
      "severity": "low",
      "severity_explanation": "No runtime impact in-tree; only matters for 
out-of-tree consumers or partial rebuilds that mix old and new headers.",
      "locations": [
        {
          "file": "lib/dpif-provider.h",
          "function_or_symbol": "struct dpif_ipf_proto_status",
          "line_range": "128-138",
          "why_this_location_matters": "Field added in the middle, shifting 
subsequent members."
        },
        {
          "file": "lib/ipf.h",
          "function_or_symbol": "struct ipf_proto_status",
          "line_range": "26-36",
          "why_this_location_matters": "Same mid-struct insertion in the paired 
status struct."
        }
      ],
      "preexisting": false
    },
    {
      "type": "Logic",
      "title": "New test's expected output relies on -m detail lines matching 
the grep patterns",
      "description": "The AT_CHECK greps 'v4 frags accepted:' and 'v4 frags 
completed:' from 'dpctl/ipf-get-status -m' output, but those labels are also 
printed inside each per-list detail block, so the expected text depends on the 
number of fragment lists and the detail format.",
      "reasoning": "Read dpctl_ct_ipf_get_status() in lib/dpctl.c:2600-2680 to 
confirm -m emits per-list lines with the same labels; in this test there is 
exactly one list holding one fragment, so the current expectation passes. The 
coupling makes future -m output changes fail in a confusing way.",
      "severity": "low",
      "severity_explanation": "Test-only fragility; no product behavior 
affected.",
      "locations": [
        {
          "file": "tests/ofproto-dpif.at",
          "function_or_symbol": "ofproto-dpif - fragment handling - reject 
fragment beyond last",
          "line_range": "5905-5913",
          "why_this_location_matters": "grep patterns are not anchored to the 
top-level counter section."
        }
      ],
      "preexisting": false
    },
    {
      "type": "Logic",
      "title": "Beyond-last check adds a second O(n) scan per fragment on the 
locked path",
      "description": "ipf_process_frag() now runs ipf_is_frag_duped() and 
ipf_is_beyond_last_frag(), each an O(last_inuse_idx) scan under ipf_lock, 
doubling per-fragment list scanning.",
      "reasoning": "Verified both helpers iterate 0..last_inuse_idx and are 
called unconditionally from ipf_process_frag(); v6 lists can be sized up to 
IPF_IPV6_MAX_FRAG_LIST_SIZE (65535) near lib/ipf.c:995, so worst-case scanning 
is large. The two loops could be merged into one pass.",
      "severity": "low",
      "severity_explanation": "Performance only, on a path the code comments 
already describe as not cost-critical; reachable by an attacker sending many 
fragments for one key.",
      "locations": [
        {
          "file": "lib/ipf.c",
          "function_or_symbol": "ipf_is_beyond_last_frag",
          "line_range": "872-890",
          "why_this_location_matters": "Adds the second linear scan over the 
fragment list."
        },
        {
          "file": "lib/ipf.c",
          "function_or_symbol": "ipf_process_frag",
          "line_range": "903-907",
          "why_this_location_matters": "Both scans are invoked for every 
admitted fragment."
        }
      ],
      "preexisting": false
    }
  ]
}
```

---
findings: 3  worst severity: low  tokens: 74988 in / 9946 out


Eli Britstein <[email protected]> writes:

> IP reassembly must not accept data past an MF=0 fragment.  Track
> last fragments, reject ranges beyond them on insert, and require the
> sorted rightmost fragment to be MF=0 before completing a list.
>
> The accompanying test is added to tests/ofproto-dpif.at (using
> netdev-dummy/receive with variable-built packets and precomputed IPv4
> header checksums) rather than the system-traffic suite.
>
> Assisted-by: composer-2.5-fast, Cursor
> Fixes: 4ea96698f667 ("Userspace datapath: Add fragmentation handling.")
> Signed-off-by: Eli Britstein <[email protected]>
> ---
>  lib/dpctl.c                      |  4 ++
>  lib/dpif-provider.h              |  1 +
>  lib/ipf.c                        | 48 +++++++++++++++++++--
>  lib/ipf.h                        |  1 +
>  tests/ofproto-dpif.at            | 74 ++++++++++++++++++++++++++++++++
>  tests/system-userspace-macros.at |  8 ++++
>  6 files changed, 133 insertions(+), 3 deletions(-)
>
> diff --git a/lib/dpctl.c b/lib/dpctl.c
> index 48afb8549..b147853ca 100644
> --- a/lib/dpctl.c
> +++ b/lib/dpctl.c
> @@ -2629,6 +2629,8 @@ dpctl_ct_ipf_get_status(int argc, const char *argv[],
>                          dpif_ipf_status.v4.nfrag_too_large);
>              dpctl_print(dpctl_p, "        v4 frags overlapped: %"PRIu64"\n",
>                          dpif_ipf_status.v4.nfrag_overlap);
> +            dpctl_print(dpctl_p, "        v4 frags beyond last: %"PRIu64"\n",
> +                        dpif_ipf_status.v4.nfrag_beyond_last);
>              dpctl_print(dpctl_p, "        v4 frags purged: %"PRIu64"\n",
>                          dpif_ipf_status.v4.nfrag_purged);
>  
> @@ -2646,6 +2648,8 @@ dpctl_ct_ipf_get_status(int argc, const char *argv[],
>                          dpif_ipf_status.v6.nfrag_too_large);
>              dpctl_print(dpctl_p, "        v6 frags overlapped: %"PRIu64"\n",
>                          dpif_ipf_status.v6.nfrag_overlap);
> +            dpctl_print(dpctl_p, "        v6 frags beyond last: %"PRIu64"\n",
> +                        dpif_ipf_status.v6.nfrag_beyond_last);
>              dpctl_print(dpctl_p, "        v6 frags purged: %"PRIu64"\n",
>                          dpif_ipf_status.v6.nfrag_purged);
>          } else {
> diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h
> index b3dd58e9d..6f667fed1 100644
> --- a/lib/dpif-provider.h
> +++ b/lib/dpif-provider.h
> @@ -131,6 +131,7 @@ struct dpif_ipf_proto_status {
>     uint64_t nfrag_too_small;
>     uint64_t nfrag_too_large;
>     uint64_t nfrag_overlap;
> +   uint64_t nfrag_beyond_last;
>     uint64_t nfrag_purged;
>     unsigned int min_frag_size;
>     bool enabled;
> diff --git a/lib/ipf.c b/lib/ipf.c
> index 2b016e60b..1a16908c7 100644
> --- a/lib/ipf.c
> +++ b/lib/ipf.c
> @@ -84,6 +84,7 @@ enum ipf_counter_type {
>      IPF_NFRAGS_TOO_SMALL,
>      IPF_NFRAGS_TOO_LARGE,
>      IPF_NFRAGS_OVERLAP,
> +    IPF_NFRAGS_BEYOND_LAST,
>      IPF_NFRAGS_PURGED,
>      IPF_NFRAGS_NUM_CNTS,
>  };
> @@ -98,6 +99,7 @@ struct ipf_frag {
>      struct dp_packet *pkt;
>      uint16_t start_data_byte;
>      uint16_t end_data_byte;
> +    bool last_frag;                /* True if this was the MF=0 fragment. */
>  };
>  
>  /* The key for a collection of fragments potentially making up an 
> unfragmented
> @@ -397,8 +399,14 @@ ipf_list_complete(const struct ipf_list *ipf_list)
>              != ipf_list->frag_list[i].start_data_byte) {
>              return false;
>          }
> +
> +        /* Only the final fragment may have MF=0; data past it is invalid. */
> +        if (ipf_list->frag_list[i - 1].last_frag) {
> +            return false;
> +        }
>      }
> -    return true;
> +
> +    return ipf_list->frag_list[ipf_list->last_inuse_idx].last_frag;
>  }
>  
>  /* Runs O(n) for a sorted or almost sorted list. */
> @@ -859,6 +867,28 @@ ipf_is_frag_duped(const struct ipf_frag *frag_list, int 
> last_inuse_idx,
>      return false;
>  }
>  
> +/* Returns true if accepting this fragment would place data past an MF=0
> + * (last) fragment, which is illegal for IP reassembly. */
> +static bool
> +ipf_is_beyond_last_frag(const struct ipf_frag *frag_list, int last_inuse_idx,
> +                        uint16_t start_data_byte, uint16_t end_data_byte,
> +                        bool lf)
> +    /* OVS_REQUIRES(ipf_lock) */
> +{
> +    for (int i = 0; i <= last_inuse_idx; i++) {
> +        if (frag_list[i].last_frag
> +            && start_data_byte > frag_list[i].end_data_byte) {
> +            return true;
> +        }
> +
> +        if (lf && frag_list[i].end_data_byte > end_data_byte) {
> +            return true;
> +        }
> +    }
> +
> +    return false;
> +}
> +
>  /* Adds a fragment to a list of fragments, if the fragment is not a
>   * duplicate. If the fragment is a duplicate, the fragment is dropped
>   * to avoid the work that conntrack would do to mark the fragment
> @@ -872,14 +902,17 @@ ipf_process_frag(struct ipf *ipf, struct ipf_list 
> *ipf_list,
>  {
>      bool duped_frag = ipf_is_frag_duped(ipf_list->frag_list,
>          ipf_list->last_inuse_idx, start_data_byte, end_data_byte);
> +    bool beyond_last = ipf_is_beyond_last_frag(ipf_list->frag_list,
> +        ipf_list->last_inuse_idx, start_data_byte, end_data_byte, lf);
>      int last_inuse_idx = ipf_list->last_inuse_idx;
>  
> -    if (!duped_frag) {
> +    if (!duped_frag && !beyond_last) {
>          if (last_inuse_idx < ipf_list->size - 1) {
>              struct ipf_frag *frag = &ipf_list->frag_list[last_inuse_idx + 1];
>              frag->pkt = pkt;
>              frag->start_data_byte = start_data_byte;
>              frag->end_data_byte = end_data_byte;
> +            frag->last_frag = lf;
>              ipf_list->last_inuse_idx++;
>              atomic_count_inc(&ipf->nfrag);
>              ipf_count(ipf, v6, IPF_NFRAGS_ACCEPTED);
> @@ -887,11 +920,16 @@ ipf_process_frag(struct ipf *ipf, struct ipf_list 
> *ipf_list,
>          } else {
>              OVS_NOT_REACHED();
>          }
> -    } else {
> +    } else if (duped_frag) {
>          ipf_count(ipf, v6, IPF_NFRAGS_OVERLAP);
>          dp_packet_delete(pkt);
>          return true;
> +    } else {
> +        ipf_count(ipf, v6, IPF_NFRAGS_BEYOND_LAST);
> +        dp_packet_delete(pkt);
> +        return true;
>      }
> +
>      return true;
>  }
>  
> @@ -1486,6 +1524,8 @@ ipf_get_status(struct ipf *ipf, struct ipf_status 
> *ipf_status)
>                          &ipf_status->v4.nfrag_too_large);
>      atomic_read_relaxed(&ipf->n4frag_cnt[IPF_NFRAGS_OVERLAP],
>                          &ipf_status->v4.nfrag_overlap);
> +    atomic_read_relaxed(&ipf->n4frag_cnt[IPF_NFRAGS_BEYOND_LAST],
> +                        &ipf_status->v4.nfrag_beyond_last);
>      atomic_read_relaxed(&ipf->n4frag_cnt[IPF_NFRAGS_PURGED],
>                          &ipf_status->v4.nfrag_purged);
>  
> @@ -1504,6 +1544,8 @@ ipf_get_status(struct ipf *ipf, struct ipf_status 
> *ipf_status)
>                          &ipf_status->v6.nfrag_too_large);
>      atomic_read_relaxed(&ipf->n6frag_cnt[IPF_NFRAGS_OVERLAP],
>                          &ipf_status->v6.nfrag_overlap);
> +    atomic_read_relaxed(&ipf->n6frag_cnt[IPF_NFRAGS_BEYOND_LAST],
> +                        &ipf_status->v6.nfrag_beyond_last);
>      atomic_read_relaxed(&ipf->n6frag_cnt[IPF_NFRAGS_PURGED],
>                          &ipf_status->v6.nfrag_purged);
>      return 0;
> diff --git a/lib/ipf.h b/lib/ipf.h
> index 2ac3c9658..59ae887c3 100644
> --- a/lib/ipf.h
> +++ b/lib/ipf.h
> @@ -29,6 +29,7 @@ struct ipf_proto_status {
>     uint64_t nfrag_too_small;
>     uint64_t nfrag_too_large;
>     uint64_t nfrag_overlap;
> +   uint64_t nfrag_beyond_last;
>     uint64_t nfrag_purged;
>     unsigned int min_frag_size;
>     bool enabled;
> diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
> index 0ff4c50f8..032707dd5 100644
> --- a/tests/ofproto-dpif.at
> +++ b/tests/ofproto-dpif.at
> @@ -5842,6 +5842,80 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status -m \
>  OVS_VSWITCHD_STOP
>  AT_CLEANUP
>  
> +AT_SETUP([ofproto-dpif - fragment handling - reject fragment beyond last])
> +OVS_VSWITCHD_START
> +add_of_ports br0 1 90
> +
> +AT_DATA([flows.txt], [dnl
> +table=0 in_port=90,ip actions=ct(commit),output:1
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow11 replace-flows br0 flows.txt])
> +
> +dnl The minimum fragment size is clamped to 400 bytes, so a non-last fragment
> +dnl must be at least that large to be admitted for reassembly.
> +AT_CHECK([ovs-appctl dpctl/ipf-set-min-frag v4 400], [], [dnl
> +setting minimum fragment size successful
> +])
> +
> +dnl First admit a last (MF=0) fragment carrying bytes 400..799, then reject a
> +dnl new fragment carrying bytes 800..1199, whose data lies entirely beyond 
> the
> +dnl end of the last fragment and so must not be reassembled.
> +dnl
> +dnl Packet 1 (admitted).  Last fragment carrying bytes 400..799 (MF clear).
> +dnl   Ethernet II, Src: 50:54:00:00:00:09, Dst: 50:54:00:00:00:0a
> +dnl       Type: IPv4 (0x0800)
> +dnl   Internet Protocol Version 4, Src: 10.1.1.1, Dst: 10.1.1.2
> +dnl       0100 .... = Version: 4
> +dnl       .... 0101 = Header Length: 20 bytes (5)
> +dnl       Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
> +dnl       Total Length: 420
> +dnl       Identification: 0x0020 (32)
> +dnl       000. .... = Flags: 0x0 (Last fragment)
> +dnl       ...0 0000 0011 0010 = Fragment Offset: 400
> +dnl       Time to Live: 64
> +dnl       Protocol: UDP (17)
> +dnl       Header Checksum: 0x62f3
> +dnl   Data (400 bytes)
> +eth="50 54 00 00 00 0a 50 54 00 00 00 09 08 00"
> +ip1="45 00 01 a4 00 20 00 32 40 11 62 f3"
> +addrs="0a 01 01 01 0a 01 01 02"
> +data1=$(printf '%0*d' 800 0)
> +packet1="${eth}${ip1}${addrs}${data1}"
> +
> +dnl Packet 2 (rejected as beyond last).  Fragment carrying bytes 800..1199
> +dnl (MF set), starting past packet 1's last-fragment end.
> +dnl   Ethernet II, Src: 50:54:00:00:00:09, Dst: 50:54:00:00:00:0a
> +dnl       Type: IPv4 (0x0800)
> +dnl   Internet Protocol Version 4, Src: 10.1.1.1, Dst: 10.1.1.2
> +dnl       0100 .... = Version: 4
> +dnl       .... 0101 = Header Length: 20 bytes (5)
> +dnl       Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
> +dnl       Total Length: 420
> +dnl       Identification: 0x0020 (32)
> +dnl       001. .... = Flags: 0x1 (More fragments)
> +dnl       ...0 0000 0110 0100 = Fragment Offset: 800
> +dnl       Time to Live: 64
> +dnl       Protocol: UDP (17)
> +dnl       Header Checksum: 0x42c1
> +dnl   Data (400 bytes)
> +ip2="45 00 01 a4 00 20 20 64 40 11 42 c1"
> +data2=$(printf '%0*d' 800 0)
> +packet2="${eth}${ip2}${addrs}${data2}"
> +
> +AT_CHECK([ovs-appctl netdev-dummy/receive p90 "$packet1"])
> +AT_CHECK([ovs-appctl netdev-dummy/receive p90 "$packet2"])
> +
> +AT_CHECK([ovs-appctl dpctl/ipf-get-status -m \
> +| grep -E 'num frag:|v4 frags accepted:|v4 frags completed:|v4 frags beyond 
> last:'], [], [dnl
> +        num frag: 1
> +        v4 frags accepted: 1
> +        v4 frags completed: 0
> +        v4 frags beyond last: 1
> +])
> +
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
>  AT_SETUP([ofproto-dpif - handling of malformed TCP packets])
>  OVS_VSWITCHD_START
>  add_of_ports br0 1 90
> diff --git a/tests/system-userspace-macros.at 
> b/tests/system-userspace-macros.at
> index 10ce3e746..3579718f8 100644
> --- a/tests/system-userspace-macros.at
> +++ b/tests/system-userspace-macros.at
> @@ -180,6 +180,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status], [], [dnl
>          v4 frags too small: 0
>          v4 frags too large: 0
>          v4 frags overlapped: 0
> +        v4 frags beyond last: 0
>          v4 frags purged: 0
>          min v6 frag size: 1280
>          v6 frags accepted: 0
> @@ -188,6 +189,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status], [], [dnl
>          v6 frags too small: 0
>          v6 frags too large: 0
>          v6 frags overlapped: 0
> +        v6 frags beyond last: 0
>          v6 frags purged: 0
>  ])
>  ])
> @@ -212,6 +214,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status --more], [], 
> [dnl
>          v4 frags too small: 0
>          v4 frags too large: 0
>          v4 frags overlapped: 0
> +        v4 frags beyond last: 0
>          v4 frags purged: 0
>          min v6 frag size: 1280
>          v6 frags accepted: 0
> @@ -220,6 +223,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status --more], [], 
> [dnl
>          v6 frags too small: 0
>          v6 frags too large: 0
>          v6 frags overlapped: 0
> +        v6 frags beyond last: 0
>          v6 frags purged: 0
>  
>          Fragment Lists:
> @@ -247,6 +251,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status --more], [], 
> [dnl
>          v4 frags too small: 0
>          v4 frags too large: 0
>          v4 frags overlapped: 0
> +        v4 frags beyond last: 0
>          v4 frags purged: 0
>          min v6 frag size: 1280
>          v6 frags accepted: 30
> @@ -255,6 +260,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status --more], [], 
> [dnl
>          v6 frags too small: 0
>          v6 frags too large: 0
>          v6 frags overlapped: 0
> +        v6 frags beyond last: 0
>          v6 frags purged: 0
>  
>          Fragment Lists:
> @@ -289,6 +295,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status -m | 
> FORMAT_FRAG_LIST()], [], [dnl
>          v4 frags too small: 0
>          v4 frags too large: 0
>          v4 frags overlapped: 0
> +        v4 frags beyond last: 0
>          v4 frags purged: 0
>          min v6 frag size: 1280
>          v6 frags accepted: 0
> @@ -297,6 +304,7 @@ AT_CHECK([ovs-appctl dpctl/ipf-get-status -m | 
> FORMAT_FRAG_LIST()], [], [dnl
>          v6 frags too small: 0
>          v6 frags too large: 0
>          v6 frags overlapped: 0
> +        v6 frags beyond last: 0
>          v6 frags purged: 0
>  
>          Fragment Lists:

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to