Lines Matching +full:master +full:- +full:stats
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
24 * --
25 * Or not - resetting the counter and bridging the frame would create a
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()
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()
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()
115 netdev_warn_once(port->dev, in hsr_get_untagged_frame()
118 if (!frame->skb_std) in hsr_get_untagged_frame()
122 return skb_clone(frame->skb_std, GFP_ATOMIC); in hsr_get_untagged_frame()
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()
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()
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()
189 skb->protocol = eth_hdr(skb)->h_proto; in prp_fill_rct()
199 if (port->type == HSR_PT_SLAVE_A) in hsr_set_path_id()
204 set_hsr_tag_path(&hsr_ethhdr->hsr_tag, path_id); in hsr_set_path_id()
218 lsdu_size = skb->len - 14; in hsr_fill_tag()
219 if (frame->is_vlan) in hsr_fill_tag()
220 lsdu_size -= 4; in hsr_fill_tag()
225 set_hsr_tag_LSDU_size(&hsr_ethhdr->hsr_tag, lsdu_size); in hsr_fill_tag()
226 hsr_ethhdr->hsr_tag.sequence_nr = htons(frame->sequence_nr); in hsr_fill_tag()
227 hsr_ethhdr->hsr_tag.encap_proto = hsr_ethhdr->ethhdr.h_proto; in hsr_fill_tag()
228 hsr_ethhdr->ethhdr.h_proto = htons(proto_version ? in hsr_fill_tag()
230 skb->protocol = hsr_ethhdr->ethhdr.h_proto; in hsr_fill_tag()
245 if (frame->skb_hsr) { in hsr_create_tagged_frame()
247 (struct hsr_ethhdr *)skb_mac_header(frame->skb_hsr); in hsr_create_tagged_frame()
251 return skb_clone(frame->skb_hsr, GFP_ATOMIC); in hsr_create_tagged_frame()
255 skb = __pskb_copy(frame->skb_std, in hsr_create_tagged_frame()
256 skb_headroom(frame->skb_std) + HSR_HLEN, GFP_ATOMIC); in hsr_create_tagged_frame()
261 if (skb->ip_summed == CHECKSUM_PARTIAL) in hsr_create_tagged_frame()
262 skb->csum_start += HSR_HLEN; in hsr_create_tagged_frame()
265 if (frame->is_vlan) in hsr_create_tagged_frame()
276 return hsr_fill_tag(skb, frame, port, port->hsr->prot_version); in hsr_create_tagged_frame()
284 if (frame->skb_prp) { in prp_create_tagged_frame()
285 struct prp_rct *trailer = skb_get_PRP_rct(frame->skb_prp); in prp_create_tagged_frame()
293 return skb_clone(frame->skb_prp, GFP_ATOMIC); in prp_create_tagged_frame()
296 skb = skb_copy_expand(frame->skb_std, 0, in prp_create_tagged_frame()
297 skb_tailroom(frame->skb_std) + HSR_HLEN, in prp_create_tagged_frame()
308 was_multicast_frame = (skb->pkt_type == PACKET_MULTICAST); in hsr_deliver_master()
311 recv_len = skb->len; in hsr_deliver_master()
314 dev->stats.rx_dropped++; in hsr_deliver_master()
316 dev->stats.rx_packets++; in hsr_deliver_master()
317 dev->stats.rx_bytes += recv_len; in hsr_deliver_master()
319 dev->stats.multicast++; in hsr_deliver_master()
326 if (frame->port_rcv->type == HSR_PT_MASTER) { in hsr_xmit()
327 hsr_addr_subst_dest(frame->node_src, skb, port); in hsr_xmit()
329 /* Address substitution (IEC62439-3 pp 26, 50): replace mac in hsr_xmit()
332 ether_addr_copy(eth_hdr(skb)->h_source, port->dev->dev_addr); in hsr_xmit()
339 return ((frame->port_rcv->type == HSR_PT_SLAVE_A && in prp_drop_frame()
340 port->type == HSR_PT_SLAVE_B) || in prp_drop_frame()
341 (frame->port_rcv->type == HSR_PT_SLAVE_B && in prp_drop_frame()
342 port->type == HSR_PT_SLAVE_A)); in prp_drop_frame()
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.
354 * tags if they're of the non-HSR type (but only after duplicate discard). The
355 * master device always strips HSR tags.
362 hsr_for_each_port(frame->port_rcv->hsr, port) { in hsr_forward_do()
363 struct hsr_priv *hsr = port->hsr; in hsr_forward_do()
365 if (port == frame->port_rcv) in hsr_forward_do()
369 if (port->type == HSR_PT_MASTER && !frame->is_local_dest) in hsr_forward_do()
372 /* Deliver frames directly addressed to us to master only */ in hsr_forward_do()
373 if (port->type != HSR_PT_MASTER && frame->is_local_exclusive) in hsr_forward_do()
379 if (!frame->is_from_san && in hsr_forward_do()
380 hsr_register_frame_out(port, frame->node_src, in hsr_forward_do()
381 frame->sequence_nr)) in hsr_forward_do()
384 if (frame->is_supervision && port->type == HSR_PT_MASTER) { in hsr_forward_do()
392 if (hsr->proto_ops->drop_frame && in hsr_forward_do()
393 hsr->proto_ops->drop_frame(frame, port)) in hsr_forward_do()
396 if (port->type != HSR_PT_MASTER) in hsr_forward_do()
397 skb = hsr->proto_ops->create_tagged_frame(frame, port); in hsr_forward_do()
399 skb = hsr->proto_ops->get_untagged_frame(frame, port); in hsr_forward_do()
402 frame->port_rcv->dev->stats.rx_dropped++; in hsr_forward_do()
406 skb->dev = port->dev; in hsr_forward_do()
407 if (port->type == HSR_PT_MASTER) in hsr_forward_do()
408 hsr_deliver_master(skb, port->dev, frame->node_src); in hsr_forward_do()
417 if (hsr_addr_is_self(hsr, eth_hdr(skb)->h_dest)) { in check_local_dest()
418 frame->is_local_exclusive = true; in check_local_dest()
419 skb->pkt_type = PACKET_HOST; in check_local_dest()
421 frame->is_local_exclusive = false; in check_local_dest()
424 if (skb->pkt_type == PACKET_HOST || in check_local_dest()
425 skb->pkt_type == PACKET_MULTICAST || in check_local_dest()
426 skb->pkt_type == PACKET_BROADCAST) { in check_local_dest()
427 frame->is_local_dest = true; in check_local_dest()
429 frame->is_local_dest = false; in check_local_dest()
436 struct hsr_port *port = frame->port_rcv; in handle_std_frame()
437 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 lockdep_assert_held(&hsr->seqnr_lock); in handle_std_frame()
448 frame->sequence_nr = hsr->sequence_nr; in handle_std_frame()
449 hsr->sequence_nr++; in handle_std_frame()
456 struct hsr_port *port = frame->port_rcv; in hsr_fill_frame_info()
457 struct hsr_priv *hsr = port->hsr; in hsr_fill_frame_info()
460 if ((!hsr->prot_version && proto == htons(ETH_P_PRP)) || in hsr_fill_frame_info()
463 if (skb->mac_len < sizeof(struct hsr_ethhdr)) in hsr_fill_frame_info()
464 return -EINVAL; in hsr_fill_frame_info()
466 /* HSR tagged frame :- Data or Supervision */ in hsr_fill_frame_info()
467 frame->skb_std = NULL; in hsr_fill_frame_info()
468 frame->skb_prp = NULL; in hsr_fill_frame_info()
469 frame->skb_hsr = skb; in hsr_fill_frame_info()
470 frame->sequence_nr = hsr_get_skb_sequence_nr(skb); in hsr_fill_frame_info()
474 /* Standard frame or PRP from master port */ in hsr_fill_frame_info()
487 prp_check_lsdu_size(skb, rct, frame->is_supervision)) { in prp_fill_frame_info()
488 frame->skb_hsr = NULL; in prp_fill_frame_info()
489 frame->skb_std = NULL; in prp_fill_frame_info()
490 frame->skb_prp = skb; in prp_fill_frame_info()
491 frame->sequence_nr = prp_get_skb_sequence_nr(rct); in prp_fill_frame_info()
502 struct hsr_priv *hsr = port->hsr; in fill_frame_info()
509 if (skb->mac_len < sizeof(struct ethhdr)) in fill_frame_info()
510 return -EINVAL; in fill_frame_info()
513 frame->is_supervision = is_supervision_frame(port->hsr, skb); in fill_frame_info()
514 frame->node_src = hsr_get_node(port, &hsr->node_db, skb, in fill_frame_info()
515 frame->is_supervision, in fill_frame_info()
516 port->type); in fill_frame_info()
517 if (!frame->node_src) in fill_frame_info()
518 return -1; /* Unknown node and !is_supervision, or no mem */ in fill_frame_info()
521 frame->is_vlan = false; in fill_frame_info()
522 proto = ethhdr->h_proto; in fill_frame_info()
525 frame->is_vlan = true; in fill_frame_info()
527 if (frame->is_vlan) { in fill_frame_info()
529 proto = vlan_hdr->vlanhdr.h_vlan_encapsulated_proto; in fill_frame_info()
531 netdev_warn_once(skb->dev, "VLAN not yet supported"); in fill_frame_info()
532 return -EINVAL; in fill_frame_info()
535 frame->is_from_san = false; in fill_frame_info()
536 frame->port_rcv = port; in fill_frame_info()
537 ret = hsr->proto_ops->fill_frame_info(proto, skb, frame); in fill_frame_info()
541 check_local_dest(port->hsr, skb, frame); in fill_frame_info()
558 /* Gets called for ingress frames as well as egress from master port. in hsr_forward_skb()
559 * So check and increment stats for master port only here. in hsr_forward_skb()
561 if (port->type == HSR_PT_MASTER) { in hsr_forward_skb()
562 port->dev->stats.tx_packets++; in hsr_forward_skb()
563 port->dev->stats.tx_bytes += skb->len; in hsr_forward_skb()
573 port->dev->stats.tx_dropped++; in hsr_forward_skb()