From nobody Sun May 19 01:26:41 2024 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C14D131BAA; Tue, 23 Apr 2024 12:49:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=85.214.62.61 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876568; cv=none; b=UcIVAIqvhW+ebTRLEWutE/owalb68te21EVu7SsVAEySSPmq+q3nrAU0m6e2d/QGtoAhN1DsLGjDs/OmJa/wc5zepCRaolATFiGarsdmCMcLK8JhE9OadBAnL2qgg7CXfutuQZGN4ZNXah5ARkRDtWvB/aWSnG/rU+O5r//dC8o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876568; c=relaxed/simple; bh=iTk6/9XFwKjuzhgBDETE1+oun/vT1b823kkN8c9Jnk0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XyEk8UOY98hC/w1WBCbBZatoEergrvJiWVmTlJdUiibdO//XOJDAf599xqG5gEXj5a3X2gwNWSGwId3dyCBB+Du4pyg5CVlWqAezDUlDcvcW4+72L4ZrCbXcei4sFIkl22fRw6xqRzRoRkqLzaBTECPUOyfwmMfZ41LoVioVSs8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de; spf=pass smtp.mailfrom=denx.de; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b=uJdcYeqp; arc=none smtp.client-ip=85.214.62.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=denx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b="uJdcYeqp" Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id A2956884EC; Tue, 23 Apr 2024 14:49:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1713876564; bh=Io3Jkuax07vnES7pi7ziX2d54028w6Pxbf8R6hFcoH0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=uJdcYeqp4s9PeoFPu6zuRiTSPlgRTwx010uR4ot+uJQY36OlWI432iUaBwSIh/J7V Impg64BSxofXdTyqDhT92LqEQ5lh4elKjV1xvJtAQbhUz+EknQur5t0U/vGl2kRHLJ 0ubDjwbC/f+iarebbIMuDa+cMjG1ssK5dO71gFbPT6WmaRfl+WkpqJXlonGgKUQhyY ZW3elGYHhB1t7G3tFYefCKVUXRXOFverMF74z3poeJ4paBELh+MIJLAmJALY/YtYfz 1K6oOl0SMFjchq5/wWvjFWWqQOtVpOTpUXAhnY7r9rBhaUhNyLeNrikMwMVXmrecmY lmsXXiWom7rMA== From: Lukasz Majewski To: netdev@vger.kernel.org, Paolo Abeni , Casper Andersson Cc: Andrew Lunn , Eric Dumazet , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , Oleksij Rempel , Tristram.Ha@microchip.com, Sebastian Andrzej Siewior , Ravi Gunasekaran , Simon Horman , Nikita Zhandarovich , Murali Karicheri , Jiri Pirko , Dan Carpenter , Ziyang Xuan , Shigeru Yoshida , "Ricardo B. Marliere" , linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [net-next PATCH v6 1/5] net: hsr: Provide RedBox support (HSR-SAN) Date: Tue, 23 Apr 2024 14:49:04 +0200 Message-Id: <20240423124908.2073400-2-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240423124908.2073400-1-lukma@denx.de> References: <20240423124908.2073400-1-lukma@denx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Introduce RedBox support (HSR-SAN to be more precise) for HSR networks. Following traffic reduction optimizations have been implemented: - Do not send HSR supervisory frames to Port C (interlink) - Do not forward to HSR ring frames addressed to Port C - Do not forward to Port C frames from HSR ring - Do not send duplicate HSR frame to HSR ring when destination is Port C The corresponding patch to modify iptable2 sources has already been sent: https://lore.kernel.org/netdev/20240308145729.490863-1-lukma@denx.de/T/ Testing procedure (veth and netns): ----------------------------------- One shall run: linux-vanila/tools/testing/selftests/net/hsr/hsr_redbox.sh (Detailed description of the setup one can find in the test script file). Testing procedure (real hardware): ---------------------------------- The EVB-KSZ9477 has been used for testing on net-next branch (SHA1: 5fc68320c1fb3c7d456ddcae0b4757326a043e6f). Ports 4/5 were used for SW managed HSR (hsr1) as first hsr0 for ports 1/2 (with HW offloading for ksz9477) was created. Port 3 has been used as interlink port (single USB-ETH dongle). Configuration - RedBox (EVB-KSZ9477): if link set lan1 down;ip link set lan2 down ip link add name hsr0 type hsr slave1 lan1 slave2 lan2 supervision 45 versi= on 1 ip link add name hsr1 type hsr slave1 lan4 slave2 lan5 interlink lan3 super= vision 45 version 1 ip link set lan4 up;ip link set lan5 up ip link set lan3 up ip addr add 192.168.0.11/24 dev hsr1 ip link set hsr1 up Configuration - DAN-H (EVB-KSZ9477): ip link set lan1 down;ip link set lan2 down ip link add name hsr0 type hsr slave1 lan1 slave2 lan2 supervision 45 versi= on 1 ip link add name hsr1 type hsr slave1 lan4 slave2 lan5 supervision 45 versi= on 1 ip link set lan4 up;ip link set lan5 up ip addr add 192.168.0.12/24 dev hsr1 ip link set hsr1 up This approach uses only SW based HSR devices (hsr1). -------------- ----------------- ------------ DAN-H Port5 | <------> | Port5 | | Port4 | <------> | Port4 Port3 | <---> | PC | | (RedBox) | | (USB-ETH) EVB-KSZ9477 | | EVB-KSZ9477 | | -------------- ----------------- ------------ Signed-off-by: Lukasz Majewski --- Changes for v2: - Add deleting of HSR_PT_INTERLINK node to hsr_del_ports() - Rewrite handle_std_frame() to awoid code duplication - Fix reverse christmas tree in hsr_prune_proxy_nodes() as well as remove stale node indication as interlink doesn't need this detection (only check if node is inactive for more than HSR_PROXY_NODE_FORGET_TIME is required) - Rewrite commit message Changes for v3: - Modify frame passed Port C (Interlink) to have RedBox's source address (S= A) This fixes issue with connecting L2 switch to Interlink Port as switches drop frames with SA other than one registered in their (internal) routing tables. - Do not forward to port C (Interlink) frames from nodes A and B if DA is in NodeTable. - Fix problem with ProxyNodeTable being pollued by nodes already registered in HSR ring. - Prevent from sending frames to HSR ring when destination addresses (DA) are in ProxyNodeTable Changes for v4: - Replace memcpy() with dedicated ether_addr_copy() function - Update commit message description to replace ifconfig with ip command usage Changes for v5: - Delete INTERLINK port before the main HSR one is deleted - Delete timer responsible for triggering function to prune proxy nodes Changes for v6: - Remove not used hsr_handle_san_frame() declaration - Add test description for veth and network ns (netns) based setup to the commit message. --- include/uapi/linux/if_link.h | 1 + net/hsr/hsr_device.c | 36 ++++++++++++++- net/hsr/hsr_device.h | 4 +- net/hsr/hsr_forward.c | 85 ++++++++++++++++++++++++++++++++---- net/hsr/hsr_framereg.c | 52 ++++++++++++++++++++++ net/hsr/hsr_framereg.h | 4 ++ net/hsr/hsr_main.h | 7 +++ net/hsr/hsr_netlink.c | 30 +++++++++++-- net/hsr/hsr_slave.c | 1 + 9 files changed, 204 insertions(+), 16 deletions(-) diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h index ffa637b38c93..e9f10860ec8e 100644 --- a/include/uapi/linux/if_link.h +++ b/include/uapi/linux/if_link.h @@ -1771,6 +1771,7 @@ enum { IFLA_HSR_PROTOCOL, /* Indicate different protocol than * HSR. For example PRP. */ + IFLA_HSR_INTERLINK, /* HSR interlink network device */ __IFLA_HSR_MAX, }; =20 diff --git a/net/hsr/hsr_device.c b/net/hsr/hsr_device.c index e9d45133d641..cd1e7c6d2fc0 100644 --- a/net/hsr/hsr_device.c +++ b/net/hsr/hsr_device.c @@ -146,6 +146,9 @@ static int hsr_dev_open(struct net_device *dev) case HSR_PT_SLAVE_B: designation =3D "Slave B"; break; + case HSR_PT_INTERLINK: + designation =3D "Interlink"; + break; default: designation =3D "Unknown"; } @@ -285,6 +288,7 @@ static void send_hsr_supervision_frame(struct hsr_port = *master, struct hsr_priv *hsr =3D master->hsr; __u8 type =3D HSR_TLV_LIFE_CHECK; struct hsr_sup_payload *hsr_sp; + struct hsr_sup_tlv *hsr_stlv; struct hsr_sup_tag *hsr_stag; struct sk_buff *skb; =20 @@ -324,6 +328,16 @@ static void send_hsr_supervision_frame(struct hsr_port= *master, hsr_sp =3D skb_put(skb, sizeof(struct hsr_sup_payload)); ether_addr_copy(hsr_sp->macaddress_A, master->dev->dev_addr); =20 + if (hsr->redbox) { + hsr_stlv =3D skb_put(skb, sizeof(struct hsr_sup_tlv)); + hsr_stlv->HSR_TLV_type =3D PRP_TLV_REDBOX_MAC; + hsr_stlv->HSR_TLV_length =3D sizeof(struct hsr_sup_payload); + + /* Payload: MacAddressRedBox */ + hsr_sp =3D skb_put(skb, sizeof(struct hsr_sup_payload)); + ether_addr_copy(hsr_sp->macaddress_A, hsr->macaddress_redbox); + } + if (skb_put_padto(skb, ETH_ZLEN)) { spin_unlock_bh(&hsr->seqnr_lock); return; @@ -405,6 +419,10 @@ void hsr_del_ports(struct hsr_priv *hsr) if (port) hsr_del_port(port); =20 + port =3D hsr_port_get_hsr(hsr, HSR_PT_INTERLINK); + if (port) + hsr_del_port(port); + port =3D hsr_port_get_hsr(hsr, HSR_PT_MASTER); if (port) hsr_del_port(port); @@ -534,8 +552,8 @@ static const unsigned char def_multicast_addr[ETH_ALEN]= __aligned(2) =3D { }; =20 int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[= 2], - unsigned char multicast_spec, u8 protocol_version, - struct netlink_ext_ack *extack) + struct net_device *interlink, unsigned char multicast_spec, + u8 protocol_version, struct netlink_ext_ack *extack) { bool unregister =3D false; struct hsr_priv *hsr; @@ -544,6 +562,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct= net_device *slave[2], hsr =3D netdev_priv(hsr_dev); INIT_LIST_HEAD(&hsr->ports); INIT_LIST_HEAD(&hsr->node_db); + INIT_LIST_HEAD(&hsr->proxy_node_db); spin_lock_init(&hsr->list_lock); =20 eth_hw_addr_set(hsr_dev, slave[0]->dev_addr); @@ -569,6 +588,7 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct= net_device *slave[2], /* Overflow soon to find bugs easier: */ hsr->sequence_nr =3D HSR_SEQNR_START; hsr->sup_sequence_nr =3D HSR_SUP_SEQNR_START; + hsr->interlink_sequence_nr =3D HSR_SEQNR_START; =20 timer_setup(&hsr->announce_timer, hsr_announce, 0); timer_setup(&hsr->prune_timer, hsr_prune_nodes, 0); @@ -604,6 +624,18 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struc= t net_device *slave[2], if (res) goto err_unregister; =20 + if (interlink) { + res =3D hsr_add_port(hsr, interlink, HSR_PT_INTERLINK, extack); + if (res) + goto err_unregister; + + hsr->redbox =3D true; + ether_addr_copy(hsr->macaddress_redbox, interlink->dev_addr); + timer_setup(&hsr->prune_proxy_timer, hsr_prune_proxy_nodes, 0); + mod_timer(&hsr->prune_proxy_timer, + jiffies + msecs_to_jiffies(PRUNE_PROXY_PERIOD)); + } + hsr_debugfs_init(hsr, hsr_dev); mod_timer(&hsr->prune_timer, jiffies + msecs_to_jiffies(PRUNE_PERIOD)); =20 diff --git a/net/hsr/hsr_device.h b/net/hsr/hsr_device.h index 9060c92168f9..655284095b78 100644 --- a/net/hsr/hsr_device.h +++ b/net/hsr/hsr_device.h @@ -16,8 +16,8 @@ void hsr_del_ports(struct hsr_priv *hsr); void hsr_dev_setup(struct net_device *dev); int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[= 2], - unsigned char multicast_spec, u8 protocol_version, - struct netlink_ext_ack *extack); + struct net_device *interlink, unsigned char multicast_spec, + u8 protocol_version, struct netlink_ext_ack *extack); void hsr_check_carrier_and_operstate(struct hsr_priv *hsr); int hsr_get_max_mtu(struct hsr_priv *hsr); #endif /* __HSR_DEVICE_H */ diff --git a/net/hsr/hsr_forward.c b/net/hsr/hsr_forward.c index 5d68cb181695..05a61b8286ec 100644 --- a/net/hsr/hsr_forward.c +++ b/net/hsr/hsr_forward.c @@ -377,6 +377,15 @@ static int hsr_xmit(struct sk_buff *skb, struct hsr_po= rt *port, */ ether_addr_copy(eth_hdr(skb)->h_source, port->dev->dev_addr); } + + /* When HSR node is used as RedBox - the frame received from HSR ring + * requires source MAC address (SA) replacement to one which can be + * recognized by SAN devices (otherwise, frames are dropped by switch) + */ + if (port->type =3D=3D HSR_PT_INTERLINK) + ether_addr_copy(eth_hdr(skb)->h_source, + port->hsr->macaddress_redbox); + return dev_queue_xmit(skb); } =20 @@ -390,9 +399,57 @@ bool prp_drop_frame(struct hsr_frame_info *frame, stru= ct hsr_port *port) =20 bool hsr_drop_frame(struct hsr_frame_info *frame, struct hsr_port *port) { + struct sk_buff *skb; + if (port->dev->features & NETIF_F_HW_HSR_FWD) return prp_drop_frame(frame, port); =20 + /* RedBox specific frames dropping policies + * + * Do not send HSR supervisory frames to SAN devices + */ + if (frame->is_supervision && port->type =3D=3D HSR_PT_INTERLINK) + return true; + + /* Do not forward to other HSR port (A or B) unicast frames which + * are addressed to interlink port (and are in the ProxyNodeTable). + */ + skb =3D frame->skb_hsr; + if (skb && prp_drop_frame(frame, port) && + is_unicast_ether_addr(eth_hdr(skb)->h_dest) && + hsr_is_node_in_db(&port->hsr->proxy_node_db, + eth_hdr(skb)->h_dest)) { + return true; + } + + /* Do not forward to port C (Interlink) frames from nodes A and B + * if DA is in NodeTable. + */ + if ((frame->port_rcv->type =3D=3D HSR_PT_SLAVE_A || + frame->port_rcv->type =3D=3D HSR_PT_SLAVE_B) && + port->type =3D=3D HSR_PT_INTERLINK) { + skb =3D frame->skb_hsr; + if (skb && is_unicast_ether_addr(eth_hdr(skb)->h_dest) && + hsr_is_node_in_db(&port->hsr->node_db, + eth_hdr(skb)->h_dest)) { + return true; + } + } + + /* Do not forward to port A and B unicast frames received on the + * interlink port if it is addressed to one of nodes registered in + * the ProxyNodeTable. + */ + if ((port->type =3D=3D HSR_PT_SLAVE_A || port->type =3D=3D HSR_PT_SLAVE_B= ) && + frame->port_rcv->type =3D=3D HSR_PT_INTERLINK) { + skb =3D frame->skb_std; + if (skb && is_unicast_ether_addr(eth_hdr(skb)->h_dest) && + hsr_is_node_in_db(&port->hsr->proxy_node_db, + eth_hdr(skb)->h_dest)) { + return true; + } + } + return false; } =20 @@ -448,13 +505,14 @@ static void hsr_forward_do(struct hsr_frame_info *fra= me) } =20 /* Check if frame is to be dropped. Eg. for PRP no forward - * between ports. + * between ports, or sending HSR supervision to RedBox. */ if (hsr->proto_ops->drop_frame && hsr->proto_ops->drop_frame(frame, port)) continue; =20 - if (port->type !=3D HSR_PT_MASTER) + if (port->type =3D=3D HSR_PT_SLAVE_A || + port->type =3D=3D HSR_PT_SLAVE_B) skb =3D hsr->proto_ops->create_tagged_frame(frame, port); else skb =3D hsr->proto_ops->get_untagged_frame(frame, port); @@ -469,7 +527,9 @@ static void hsr_forward_do(struct hsr_frame_info *frame) hsr_deliver_master(skb, port->dev, frame->node_src); } else { if (!hsr_xmit(skb, port, frame)) - sent =3D true; + if (port->type =3D=3D HSR_PT_SLAVE_A || + port->type =3D=3D HSR_PT_SLAVE_B) + sent =3D true; } } } @@ -503,10 +563,12 @@ static void handle_std_frame(struct sk_buff *skb, frame->skb_prp =3D NULL; frame->skb_std =3D skb; =20 - if (port->type !=3D HSR_PT_MASTER) { + if (port->type !=3D HSR_PT_MASTER) frame->is_from_san =3D true; - } else { - /* Sequence nr for the master node */ + + if (port->type =3D=3D HSR_PT_MASTER || + port->type =3D=3D HSR_PT_INTERLINK) { + /* Sequence nr for the master/interlink node */ lockdep_assert_held(&hsr->seqnr_lock); frame->sequence_nr =3D hsr->sequence_nr; hsr->sequence_nr++; @@ -564,6 +626,7 @@ static int fill_frame_info(struct hsr_frame_info *frame, { struct hsr_priv *hsr =3D port->hsr; struct hsr_vlan_ethhdr *vlan_hdr; + struct list_head *n_db; struct ethhdr *ethhdr; __be16 proto; int ret; @@ -574,9 +637,13 @@ static int fill_frame_info(struct hsr_frame_info *fram= e, =20 memset(frame, 0, sizeof(*frame)); frame->is_supervision =3D is_supervision_frame(port->hsr, skb); - frame->node_src =3D hsr_get_node(port, &hsr->node_db, skb, - frame->is_supervision, - port->type); + + n_db =3D &hsr->node_db; + if (port->type =3D=3D HSR_PT_INTERLINK) + n_db =3D &hsr->proxy_node_db; + + frame->node_src =3D hsr_get_node(port, n_db, skb, + frame->is_supervision, port->type); if (!frame->node_src) return -1; /* Unknown node and !is_supervision, or no mem */ =20 diff --git a/net/hsr/hsr_framereg.c b/net/hsr/hsr_framereg.c index 26329db09210..614df9649794 100644 --- a/net/hsr/hsr_framereg.c +++ b/net/hsr/hsr_framereg.c @@ -71,6 +71,14 @@ static struct hsr_node *find_node_by_addr_A(struct list_= head *node_db, return NULL; } =20 +/* Check if node for a given MAC address is already present in data base + */ +bool hsr_is_node_in_db(struct list_head *node_db, + const unsigned char addr[ETH_ALEN]) +{ + return !!find_node_by_addr_A(node_db, addr); +} + /* Helper for device init; the self_node is used in hsr_rcv() to recognize * frames from self that's been looped over the HSR ring. */ @@ -223,6 +231,15 @@ struct hsr_node *hsr_get_node(struct hsr_port *port, s= truct list_head *node_db, } } =20 + /* Check if required node is not in proxy nodes table */ + list_for_each_entry_rcu(node, &hsr->proxy_node_db, mac_list) { + if (ether_addr_equal(node->macaddress_A, ethhdr->h_source)) { + if (hsr->proto_ops->update_san_info) + hsr->proto_ops->update_san_info(node, is_sup); + return node; + } + } + /* Everyone may create a node entry, connected node to a HSR/PRP * device. */ @@ -418,6 +435,10 @@ void hsr_addr_subst_dest(struct hsr_node *node_src, st= ruct sk_buff *skb, =20 node_dst =3D find_node_by_addr_A(&port->hsr->node_db, eth_hdr(skb)->h_dest); + if (!node_dst && port->hsr->redbox) + node_dst =3D find_node_by_addr_A(&port->hsr->proxy_node_db, + eth_hdr(skb)->h_dest); + if (!node_dst) { if (port->hsr->prot_version !=3D PRP_V1 && net_ratelimit()) netdev_err(skb->dev, "%s: Unknown node\n", __func__); @@ -561,6 +582,37 @@ void hsr_prune_nodes(struct timer_list *t) jiffies + msecs_to_jiffies(PRUNE_PERIOD)); } =20 +void hsr_prune_proxy_nodes(struct timer_list *t) +{ + struct hsr_priv *hsr =3D from_timer(hsr, t, prune_proxy_timer); + unsigned long timestamp; + struct hsr_node *node; + struct hsr_node *tmp; + + spin_lock_bh(&hsr->list_lock); + list_for_each_entry_safe(node, tmp, &hsr->proxy_node_db, mac_list) { + timestamp =3D node->time_in[HSR_PT_INTERLINK]; + + /* Prune old entries */ + if (time_is_before_jiffies(timestamp + + msecs_to_jiffies(HSR_PROXY_NODE_FORGET_TIME))) { + hsr_nl_nodedown(hsr, node->macaddress_A); + if (!node->removed) { + list_del_rcu(&node->mac_list); + node->removed =3D true; + /* Note that we need to free this entry later: */ + kfree_rcu(node, rcu_head); + } + } + } + + spin_unlock_bh(&hsr->list_lock); + + /* Restart timer */ + mod_timer(&hsr->prune_proxy_timer, + jiffies + msecs_to_jiffies(PRUNE_PROXY_PERIOD)); +} + void *hsr_get_next_node(struct hsr_priv *hsr, void *_pos, unsigned char addr[ETH_ALEN]) { diff --git a/net/hsr/hsr_framereg.h b/net/hsr/hsr_framereg.h index b23556251d62..7619e31c1d2d 100644 --- a/net/hsr/hsr_framereg.h +++ b/net/hsr/hsr_framereg.h @@ -46,6 +46,7 @@ int hsr_register_frame_out(struct hsr_port *port, struct = hsr_node *node, u16 sequence_nr); =20 void hsr_prune_nodes(struct timer_list *t); +void hsr_prune_proxy_nodes(struct timer_list *t); =20 int hsr_create_self_node(struct hsr_priv *hsr, const unsigned char addr_a[ETH_ALEN], @@ -67,6 +68,9 @@ void prp_handle_san_frame(bool san, enum hsr_port_type po= rt, struct hsr_node *node); void prp_update_san_info(struct hsr_node *node, bool is_sup); =20 +bool hsr_is_node_in_db(struct list_head *node_db, + const unsigned char addr[ETH_ALEN]); + struct hsr_node { struct list_head mac_list; /* Protect R/W access to seq_out */ diff --git a/net/hsr/hsr_main.h b/net/hsr/hsr_main.h index 18e01791ad79..23850b16d1ea 100644 --- a/net/hsr/hsr_main.h +++ b/net/hsr/hsr_main.h @@ -21,6 +21,7 @@ */ #define HSR_LIFE_CHECK_INTERVAL 2000 /* ms */ #define HSR_NODE_FORGET_TIME 60000 /* ms */ +#define HSR_PROXY_NODE_FORGET_TIME 60000 /* ms */ #define HSR_ANNOUNCE_INTERVAL 100 /* ms */ #define HSR_ENTRY_FORGET_TIME 400 /* ms */ =20 @@ -35,6 +36,7 @@ * HSR_NODE_FORGET_TIME? */ #define PRUNE_PERIOD 3000 /* ms */ +#define PRUNE_PROXY_PERIOD 3000 /* ms */ #define HSR_TLV_EOT 0 /* End of TLVs */ #define HSR_TLV_ANNOUNCE 22 #define HSR_TLV_LIFE_CHECK 23 @@ -192,11 +194,14 @@ struct hsr_priv { struct rcu_head rcu_head; struct list_head ports; struct list_head node_db; /* Known HSR nodes */ + struct list_head proxy_node_db; /* RedBox HSR proxy nodes */ struct hsr_self_node __rcu *self_node; /* MACs of slaves */ struct timer_list announce_timer; /* Supervision frame dispatch */ struct timer_list prune_timer; + struct timer_list prune_proxy_timer; int announce_count; u16 sequence_nr; + u16 interlink_sequence_nr; /* Interlink port seq_nr */ u16 sup_sequence_nr; /* For HSRv1 separate seq_nr for supervision */ enum hsr_version prot_version; /* Indicate if HSRv0, HSRv1 or PRPv1 */ spinlock_t seqnr_lock; /* locking for sequence_nr */ @@ -209,6 +214,8 @@ struct hsr_priv { * of lan_id */ bool fwd_offloaded; /* Forwarding offloaded to HW */ + bool redbox; /* Device supports HSR RedBox */ + unsigned char macaddress_redbox[ETH_ALEN]; unsigned char sup_multicast_addr[ETH_ALEN] __aligned(sizeof(u16)); /* Align to u16 boundary to avoid unaligned access * in ether_addr_equal diff --git a/net/hsr/hsr_netlink.c b/net/hsr/hsr_netlink.c index 78fe40eb9f01..898f18c6da53 100644 --- a/net/hsr/hsr_netlink.c +++ b/net/hsr/hsr_netlink.c @@ -23,6 +23,7 @@ static const struct nla_policy hsr_policy[IFLA_HSR_MAX + = 1] =3D { [IFLA_HSR_SUPERVISION_ADDR] =3D { .len =3D ETH_ALEN }, [IFLA_HSR_SEQ_NR] =3D { .type =3D NLA_U16 }, [IFLA_HSR_PROTOCOL] =3D { .type =3D NLA_U8 }, + [IFLA_HSR_INTERLINK] =3D { .type =3D NLA_U32 }, }; =20 /* Here, it seems a netdevice has already been allocated for us, and the @@ -35,8 +36,8 @@ static int hsr_newlink(struct net *src_net, struct net_de= vice *dev, enum hsr_version proto_version; unsigned char multicast_spec; u8 proto =3D HSR_PROTOCOL_HSR; - struct net_device *link[2]; =20 + struct net_device *link[2], *interlink =3D NULL; if (!data) { NL_SET_ERR_MSG_MOD(extack, "No slave devices specified"); return -EINVAL; @@ -67,6 +68,20 @@ static int hsr_newlink(struct net *src_net, struct net_d= evice *dev, return -EINVAL; } =20 + if (data[IFLA_HSR_INTERLINK]) + interlink =3D __dev_get_by_index(src_net, + nla_get_u32(data[IFLA_HSR_INTERLINK])); + + if (interlink && interlink =3D=3D link[0]) { + NL_SET_ERR_MSG_MOD(extack, "Interlink and Slave1 are the same"); + return -EINVAL; + } + + if (interlink && interlink =3D=3D link[1]) { + NL_SET_ERR_MSG_MOD(extack, "Interlink and Slave2 are the same"); + return -EINVAL; + } + if (!data[IFLA_HSR_MULTICAST_SPEC]) multicast_spec =3D 0; else @@ -96,10 +111,17 @@ static int hsr_newlink(struct net *src_net, struct net= _device *dev, } } =20 - if (proto =3D=3D HSR_PROTOCOL_PRP) + if (proto =3D=3D HSR_PROTOCOL_PRP) { proto_version =3D PRP_V1; + if (interlink) { + NL_SET_ERR_MSG_MOD(extack, + "Interlink only works with HSR"); + return -EINVAL; + } + } =20 - return hsr_dev_finalize(dev, link, multicast_spec, proto_version, extack); + return hsr_dev_finalize(dev, link, interlink, multicast_spec, + proto_version, extack); } =20 static void hsr_dellink(struct net_device *dev, struct list_head *head) @@ -107,6 +129,7 @@ static void hsr_dellink(struct net_device *dev, struct = list_head *head) struct hsr_priv *hsr =3D netdev_priv(dev); =20 del_timer_sync(&hsr->prune_timer); + del_timer_sync(&hsr->prune_proxy_timer); del_timer_sync(&hsr->announce_timer); =20 hsr_debugfs_term(hsr); @@ -114,6 +137,7 @@ static void hsr_dellink(struct net_device *dev, struct = list_head *head) =20 hsr_del_self_node(hsr); hsr_del_nodes(&hsr->node_db); + hsr_del_nodes(&hsr->proxy_node_db); =20 unregister_netdevice_queue(dev, head); } diff --git a/net/hsr/hsr_slave.c b/net/hsr/hsr_slave.c index 1b6457f357bd..af6cf64a00e0 100644 --- a/net/hsr/hsr_slave.c +++ b/net/hsr/hsr_slave.c @@ -55,6 +55,7 @@ static rx_handler_result_t hsr_handle_frame(struct sk_buf= f **pskb) protocol =3D eth_hdr(skb)->h_proto; =20 if (!(port->dev->features & NETIF_F_HW_HSR_TAG_RM) && + port->type !=3D HSR_PT_INTERLINK && hsr->proto_ops->invalid_dan_ingress_frame && hsr->proto_ops->invalid_dan_ingress_frame(protocol)) goto finish_pass; --=20 2.20.1 From nobody Sun May 19 01:26:41 2024 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9016A13280E; Tue, 23 Apr 2024 12:49:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=85.214.62.61 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876568; cv=none; b=lxbAQiLqlAgeHawm11xWAkZuslI3wZtREOA7Vxey+2IuNEXKos9NC2dwofQraU1eYn06E2xM6SIgT7xG1wa6nkyELK3G8D7lLFv2Ud5eDOnxQvhT4ZO++xwa5Yh2o027dRJVUGBLY3yNw8jvTdXyT5zosRoJ0iAFxFZjoPwyKgQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876568; c=relaxed/simple; bh=ENEQWjd/orFKbPCnRA9/wp03isKnfgGXn50Q9kBx/4U=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PqP82DmtRbV2LfRmrhGQCht0WUgDm7oO8KMLIlmRQVjYijrM2jJevXYzfPC4Nan24J9cb33TQV3jQov47XQPbymlkI3SGS2fRHMHgGL6C9qvddQ/c+91s3w2iFD8k/GLP28UZKxwftjP3qrZNWpPzBHGHn/QX14Iz2QTKknZP/A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de; spf=pass smtp.mailfrom=denx.de; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b=RosOYJi7; arc=none smtp.client-ip=85.214.62.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=denx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b="RosOYJi7" Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 5F7BA88599; Tue, 23 Apr 2024 14:49:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1713876564; bh=IiL05VoBy7iASraWS1ixTUxUFwRXhuZA90r6BgcT/kg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RosOYJi7Xh7QYxrSYxVRaMxlMl1g5I2pa1CGd3o7KvgVt4+dsWdCi4v0UgEEcA2Gm AzmPTexUihPUTnZRILSDCA6ihpeA5E7GoDpOWEDZ9inq2+bMT743FLHMGrtrLrof21 aC+WwQlqjxC3Sy8uKkaLnlQYgJ2uuzDp8kpalOGCq04wktHT/uV5xZKMWYTqZFF9HR t+R63CyIThWH2d7TJ+pXqYvrSZRpnUJzLUld/A0i+SxRkLNgXt0X1ns4bPk59gQ2w4 0SQcTkrRMSC1vpl0Whw1gr6TBqWf+SnLLCpJufgdxiiMZ7VckG6ihdwk5vkWGyobev jEJBEPOvXAOcw== From: Lukasz Majewski To: netdev@vger.kernel.org, Paolo Abeni , Casper Andersson Cc: Andrew Lunn , Eric Dumazet , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , Oleksij Rempel , Tristram.Ha@microchip.com, Sebastian Andrzej Siewior , Ravi Gunasekaran , Simon Horman , Nikita Zhandarovich , Murali Karicheri , Jiri Pirko , Dan Carpenter , Ziyang Xuan , Shigeru Yoshida , "Ricardo B. Marliere" , linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [net-next PATCH v6 2/5] test: hsr: Remove script code already implemented in lib.sh Date: Tue, 23 Apr 2024 14:49:05 +0200 Message-Id: <20240423124908.2073400-3-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240423124908.2073400-1-lukma@denx.de> References: <20240423124908.2073400-1-lukma@denx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Some parts (like netns creation and cleanup) of hsr_ping.sh script are already implemented in ../lib.sh common script, so can be replaced by it. Signed-off-by: Lukasz Majewski --- Changes for v6: - New patch --- tools/testing/selftests/net/hsr/hsr_ping.sh | 28 +++------------------ 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/tools/testing/selftests/net/hsr/hsr_ping.sh b/tools/testing/se= lftests/net/hsr/hsr_ping.sh index 1c6457e54625..bd7c4b8f07b8 100755 --- a/tools/testing/selftests/net/hsr/hsr_ping.sh +++ b/tools/testing/selftests/net/hsr/hsr_ping.sh @@ -1,6 +1,7 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 =20 +source ../lib.sh ret=3D0 ksft_skip=3D4 ipv6=3Dtrue @@ -27,19 +28,7 @@ while getopts "$optstring" option;do esac done =20 -sec=3D$(date +%s) -rndh=3D$(printf %x $sec)-$(mktemp -u XXXXXX) -ns1=3D"ns1-$rndh" -ns2=3D"ns2-$rndh" -ns3=3D"ns3-$rndh" - -cleanup() -{ - local netns - for netns in "$ns1" "$ns2" "$ns3" ;do - ip netns del $netns - done -} +setup_ns ns1 ns2 ns3 =20 # $1: IP address is_v6() @@ -254,21 +243,10 @@ if [ $? -ne 0 ];then exit $ksft_skip fi =20 -trap cleanup EXIT - -for i in "$ns1" "$ns2" "$ns3" ;do - ip netns add $i || exit $ksft_skip - ip -net $i link set lo up -done +trap cleanup_all_ns EXIT =20 setup_hsr_interfaces 0 do_complete_ping_test -cleanup - -for i in "$ns1" "$ns2" "$ns3" ;do - ip netns add $i || exit $ksft_skip - ip -net $i link set lo up -done =20 setup_hsr_interfaces 1 do_complete_ping_test --=20 2.20.1 From nobody Sun May 19 01:26:41 2024 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D9BD129E95; Tue, 23 Apr 2024 12:49:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=85.214.62.61 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876569; cv=none; b=kE4p8sCecS1jpr260KUwcLx+PhnQkU79tkrtuh9uXVUf4jCmgQrLJ1psM1NQ35pGd0txC8YC/6gRf1Mk5RjFSkHvf5noS/IRFcmZyFYT46RQH4m7ajggffl9KDtGhZZpgHjz3h1KTWCPM/ozN7jl/Lq5Te3g1h2g3ta1m5OSEyg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876569; c=relaxed/simple; bh=l+EukYChqq3qBiwbnn/UAYYX26vJ61gYpOLFJtik6bY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jGY1Eg1pCgppVtYLEWNta39EgPLoTHq9zI+pI8e1faxFcVS1HYN+w9GTR4ykVFIRqRZV5sAI0XcEM6hTXqFAySZrbmpFOkO4ogLFv1uNShbJN/UDOFvY+53z96jvO+D1WObqxVO66A0k8ZT70M0Boj9OfY3UycbzEIohgLglIPA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de; spf=pass smtp.mailfrom=denx.de; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b=qZUi1j3k; arc=none smtp.client-ip=85.214.62.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=denx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b="qZUi1j3k" Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 100C1885A2; Tue, 23 Apr 2024 14:49:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1713876565; bh=h6JvA4qYo+9oassIObUcS54wmHUdhNA+WMQkhrfxRto=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=qZUi1j3kLXUtYII9cb6AcHh+Ekltqz63a1ArnrIoXpzkqBw6U/RF3j3+N0aPCYClQ 26yRoS8XRmNrdpXOH0/IdKws8anDa69g3kOVqStWIEzhjrwdyJHTY89iYV73+qUOZn oG4a7oNKkzmP17T6dUvvScoWb/Pqu0kjr6cJsXNHYU4qshhN/lU5VT6U6cE5YQaxMt Z2+1hHRfKqyCatRfQGskRUj3vLEGl7nBg9MYREtSUkRhw3vsJJepPXuw+cZH90wMiB Z5LT5jgnqExfEM6P6zNeKMVxwgFjo1uyCSTT8Yd3Ws4e9C/TKiMkTwxmqMJH6dCiwt KuBgkvrQeSS9g== From: Lukasz Majewski To: netdev@vger.kernel.org, Paolo Abeni , Casper Andersson Cc: Andrew Lunn , Eric Dumazet , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , Oleksij Rempel , Tristram.Ha@microchip.com, Sebastian Andrzej Siewior , Ravi Gunasekaran , Simon Horman , Nikita Zhandarovich , Murali Karicheri , Jiri Pirko , Dan Carpenter , Ziyang Xuan , Shigeru Yoshida , "Ricardo B. Marliere" , linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [net-next PATCH v6 3/5] test: hsr: Move common code to hsr_common.sh file Date: Tue, 23 Apr 2024 14:49:06 +0200 Message-Id: <20240423124908.2073400-4-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240423124908.2073400-1-lukma@denx.de> References: <20240423124908.2073400-1-lukma@denx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Some of the code already present in the hsr_ping.sh test program can be moved to a separate script file, so it can be reused by other HSR functionality (like HSR-SAN) tests. Signed-off-by: Lukasz Majewski --- Changes for v6: - Use common code from ../lib.sh - Add hsr_common.sh to TEST_FILES variable --- tools/testing/selftests/net/hsr/Makefile | 1 + tools/testing/selftests/net/hsr/hsr_common.sh | 83 +++++++++++++++++++ tools/testing/selftests/net/hsr/hsr_ping.sh | 82 +----------------- 3 files changed, 88 insertions(+), 78 deletions(-) create mode 100644 tools/testing/selftests/net/hsr/hsr_common.sh diff --git a/tools/testing/selftests/net/hsr/Makefile b/tools/testing/selft= ests/net/hsr/Makefile index 92c1d9d080cd..c782ad19e011 100644 --- a/tools/testing/selftests/net/hsr/Makefile +++ b/tools/testing/selftests/net/hsr/Makefile @@ -3,5 +3,6 @@ top_srcdir =3D ../../../../.. =20 TEST_PROGS :=3D hsr_ping.sh +TEST_FILES +=3D hsr_common.sh =20 include ../../lib.mk diff --git a/tools/testing/selftests/net/hsr/hsr_common.sh b/tools/testing/= selftests/net/hsr/hsr_common.sh new file mode 100644 index 000000000000..be4ad07ff355 --- /dev/null +++ b/tools/testing/selftests/net/hsr/hsr_common.sh @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: GPL-2.0 +# Common code for HSR testing scripts + +source ../lib.sh +ret=3D0 +ksft_skip=3D4 + +# $1: IP address +is_v6() +{ + [ -z "${1##*:*}" ] +} + +do_ping() +{ + local netns=3D"$1" + local connect_addr=3D"$2" + local ping_args=3D"-q -c 2" + + if is_v6 "${connect_addr}"; then + $ipv6 || return 0 + ping_args=3D"${ping_args} -6" + fi + + ip netns exec ${netns} ping ${ping_args} $connect_addr >/dev/null + if [ $? -ne 0 ] ; then + echo "$netns -> $connect_addr connectivity [ FAIL ]" 1>&2 + ret=3D1 + return 1 + fi + + return 0 +} + +do_ping_long() +{ + local netns=3D"$1" + local connect_addr=3D"$2" + local ping_args=3D"-q -c 10" + + if is_v6 "${connect_addr}"; then + $ipv6 || return 0 + ping_args=3D"${ping_args} -6" + fi + + OUT=3D"$(LANG=3DC ip netns exec ${netns} ping ${ping_args} $connect_addr = | grep received)" + if [ $? -ne 0 ] ; then + echo "$netns -> $connect_addr ping [ FAIL ]" 1>&2 + ret=3D1 + return 1 + fi + + VAL=3D"$(echo $OUT | cut -d' ' -f1-8)" + if [ "$VAL" !=3D "10 packets transmitted, 10 received, 0% packet loss," ] + then + echo "$netns -> $connect_addr ping TEST [ FAIL ]" + echo "Expect to send and receive 10 packets and no duplicates." + echo "Full message: ${OUT}." + ret=3D1 + return 1 + fi + + return 0 +} + +stop_if_error() +{ + local msg=3D"$1" + + if [ ${ret} -ne 0 ]; then + echo "FAIL: ${msg}" 1>&2 + exit ${ret} + fi +} + +check_prerequisites() +{ + ip -Version > /dev/null 2>&1 + if [ $? -ne 0 ];then + echo "SKIP: Could not run test without ip tool" + exit $ksft_skip + fi +} diff --git a/tools/testing/selftests/net/hsr/hsr_ping.sh b/tools/testing/se= lftests/net/hsr/hsr_ping.sh index bd7c4b8f07b8..790294c8af83 100755 --- a/tools/testing/selftests/net/hsr/hsr_ping.sh +++ b/tools/testing/selftests/net/hsr/hsr_ping.sh @@ -1,11 +1,10 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 =20 -source ../lib.sh -ret=3D0 -ksft_skip=3D4 ipv6=3Dtrue =20 +source ./hsr_common.sh + optstring=3D"h4" usage() { echo "Usage: $0 [OPTION]" @@ -28,76 +27,6 @@ while getopts "$optstring" option;do esac done =20 -setup_ns ns1 ns2 ns3 - -# $1: IP address -is_v6() -{ - [ -z "${1##*:*}" ] -} - -do_ping() -{ - local netns=3D"$1" - local connect_addr=3D"$2" - local ping_args=3D"-q -c 2" - - if is_v6 "${connect_addr}"; then - $ipv6 || return 0 - ping_args=3D"${ping_args} -6" - fi - - ip netns exec ${netns} ping ${ping_args} $connect_addr >/dev/null - if [ $? -ne 0 ] ; then - echo "$netns -> $connect_addr connectivity [ FAIL ]" 1>&2 - ret=3D1 - return 1 - fi - - return 0 -} - -do_ping_long() -{ - local netns=3D"$1" - local connect_addr=3D"$2" - local ping_args=3D"-q -c 10" - - if is_v6 "${connect_addr}"; then - $ipv6 || return 0 - ping_args=3D"${ping_args} -6" - fi - - OUT=3D"$(LANG=3DC ip netns exec ${netns} ping ${ping_args} $connect_addr = | grep received)" - if [ $? -ne 0 ] ; then - echo "$netns -> $connect_addr ping [ FAIL ]" 1>&2 - ret=3D1 - return 1 - fi - - VAL=3D"$(echo $OUT | cut -d' ' -f1-8)" - if [ "$VAL" !=3D "10 packets transmitted, 10 received, 0% packet loss," ] - then - echo "$netns -> $connect_addr ping TEST [ FAIL ]" - echo "Expect to send and receive 10 packets and no duplicates." - echo "Full message: ${OUT}." - ret=3D1 - return 1 - fi - - return 0 -} - -stop_if_error() -{ - local msg=3D"$1" - - if [ ${ret} -ne 0 ]; then - echo "FAIL: ${msg}" 1>&2 - exit ${ret} - fi -} - do_complete_ping_test() { echo "INFO: Initial validation ping." @@ -237,11 +166,8 @@ setup_hsr_interfaces() ip -net "$ns3" link set hsr3 up } =20 -ip -Version > /dev/null 2>&1 -if [ $? -ne 0 ];then - echo "SKIP: Could not run test without ip tool" - exit $ksft_skip -fi +check_prerequisites +setup_ns ns1 ns2 ns3 =20 trap cleanup_all_ns EXIT =20 --=20 2.20.1 From nobody Sun May 19 01:26:41 2024 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0734912DDBE; Tue, 23 Apr 2024 12:49:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=85.214.62.61 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876569; cv=none; b=ZdsfJ3hyLZOzKP7Ft04Jdi/Wcx5OFIvZsFuPzXMn+2XEvRyBrJgLNkg8Wgtc8X+Ssk78+NP9QHvRMXfMwlV9AymoKQYINtLW1lmteQ3zBKKUZLyok5klzVk7gF6d8RQn9t0zPUHoPmSBVzns1PFAgxuAnQLkKxTgsGKQsAIQ1w4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876569; c=relaxed/simple; bh=4KJAZTnFdP0YfNsuIvgBcb3TjXvRU3k02Foba2mASPY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=EmxBgTJCxbc3WzVmujTW6cy0tFnrYUs8M9pTlSZZSUnvNdeCo3SzZgwIpEQ/AMzH4QGrrYkvNeyN75RByuKV1JRVNGSda5MZixwF2wUeKiQzB/wGAf6cjrCsEYPKaxqWfhtRHBtrSs5Onm6FqotwCmaYFB1AlL7iTGNTpmWPm6E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de; spf=pass smtp.mailfrom=denx.de; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b=tVkokZzG; arc=none smtp.client-ip=85.214.62.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=denx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b="tVkokZzG" Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id BAEB48828C; Tue, 23 Apr 2024 14:49:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1713876566; bh=kzTo4K8y7VuBk5h4xs8FQ5Pjrt3pC9EnvZtlpBFRwK8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tVkokZzGMiaiUWimE/8N7Nc2vjrEGPsZaXZbcF9qic2l6L54sKxDS7QTicsfnTYzD Tj4JhfV1WdR/fO1kiMc8mpziyJBxrjMXsOoieUCZ/e3sg3uwG1upGywbXhhsALHqk7 7zd9RnbiSz0NuNm8N4nSx1YipM97IO8hyZAPsAwaQEo8LgaRX87HjaPBfH1zL7P0Yf ocG4VF0RR0s028fQg2x/Lfhia1Rkf1G21AndbCenD6CLKbSBMPN/HEq/+Ec2LTYSr5 Eco19MkWvt4yH+8IYlHN21IjfkGgXMd5+DtSqYfALNx3hm3lHkLYUYBN18Eb/7MpIs mauMxg6VIZUcQ== From: Lukasz Majewski To: netdev@vger.kernel.org, Paolo Abeni , Casper Andersson Cc: Andrew Lunn , Eric Dumazet , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , Oleksij Rempel , Tristram.Ha@microchip.com, Sebastian Andrzej Siewior , Ravi Gunasekaran , Simon Horman , Nikita Zhandarovich , Murali Karicheri , Jiri Pirko , Dan Carpenter , Ziyang Xuan , Shigeru Yoshida , "Ricardo B. Marliere" , linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [net-next PATCH v6 4/5] test: hsr: Extract version agnostic information from ping command output Date: Tue, 23 Apr 2024 14:49:07 +0200 Message-Id: <20240423124908.2073400-5-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240423124908.2073400-1-lukma@denx.de> References: <20240423124908.2073400-1-lukma@denx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" Current code checks if ping command output match hardcoded pattern: "10 packets transmitted, 10 received, 0% packet loss,". Such approach will work only from one ping program version (for which this test has been originally written). This patch address problem when ping with different summary output like "10 packets transmitted, 10 packets received, 0% packet" is used to run this test - for example one from busybox (as the test system runs in QEMU with rootfs created with buildroot). The fix is to modify output of ping command to be agnostic to ping version used on the platform. Signed-off-by: Lukasz Majewski --- Changes for v6: - New patch --- tools/testing/selftests/net/hsr/hsr_common.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/hsr/hsr_common.sh b/tools/testing/= selftests/net/hsr/hsr_common.sh index be4ad07ff355..8e97b1f2e7e5 100644 --- a/tools/testing/selftests/net/hsr/hsr_common.sh +++ b/tools/testing/selftests/net/hsr/hsr_common.sh @@ -51,7 +51,8 @@ do_ping_long() fi =20 VAL=3D"$(echo $OUT | cut -d' ' -f1-8)" - if [ "$VAL" !=3D "10 packets transmitted, 10 received, 0% packet loss," ] + SED_VAL=3D"$(echo ${VAL} | sed -r -e 's/([0-9]{2}).*([0-9]{2}).*[[:space:= ]]([0-9]+%).*/\1 transmitted \2 received \3 loss/')" + if [ "${SED_VAL}" !=3D "10 transmitted 10 received 0% loss" ] then echo "$netns -> $connect_addr ping TEST [ FAIL ]" echo "Expect to send and receive 10 packets and no duplicates." --=20 2.20.1 From nobody Sun May 19 01:26:41 2024 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B36CB135417; Tue, 23 Apr 2024 12:49:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=85.214.62.61 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876571; cv=none; b=K4MhaspcUko80mbF9lwGwy7RiWuLrMSGKLIIRDAntbecrjYyrKeuopPLbagxrKchXlMI3WsltgImk04qO/Lzup86pvHfkixKO8WZPvURsCuodLrbpmZoD9uQUv2YUGwQrA5+oTpnuU3w6FQBqH9Nkq+xlD0FDyL+DUX6N+W0vKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713876571; c=relaxed/simple; bh=uTLp+ELFhdGrJpCMfmww9OK9ESHzrjUhNlIi99hsMw0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=kMRXSZouYkrQK3mcmZ1IV8etGtdlRCfAeUyc809KmTrhq4EfPMEX9FMoi6GhhH5BU40Rhbwiggi/Xl14uX7OFPuayEi43Fu/ts2Kn2/cOjZj4JRMQL9bJE4IJa9cl9I/bbomRCTvx+qzTswEr+7mbCspLld9OsV8iLvZdX6KyH8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de; spf=pass smtp.mailfrom=denx.de; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b=vJqK1J1X; arc=none smtp.client-ip=85.214.62.61 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=denx.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=denx.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=denx.de header.i=@denx.de header.b="vJqK1J1X" Received: from localhost.localdomain (85-222-111-42.dynamic.chello.pl [85.222.111.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: lukma@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 714C48851D; Tue, 23 Apr 2024 14:49:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1713876567; bh=jhxcryAuFqbosk8HIXlOyLBsXBEZ6UHazg4UEaO9BxU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vJqK1J1Xh1VwdC06jg3okQcMTJofDvM5aDcHFFO7qpBv8vHQaYkrGp07H+nv4CbQa CPU/Cwm9XuQR3EkRKSV0TXa4S0lExV54bBbmaqPCuAiDyXGofbbyNBeO6jhEai3xR6 yaNgotRrnhgwF+c00gr1hMkwGiEBe+Q9raz5ZIt9KLZCAbbW3ZjKWk8EDma/sWkG6E hsDS8T3mgNbgR3Jk6Sb8SIVPRRQCyIsupQjAV/vqQjaf2RoX72sQ9yh5PTVMDP9G9n e8yEYpbhpoKJe3Edw2vLf6xbWfDHTJnW3sqeWygzRIeYC8KeK8MNQKqPYVN5LlOXIB YghhXeicI04mQ== From: Lukasz Majewski To: netdev@vger.kernel.org, Paolo Abeni , Casper Andersson Cc: Andrew Lunn , Eric Dumazet , Vladimir Oltean , "David S. Miller" , Jakub Kicinski , Oleksij Rempel , Tristram.Ha@microchip.com, Sebastian Andrzej Siewior , Ravi Gunasekaran , Simon Horman , Nikita Zhandarovich , Murali Karicheri , Jiri Pirko , Dan Carpenter , Ziyang Xuan , Shigeru Yoshida , "Ricardo B. Marliere" , linux-kernel@vger.kernel.org, Lukasz Majewski Subject: [net-next PATCH v6 5/5] test: hsr: Add test for HSR RedBOX (HSR-SAN) mode of operation Date: Tue, 23 Apr 2024 14:49:08 +0200 Message-Id: <20240423124908.2073400-6-lukma@denx.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20240423124908.2073400-1-lukma@denx.de> References: <20240423124908.2073400-1-lukma@denx.de> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Content-Type: text/plain; charset="utf-8" This patch adds hsr_redbox.sh script to test if HSR-SAN mode of operation works correctly. Signed-off-by: Lukasz Majewski --- Changes for v6: - add to Makefile's TEST_PROGS hsr_redbox.sh script --- tools/testing/selftests/net/hsr/Makefile | 2 +- tools/testing/selftests/net/hsr/hsr_redbox.sh | 92 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100755 tools/testing/selftests/net/hsr/hsr_redbox.sh diff --git a/tools/testing/selftests/net/hsr/Makefile b/tools/testing/selft= ests/net/hsr/Makefile index c782ad19e011..884cd2cc0681 100644 --- a/tools/testing/selftests/net/hsr/Makefile +++ b/tools/testing/selftests/net/hsr/Makefile @@ -2,7 +2,7 @@ =20 top_srcdir =3D ../../../../.. =20 -TEST_PROGS :=3D hsr_ping.sh +TEST_PROGS :=3D hsr_ping.sh hsr_redbox.sh TEST_FILES +=3D hsr_common.sh =20 include ../../lib.mk diff --git a/tools/testing/selftests/net/hsr/hsr_redbox.sh b/tools/testing/= selftests/net/hsr/hsr_redbox.sh new file mode 100755 index 000000000000..52e0412c32e6 --- /dev/null +++ b/tools/testing/selftests/net/hsr/hsr_redbox.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ipv6=3Dfalse + +source ./hsr_common.sh + +do_complete_ping_test() +{ + echo "INFO: Initial validation ping (HSR-SAN/RedBox)." + # Each node has to be able each one. + do_ping "${ns1}" 100.64.0.2 + do_ping "${ns2}" 100.64.0.1 + # Ping from SAN to hsr1 (via hsr2) + do_ping "${ns3}" 100.64.0.1 + do_ping "${ns1}" 100.64.0.3 + stop_if_error "Initial validation failed." + + # Wait for MGNT HSR frames being received and nodes being + # merged. + sleep 5 + + echo "INFO: Longer ping test (HSR-SAN/RedBox)." + # Ping from SAN to hsr1 (via hsr2) + do_ping_long "${ns3}" 100.64.0.1 + # Ping from hsr1 (via hsr2) to SAN + do_ping_long "${ns1}" 100.64.0.3 + stop_if_error "Longer ping test failed." + + echo "INFO: All good." +} + +setup_hsr_interfaces() +{ + local HSRv=3D"$1" + + echo "INFO: preparing interfaces for HSRv${HSRv} (HSR-SAN/RedBox)." + +# |NS1 | +# | | +# | /-- hsr1 --\ | +# | ns1eth1 ns1eth2 | +# |------------------------| +# | | +# | | +# | | +# |------------------------| |-----------| +# | ns2eth1 ns2eth2 | | | +# | \-- hsr2 --/ | | | +# | \ | | | +# | ns2eth3 |--------| ns3eth1 | +# | (interlink)| | | +# |NS2 (RedBOX) | |NS3 (SAN) | +# + # Check if iproute2 supports adding interlink port to hsrX device + ip link help hsr | grep -q INTERLINK + [ $? -ne 0 ] && { echo "iproute2: HSR interlink interface not supported!"= ; exit 0; } + + # Create interfaces for name spaces + ip link add ns1eth1 netns "${ns1}" type veth peer name ns2eth1 netns "${n= s2}" + ip link add ns1eth2 netns "${ns1}" type veth peer name ns2eth2 netns "${n= s2}" + ip link add ns3eth1 netns "${ns3}" type veth peer name ns2eth3 netns "${n= s2}" + + sleep 1 + + ip -n "${ns1}" link set ns1eth1 up + ip -n "${ns1}" link set ns1eth2 up + + ip -n "${ns2}" link set ns2eth1 up + ip -n "${ns2}" link set ns2eth2 up + ip -n "${ns2}" link set ns2eth3 up + + ip -n "${ns3}" link set ns3eth1 up + + ip -net "${ns1}" link add name hsr1 type hsr slave1 ns1eth1 slave2 ns1eth= 2 supervision 45 version ${HSRv} proto 0 + ip -net "${ns2}" link add name hsr2 type hsr slave1 ns2eth1 slave2 ns2eth= 2 interlink ns2eth3 supervision 45 version ${HSRv} proto 0 + + ip -n "${ns1}" addr add 100.64.0.1/24 dev hsr1 + ip -n "${ns2}" addr add 100.64.0.2/24 dev hsr2 + ip -n "${ns3}" addr add 100.64.0.3/24 dev ns3eth1 + + ip -n "${ns1}" link set hsr1 up + ip -n "${ns2}" link set hsr2 up +} + +check_prerequisites +setup_ns ns1 ns2 ns3 + +setup_hsr_interfaces 1 +do_complete_ping_test + +exit $ret --=20 2.20.1