It is possible for a frag list to partially expire, but for the final fragment to arrive before expiry is complete. Now check the sent index before adding another packet to a frag list.
Reported-at: https://issues.redhat.com/browse/FDP-1428 Signed-off-by: Mike Pattrick <m...@redhat.com> --- nb: As an alternative, the "ipf: Don't send expired frags." patch could be backported to 3.1 --- lib/ipf.c | 10 +++++-- tests/ofproto-dpif.at | 67 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/lib/ipf.c b/lib/ipf.c index 33f1defcd..8da8e1b13 100644 --- a/lib/ipf.c +++ b/lib/ipf.c @@ -812,9 +812,15 @@ ipf_process_frag(struct ipf *ipf, struct ipf_list *ipf_list, struct reassembled_pkt **rp) OVS_REQUIRES(ipf->ipf_lock) { - bool duped_frag = ipf_is_frag_duped(ipf_list->frag_list, - ipf_list->last_inuse_idx, start_data_byte, end_data_byte); int last_inuse_idx = ipf_list->last_inuse_idx; + bool duped_frag = false; + + /* Count the packet as a dup if it's arrived after starting to send packets. */ + if (ipf_list->last_sent_idx != IPF_INVALID_IDX || + ipf_is_frag_duped(ipf_list->frag_list, ipf_list->last_inuse_idx, + start_data_byte, end_data_byte)) { + duped_frag = true; + } if (!duped_frag) { if (last_inuse_idx < ipf_list->size - 1) { diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index 3d84618b3..75c1806bb 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -5632,6 +5632,73 @@ recirc(),in_port(90),packet_type(ns=0,id=0),eth_type(0x0800),ipv4(proto=6,frag=l OVS_VSWITCHD_STOP AT_CLEANUP +AT_SETUP([ofproto-dpif - fragment handling - expired]) +OVS_VSWITCHD_START +add_of_ports br0 1 2 90 + +AT_DATA([flows.txt], [dnl +table=0 ip actions=ct(commit, table=1, zone=40) +table=1 ip actions=2 +]) +AT_CHECK([ovs-ofctl -O OpenFlow11 replace-flows br0 flows.txt]) + +AT_CHECK([ovs-appctl time/stop]) + +zero210=$(printf '0%.0s' $(seq 420)) +zero80=$(printf '0%.0s' $(seq 160)) + +dnl Generated by: fragment(Ether(src="aa:aa:aa:aa:aa:aa", dst="bb:bb:bb:bb:bb:bb")/IP(src="1.1.1.1", dst="2.2.2.2", id=1)/UDP(sport=1,dport=2)/("\x00"*60000)) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001200040114f0b010101010202020200010002ea6825140000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000120b940114e52010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001217240114d99010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001222b40114ce0010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000122e440114c27010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001239d40114b6e010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001245640114ab5010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001250f401149fc010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000125c840114943010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000126814011488a010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001273a401147d1010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000127f340114718010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000128ac4011465f010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012965401145a6010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012a1e401144ed010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012ad740114434010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012b904011437b010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012c49401142c2010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012d0240114209010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012dbb40114150010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012e7440114097010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012f2d40113fde010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00012fe640113f25010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001309f40113e6c010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001315840113db3010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001321140113cfa010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000132ca40113c41010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001338340113b88010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001343c40113acf010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000134f540113a16010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000135ae4011395d010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00013667401138a4010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00013720401137eb010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc000137d940113732010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001389240113679010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc0001394b401135c0010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00013a0440113507010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00013abd4011344e010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00013b7640113395010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa0800450005dc00013c2f401132dc010101010202020200000000000000000000${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}${zero210}"]) + +AT_CHECK([ovs-appctl time/warp 15001], [0], [ignore]) + +dnl Send an unrelated non-frag +AT_CHECK([ovs-appctl netdev-dummy/receive p90 "eth(src=40:44:44:44:00:00,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=6,tos=0,ttl=64,frag=no)"]) + +AT_CHECK([ovs-appctl netdev-dummy/receive p1 "bbbbbbbbbbbbaaaaaaaaaaaa08004500033c00011ce8401154c30101010102020202000000000000000000000000000000000000${zero210}${zero210}${zero210}${zero80}${zero80}"]) + +OVS_VSWITCHD_STOP +AT_CLEANUP + AT_SETUP([ofproto-dpif - handling of malformed TCP packets]) OVS_VSWITCHD_START add_of_ports br0 1 90 -- 2.49.0 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev