Received: by 2002:a05:6a10:1d13:0:0:0:0 with SMTP id pp19csp334799pxb; Mon, 16 Aug 2021 06:34:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwAYXNItDWQO3EQW6fKF7gS6KmBjbug2mwFIw9D3G/VKkrM8LeptTDCK0iHWXvSZP22gysK X-Received: by 2002:a17:906:2bcf:: with SMTP id n15mr16244159ejg.414.1629120851118; Mon, 16 Aug 2021 06:34:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629120851; cv=none; d=google.com; s=arc-20160816; b=J49XsCZmk6g1bYDlIMEdlMUh5d6oiia8cr7aVEc9uExZuHWH7s9A/itYGC8GcrFI7T 0KKYx5vtb3FhgTM2bY3aDq8OVqXGAblEDXlVTtd+qnc1eRXhmoTpi4ixf73L5jlBAqnL xNwBka739vN0jIHqciOaxojcY2T7OxFFvYexO5Ukwhy3oNaMOlYzsrlhW6m4QwEAtlKI qmZhuZr76b5CUCWSKu6BpytRHqH/RsGXXa6tHyw4ANzKYpxlGlVW6SIYTSZdQXQQE2oG 6p7E/hDdvPyvH7S4d1FmxsgLc86t1E64oUGRuDfZVIfCoYUHYxvCEkuwkNIc8x7Vu0lL dT4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=kCf4s7fZNHAjwRL7t6M/U+AimTg80EMKV51mNbvt7C0=; b=UF0OLQIdA1XVTAXlfDQJxhiSgoIz+bv/sw9tddJzakNqcX3Jv9lfi1r3IGBUSVfvvr HpLtBG2iFZ6alhAlQHJBKUvx4qq3cNyt5ZRwoDMMeSB0a2QrKxLiTIySEZwuvHfSFLWz HJ5o/CPKIHyPBwcp06yknuCLkyYMRssTRfrLZvqlH1qN74oktmBn+vKyX5J6CDjKUX92 9E1TSM5RNmeKX+o4oVmweUlqARqw4V0OA/Gy3KaaowpbVrfbDtWpj6ij0AlZvCvyk3p2 hIxyhfAgVAAm8hm/ySEDWKazQAiWMlXORMkNTGZ30XNVoErdxZiQ/P0B5bnk36Zhdl7R faRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=osAtszU7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b22si10345198edw.438.2021.08.16.06.33.48; Mon, 16 Aug 2021 06:34:11 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=osAtszU7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241684AbhHPNaK (ORCPT + 99 others); Mon, 16 Aug 2021 09:30:10 -0400 Received: from mail.kernel.org ([198.145.29.99]:43050 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238323AbhHPNSb (ORCPT ); Mon, 16 Aug 2021 09:18:31 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id CB316632F4; Mon, 16 Aug 2021 13:13:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1629119640; bh=8bGJjCOK9oNDWp11wwW3PeetT7VyQgYIuGeG96ipbQI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=osAtszU7DdZSQ1Ij0QbBX6L+5msfgfCz1uZ5XRI9FJViNw2C/YsdTcN/MriTaINw2 98qwW74r8DCgAs0GfoEVGp428eAE4ZMvqlsJkpS9THT5xE88Jr9lnICKwBRDsFTj5v hWEJ+2dYl48d5N0/aNw6J7lfvYVXEY70JoAxweuQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ido Schimmel , Nikolay Aleksandrov , Vladimir Oltean , Jakub Kicinski , Sasha Levin Subject: [PATCH 5.13 105/151] net: bridge: fix flags interpretation for extern learn fdb entries Date: Mon, 16 Aug 2021 15:02:15 +0200 Message-Id: <20210816125447.532925808@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210816125444.082226187@linuxfoundation.org> References: <20210816125444.082226187@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nikolay Aleksandrov [ Upstream commit 45a687879b31caae4032abd1c2402e289d2b8083 ] Ignore fdb flags when adding port extern learn entries and always set BR_FDB_LOCAL flag when adding bridge extern learn entries. This is closest to the behaviour we had before and avoids breaking any use cases which were allowed. This patch fixes iproute2 calls which assume NUD_PERMANENT and were allowed before, example: $ bridge fdb add 00:11:22:33:44:55 dev swp1 extern_learn Extern learn entries are allowed to roam, but do not expire, so static or dynamic flags make no sense for them. Also add a comment for future reference. Fixes: eb100e0e24a2 ("net: bridge: allow to add externally learned entries from user-space") Fixes: 0541a6293298 ("net: bridge: validate the NUD_PERMANENT bit when adding an extern_learn FDB entry") Reviewed-by: Ido Schimmel Tested-by: Ido Schimmel Signed-off-by: Nikolay Aleksandrov Reviewed-by: Vladimir Oltean Link: https://lore.kernel.org/r/20210810110010.43859-1-razor@blackwall.org Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- include/uapi/linux/neighbour.h | 7 +++++-- net/bridge/br.c | 3 +-- net/bridge/br_fdb.c | 11 ++++------- net/bridge/br_private.h | 2 +- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/include/uapi/linux/neighbour.h b/include/uapi/linux/neighbour.h index dc8b72201f6c..00a60695fa53 100644 --- a/include/uapi/linux/neighbour.h +++ b/include/uapi/linux/neighbour.h @@ -66,8 +66,11 @@ enum { #define NUD_NONE 0x00 /* NUD_NOARP & NUD_PERMANENT are pseudostates, they never change - and make no address resolution or NUD. - NUD_PERMANENT also cannot be deleted by garbage collectors. + * and make no address resolution or NUD. + * NUD_PERMANENT also cannot be deleted by garbage collectors. + * When NTF_EXT_LEARNED is set for a bridge fdb entry the different cache entry + * states don't make sense and thus are ignored. Such entries don't age and + * can roam. */ struct nda_cacheinfo { diff --git a/net/bridge/br.c b/net/bridge/br.c index bbab9984f24e..ef743f94254d 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c @@ -166,8 +166,7 @@ static int br_switchdev_event(struct notifier_block *unused, case SWITCHDEV_FDB_ADD_TO_BRIDGE: fdb_info = ptr; err = br_fdb_external_learn_add(br, p, fdb_info->addr, - fdb_info->vid, - fdb_info->is_local, false); + fdb_info->vid, false); if (err) { err = notifier_from_errno(err); break; diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index 87ce52bba649..3451c888ff79 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c @@ -1026,10 +1026,7 @@ static int __br_fdb_add(struct ndmsg *ndm, struct net_bridge *br, "FDB entry towards bridge must be permanent"); return -EINVAL; } - - err = br_fdb_external_learn_add(br, p, addr, vid, - ndm->ndm_state & NUD_PERMANENT, - true); + err = br_fdb_external_learn_add(br, p, addr, vid, true); } else { spin_lock_bh(&br->hash_lock); err = fdb_add_entry(br, p, addr, ndm, nlh_flags, vid, nfea_tb); @@ -1257,7 +1254,7 @@ void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p) } int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, - const unsigned char *addr, u16 vid, bool is_local, + const unsigned char *addr, u16 vid, bool swdev_notify) { struct net_bridge_fdb_entry *fdb; @@ -1275,7 +1272,7 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, if (swdev_notify) flags |= BIT(BR_FDB_ADDED_BY_USER); - if (is_local) + if (!p) flags |= BIT(BR_FDB_LOCAL); fdb = fdb_create(br, p, addr, vid, flags); @@ -1304,7 +1301,7 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, if (swdev_notify) set_bit(BR_FDB_ADDED_BY_USER, &fdb->flags); - if (is_local) + if (!p) set_bit(BR_FDB_LOCAL, &fdb->flags); if (modified) diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 4e3d26e0a2d1..e013d33f1c7c 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -707,7 +707,7 @@ int br_fdb_get(struct sk_buff *skb, struct nlattr *tb[], struct net_device *dev, int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p); void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p); int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, - const unsigned char *addr, u16 vid, bool is_local, + const unsigned char *addr, u16 vid, bool swdev_notify); int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, const unsigned char *addr, u16 vid, -- 2.30.2