• Eelco Chaudron's avatar
    openvswitch: Fix flow lookup to use unmasked key · 68bb1010
    Eelco Chaudron authored
    The commit mentioned below causes the ovs_flow_tbl_lookup() function
    to be called with the masked key. However, it's supposed to be called
    with the unmasked key. This due to the fact that the datapath supports
    installing wider flows, and OVS relies on this behavior. For example
    if ipv4(src=1.1.1.1/192.0.0.0, dst=1.1.1.2/192.0.0.0) exists, a wider
    flow (smaller mask) of ipv4(src=192.1.1.1/128.0.0.0,dst=192.1.1.2/
    128.0.0.0) is allowed to be added.
    
    However, if we try to add a wildcard rule, the installation fails:
    
    $ ovs-appctl dpctl/add-flow system@myDP "in_port(1),eth_type(0x0800), \
      ipv4(src=1.1.1.1/192.0.0.0,dst=1.1.1.2/192.0.0.0,frag=no)" 2
    $ ovs-appctl dpctl/add-flow system@myDP "in_port(1),eth_type(0x0800), \
      ipv4(src=192.1.1.1/0.0.0.0,dst=49.1.1.2/0.0.0.0,frag=no)" 2
    ovs-vswitchd: updating flow table (File exists)
    
    The reason is that the key used to determine if the flow is already
    present in the system uses the original key ANDed with the mask.
    This results in the IP address not being part of the (miniflow) key,
    i.e., being substituted with an all-zero value. When doing the actual
    lookup, this results in the key wrongfully matching the first flow,
    and therefore the flow does not get installed.
    
    This change reverses the commit below, but rather than having the key
    on the stack, it's allocated.
    
    Fixes: 190aa3e7 ("openvswitch: Fix Frame-size larger than 1024 bytes warning.")
    Signed-off-by: default avatarEelco Chaudron <echaudro@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    68bb1010
datapath.c 68.6 KB