From: Ben Pfaff Date: Sat, 5 Apr 2014 17:27:05 +0000 (-0700) Subject: dpif-netdev: Unwildcard entire odp_port in dpif_netdev_mask_from_nlattrs(). X-Git-Tag: v2.1.1~17 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=a205dff624fa2c14dfd13fdf493299f4bff998e2 dpif-netdev: Unwildcard entire odp_port in dpif_netdev_mask_from_nlattrs(). One case in the dpif_netdev_mask_from_nlattrs() function accidentally wildcarded only a 16-bit subset of the mask's odp_port. On little-endian machines this subset was the lower bits, which happened to work out OK, but on big-endian machines this subset was the upper bits, which doesn't work and causes a test failure. (The problem was actually visible in the test expected results on little-endian machines, but we had not noticed.) This commit unwildcards the whole field, fixing the problem, and updates the test expected results to match. This fixes the failure of test 732 seen here: https://buildd.debian.org/status/fetch.php?pkg=openvswitch&arch=sparc&ver=2.1.0%2Bgit20140325-1&stamp=1396438624 Signed-off-by: Ben Pfaff Acked-by: Jarno Rajahalme --- diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index df89fabdb..efe50c97f 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -814,8 +814,6 @@ dpif_netdev_mask_from_nlattrs(const struct nlattr *key, uint32_t key_len, return EINVAL; } - /* Force unwildcard the in_port. */ - mask->in_port.odp_port = u32_to_odp(UINT32_MAX); } else { enum mf_field_id id; /* No mask key, unwildcard everything except fields whose @@ -834,6 +832,14 @@ dpif_netdev_mask_from_nlattrs(const struct nlattr *key, uint32_t key_len, } } + /* Force unwildcard the in_port. + * + * We need to do this even in the case where we unwildcard "everything" + * above because "everything" only includes the 16-bit OpenFlow port number + * mask->in_port.ofp_port, which only covers half of the 32-bit datapath + * port number mask->in_port.odp_port. */ + mask->in_port.odp_port = u32_to_odp(UINT32_MAX); + return 0; } diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at index 1a58da671..618ea8d17 100644 --- a/tests/ofproto-dpif.at +++ b/tests/ofproto-dpif.at @@ -2963,8 +2963,8 @@ for i in 1 2 3 4; do AT_CHECK([ovs-appctl netdev-dummy/receive p1 'in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0)']) done AT_CHECK([ovs-appctl dpif/dump-flows br0 | STRIP_USED], [0], [dnl -skb_priority(0),skb_mark(0),in_port(1/0xffff),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:2 -skb_priority(0),skb_mark(0),in_port(1/0xffff),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:drop +skb_priority(0),skb_mark(0),in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.0.0.2,dst=10.0.0.1,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:2 +skb_priority(0),skb_mark(0),in_port(1),eth(src=50:54:00:00:00:0b,dst=50:54:00:00:00:0c),eth_type(0x0800),ipv4(src=10.0.0.4,dst=10.0.0.3,proto=1,tos=0,ttl=64,frag=no),icmp(type=8,code=0), packets:3, bytes:180, used:0.0s, actions:drop ]) OVS_VSWITCHD_STOP AT_CLEANUP