Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934128AbaKSVUL (ORCPT ); Wed, 19 Nov 2014 16:20:11 -0500 Received: from na3sys009aog119.obsmtp.com ([74.125.149.246]:36722 "HELO na3sys009aog119.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with SMTP id S933613AbaKSVUH (ORCPT ); Wed, 19 Nov 2014 16:20:07 -0500 From: Joe Stringer To: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, pshelar@nicira.com, dev@openvswitch.org Subject: [PATCHv2 net] openvswitch: Fix mask generation for IPv6 labels. Date: Wed, 19 Nov 2014 13:20:01 -0800 Message-Id: <1416432001-35678-1-git-send-email-joestringer@nicira.com> X-Mailer: git-send-email 1.7.10.4 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When userspace doesn't provide a mask, OVS datapath generates a fully unwildcarded mask for the flow. This is done by taking a copy of the flow key, then iterating across its attributes, setting all values to 0xff. This works for most attributes, as the length of the netlink attribute typically matches the length of the value. However, IPv6 labels only use the lower 20 bits of the field. This patch makes a special case to handle this. This fixes the following error seen when installing IPv6 flows without a mask: openvswitch: netlink: Invalid IPv6 flow label value (value=ffffffff, max=fffff) Signed-off-by: Joe Stringer --- v2: OR lower 20 bits (upper 12 bits remain from earlier memdup) --- net/openvswitch/flow_netlink.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c index fa4ec2e..e530025 100644 --- a/net/openvswitch/flow_netlink.c +++ b/net/openvswitch/flow_netlink.c @@ -825,7 +825,7 @@ static int ovs_key_from_nlattrs(struct sw_flow_match *match, u64 attrs, return 0; } -static void nlattr_set(struct nlattr *attr, u8 val, bool is_attr_mask_key) +static void mask_set_nlattr(struct nlattr *attr) { struct nlattr *nla; int rem; @@ -835,16 +835,18 @@ static void nlattr_set(struct nlattr *attr, u8 val, bool is_attr_mask_key) /* We assume that ovs_key_lens[type] == -1 means that type is a * nested attribute */ - if (is_attr_mask_key && ovs_key_lens[nla_type(nla)] == -1) - nlattr_set(nla, val, false); + if (ovs_key_lens[nla_type(nla)] == -1) + nla_for_each_nested(nla, attr, rem) + memset(nla_data(nla), 0xff, nla_len(nla)); else - memset(nla_data(nla), val, nla_len(nla)); - } -} + memset(nla_data(nla), 0xff, nla_len(nla)); -static void mask_set_nlattr(struct nlattr *attr, u8 val) -{ - nlattr_set(attr, val, true); + if (nla_type(nla) == OVS_KEY_ATTR_IPV6) { + struct ovs_key_ipv6 *ipv6_key = nla_data(nla); + + ipv6_key->ipv6_label |= htonl(0x000FFFFF); + } + } } /** @@ -926,7 +928,7 @@ int ovs_nla_get_match(struct sw_flow_match *match, if (!newmask) return -ENOMEM; - mask_set_nlattr(newmask, 0xff); + mask_set_nlattr(newmask); /* The userspace does not send tunnel attributes that are 0, * but we should not wildcard them nonetheless. -- 1.7.10.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/