From patchwork Wed Mar 13 01:45:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vlad Yasevich X-Patchwork-Id: 227141 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 AEE002C029B for ; Wed, 13 Mar 2013 12:45:43 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755887Ab3CMBpm (ORCPT ); Tue, 12 Mar 2013 21:45:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:37432 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755705Ab3CMBpc (ORCPT ); Tue, 12 Mar 2013 21:45:32 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r2D1jV3n017571 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 12 Mar 2013 21:45:31 -0400 Received: from vyasevic.redhat.com (ovpn-113-57.phx2.redhat.com [10.3.113.57]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r2D1jROn020808; Tue, 12 Mar 2013 21:45:30 -0400 From: Vlad Yasevich To: netdev@vger.kernel.org Cc: bridge@lists.linux-foundation.org, Vlad Yasevich Subject: [PATCH net-next 3/4] bridge: Implement IFF_UNICAST_FLT Date: Tue, 12 Mar 2013 21:45:25 -0400 Message-Id: <1363139126-13396-4-git-send-email-vyasevic@redhat.com> In-Reply-To: <1363139126-13396-1-git-send-email-vyasevic@redhat.com> References: <1363139126-13396-1-git-send-email-vyasevic@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Implement IFF_UNICAST_FLT on the bridge. Unicast addresses added to the bridge device are synched to the uplink devices. This allows for uplink devices to change while preserving mac assignment. Signed-off-by: Vlad Yasevich --- net/bridge/br_device.c | 11 ++++++++++- net/bridge/br_fdb.c | 6 ++++++ net/bridge/br_if.c | 2 ++ 3 files changed, 18 insertions(+), 1 deletions(-) diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 37f611f..de190fa 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -106,6 +106,15 @@ static int br_dev_open(struct net_device *dev) static void br_dev_set_multicast_list(struct net_device *dev) { + struct net_bridge *br = netdev_priv(dev); + struct net_bridge_port *port; + + rcu_read_lock(); + list_for_each_entry_rcu(port, &br->port_list, list) { + if (port->flags & BR_UPLINK) + dev_uc_sync(port->dev, dev); + } + rcu_read_unlock(); } static int br_dev_stop(struct net_device *dev) @@ -384,7 +393,7 @@ void br_dev_setup(struct net_device *dev) SET_ETHTOOL_OPS(dev, &br_ethtool_ops); SET_NETDEV_DEVTYPE(dev, &br_type); dev->tx_queue_len = 0; - dev->priv_flags = IFF_EBRIDGE; + dev->priv_flags = IFF_EBRIDGE | IFF_UNICAST_FLT; dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | NETIF_F_HIGHDMA | NETIF_F_GSO_MASK | NETIF_F_HW_CSUM | NETIF_F_LLTX | diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index b0812c9..ef7b51e 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c @@ -677,6 +677,9 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], struct net_port_vlans *pv; unsigned short vid = VLAN_N_VID; + if ((ndm->ndm_flags & NTF_SELF) && (dev->priv_flags & IFF_EBRIDGE)) + return ndo_dflt_fdb_add(ndm, tb, dev, addr, nlh_flags); + if (!(ndm->ndm_state & (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE))) { pr_info("bridge: RTM_NEWNEIGH with invalid state %#x\n", ndm->ndm_state); return -EINVAL; @@ -774,6 +777,9 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], struct net_port_vlans *pv; unsigned short vid = VLAN_N_VID; + if ((ndm->ndm_flags & NTF_SELF) && (dev->priv_flags & IFF_EBRIDGE)) + return ndo_dflt_fdb_del(ndm, tb, dev, addr); + if (tb[NDA_VLAN]) { if (nla_len(tb[NDA_VLAN]) != sizeof(unsigned short)) { pr_info("bridge: RTM_NEWNEIGH with invalid vlan\n"); diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index 02b4440..5196a79 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c @@ -145,6 +145,8 @@ static void del_nbp(struct net_bridge_port *p) nbp_vlan_flush(p); br_fdb_delete_by_port(br, p, 1); + if (p->flags & BR_UPLINK) + dev_uc_unsync(dev, br->dev); list_del_rcu(&p->list);