[ovs-dev] [PATCH v3] dpctl/add-flow: Fix ovs-dpdk crash when add dp flow without in_port field.

Ilya Maximets i.maximets at ovn.org
Tue Mar 2 09:52:30 UTC 2021


On 2/26/21 10:48 AM, Mao YingMing wrote:
> Fix the following ovs-dpdk crash and add a unit test for this issue
> to tests/dpif-netdev.at
> 
> $ ovs-appctl dpctl/add-flow netdev at ovs-netdev "eth(),eth_type(0x0800),ipv4()" "3"
> unixctl|WARN|error communicating with unix:/usr/local/var/run/openvswitch/ovs-vswitchd.1995.ctl: End of file
> ovs-appctl: ovs-vswitchd: transaction error (End of file)
> 
> ovs-vswitchd.log record:
> util(ovs-vswitchd)|EMER|lib/dpif-netdev.c:3638: assertion match->wc.masks.in_port.odp_port == ODPP_NONE failed in dp_netdev_flow_add()
> daemon_unix(monitor)|ERR|2 crashes: pid 1995 died, killed (Aborted), core dumped, restarting
> 
> Fix result:
> 
> $ ovs-appctl dpctl/add-flow netdev at ovs-netdev "eth(),eth_type(0x0800),ipv4()" "3"
> ovs-vswitchd: updating flow table (Invalid argument)
> ovs-appctl: ovs-vswitchd: server returned an error
> 
> ovs-vswitchd.log record:
> dpif_netdev|ERR|failed to put[create] flow: in_port is not an exact match
> dpif|WARN|netdev at ovs-netdev: failed to put[create] (Invalid argument) ufid:7ee62592-88ca-4ff2-9e42-38c5d844ffd1 eth(src=00:00:00:00:00:00/00:00:00:00:00:00,dst=00:00:00:00:00:00/00:00:00:00:00:00),eth_type(0x0800),ipv4(src=0.0.0.0/0.0.0.0,dst=0.0.0.0/0.0.0.0,proto=0/0,tos=0/0,ttl=0/0), actions:3
> 
> Signed-off-by: Mao YingMing <maoyingming at baidu.com>
> ---
>  lib/dpif-netdev.c    |  9 +++++++++
>  tests/dpif-netdev.at | 22 ++++++++++++++++++++++
>  2 files changed, 31 insertions(+)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index e3fd0a0..d4561e2 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -3834,6 +3834,15 @@ dpif_netdev_flow_put(struct dpif *dpif, const struct dpif_flow_put *put)
>          return error;
>      }
>  
> +    if (match.wc.masks.in_port.odp_port != ODPP_NONE) {
> +        static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
> +
> +        VLOG_ERR_RL(&rl, "failed to put%s flow: in_port is not an exact match",
> +                (put->flags & DPIF_FP_CREATE) ? "[create]"
> +                : (put->flags & DPIF_FP_MODIFY) ? "[modify]" : "[zero]");
> +        return EINVAL;
> +    }
> +
>      if (put->ufid) {
>          ufid = *put->ufid;
>      } else {
> diff --git a/tests/dpif-netdev.at b/tests/dpif-netdev.at
> index 2862a3c..433ed5f 100644
> --- a/tests/dpif-netdev.at
> +++ b/tests/dpif-netdev.at
> @@ -589,3 +589,25 @@ arp,in_port=ANY,dl_vlan=11,dl_vlan_pcp=7,vlan_tci1=0x0000,dl_src=00:06:07:08:09:
>  
>  DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy])
>  DPIF_NETDEV_FLOW_HW_OFFLOAD_OFFSETS_VID_ARP([dummy-pmd])
> +
> +m4_define([DPIF_NETDEV_CHECK_IN_PORT_EXACT_MATCH],
> +  [AT_SETUP([dpif-netdev - check dpctl/add-flow in_port exact match - $1])
> +   OVS_VSWITCHD_START(
> +     [add-port br0 p1 \
> +      -- set interface p1 type=$1 options:pstream=punix:$OVS_RUNDIR/p0.sock \
> +      -- set bridge br0 datapath-type=dummy \
> +                        other-config:datapath-id=1234 fail-mode=secure], [], [],
> +      [m4_if([$1], [dummy-pmd], [--dummy-numa="0,0,0,0,1,1,1,1"], [])])
> +
> +   AT_CHECK([ovs-appctl dpctl/add-flow "eth(),eth_type(0x0800),ipv4()" "3"], [2], [],
> +     [ovs-vswitchd: updating flow table (Invalid argument)
> +ovs-appctl: ovs-vswitchd: server returned an error
> +])
> +   OVS_WAIT_UNTIL([grep "flow: in_port is not an exact match" ovs-vswitchd.log])
> +
> +   AT_CHECK([grep 'flow: in_port is not an exact match' ovs-vswitchd.log],[0], [ignore], [ignore])
> +   OVS_VSWITCHD_STOP(["/flow: in_port is not an exact match/d
> +/failed to put/d"])
> +   AT_CLEANUP])
> +
> +DPIF_NETDEV_CHECK_IN_PORT_EXACT_MATCH([dummy-pmd])
> 

Thanks!
I simplified the test a bit (we don't really need m4_define() since there
is no need to test this with different port types) and applied to master.
Also backported down to 2.13.

Best regards, Ilya Maximets.


More information about the dev mailing list