xref: /kernel/linux/linux-5.10/net/hsr/hsr_forward.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright 2011-2014 Autronica Fire and Security AS
3 *
4 * Author(s):
5 *	2011-2014 Arvid Brodin, arvid.brodin@alten.se
6 *
7 * Frame router for HSR and PRP.
8 */
9
10#include "hsr_forward.h"
11#include <linux/types.h>
12#include <linux/skbuff.h>
13#include <linux/etherdevice.h>
14#include <linux/if_vlan.h>
15#include "hsr_main.h"
16#include "hsr_framereg.h"
17
18struct hsr_node;
19
20/* The uses I can see for these HSR supervision frames are:
21 * 1) Use the frames that are sent after node initialization ("HSR_TLV.Type =
22 *    22") to reset any sequence_nr counters belonging to that node. Useful if
23 *    the other node's counter has been reset for some reason.
24 *    --
25 *    Or not - resetting the counter and bridging the frame would create a
26 *    loop, unfortunately.
27 *
28 * 2) Use the LifeCheck frames to detect ring breaks. I.e. if no LifeCheck
29 *    frame is received from a particular node, we know something is wrong.
30 *    We just register these (as with normal frames) and throw them away.
31 *
32 * 3) Allow different MAC addresses for the two slave interfaces, using the
33 *    MacAddressA field.
34 */
35static bool is_supervision_frame(struct hsr_priv *hsr, struct sk_buff *skb)
36{
37	struct ethhdr *eth_hdr;
38	struct hsr_sup_tag *hsr_sup_tag;
39	struct hsrv1_ethhdr_sp *hsr_V1_hdr;
40
41	WARN_ON_ONCE(!skb_mac_header_was_set(skb));
42	eth_hdr = (struct ethhdr *)skb_mac_header(skb);
43
44	/* Correct addr? */
45	if (!ether_addr_equal(eth_hdr->h_dest,
46			      hsr->sup_multicast_addr))
47		return false;
48
49	/* Correct ether type?. */
50	if (!(eth_hdr->h_proto == htons(ETH_P_PRP) ||
51	      eth_hdr->h_proto == htons(ETH_P_HSR)))
52		return false;
53
54	/* Get the supervision header from correct location. */
55	if (eth_hdr->h_proto == htons(ETH_P_HSR)) { /* Okay HSRv1. */
56		hsr_V1_hdr = (struct hsrv1_ethhdr_sp *)skb_mac_header(skb);
57		if (hsr_V1_hdr->hsr.encap_proto != htons(ETH_P_PRP))
58			return false;
59
60		hsr_sup_tag = &hsr_V1_hdr->hsr_sup;
61	} else {
62		hsr_sup_tag =
63		     &((struct hsrv0_ethhdr_sp *)skb_mac_header(skb))->hsr_sup;
64	}
65
66	if (hsr_sup_tag->HSR_TLV_type != HSR_TLV_ANNOUNCE &&
67	    hsr_sup_tag->HSR_TLV_type != HSR_TLV_LIFE_CHECK &&
68	    hsr_sup_tag->HSR_TLV_type != PRP_TLV_LIFE_CHECK_DD &&
69	    hsr_sup_tag->HSR_TLV_type != PRP_TLV_LIFE_CHECK_DA)
70		return false;
71	if (hsr_sup_tag->HSR_TLV_length != 12 &&
72	    hsr_sup_tag->HSR_TLV_length != sizeof(struct hsr_sup_payload))
73		return false;
74
75	return true;
76}
77
78static struct sk_buff *create_stripped_skb_hsr(struct sk_buff *skb_in,
79					       struct hsr_frame_info *frame)
80{
81	struct sk_buff *skb;
82	int copylen;
83	unsigned char *dst, *src;
84
85	skb_pull(skb_in, HSR_HLEN);
86	skb = __pskb_copy(skb_in, skb_headroom(skb_in) - HSR_HLEN, GFP_ATOMIC);
87	skb_push(skb_in, HSR_HLEN);
88	if (!skb)
89		return NULL;
90
91	skb_reset_mac_header(skb);
92
93	if (skb->ip_summed == CHECKSUM_PARTIAL)
94		skb->csum_start -= HSR_HLEN;
95
96	copylen = 2 * ETH_ALEN;
97	if (frame->is_vlan)
98		copylen += VLAN_HLEN;
99	src = skb_mac_header(skb_in);
100	dst = skb_mac_header(skb);
101	memcpy(dst, src, copylen);
102
103	skb->protocol = eth_hdr(skb)->h_proto;
104	return skb;
105}
106
107struct sk_buff *hsr_get_untagged_frame(struct hsr_frame_info *frame,
108				       struct hsr_port *port)
109{
110	if (!frame->skb_std) {
111		if (frame->skb_hsr)
112			frame->skb_std =
113				create_stripped_skb_hsr(frame->skb_hsr, frame);
114		else
115			netdev_warn_once(port->dev,
116					 "Unexpected frame received in hsr_get_untagged_frame()\n");
117
118		if (!frame->skb_std)
119			return NULL;
120	}
121
122	return skb_clone(frame->skb_std, GFP_ATOMIC);
123}
124
125struct sk_buff *prp_get_untagged_frame(struct hsr_frame_info *frame,
126				       struct hsr_port *port)
127{
128	if (!frame->skb_std) {
129		if (frame->skb_prp) {
130			/* trim the skb by len - HSR_HLEN to exclude RCT */
131			skb_trim(frame->skb_prp,
132				 frame->skb_prp->len - HSR_HLEN);
133			frame->skb_std =
134				__pskb_copy(frame->skb_prp,
135					    skb_headroom(frame->skb_prp),
136					    GFP_ATOMIC);
137		} else {
138			/* Unexpected */
139			WARN_ONCE(1, "%s:%d: Unexpected frame received (port_src %s)\n",
140				  __FILE__, __LINE__, port->dev->name);
141			return NULL;
142		}
143	}
144
145	return skb_clone(frame->skb_std, GFP_ATOMIC);
146}
147
148static void prp_set_lan_id(struct prp_rct *trailer,
149			   struct hsr_port *port)
150{
151	int lane_id;
152
153	if (port->type == HSR_PT_SLAVE_A)
154		lane_id = 0;
155	else
156		lane_id = 1;
157
158	/* Add net_id in the upper 3 bits of lane_id */
159	lane_id |= port->hsr->net_id;
160	set_prp_lan_id(trailer, lane_id);
161}
162
163/* Tailroom for PRP rct should have been created before calling this */
164static struct sk_buff *prp_fill_rct(struct sk_buff *skb,
165				    struct hsr_frame_info *frame,
166				    struct hsr_port *port)
167{
168	struct prp_rct *trailer;
169	int min_size = ETH_ZLEN;
170	int lsdu_size;
171
172	if (!skb)
173		return skb;
174
175	if (frame->is_vlan)
176		min_size = VLAN_ETH_ZLEN;
177
178	if (skb_put_padto(skb, min_size))
179		return NULL;
180
181	trailer = (struct prp_rct *)skb_put(skb, HSR_HLEN);
182	lsdu_size = skb->len - 14;
183	if (frame->is_vlan)
184		lsdu_size -= 4;
185	prp_set_lan_id(trailer, port);
186	set_prp_LSDU_size(trailer, lsdu_size);
187	trailer->sequence_nr = htons(frame->sequence_nr);
188	trailer->PRP_suffix = htons(ETH_P_PRP);
189	skb->protocol = eth_hdr(skb)->h_proto;
190
191	return skb;
192}
193
194static void hsr_set_path_id(struct hsr_ethhdr *hsr_ethhdr,
195			    struct hsr_port *port)
196{
197	int path_id;
198
199	if (port->type == HSR_PT_SLAVE_A)
200		path_id = 0;
201	else
202		path_id = 1;
203
204	set_hsr_tag_path(&hsr_ethhdr->hsr_tag, path_id);
205}
206
207static struct sk_buff *hsr_fill_tag(struct sk_buff *skb,
208				    struct hsr_frame_info *frame,
209				    struct hsr_port *port, u8 proto_version)
210{
211	struct hsr_ethhdr *hsr_ethhdr;
212	int lsdu_size;
213
214	/* pad to minimum packet size which is 60 + 6 (HSR tag) */
215	if (skb_put_padto(skb, ETH_ZLEN + HSR_HLEN))
216		return NULL;
217
218	lsdu_size = skb->len - 14;
219	if (frame->is_vlan)
220		lsdu_size -= 4;
221
222	hsr_ethhdr = (struct hsr_ethhdr *)skb_mac_header(skb);
223
224	hsr_set_path_id(hsr_ethhdr, port);
225	set_hsr_tag_LSDU_size(&hsr_ethhdr->hsr_tag, lsdu_size);
226	hsr_ethhdr->hsr_tag.sequence_nr = htons(frame->sequence_nr);
227	hsr_ethhdr->hsr_tag.encap_proto = hsr_ethhdr->ethhdr.h_proto;
228	hsr_ethhdr->ethhdr.h_proto = htons(proto_version ?
229			ETH_P_HSR : ETH_P_PRP);
230	skb->protocol = hsr_ethhdr->ethhdr.h_proto;
231
232	return skb;
233}
234
235/* If the original frame was an HSR tagged frame, just clone it to be sent
236 * unchanged. Otherwise, create a private frame especially tagged for 'port'.
237 */
238struct sk_buff *hsr_create_tagged_frame(struct hsr_frame_info *frame,
239					struct hsr_port *port)
240{
241	unsigned char *dst, *src;
242	struct sk_buff *skb;
243	int movelen;
244
245	if (frame->skb_hsr) {
246		struct hsr_ethhdr *hsr_ethhdr =
247			(struct hsr_ethhdr *)skb_mac_header(frame->skb_hsr);
248
249		/* set the lane id properly */
250		hsr_set_path_id(hsr_ethhdr, port);
251		return skb_clone(frame->skb_hsr, GFP_ATOMIC);
252	}
253
254	/* Create the new skb with enough headroom to fit the HSR tag */
255	skb = __pskb_copy(frame->skb_std,
256			  skb_headroom(frame->skb_std) + HSR_HLEN, GFP_ATOMIC);
257	if (!skb)
258		return NULL;
259	skb_reset_mac_header(skb);
260
261	if (skb->ip_summed == CHECKSUM_PARTIAL)
262		skb->csum_start += HSR_HLEN;
263
264	movelen = ETH_HLEN;
265	if (frame->is_vlan)
266		movelen += VLAN_HLEN;
267
268	src = skb_mac_header(skb);
269	dst = skb_push(skb, HSR_HLEN);
270	memmove(dst, src, movelen);
271	skb_reset_mac_header(skb);
272
273	/* skb_put_padto free skb on error and hsr_fill_tag returns NULL in
274	 * that case
275	 */
276	return hsr_fill_tag(skb, frame, port, port->hsr->prot_version);
277}
278
279struct sk_buff *prp_create_tagged_frame(struct hsr_frame_info *frame,
280					struct hsr_port *port)
281{
282	struct sk_buff *skb;
283
284	if (frame->skb_prp) {
285		struct prp_rct *trailer = skb_get_PRP_rct(frame->skb_prp);
286
287		if (trailer) {
288			prp_set_lan_id(trailer, port);
289		} else {
290			WARN_ONCE(!trailer, "errored PRP skb");
291			return NULL;
292		}
293		return skb_clone(frame->skb_prp, GFP_ATOMIC);
294	}
295
296	skb = skb_copy_expand(frame->skb_std, 0,
297			      skb_tailroom(frame->skb_std) + HSR_HLEN,
298			      GFP_ATOMIC);
299	return prp_fill_rct(skb, frame, port);
300}
301
302static void hsr_deliver_master(struct sk_buff *skb, struct net_device *dev,
303			       struct hsr_node *node_src)
304{
305	bool was_multicast_frame;
306	int res, recv_len;
307
308	was_multicast_frame = (skb->pkt_type == PACKET_MULTICAST);
309	hsr_addr_subst_source(node_src, skb);
310	skb_pull(skb, ETH_HLEN);
311	recv_len = skb->len;
312	res = netif_rx(skb);
313	if (res == NET_RX_DROP) {
314		dev->stats.rx_dropped++;
315	} else {
316		dev->stats.rx_packets++;
317		dev->stats.rx_bytes += recv_len;
318		if (was_multicast_frame)
319			dev->stats.multicast++;
320	}
321}
322
323static int hsr_xmit(struct sk_buff *skb, struct hsr_port *port,
324		    struct hsr_frame_info *frame)
325{
326	if (frame->port_rcv->type == HSR_PT_MASTER) {
327		hsr_addr_subst_dest(frame->node_src, skb, port);
328
329		/* Address substitution (IEC62439-3 pp 26, 50): replace mac
330		 * address of outgoing frame with that of the outgoing slave's.
331		 */
332		ether_addr_copy(eth_hdr(skb)->h_source, port->dev->dev_addr);
333	}
334	return dev_queue_xmit(skb);
335}
336
337bool prp_drop_frame(struct hsr_frame_info *frame, struct hsr_port *port)
338{
339	return ((frame->port_rcv->type == HSR_PT_SLAVE_A &&
340		 port->type ==  HSR_PT_SLAVE_B) ||
341		(frame->port_rcv->type == HSR_PT_SLAVE_B &&
342		 port->type ==  HSR_PT_SLAVE_A));
343}
344
345/* Forward the frame through all devices except:
346 * - Back through the receiving device
347 * - If it's a HSR frame: through a device where it has passed before
348 * - if it's a PRP frame: through another PRP slave device (no bridge)
349 * - To the local HSR master only if the frame is directly addressed to it, or
350 *   a non-supervision multicast or broadcast frame.
351 *
352 * HSR slave devices should insert a HSR tag into the frame, or forward the
353 * frame unchanged if it's already tagged. Interlink devices should strip HSR
354 * tags if they're of the non-HSR type (but only after duplicate discard). The
355 * master device always strips HSR tags.
356 */
357static void hsr_forward_do(struct hsr_frame_info *frame)
358{
359	struct hsr_port *port;
360	struct sk_buff *skb;
361
362	hsr_for_each_port(frame->port_rcv->hsr, port) {
363		struct hsr_priv *hsr = port->hsr;
364		/* Don't send frame back the way it came */
365		if (port == frame->port_rcv)
366			continue;
367
368		/* Don't deliver locally unless we should */
369		if (port->type == HSR_PT_MASTER && !frame->is_local_dest)
370			continue;
371
372		/* Deliver frames directly addressed to us to master only */
373		if (port->type != HSR_PT_MASTER && frame->is_local_exclusive)
374			continue;
375
376		/* Don't send frame over port where it has been sent before.
377		 * Also fro SAN, this shouldn't be done.
378		 */
379		if (!frame->is_from_san &&
380		    hsr_register_frame_out(port, frame->node_src,
381					   frame->sequence_nr))
382			continue;
383
384		if (frame->is_supervision && port->type == HSR_PT_MASTER) {
385			hsr_handle_sup_frame(frame);
386			continue;
387		}
388
389		/* Check if frame is to be dropped. Eg. for PRP no forward
390		 * between ports.
391		 */
392		if (hsr->proto_ops->drop_frame &&
393		    hsr->proto_ops->drop_frame(frame, port))
394			continue;
395
396		if (port->type != HSR_PT_MASTER)
397			skb = hsr->proto_ops->create_tagged_frame(frame, port);
398		else
399			skb = hsr->proto_ops->get_untagged_frame(frame, port);
400
401		if (!skb) {
402			frame->port_rcv->dev->stats.rx_dropped++;
403			continue;
404		}
405
406		skb->dev = port->dev;
407		if (port->type == HSR_PT_MASTER)
408			hsr_deliver_master(skb, port->dev, frame->node_src);
409		else
410			hsr_xmit(skb, port, frame);
411	}
412}
413
414static void check_local_dest(struct hsr_priv *hsr, struct sk_buff *skb,
415			     struct hsr_frame_info *frame)
416{
417	if (hsr_addr_is_self(hsr, eth_hdr(skb)->h_dest)) {
418		frame->is_local_exclusive = true;
419		skb->pkt_type = PACKET_HOST;
420	} else {
421		frame->is_local_exclusive = false;
422	}
423
424	if (skb->pkt_type == PACKET_HOST ||
425	    skb->pkt_type == PACKET_MULTICAST ||
426	    skb->pkt_type == PACKET_BROADCAST) {
427		frame->is_local_dest = true;
428	} else {
429		frame->is_local_dest = false;
430	}
431}
432
433static void handle_std_frame(struct sk_buff *skb,
434			     struct hsr_frame_info *frame)
435{
436	struct hsr_port *port = frame->port_rcv;
437	struct hsr_priv *hsr = port->hsr;
438
439	frame->skb_hsr = NULL;
440	frame->skb_prp = NULL;
441	frame->skb_std = skb;
442
443	if (port->type != HSR_PT_MASTER) {
444		frame->is_from_san = true;
445	} else {
446		/* Sequence nr for the master node */
447		lockdep_assert_held(&hsr->seqnr_lock);
448		frame->sequence_nr = hsr->sequence_nr;
449		hsr->sequence_nr++;
450	}
451}
452
453int hsr_fill_frame_info(__be16 proto, struct sk_buff *skb,
454			struct hsr_frame_info *frame)
455{
456	struct hsr_port *port = frame->port_rcv;
457	struct hsr_priv *hsr = port->hsr;
458
459	/* HSRv0 supervisory frames double as a tag so treat them as tagged. */
460	if ((!hsr->prot_version && proto == htons(ETH_P_PRP)) ||
461	    proto == htons(ETH_P_HSR)) {
462		/* Check if skb contains hsr_ethhdr */
463		if (skb->mac_len < sizeof(struct hsr_ethhdr))
464			return -EINVAL;
465
466		/* HSR tagged frame :- Data or Supervision */
467		frame->skb_std = NULL;
468		frame->skb_prp = NULL;
469		frame->skb_hsr = skb;
470		frame->sequence_nr = hsr_get_skb_sequence_nr(skb);
471		return 0;
472	}
473
474	/* Standard frame or PRP from master port */
475	handle_std_frame(skb, frame);
476
477	return 0;
478}
479
480int prp_fill_frame_info(__be16 proto, struct sk_buff *skb,
481			struct hsr_frame_info *frame)
482{
483	/* Supervision frame */
484	struct prp_rct *rct = skb_get_PRP_rct(skb);
485
486	if (rct &&
487	    prp_check_lsdu_size(skb, rct, frame->is_supervision)) {
488		frame->skb_hsr = NULL;
489		frame->skb_std = NULL;
490		frame->skb_prp = skb;
491		frame->sequence_nr = prp_get_skb_sequence_nr(rct);
492		return 0;
493	}
494	handle_std_frame(skb, frame);
495
496	return 0;
497}
498
499static int fill_frame_info(struct hsr_frame_info *frame,
500			   struct sk_buff *skb, struct hsr_port *port)
501{
502	struct hsr_priv *hsr = port->hsr;
503	struct hsr_vlan_ethhdr *vlan_hdr;
504	struct ethhdr *ethhdr;
505	__be16 proto;
506	int ret;
507
508	/* Check if skb contains ethhdr */
509	if (skb->mac_len < sizeof(struct ethhdr))
510		return -EINVAL;
511
512	memset(frame, 0, sizeof(*frame));
513	frame->is_supervision = is_supervision_frame(port->hsr, skb);
514	frame->node_src = hsr_get_node(port, &hsr->node_db, skb,
515				       frame->is_supervision,
516				       port->type);
517	if (!frame->node_src)
518		return -1; /* Unknown node and !is_supervision, or no mem */
519
520	ethhdr = (struct ethhdr *)skb_mac_header(skb);
521	frame->is_vlan = false;
522	proto = ethhdr->h_proto;
523
524	if (proto == htons(ETH_P_8021Q))
525		frame->is_vlan = true;
526
527	if (frame->is_vlan) {
528		vlan_hdr = (struct hsr_vlan_ethhdr *)ethhdr;
529		proto = vlan_hdr->vlanhdr.h_vlan_encapsulated_proto;
530		/* FIXME: */
531		netdev_warn_once(skb->dev, "VLAN not yet supported");
532		return -EINVAL;
533	}
534
535	frame->is_from_san = false;
536	frame->port_rcv = port;
537	ret = hsr->proto_ops->fill_frame_info(proto, skb, frame);
538	if (ret)
539		return ret;
540
541	check_local_dest(port->hsr, skb, frame);
542
543	return 0;
544}
545
546/* Must be called holding rcu read lock (because of the port parameter) */
547void hsr_forward_skb(struct sk_buff *skb, struct hsr_port *port)
548{
549	struct hsr_frame_info frame;
550
551	rcu_read_lock();
552	if (fill_frame_info(&frame, skb, port) < 0)
553		goto out_drop;
554
555	hsr_register_frame_in(frame.node_src, port, frame.sequence_nr);
556	hsr_forward_do(&frame);
557	rcu_read_unlock();
558	/* Gets called for ingress frames as well as egress from master port.
559	 * So check and increment stats for master port only here.
560	 */
561	if (port->type == HSR_PT_MASTER) {
562		port->dev->stats.tx_packets++;
563		port->dev->stats.tx_bytes += skb->len;
564	}
565
566	kfree_skb(frame.skb_hsr);
567	kfree_skb(frame.skb_prp);
568	kfree_skb(frame.skb_std);
569	return;
570
571out_drop:
572	rcu_read_unlock();
573	port->dev->stats.tx_dropped++;
574	kfree_skb(skb);
575}
576