Lines Matching +full:frame +full:- +full:master
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright 2011-2014 Autronica Fire and Security AS
5 * 2011-2014 Arvid Brodin, arvid.brodin@alten.se
7 * Frame router for HSR and PRP.
24 * --
25 * Or not - resetting the counter and bridging the frame would create a
29 * frame is received from a particular node, we know something is wrong.
45 if (!ether_addr_equal(eth_hdr->h_dest, in is_supervision_frame()
46 hsr->sup_multicast_addr)) in is_supervision_frame()
50 if (!(eth_hdr->h_proto == htons(ETH_P_PRP) || in is_supervision_frame()
51 eth_hdr->h_proto == htons(ETH_P_HSR))) in is_supervision_frame()
55 if (eth_hdr->h_proto == htons(ETH_P_HSR)) { /* Okay HSRv1. */ in is_supervision_frame()
57 if (hsr_V1_hdr->hsr.encap_proto != htons(ETH_P_PRP)) in is_supervision_frame()
60 hsr_sup_tag = &hsr_V1_hdr->hsr_sup; in is_supervision_frame()
63 &((struct hsrv0_ethhdr_sp *)skb_mac_header(skb))->hsr_sup; in is_supervision_frame()
66 if (hsr_sup_tag->HSR_TLV_type != HSR_TLV_ANNOUNCE && in is_supervision_frame()
67 hsr_sup_tag->HSR_TLV_type != HSR_TLV_LIFE_CHECK && in is_supervision_frame()
68 hsr_sup_tag->HSR_TLV_type != PRP_TLV_LIFE_CHECK_DD && in is_supervision_frame()
69 hsr_sup_tag->HSR_TLV_type != PRP_TLV_LIFE_CHECK_DA) in is_supervision_frame()
71 if (hsr_sup_tag->HSR_TLV_length != 12 && in is_supervision_frame()
72 hsr_sup_tag->HSR_TLV_length != sizeof(struct hsr_sup_payload)) in is_supervision_frame()
79 struct hsr_frame_info *frame) in create_stripped_skb_hsr() argument
86 skb = __pskb_copy(skb_in, skb_headroom(skb_in) - HSR_HLEN, GFP_ATOMIC); in create_stripped_skb_hsr()
93 if (skb->ip_summed == CHECKSUM_PARTIAL) in create_stripped_skb_hsr()
94 skb->csum_start -= HSR_HLEN; in create_stripped_skb_hsr()
97 if (frame->is_vlan) in create_stripped_skb_hsr()
103 skb->protocol = eth_hdr(skb)->h_proto; in create_stripped_skb_hsr()
107 struct sk_buff *hsr_get_untagged_frame(struct hsr_frame_info *frame, in hsr_get_untagged_frame() argument
110 if (!frame->skb_std) { in hsr_get_untagged_frame()
111 if (frame->skb_hsr) { in hsr_get_untagged_frame()
112 frame->skb_std = in hsr_get_untagged_frame()
113 create_stripped_skb_hsr(frame->skb_hsr, frame); in hsr_get_untagged_frame()
116 WARN_ONCE(1, "%s:%d: Unexpected frame received (port_src %s)\n", in hsr_get_untagged_frame()
117 __FILE__, __LINE__, port->dev->name); in hsr_get_untagged_frame()
122 return skb_clone(frame->skb_std, GFP_ATOMIC); in hsr_get_untagged_frame()
125 struct sk_buff *prp_get_untagged_frame(struct hsr_frame_info *frame, in prp_get_untagged_frame() argument
128 if (!frame->skb_std) { in prp_get_untagged_frame()
129 if (frame->skb_prp) { in prp_get_untagged_frame()
130 /* trim the skb by len - HSR_HLEN to exclude RCT */ in prp_get_untagged_frame()
131 skb_trim(frame->skb_prp, in prp_get_untagged_frame()
132 frame->skb_prp->len - HSR_HLEN); in prp_get_untagged_frame()
133 frame->skb_std = in prp_get_untagged_frame()
134 __pskb_copy(frame->skb_prp, in prp_get_untagged_frame()
135 skb_headroom(frame->skb_prp), in prp_get_untagged_frame()
139 WARN_ONCE(1, "%s:%d: Unexpected frame received (port_src %s)\n", in prp_get_untagged_frame()
140 __FILE__, __LINE__, port->dev->name); in prp_get_untagged_frame()
145 return skb_clone(frame->skb_std, GFP_ATOMIC); in prp_get_untagged_frame()
153 if (port->type == HSR_PT_SLAVE_A) in prp_set_lan_id()
159 lane_id |= port->hsr->net_id; in prp_set_lan_id()
165 struct hsr_frame_info *frame, in prp_fill_rct() argument
175 if (frame->is_vlan) in prp_fill_rct()
182 lsdu_size = skb->len - 14; in prp_fill_rct()
183 if (frame->is_vlan) in prp_fill_rct()
184 lsdu_size -= 4; in prp_fill_rct()
187 trailer->sequence_nr = htons(frame->sequence_nr); in prp_fill_rct()
188 trailer->PRP_suffix = htons(ETH_P_PRP); in prp_fill_rct()
198 if (port->type == HSR_PT_SLAVE_A) in hsr_set_path_id()
203 set_hsr_tag_path(&hsr_ethhdr->hsr_tag, path_id); in hsr_set_path_id()
207 struct hsr_frame_info *frame, in hsr_fill_tag() argument
217 lsdu_size = skb->len - 14; in hsr_fill_tag()
218 if (frame->is_vlan) in hsr_fill_tag()
219 lsdu_size -= 4; in hsr_fill_tag()
224 set_hsr_tag_LSDU_size(&hsr_ethhdr->hsr_tag, lsdu_size); in hsr_fill_tag()
225 hsr_ethhdr->hsr_tag.sequence_nr = htons(frame->sequence_nr); in hsr_fill_tag()
226 hsr_ethhdr->hsr_tag.encap_proto = hsr_ethhdr->ethhdr.h_proto; in hsr_fill_tag()
227 hsr_ethhdr->ethhdr.h_proto = htons(proto_version ? in hsr_fill_tag()
233 /* If the original frame was an HSR tagged frame, just clone it to be sent
234 * unchanged. Otherwise, create a private frame especially tagged for 'port'.
236 struct sk_buff *hsr_create_tagged_frame(struct hsr_frame_info *frame, in hsr_create_tagged_frame() argument
243 if (frame->skb_hsr) { in hsr_create_tagged_frame()
245 (struct hsr_ethhdr *)skb_mac_header(frame->skb_hsr); in hsr_create_tagged_frame()
249 return skb_clone(frame->skb_hsr, GFP_ATOMIC); in hsr_create_tagged_frame()
253 skb = __pskb_copy(frame->skb_std, in hsr_create_tagged_frame()
254 skb_headroom(frame->skb_std) + HSR_HLEN, GFP_ATOMIC); in hsr_create_tagged_frame()
259 if (skb->ip_summed == CHECKSUM_PARTIAL) in hsr_create_tagged_frame()
260 skb->csum_start += HSR_HLEN; in hsr_create_tagged_frame()
263 if (frame->is_vlan) in hsr_create_tagged_frame()
274 return hsr_fill_tag(skb, frame, port, port->hsr->prot_version); in hsr_create_tagged_frame()
277 struct sk_buff *prp_create_tagged_frame(struct hsr_frame_info *frame, in prp_create_tagged_frame() argument
282 if (frame->skb_prp) { in prp_create_tagged_frame()
283 struct prp_rct *trailer = skb_get_PRP_rct(frame->skb_prp); in prp_create_tagged_frame()
291 return skb_clone(frame->skb_prp, GFP_ATOMIC); in prp_create_tagged_frame()
294 skb = skb_copy_expand(frame->skb_std, 0, in prp_create_tagged_frame()
295 skb_tailroom(frame->skb_std) + HSR_HLEN, in prp_create_tagged_frame()
297 prp_fill_rct(skb, frame, port); in prp_create_tagged_frame()
308 was_multicast_frame = (skb->pkt_type == PACKET_MULTICAST); in hsr_deliver_master()
313 dev->stats.rx_dropped++; in hsr_deliver_master()
315 dev->stats.rx_packets++; in hsr_deliver_master()
316 dev->stats.rx_bytes += skb->len; in hsr_deliver_master()
318 dev->stats.multicast++; in hsr_deliver_master()
323 struct hsr_frame_info *frame) in hsr_xmit() argument
325 if (frame->port_rcv->type == HSR_PT_MASTER) { in hsr_xmit()
326 hsr_addr_subst_dest(frame->node_src, skb, port); in hsr_xmit()
328 /* Address substitution (IEC62439-3 pp 26, 50): replace mac in hsr_xmit()
329 * address of outgoing frame with that of the outgoing slave's. in hsr_xmit()
331 ether_addr_copy(eth_hdr(skb)->h_source, port->dev->dev_addr); in hsr_xmit()
336 bool prp_drop_frame(struct hsr_frame_info *frame, struct hsr_port *port) in prp_drop_frame() argument
338 return ((frame->port_rcv->type == HSR_PT_SLAVE_A && in prp_drop_frame()
339 port->type == HSR_PT_SLAVE_B) || in prp_drop_frame()
340 (frame->port_rcv->type == HSR_PT_SLAVE_B && in prp_drop_frame()
341 port->type == HSR_PT_SLAVE_A)); in prp_drop_frame()
344 /* Forward the frame through all devices except:
345 * - Back through the receiving device
346 * - If it's a HSR frame: through a device where it has passed before
347 * - if it's a PRP frame: through another PRP slave device (no bridge)
348 * - To the local HSR master only if the frame is directly addressed to it, or
349 * a non-supervision multicast or broadcast frame.
351 * HSR slave devices should insert a HSR tag into the frame, or forward the
352 * frame unchanged if it's already tagged. Interlink devices should strip HSR
353 * tags if they're of the non-HSR type (but only after duplicate discard). The
354 * master device always strips HSR tags.
356 static void hsr_forward_do(struct hsr_frame_info *frame) in hsr_forward_do() argument
361 hsr_for_each_port(frame->port_rcv->hsr, port) { in hsr_forward_do()
362 struct hsr_priv *hsr = port->hsr; in hsr_forward_do()
363 /* Don't send frame back the way it came */ in hsr_forward_do()
364 if (port == frame->port_rcv) in hsr_forward_do()
368 if (port->type == HSR_PT_MASTER && !frame->is_local_dest) in hsr_forward_do()
371 /* Deliver frames directly addressed to us to master only */ in hsr_forward_do()
372 if (port->type != HSR_PT_MASTER && frame->is_local_exclusive) in hsr_forward_do()
375 /* Don't send frame over port where it has been sent before. in hsr_forward_do()
378 if (!frame->is_from_san && in hsr_forward_do()
379 hsr_register_frame_out(port, frame->node_src, in hsr_forward_do()
380 frame->sequence_nr)) in hsr_forward_do()
383 if (frame->is_supervision && port->type == HSR_PT_MASTER) { in hsr_forward_do()
384 hsr_handle_sup_frame(frame); in hsr_forward_do()
388 /* Check if frame is to be dropped. Eg. for PRP no forward in hsr_forward_do()
391 if (hsr->proto_ops->drop_frame && in hsr_forward_do()
392 hsr->proto_ops->drop_frame(frame, port)) in hsr_forward_do()
395 if (port->type != HSR_PT_MASTER) in hsr_forward_do()
396 skb = hsr->proto_ops->create_tagged_frame(frame, port); in hsr_forward_do()
398 skb = hsr->proto_ops->get_untagged_frame(frame, port); in hsr_forward_do()
401 frame->port_rcv->dev->stats.rx_dropped++; in hsr_forward_do()
405 skb->dev = port->dev; in hsr_forward_do()
406 if (port->type == HSR_PT_MASTER) in hsr_forward_do()
407 hsr_deliver_master(skb, port->dev, frame->node_src); in hsr_forward_do()
409 hsr_xmit(skb, port, frame); in hsr_forward_do()
414 struct hsr_frame_info *frame) in check_local_dest() argument
416 if (hsr_addr_is_self(hsr, eth_hdr(skb)->h_dest)) { in check_local_dest()
417 frame->is_local_exclusive = true; in check_local_dest()
418 skb->pkt_type = PACKET_HOST; in check_local_dest()
420 frame->is_local_exclusive = false; in check_local_dest()
423 if (skb->pkt_type == PACKET_HOST || in check_local_dest()
424 skb->pkt_type == PACKET_MULTICAST || in check_local_dest()
425 skb->pkt_type == PACKET_BROADCAST) { in check_local_dest()
426 frame->is_local_dest = true; in check_local_dest()
428 frame->is_local_dest = false; in check_local_dest()
433 struct hsr_frame_info *frame) in handle_std_frame() argument
435 struct hsr_port *port = frame->port_rcv; in handle_std_frame()
436 struct hsr_priv *hsr = port->hsr; in handle_std_frame()
439 frame->skb_hsr = NULL; in handle_std_frame()
440 frame->skb_prp = NULL; in handle_std_frame()
441 frame->skb_std = skb; in handle_std_frame()
443 if (port->type != HSR_PT_MASTER) { in handle_std_frame()
444 frame->is_from_san = true; in handle_std_frame()
446 /* Sequence nr for the master node */ in handle_std_frame()
447 spin_lock_irqsave(&hsr->seqnr_lock, irqflags); in handle_std_frame()
448 frame->sequence_nr = hsr->sequence_nr; in handle_std_frame()
449 hsr->sequence_nr++; in handle_std_frame()
450 spin_unlock_irqrestore(&hsr->seqnr_lock, irqflags); in handle_std_frame()
455 struct hsr_frame_info *frame) in hsr_fill_frame_info() argument
460 if (skb->mac_len < sizeof(struct hsr_ethhdr)) in hsr_fill_frame_info()
461 return -EINVAL; in hsr_fill_frame_info()
463 /* HSR tagged frame :- Data or Supervision */ in hsr_fill_frame_info()
464 frame->skb_std = NULL; in hsr_fill_frame_info()
465 frame->skb_prp = NULL; in hsr_fill_frame_info()
466 frame->skb_hsr = skb; in hsr_fill_frame_info()
467 frame->sequence_nr = hsr_get_skb_sequence_nr(skb); in hsr_fill_frame_info()
471 /* Standard frame or PRP from master port */ in hsr_fill_frame_info()
472 handle_std_frame(skb, frame); in hsr_fill_frame_info()
478 struct hsr_frame_info *frame) in prp_fill_frame_info() argument
480 /* Supervision frame */ in prp_fill_frame_info()
484 prp_check_lsdu_size(skb, rct, frame->is_supervision)) { in prp_fill_frame_info()
485 frame->skb_hsr = NULL; in prp_fill_frame_info()
486 frame->skb_std = NULL; in prp_fill_frame_info()
487 frame->skb_prp = skb; in prp_fill_frame_info()
488 frame->sequence_nr = prp_get_skb_sequence_nr(rct); in prp_fill_frame_info()
491 handle_std_frame(skb, frame); in prp_fill_frame_info()
496 static int fill_frame_info(struct hsr_frame_info *frame, in fill_frame_info() argument
499 struct hsr_priv *hsr = port->hsr; in fill_frame_info()
506 if (skb->mac_len < sizeof(struct ethhdr)) in fill_frame_info()
507 return -EINVAL; in fill_frame_info()
509 memset(frame, 0, sizeof(*frame)); in fill_frame_info()
510 frame->is_supervision = is_supervision_frame(port->hsr, skb); in fill_frame_info()
511 frame->node_src = hsr_get_node(port, &hsr->node_db, skb, in fill_frame_info()
512 frame->is_supervision, in fill_frame_info()
513 port->type); in fill_frame_info()
514 if (!frame->node_src) in fill_frame_info()
515 return -1; /* Unknown node and !is_supervision, or no mem */ in fill_frame_info()
518 frame->is_vlan = false; in fill_frame_info()
519 proto = ethhdr->h_proto; in fill_frame_info()
522 frame->is_vlan = true; in fill_frame_info()
524 if (frame->is_vlan) { in fill_frame_info()
526 proto = vlan_hdr->vlanhdr.h_vlan_encapsulated_proto; in fill_frame_info()
528 netdev_warn_once(skb->dev, "VLAN not yet supported"); in fill_frame_info()
531 frame->is_from_san = false; in fill_frame_info()
532 frame->port_rcv = port; in fill_frame_info()
533 ret = hsr->proto_ops->fill_frame_info(proto, skb, frame); in fill_frame_info()
537 check_local_dest(port->hsr, skb, frame); in fill_frame_info()
545 struct hsr_frame_info frame; in hsr_forward_skb() local
547 if (fill_frame_info(&frame, skb, port) < 0) in hsr_forward_skb()
550 hsr_register_frame_in(frame.node_src, port, frame.sequence_nr); in hsr_forward_skb()
551 hsr_forward_do(&frame); in hsr_forward_skb()
552 /* Gets called for ingress frames as well as egress from master port. in hsr_forward_skb()
553 * So check and increment stats for master port only here. in hsr_forward_skb()
555 if (port->type == HSR_PT_MASTER) { in hsr_forward_skb()
556 port->dev->stats.tx_packets++; in hsr_forward_skb()
557 port->dev->stats.tx_bytes += skb->len; in hsr_forward_skb()
560 kfree_skb(frame.skb_hsr); in hsr_forward_skb()
561 kfree_skb(frame.skb_prp); in hsr_forward_skb()
562 kfree_skb(frame.skb_std); in hsr_forward_skb()
566 port->dev->stats.tx_dropped++; in hsr_forward_skb()