Received: by 2002:a17:90a:1609:0:0:0:0 with SMTP id n9csp835914pja; Wed, 1 Apr 2020 09:34:23 -0700 (PDT) X-Google-Smtp-Source: ADFU+vstwRuBcDYqBSS6T+xnDW8rx5ue9Lh/OITx/qZhfN+KqaGE3kcOWZf0Rk3XQQ429u2V6Suc X-Received: by 2002:a4a:9b07:: with SMTP id a7mr17736910ook.78.1585758863796; Wed, 01 Apr 2020 09:34:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1585758863; cv=none; d=google.com; s=arc-20160816; b=e6CH4kNPqq0RZAF5AujTjiFNkLTE2pMgbJC+6kC7JdvJyMvmjSYugkoaZ6UHUrJ19f LM+iKwUlPdo2VNM6bI5yLNMwFJW8gaEZdnulrw9i8C7BOOuWwg9fhI3P+mceHXuxcqDD E/DPT3kpgnGn1wODcZs8Nti1cLnDaDCVV7le1QjW6DCXtRlC7f6E0A1yQzLqpzg+nDsT I12P+fO9kHp9L+12IL9CgOeE+pFC73ujFgHIBgNxmj82E8E7ZDsIvqD+wEGZBG+D9YDM mU2FYtvJbmo9tjA705cRCvOpVe6lbmvNOhJnhwJ8oiDIwF6APcDqzsTGyof/CdoLNuxa sXKw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=Nq8DlIaNNyLF7eWlLEUhD4or4n0rJ1xse7pIIVitJCI=; b=QuUzkUZNISMGnqyzd3lJWKCGdeGVbGgfmhfLHQ6QRIyZXhCh6ItW3Aftrxr23fE+bg S7ALlRJgvFVhDemxX1RkHFUvqKz45jh6r/FjGlmDLjDw6mwjSZnvrmjakCFsOi35b2E9 pUnqkmQUNNk13Wx98OH5lvhO6TnVGROlrSV7hsy3vPOWwgqwKeFp/CNCA6yDT1PnKOk0 aNL7A9mHhr7VQSL+1785RZra4ODuhFTtJbftjankvvFb4jjsSBgYZjvSodaSbTt6WIrE N4dKQo7xXZZkMpn8AxhlJGo6RiSy7nuO6OeNR3QIQkLRoXUrld5kFXqmfU1TiHG9L54v QTrA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cumulusnetworks.com header.s=google header.b=Pb4nhMyu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cumulusnetworks.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f33si358996otf.64.2020.04.01.09.34.11; Wed, 01 Apr 2020 09:34:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@cumulusnetworks.com header.s=google header.b=Pb4nhMyu; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cumulusnetworks.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388596AbgDAQds (ORCPT + 99 others); Wed, 1 Apr 2020 12:33:48 -0400 Received: from mail-lf1-f66.google.com ([209.85.167.66]:44209 "EHLO mail-lf1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388586AbgDAQdr (ORCPT ); Wed, 1 Apr 2020 12:33:47 -0400 Received: by mail-lf1-f66.google.com with SMTP id 131so175091lfh.11 for ; Wed, 01 Apr 2020 09:33:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Nq8DlIaNNyLF7eWlLEUhD4or4n0rJ1xse7pIIVitJCI=; b=Pb4nhMyuivqt3fOh8k0EuOcVHafLgipojtWH3huNFNONQYto6yNpASBgO2qBOGtTg3 a9I866SOtBn9sD35dpgFC4o26HhzfqS77hc1yqs4/cHjH1jvfqgnMQIYfCxahfmvfO11 T+s7q1CMmhUb28QuN6Ckl3Rn/kCBqDtu32tGQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Nq8DlIaNNyLF7eWlLEUhD4or4n0rJ1xse7pIIVitJCI=; b=YllzpTC6jjrFnyyz9hgBZlGfKVkYKLnV+EIBRbcVZtz9vouZi8zkArBEV6etuaHY8c JS25bKbUeuTWkA70NTrKicWcSEfSBdmtnAity8mnhmFSO1XkqVjkoyd6m2KP7+9v12ZX YtLvR5c57oIY09NaZeTLzmpzrUFh8BS5neiEsk69n/dmMR/GT9cZ2KACVuu1przY8Sem SJxQjsOsDVSjyWKCOi6yA/FC3qnAtFtvKCEa0CagtqW/Uj8FkWjjT28fzoeI6uKp144W E7N92RkIc5GLgdMHblC8OrykL7c9QfIkcINAS3jdh1ZlQMOFduypsDRcet4ApiTCUOpV hFPw== X-Gm-Message-State: AGi0PuZ6P+Tpc1RNDYOX1KePzzqvh+CXKXs1n3WdUhilPLKXcFFw0bQM A4l069Uksx9BO1c6uHJvPeqR5g== X-Received: by 2002:a05:6512:3127:: with SMTP id p7mr15067473lfd.108.1585758824954; Wed, 01 Apr 2020 09:33:44 -0700 (PDT) Received: from [192.168.0.109] (84-238-136-197.ip.btc-net.bg. [84.238.136.197]) by smtp.gmail.com with ESMTPSA id g5sm1536033ljl.106.2020.04.01.09.33.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 01 Apr 2020 09:33:44 -0700 (PDT) Subject: Re: [RFC net-next v4 8/9] bridge: mrp: Integrate MRP into the bridge To: Horatiu Vultur Cc: davem@davemloft.net, jiri@resnulli.us, ivecera@redhat.com, kuba@kernel.org, roopa@cumulusnetworks.com, olteanv@gmail.com, andrew@lunn.ch, UNGLinuxDriver@microchip.com, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, bridge@lists.linux-foundation.org References: <20200327092126.15407-1-horatiu.vultur@microchip.com> <20200327092126.15407-9-horatiu.vultur@microchip.com> <17d9fb2a-cb48-7bb6-cb79-3876ca3a74b2@cumulusnetworks.com> <20200401161021.3s2sqvma7r7wpo7h@soft-dev3.microsemi.net> From: Nikolay Aleksandrov Message-ID: Date: Wed, 1 Apr 2020 19:33:42 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 MIME-Version: 1.0 In-Reply-To: <20200401161021.3s2sqvma7r7wpo7h@soft-dev3.microsemi.net> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/04/2020 19:10, Horatiu Vultur wrote: > Hi Nik, > > The 03/30/2020 19:16, Nikolay Aleksandrov wrote: >> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe >> >> On 27/03/2020 11:21, Horatiu Vultur wrote: >>> To integrate MRP into the bridge, the bridge needs to do the following: >>> - add new flag(BR_MPP_AWARE) to the net bridge ports, this bit will be set when >>> the port is added to an MRP instance. In this way it knows if the frame was >>> received on MRP ring port >>> - detect if the MRP frame was received on MRP ring port in that case it would be >>> processed otherwise just forward it as usual. >>> - enable parsing of MRP >>> - before whenever the bridge was set up, it would set all the ports in >>> forwarding state. Add an extra check to not set ports in forwarding state if >>> the port is an MRP ring port. The reason of this change is that if the MRP >>> instance initially sets the port in blocked state by setting the bridge up it >>> would overwrite this setting. >>> >>> Signed-off-by: Horatiu Vultur >>> --- >>> include/linux/if_bridge.h | 1 + >>> net/bridge/br_device.c | 3 +++ >>> net/bridge/br_input.c | 3 +++ >>> net/bridge/br_netlink.c | 5 +++++ >>> net/bridge/br_private.h | 22 ++++++++++++++++++++++ >>> net/bridge/br_stp.c | 6 ++++++ >>> 6 files changed, 40 insertions(+) >>> >>> diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h >>> index 9e57c4411734..10baa9efdae8 100644 >>> --- a/include/linux/if_bridge.h >>> +++ b/include/linux/if_bridge.h >>> @@ -47,6 +47,7 @@ struct br_ip_list { >>> #define BR_BCAST_FLOOD BIT(14) >>> #define BR_NEIGH_SUPPRESS BIT(15) >>> #define BR_ISOLATED BIT(16) >>> +#define BR_MRP_AWARE BIT(17) >>> >>> #define BR_DEFAULT_AGEING_TIME (300 * HZ) >>> >>> diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c >>> index 0e3dbc5f3c34..8ec1362588af 100644 >>> --- a/net/bridge/br_device.c >>> +++ b/net/bridge/br_device.c >>> @@ -463,6 +463,9 @@ void br_dev_setup(struct net_device *dev) >>> spin_lock_init(&br->lock); >>> INIT_LIST_HEAD(&br->port_list); >>> INIT_HLIST_HEAD(&br->fdb_list); >>> +#if IS_ENABLED(CONFIG_BRIDGE_MRP) >>> + INIT_LIST_HEAD(&br->mrp_list); >>> +#endif >>> spin_lock_init(&br->hash_lock); >>> >>> br->bridge_id.prio[0] = 0x80; >>> diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c >>> index fcc260840028..d5c34f36f0f4 100644 >>> --- a/net/bridge/br_input.c >>> +++ b/net/bridge/br_input.c >>> @@ -342,6 +342,9 @@ rx_handler_result_t br_handle_frame(struct sk_buff **pskb) >>> } >>> } >>> >>> + if (unlikely(br_mrp_process(p, skb))) >>> + return RX_HANDLER_PASS; >>> + >>> forward: >>> switch (p->state) { >>> case BR_STATE_FORWARDING: >>> diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c >>> index 43dab4066f91..77bc96745be6 100644 >>> --- a/net/bridge/br_netlink.c >>> +++ b/net/bridge/br_netlink.c >>> @@ -669,6 +669,11 @@ static int br_afspec(struct net_bridge *br, >>> if (err) >>> return err; >>> break; >>> + case IFLA_BRIDGE_MRP: >>> + err = br_mrp_parse(br, p, attr, cmd); >>> + if (err) >>> + return err; >>> + break; >>> } >>> } >>> >>> diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h >>> index 1f97703a52ff..38894f2cf98f 100644 >>> --- a/net/bridge/br_private.h >>> +++ b/net/bridge/br_private.h >>> @@ -428,6 +428,10 @@ struct net_bridge { >>> int offload_fwd_mark; >>> #endif >>> struct hlist_head fdb_list; >>> + >>> +#if IS_ENABLED(CONFIG_BRIDGE_MRP) >>> + struct list_head __rcu mrp_list; >>> +#endif >>> }; >>> >>> struct br_input_skb_cb { >>> @@ -1304,6 +1308,24 @@ unsigned long br_timer_value(const struct timer_list *timer); >>> extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr); >>> #endif >>> >>> +/* br_mrp.c */ >>> +#if IS_ENABLED(CONFIG_BRIDGE_MRP) >>> +int br_mrp_parse(struct net_bridge *br, struct net_bridge_port *p, >>> + struct nlattr *attr, int cmd); >>> +int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb); >>> +#else >>> +static inline int br_mrp_parse(struct net_bridge *br, struct net_bridge_port *p, >>> + struct nlattr *attr, int cmd) >>> +{ >>> + return -1; >> >> You should return proper error here. > > It will return -EOPNOTSUPP. > >> >>> +} >>> + >>> +static inline int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb) >>> +{ >>> + return -1; >> >> The bridge can't possibly work with MRP disabled with this. > > Good catch, it will return 0. > >> >>> +} >>> +#endif >>> + >>> /* br_netlink.c */ >>> extern struct rtnl_link_ops br_link_ops; >>> int br_netlink_init(void); >>> diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c >>> index 1f14b8455345..3e88be7aa269 100644 >>> --- a/net/bridge/br_stp.c >>> +++ b/net/bridge/br_stp.c >>> @@ -36,6 +36,12 @@ void br_set_state(struct net_bridge_port *p, unsigned int state) >>> }; >>> int err; >>> >>> + /* Don't change the state of the ports if they are driven by a different >>> + * protocol. >>> + */ >>> + if (p->flags & BR_MRP_AWARE) >>> + return; >>> + >> >> Maybe disallow STP type (kernel/user-space/no-stp) changing as well, force it to no-stp. > > I am not sure that I understand completely here, do you want me to > disable STP if MRP is started? > I think it should be one of the two since they can step on each other's toes. If MRP is enabled then STP must be already disabled and should not be possible to enable while MRP is active and vice-versa. >> >>> p->state = state; >>> err = switchdev_port_attr_set(p->dev, &attr); >>> if (err && err != -EOPNOTSUPP) >>> >> >