diff options
Diffstat (limited to 'net/openvswitch/flow_netlink.c')
-rw-r--r-- | net/openvswitch/flow_netlink.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c index 5c030a4d7338..6be701f6b31b 100644 --- a/net/openvswitch/flow_netlink.c +++ b/net/openvswitch/flow_netlink.c | |||
@@ -643,6 +643,10 @@ static int ipv4_tun_from_nlattr(const struct nlattr *attr, | |||
643 | } | 643 | } |
644 | 644 | ||
645 | SW_FLOW_KEY_PUT(match, tun_key.tun_flags, tun_flags, is_mask); | 645 | SW_FLOW_KEY_PUT(match, tun_key.tun_flags, tun_flags, is_mask); |
646 | if (is_mask) | ||
647 | SW_FLOW_KEY_MEMSET_FIELD(match, tun_proto, 0xff, true); | ||
648 | else | ||
649 | SW_FLOW_KEY_PUT(match, tun_proto, AF_INET, false); | ||
646 | 650 | ||
647 | if (rem > 0) { | 651 | if (rem > 0) { |
648 | OVS_NLERR(log, "IPv4 tunnel attribute has %d unknown bytes.", | 652 | OVS_NLERR(log, "IPv4 tunnel attribute has %d unknown bytes.", |
@@ -1194,7 +1198,7 @@ int ovs_nla_get_match(struct net *net, struct sw_flow_match *match, | |||
1194 | /* The userspace does not send tunnel attributes that | 1198 | /* The userspace does not send tunnel attributes that |
1195 | * are 0, but we should not wildcard them nonetheless. | 1199 | * are 0, but we should not wildcard them nonetheless. |
1196 | */ | 1200 | */ |
1197 | if (match->key->tun_key.u.ipv4.dst) | 1201 | if (match->key->tun_proto) |
1198 | SW_FLOW_KEY_MEMSET_FIELD(match, tun_key, | 1202 | SW_FLOW_KEY_MEMSET_FIELD(match, tun_key, |
1199 | 0xff, true); | 1203 | 0xff, true); |
1200 | 1204 | ||
@@ -1367,7 +1371,7 @@ static int __ovs_nla_put_key(const struct sw_flow_key *swkey, | |||
1367 | if (nla_put_u32(skb, OVS_KEY_ATTR_PRIORITY, output->phy.priority)) | 1371 | if (nla_put_u32(skb, OVS_KEY_ATTR_PRIORITY, output->phy.priority)) |
1368 | goto nla_put_failure; | 1372 | goto nla_put_failure; |
1369 | 1373 | ||
1370 | if ((swkey->tun_key.u.ipv4.dst || is_mask)) { | 1374 | if ((swkey->tun_proto || is_mask)) { |
1371 | const void *opts = NULL; | 1375 | const void *opts = NULL; |
1372 | 1376 | ||
1373 | if (output->tun_key.tun_flags & TUNNEL_OPTIONS_PRESENT) | 1377 | if (output->tun_key.tun_flags & TUNNEL_OPTIONS_PRESENT) |
@@ -1913,6 +1917,8 @@ static int validate_and_copy_set_tun(const struct nlattr *attr, | |||
1913 | 1917 | ||
1914 | tun_info = &tun_dst->u.tun_info; | 1918 | tun_info = &tun_dst->u.tun_info; |
1915 | tun_info->mode = IP_TUNNEL_INFO_TX; | 1919 | tun_info->mode = IP_TUNNEL_INFO_TX; |
1920 | if (key.tun_proto == AF_INET6) | ||
1921 | tun_info->mode |= IP_TUNNEL_INFO_IPV6; | ||
1916 | tun_info->key = key.tun_key; | 1922 | tun_info->key = key.tun_key; |
1917 | 1923 | ||
1918 | /* We need to store the options in the action itself since | 1924 | /* We need to store the options in the action itself since |