2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-22 09:58:01 +00:00

learning-switch: Fix coredump of OpenFlow15 learning-switch.

The OpenFlow15 Packet-Out message contains the match instead of the
in_port.  The flow.tunnel.metadata.tab is not inited but used in the
loop of tun_metadata_to_nx_match.

The coredump gdb backtrace is:
 0  memcpy_from_metadata (dst=0x2f060, src=0x30880, loc=0x10) at lib/tun-metadata.c:467
 1  metadata_loc_from_match_read (match=0x30598, is_masked=<..>,
                                  mask=0x30838, idx=0, map=0x0)
        at lib/tun-metadata.c:865
 2  metadata_loc_from_match_read (is_masked=<...>, mask=0x30838, idx=0,
                                  match=0x30598, map=0x0)
        at lib/tun-metadata.c:854
 3  tun_metadata_to_nx_match (b=0x892260, oxm=OFP15_VERSION, match=0x30598)
        at lib/tun-metadata.c:888
 4  nx_put_raw (b=0x892260, oxm=OFP15_VERSION, match=0x30598,
                cookie=<...>, cookie=0, cookie_mask=<...>, cookie_mask=0)
        at lib/nx-match.c:1186
 5  oxm_put_match (b=0x892260, match=0x30598, version=OFP15_VERSION)
        at lib/nx-match.c:1343
 6  ofputil_encode_packet_out (po=0x30580, protocol=<...>) at lib/ofp-packet.c:1226
 7  process_packet_in (sw=0x891d70, oh=<...>) at lib/learning-switch.c:619
 8  lswitch_process_packet (msg=0x892210, sw=0x891d70) at lib/learning-switch.c:374
 9  lswitch_run (sw=0x891d70) at lib/learning-switch.c:324
 10 main (argc=<...>, argv=<...>) at utilities/ovs-testcontroller.c:180

Fix that by initing the flow metadata.

Fixes: 35eb6326d5d0 ("ofp-util: Add flow metadata to ofputil_packet_out")
Signed-off-by: Faicker Mo <faicker.mo@ucloud.cn>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
Faicker Mo 2023-04-07 14:30:22 +08:00 committed by Ilya Maximets
parent 07c27226ee
commit 70ba6e97db
4 changed files with 27 additions and 1 deletions

View File

@ -569,6 +569,7 @@ process_packet_in(struct lswitch *sw, const struct ofp_header *oh)
}
/* Prepare packet_out in case we need one. */
match_init_catchall(&po.flow_metadata);
po.buffer_id = buffer_id;
if (buffer_id == UINT32_MAX) {
po.packet = dp_packet_data(&pkt);

View File

@ -110,7 +110,8 @@ TESTSUITE_AT = \
tests/mcast-snooping.at \
tests/packet-type-aware.at \
tests/nsh.at \
tests/drop-stats.at
tests/drop-stats.at \
tests/learning-switch.at
EXTRA_DIST += $(FUZZ_REGRESSION_TESTS)
FUZZ_REGRESSION_TESTS = \

23
tests/learning-switch.at Normal file
View File

@ -0,0 +1,23 @@
AT_BANNER([learning switch])
### -----------------------------------------------------------------
### learning switch OpenFlow15 test case
### -----------------------------------------------------------------
AT_SETUP([learning switch - OpenFlow15])
dnl Start ovs-testcontroller
AT_CHECK([ovs-testcontroller --no-chdir --detach punix:controller --pidfile -v ptcp:], [0], [ignore])
dnl Start ovs
OVS_VSWITCHD_START([dnl
set bridge br0 datapath_type=dummy \
protocols=OpenFlow15 -- \
add-port br0 p1 -- set Interface p1 type=dummy ofport_request=1 -- \
set-controller br0 tcp:127.0.0.1:6653])
AT_CHECK([
ovs-appctl netdev-dummy/receive p1 1e2ce92a669e3a6dd2099cab0800450000548a53400040011addc0a80a0ac0a80a1e08006f200a4d0001fc509a58000000002715020000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
], [0], [ignore])
AT_CHECK([kill `cat ovs-testcontroller.pid`])
OVS_WAIT_UNTIL([! test -e controller])
OVS_VSWITCHD_STOP(["/cannot find route for controller/d"])
AT_CLEANUP

View File

@ -77,3 +77,4 @@ m4_include([tests/packet-type-aware.at])
m4_include([tests/nsh.at])
m4_include([tests/drop-stats.at])
m4_include([tests/pytest.at])
m4_include([tests/learning-switch.at])