From patchwork Tue Sep 1 15:43:09 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ahmed Amamou X-Patchwork-Id: 512913 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 8223B1401CD for ; Wed, 2 Sep 2015 01:55:47 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754009AbbIAPza (ORCPT ); Tue, 1 Sep 2015 11:55:30 -0400 Received: from mail4.gandi.net ([217.70.183.210]:42867 "EHLO gandi.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752344AbbIAPxk (ORCPT ); Tue, 1 Sep 2015 11:53:40 -0400 Received: from mfiltercorp2.gandi.net (mfiltercorp2.gandi.net [217.70.183.154]) by gandi.net (Postfix) with ESMTP id A2C28E39B7; Tue, 1 Sep 2015 17:43:41 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mfiltercorp2.gandi.net X-Spam-Flag: NO X-Spam-Score: -101.555 X-Spam-Level: X-Spam-Status: No, score=-101.555 tagged_above=-999 required=5 tests=[ALL_TRUSTED=-1, RP_MATCHES_RCVD=-0.555, USER_IN_WHITELIST=-100] autolearn=disabled Received: from gandi.net ([IPv6:::ffff:217.70.183.210]) by mfiltercorp2.gandi.net (mfiltercorp2.gandi.net [::ffff:217.70.183.154]) (amavisd-new, port 10024) with ESMTP id Bnoiqt8GmRf4; Tue, 1 Sep 2015 17:43:40 +0200 (CEST) Received: from bof.gandi.net (ahmed.gandi.net [217.70.181.47]) (using TLSv1 with cipher ECDHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) by gandi.net (Postfix) with ESMTPSA id 639B2E39C8; Tue, 1 Sep 2015 17:43:40 +0200 (CEST) From: Ahmed Amamou To: netdev@vger.kernel.org Cc: William Dauchy , Ahmed Amamou , Kamel Haddadou Subject: [PATCH RFC v2 14/21] net: rbridge: update forwarding database Date: Tue, 1 Sep 2015 17:43:09 +0200 Message-Id: <1441122196-11662-15-git-send-email-ahmed@gandi.net> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1441122196-11662-1-git-send-email-ahmed@gandi.net> References: <1441122196-11662-1-git-send-email-ahmed@gandi.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org update forwarding database to include nickname information used in encapsulation and decapsulation add functions to get and update nickname Signed-off-by: Ahmed Amamou Signed-off-by: Kamel Haddadou Signed-off-by: William Dauchy --- net/bridge/br_fdb.c | 41 +++++++++++++++++++++++++++++++++++++++++ net/bridge/br_private.h | 11 +++++++++++ 2 files changed, 52 insertions(+) diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 9e9875d..14540f1 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c @@ -552,8 +552,14 @@ int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, return ret; } +#ifdef CONFIG_TRILL +void br_fdb_update_nick(struct net_bridge *br, struct net_bridge_port *source, + const unsigned char *addr, u16 vid, bool added_by_user, + uint16_t nick) +#else void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, const unsigned char *addr, u16 vid, bool added_by_user) +#endif { struct hlist_head *head = &br->hash[br_mac_hash(addr, vid)]; struct net_bridge_fdb_entry *fdb; @@ -587,6 +593,10 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, fdb->added_by_user = 1; if (unlikely(fdb_modified)) fdb_notify(br, fdb, RTM_NEWNEIGH); +#ifdef CONFIG_TRILL + if (nick != RBRIDGE_NICKNAME_UNUSED) + fdb->nick = nick; +#endif } } else { spin_lock(&br->hash_lock); @@ -605,6 +615,16 @@ void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, } } +#ifdef CONFIG_TRILL +void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, + const unsigned char *addr, u16 vid, bool added_by_user) +{ + br_fdb_update_nick(br, source, addr, vid, added_by_user, + RBRIDGE_NICKNAME_UNUSED); +} + +#endif + static int fdb_to_nud(const struct net_bridge_fdb_entry *fdb) { if (fdb->is_local) @@ -1076,3 +1096,24 @@ int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, return err; } + +#ifdef CONFIG_TRILL +/* get_nick_from_mac: used to get correspondant nick to Mac address + * used only on ingress/Egress Rbridge (those how encapsulate + * and decapsulate frames) + * must be called while encapsulating to get mac <-> nick correspondance + */ +uint16_t get_nick_from_mac(struct net_bridge_port *p, unsigned char *dest, + u16 vid) +{ + struct hlist_head *head = &p->br->hash[br_mac_hash(dest, vid)]; + struct net_bridge_fdb_entry *fdb; + + if (is_multicast_ether_addr(dest)) + return RBRIDGE_NICKNAME_NONE; + fdb = fdb_find(head, dest, vid); + if (likely(fdb)) + return fdb->nick; + return RBRIDGE_NICKNAME_NONE; +} +#endif diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index ceaf5a9..a62e41e 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -120,6 +120,9 @@ struct net_bridge_fdb_entry added_by_user:1, added_by_external_learn:1; __u16 vlan_id; +#ifdef CONFIG_TRILL + __u16 nick; /* destination's nickname */ +#endif }; struct net_bridge_port_group { @@ -436,6 +439,14 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, const unsigned char *addr, u16 vid); int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, const unsigned char *addr, u16 vid); +#ifdef CONFIG_TRILL +void br_fdb_update_nick(struct net_bridge *br, + struct net_bridge_port *source, + const unsigned char *addr, + u16 vid, bool added_by_user, uint16_t nick); +uint16_t get_nick_from_mac(struct net_bridge_port *p, unsigned char *dest, + u16 vid); +#endif /* br_forward.c */ void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb);