From patchwork Wed Nov 9 07:55:51 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roopa Prabhu X-Patchwork-Id: 124458 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id C10FF1007D4 for ; Wed, 9 Nov 2011 10:59:35 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933398Ab1KHX72 (ORCPT ); Tue, 8 Nov 2011 18:59:28 -0500 Received: from mtv-iport-4.cisco.com ([173.36.130.15]:25847 "EHLO mtv-iport-4.cisco.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932781Ab1KHX70 (ORCPT ); Tue, 8 Nov 2011 18:59:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=roprabhu@cisco.com; l=3863; q=dns/txt; s=iport; t=1320796766; x=1322006366; h=subject:to:from:cc:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=goPW/dVrGloIoQ230+CSCU9+a+6+ShYQY/i6rT9Ozdw=; b=C2KXUeELtYsk7WY/iAscAXvgPTi2jzdUPYnAIV/SYdo+zKsMTzONiMjD AD9GCbqeMHgUtqowzV7ic3TJGfaQgGmuvqYnClgwxjz5MBqviXRsgxNRu MzAPkGhABYwO3qeyqMKrsUa9QqbadjRb8eNrN1TzdwxGHyJ9VMBQQhyvN M=; X-IronPort-AV: E=Sophos;i="4.69,479,1315180800"; d="scan'208";a="13076923" Received: from mtv-core-4.cisco.com ([171.68.58.9]) by mtv-iport-4.cisco.com with ESMTP; 08 Nov 2011 23:59:26 +0000 Received: from rhel6.1 (savbu-dhcp-10-193-164-236.cisco.com [10.193.164.236]) by mtv-core-4.cisco.com (8.14.3/8.14.3) with ESMTP id pA8NxP2q026309; Tue, 8 Nov 2011 23:59:25 GMT Subject: [net-next-2.6 PATCH 3/6 v4] rtnetlink: Add support to set MAC/VLAN filters To: netdev@vger.kernel.org, davem@davemloft.net From: Roopa Prabhu Cc: chrisw@redhat.com, sri@us.ibm.com, dragos.tatulea@gmail.com, kvm@vger.kernel.org, arnd@arndb.de, mst@redhat.com, gregory.v.rose@intel.com, mchan@broadcom.com, dwang2@cisco.com, shemminger@vyatta.com, eric.dumazet@gmail.com, kaber@trash.net, benve@cisco.com Date: Tue, 08 Nov 2011 23:55:51 -0800 Message-ID: <20111109075551.13549.65530.stgit@rhel6.1> In-Reply-To: <20111109075449.13549.58135.stgit@rhel6.1> References: <20111109075449.13549.58135.stgit@rhel6.1> User-Agent: StGit/0.15 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Roopa Prabhu This patch adds support in rtnetlink for IFLA_RX_FILTER and IFLA_VF_RX_FILTERS set. It calls netdev_ops->set_rx_filter_addr and rtnl_link_ops->set_rx_filter_vlan Signed-off-by: Roopa Prabhu Signed-off-by: Christian Benvenuti Signed-off-by: David Wang --- include/linux/if_link.h | 2 + net/core/rtnetlink.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 0 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 74a9f17..a8c2c14 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h @@ -268,6 +268,8 @@ enum macvlan_mode { /* SR-IOV virtual function management section */ +#define SELF_VF -1 + enum { IFLA_VF_INFO_UNSPEC, IFLA_VF_INFO, diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 9eead8e..a042910 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1294,6 +1294,66 @@ static int do_set_master(struct net_device *dev, int ifindex) return 0; } +static int do_set_rx_filter(struct net_device *dev, int vf, + struct nlattr *rx_filter[], + int *modified) +{ + const struct net_device_ops *ops = dev->netdev_ops; + int err = 0; + + if (rx_filter[IFLA_RX_FILTER_ADDR]) { + struct nlattr *addr_filter[IFLA_RX_FILTER_ADDR_MAX+1]; + + if (!ops->ndo_set_rx_filter_addr) { + err = -EOPNOTSUPP; + goto errout; + } + + err = nla_parse_nested(addr_filter, IFLA_RX_FILTER_ADDR_MAX, + rx_filter[IFLA_RX_FILTER_ADDR], + ifla_addr_filter_policy); + if (err < 0) + goto errout; + + if (addr_filter[IFLA_RX_FILTER_ADDR_FLAGS]) { + unsigned int flags = nla_get_u32( + addr_filter[IFLA_RX_FILTER_ADDR_FLAGS]); + if (flags & ~RX_FILTER_FLAGS) { + err = -EINVAL; + goto errout; + } + } + + err = ops->ndo_set_rx_filter_addr(dev, vf, addr_filter); + if (err < 0) + goto errout; + *modified = 1; + } + + if (rx_filter[IFLA_RX_FILTER_VLAN]) { + struct nlattr *vlan_filter[IFLA_RX_FILTER_VLAN_MAX+1]; + + if (!ops->ndo_set_rx_filter_vlan) { + err = -EOPNOTSUPP; + goto errout; + } + + err = nla_parse_nested(vlan_filter, IFLA_RX_FILTER_VLAN_MAX, + rx_filter[IFLA_RX_FILTER_VLAN], + ifla_vlan_filter_policy); + if (err < 0) + goto errout; + + err = ops->ndo_set_rx_filter_vlan(dev, vf, vlan_filter); + if (err < 0) + goto errout; + *modified = 1; + } + +errout: + return err; +} + static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, struct nlattr **tb, char *ifname, int modified) { @@ -1515,6 +1575,47 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm, modified = 1; } } + + if (tb[IFLA_VF_RX_FILTERS]) { + struct nlattr *vf_rx_filter[IFLA_RX_FILTER_MAX+1]; + struct nlattr *attr; + int vf; + int rem; + + nla_for_each_nested(attr, tb[IFLA_VF_RX_FILTERS], rem) { + if (nla_type(attr) != IFLA_VF_RX_FILTER) + continue; + err = nla_parse_nested(vf_rx_filter, IFLA_RX_FILTER_MAX, + attr, ifla_rx_filter_policy); + if (err < 0) + goto errout; + + if (!vf_rx_filter[IFLA_RX_FILTER_VF]) { + err = -EOPNOTSUPP; + goto errout; + } + vf = nla_get_u32(vf_rx_filter[IFLA_RX_FILTER_VF]); + + err = do_set_rx_filter(dev, vf, vf_rx_filter, + &modified); + if (err < 0) + goto errout; + } + } + + if (tb[IFLA_RX_FILTER]) { + struct nlattr *rx_filter[IFLA_RX_FILTER_MAX+1]; + + err = nla_parse_nested(rx_filter, IFLA_RX_FILTER_MAX, + tb[IFLA_RX_FILTER], ifla_rx_filter_policy); + if (err < 0) + goto errout; + + err = do_set_rx_filter(dev, SELF_VF, rx_filter, &modified); + if (err < 0) + goto errout; + } + err = 0; errout: