[ovs-dev] [PATCH] dpif-netdev: Fix crash when PACKET_OUT is metered
Tony van der Peet
tony.vanderpeet at alliedtelesis.co.nz
Wed Jun 16 00:04:24 UTC 2021
From: Tony van der Peet <tony.vanderpeet at gmail.com>
When a PACKET_OUT has output port of OFPP_TABLE, and the rule
table includes a meter and this causes the packet to be deleted,
stop the packet from being deleted twice by cloning it and setting
it up to be stolen in execution.
Add a test to verify this condition.
Signed-off-by: Tony van der Peet <tony.vanderpeet at gmail.com>
---
lib/dpif-netdev.c | 9 ++++++---
tests/ofproto-dpif.at | 20 ++++++++++++++++++++
2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index 650e67ab3..d7dc815d8 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -4168,9 +4168,12 @@ dpif_netdev_execute(struct dpif *dpif, struct dpif_execute *execute)
flow_hash_5tuple(execute->flow, 0));
}
- dp_packet_batch_init_packet(&pp, execute->packet);
- pp.do_not_steal = true;
- dp_netdev_execute_actions(pmd, &pp, false, execute->flow,
+ /* Batch a copy of the packet for execution and expect this
+ * packet to be stolne.
+ */
+ dp_packet_batch_init_packet(&pp, dp_packet_clone(execute->packet));
+ pp.do_not_steal = false;
+ dp_netdev_execute_actions(pmd, &pp, true, execute->flow,
execute->actions, execute->actions_len);
dp_netdev_pmd_flush_output_packets(pmd, true);
diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
index 31064ed95..522cc1318 100644
--- a/tests/ofproto-dpif.at
+++ b/tests/ofproto-dpif.at
@@ -9520,6 +9520,26 @@ OFPST_TABLE reply (OF1.3) (xid=0x2):
OVS_VSWITCHD_STOP
AT_CLEANUP
+AT_SETUP([ofproto-dpif packet-out table meter drop])
+OVS_VSWITCHD_START
+add_of_ports br0 1 2
+
+AT_CHECK([ovs-ofctl -O OpenFlow13 add-meter br0 'meter=1 pktps bands=type=drop rate=1'])
+AT_CHECK([ovs-ofctl -O OpenFlow13 add-flow br0 'in_port=1 action=meter:1,output:2'])
+
+ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000400080000 actions=resubmit(,0)"
+ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000400080000 actions=resubmit(,0)"
+
+# Check that vswitchd hasn't crashed by dumping the meter added above
+AT_CHECK([ovs-ofctl -O OpenFlow13 dump-meters br0 | ofctl_strip], [0], [dnl
+OFPST_METER_CONFIG reply (OF1.3):
+meter=1 pktps bands=
+type=drop rate=1
+])
+
+OVS_VSWITCHD_STOP
+AT_CLEANUP
+
AT_SETUP([ofproto-dpif - ICMPv6])
OVS_VSWITCHD_START
add_of_ports br0 1
--
2.31.1
More information about the dev
mailing list