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.
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>
16 #include "hsr_framereg.h"
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.
25 * Or not - resetting the counter and bridging the frame would create a
26 * loop, unfortunately.
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.
32 * 3) Allow different MAC addresses for the two slave interfaces, using the
35 static bool is_supervision_frame(struct hsr_priv
*hsr
, struct sk_buff
*skb
)
37 struct ethhdr
*eth_hdr
;
38 struct hsr_sup_tag
*hsr_sup_tag
;
39 struct hsrv1_ethhdr_sp
*hsr_V1_hdr
;
40 struct hsr_sup_tlv
*hsr_sup_tlv
;
43 WARN_ON_ONCE(!skb_mac_header_was_set(skb
));
44 eth_hdr
= (struct ethhdr
*)skb_mac_header(skb
);
47 if (!ether_addr_equal(eth_hdr
->h_dest
,
48 hsr
->sup_multicast_addr
))
51 /* Correct ether type?. */
52 if (!(eth_hdr
->h_proto
== htons(ETH_P_PRP
) ||
53 eth_hdr
->h_proto
== htons(ETH_P_HSR
)))
56 /* Get the supervision header from correct location. */
57 if (eth_hdr
->h_proto
== htons(ETH_P_HSR
)) { /* Okay HSRv1. */
58 total_length
= sizeof(struct hsrv1_ethhdr_sp
);
59 if (!pskb_may_pull(skb
, total_length
))
62 hsr_V1_hdr
= (struct hsrv1_ethhdr_sp
*)skb_mac_header(skb
);
63 if (hsr_V1_hdr
->hsr
.encap_proto
!= htons(ETH_P_PRP
))
66 hsr_sup_tag
= &hsr_V1_hdr
->hsr_sup
;
68 total_length
= sizeof(struct hsrv0_ethhdr_sp
);
69 if (!pskb_may_pull(skb
, total_length
))
73 &((struct hsrv0_ethhdr_sp
*)skb_mac_header(skb
))->hsr_sup
;
76 if (hsr_sup_tag
->tlv
.HSR_TLV_type
!= HSR_TLV_ANNOUNCE
&&
77 hsr_sup_tag
->tlv
.HSR_TLV_type
!= HSR_TLV_LIFE_CHECK
&&
78 hsr_sup_tag
->tlv
.HSR_TLV_type
!= PRP_TLV_LIFE_CHECK_DD
&&
79 hsr_sup_tag
->tlv
.HSR_TLV_type
!= PRP_TLV_LIFE_CHECK_DA
)
81 if (hsr_sup_tag
->tlv
.HSR_TLV_length
!= 12 &&
82 hsr_sup_tag
->tlv
.HSR_TLV_length
!= sizeof(struct hsr_sup_payload
))
86 total_length
+= hsr_sup_tag
->tlv
.HSR_TLV_length
;
87 if (!pskb_may_pull(skb
, total_length
))
89 skb_pull(skb
, total_length
);
90 hsr_sup_tlv
= (struct hsr_sup_tlv
*)skb
->data
;
91 skb_push(skb
, total_length
);
93 /* if this is a redbox supervision frame we need to verify
94 * that more data is available
96 if (hsr_sup_tlv
->HSR_TLV_type
== PRP_TLV_REDBOX_MAC
) {
97 /* tlv length must be a length of a mac address */
98 if (hsr_sup_tlv
->HSR_TLV_length
!= sizeof(struct hsr_sup_payload
))
101 /* make sure another tlv follows */
102 total_length
+= sizeof(struct hsr_sup_tlv
) + hsr_sup_tlv
->HSR_TLV_length
;
103 if (!pskb_may_pull(skb
, total_length
))
107 skb_pull(skb
, total_length
);
108 hsr_sup_tlv
= (struct hsr_sup_tlv
*)skb
->data
;
109 skb_push(skb
, total_length
);
112 /* end of tlvs must follow at the end */
113 if (hsr_sup_tlv
->HSR_TLV_type
== HSR_TLV_EOT
&&
114 hsr_sup_tlv
->HSR_TLV_length
!= 0)
120 static bool is_proxy_supervision_frame(struct hsr_priv
*hsr
,
123 struct hsr_sup_payload
*payload
;
124 struct ethhdr
*eth_hdr
;
125 u16 total_length
= 0;
127 eth_hdr
= (struct ethhdr
*)skb_mac_header(skb
);
129 /* Get the HSR protocol revision. */
130 if (eth_hdr
->h_proto
== htons(ETH_P_HSR
))
131 total_length
= sizeof(struct hsrv1_ethhdr_sp
);
133 total_length
= sizeof(struct hsrv0_ethhdr_sp
);
135 if (!pskb_may_pull(skb
, total_length
+ sizeof(struct hsr_sup_payload
)))
138 skb_pull(skb
, total_length
);
139 payload
= (struct hsr_sup_payload
*)skb
->data
;
140 skb_push(skb
, total_length
);
142 /* For RedBox (HSR-SAN) check if we have received the supervision
143 * frame with MAC addresses from own ProxyNodeTable.
145 return hsr_is_node_in_db(&hsr
->proxy_node_db
,
146 payload
->macaddress_A
);
149 static struct sk_buff
*create_stripped_skb_hsr(struct sk_buff
*skb_in
,
150 struct hsr_frame_info
*frame
)
154 unsigned char *dst
, *src
;
156 skb_pull(skb_in
, HSR_HLEN
);
157 skb
= __pskb_copy(skb_in
, skb_headroom(skb_in
) - HSR_HLEN
, GFP_ATOMIC
);
158 skb_push(skb_in
, HSR_HLEN
);
162 skb_reset_mac_header(skb
);
164 if (skb
->ip_summed
== CHECKSUM_PARTIAL
)
165 skb
->csum_start
-= HSR_HLEN
;
167 copylen
= 2 * ETH_ALEN
;
169 copylen
+= VLAN_HLEN
;
170 src
= skb_mac_header(skb_in
);
171 dst
= skb_mac_header(skb
);
172 memcpy(dst
, src
, copylen
);
174 skb
->protocol
= eth_hdr(skb
)->h_proto
;
178 struct sk_buff
*hsr_get_untagged_frame(struct hsr_frame_info
*frame
,
179 struct hsr_port
*port
)
181 if (!frame
->skb_std
) {
184 create_stripped_skb_hsr(frame
->skb_hsr
, frame
);
186 netdev_warn_once(port
->dev
,
187 "Unexpected frame received in hsr_get_untagged_frame()\n");
193 return skb_clone(frame
->skb_std
, GFP_ATOMIC
);
196 struct sk_buff
*prp_get_untagged_frame(struct hsr_frame_info
*frame
,
197 struct hsr_port
*port
)
199 if (!frame
->skb_std
) {
200 if (frame
->skb_prp
) {
201 /* trim the skb by len - HSR_HLEN to exclude RCT */
202 skb_trim(frame
->skb_prp
,
203 frame
->skb_prp
->len
- HSR_HLEN
);
205 __pskb_copy(frame
->skb_prp
,
206 skb_headroom(frame
->skb_prp
),
210 WARN_ONCE(1, "%s:%d: Unexpected frame received (port_src %s)\n",
211 __FILE__
, __LINE__
, port
->dev
->name
);
216 return skb_clone(frame
->skb_std
, GFP_ATOMIC
);
219 static void prp_set_lan_id(struct prp_rct
*trailer
,
220 struct hsr_port
*port
)
224 if (port
->type
== HSR_PT_SLAVE_A
)
229 /* Add net_id in the upper 3 bits of lane_id */
230 lane_id
|= port
->hsr
->net_id
;
231 set_prp_lan_id(trailer
, lane_id
);
234 /* Tailroom for PRP rct should have been created before calling this */
235 static struct sk_buff
*prp_fill_rct(struct sk_buff
*skb
,
236 struct hsr_frame_info
*frame
,
237 struct hsr_port
*port
)
239 struct prp_rct
*trailer
;
240 int min_size
= ETH_ZLEN
;
247 min_size
= VLAN_ETH_ZLEN
;
249 if (skb_put_padto(skb
, min_size
))
252 trailer
= (struct prp_rct
*)skb_put(skb
, HSR_HLEN
);
253 lsdu_size
= skb
->len
- 14;
256 prp_set_lan_id(trailer
, port
);
257 set_prp_LSDU_size(trailer
, lsdu_size
);
258 trailer
->sequence_nr
= htons(frame
->sequence_nr
);
259 trailer
->PRP_suffix
= htons(ETH_P_PRP
);
260 skb
->protocol
= eth_hdr(skb
)->h_proto
;
265 static void hsr_set_path_id(struct hsr_ethhdr
*hsr_ethhdr
,
266 struct hsr_port
*port
)
270 if (port
->type
== HSR_PT_SLAVE_A
)
275 set_hsr_tag_path(&hsr_ethhdr
->hsr_tag
, path_id
);
278 static struct sk_buff
*hsr_fill_tag(struct sk_buff
*skb
,
279 struct hsr_frame_info
*frame
,
280 struct hsr_port
*port
, u8 proto_version
)
282 struct hsr_ethhdr
*hsr_ethhdr
;
285 /* pad to minimum packet size which is 60 + 6 (HSR tag) */
286 if (skb_put_padto(skb
, ETH_ZLEN
+ HSR_HLEN
))
289 lsdu_size
= skb
->len
- 14;
293 hsr_ethhdr
= (struct hsr_ethhdr
*)skb_mac_header(skb
);
295 hsr_set_path_id(hsr_ethhdr
, port
);
296 set_hsr_tag_LSDU_size(&hsr_ethhdr
->hsr_tag
, lsdu_size
);
297 hsr_ethhdr
->hsr_tag
.sequence_nr
= htons(frame
->sequence_nr
);
298 hsr_ethhdr
->hsr_tag
.encap_proto
= hsr_ethhdr
->ethhdr
.h_proto
;
299 hsr_ethhdr
->ethhdr
.h_proto
= htons(proto_version
?
300 ETH_P_HSR
: ETH_P_PRP
);
301 skb
->protocol
= hsr_ethhdr
->ethhdr
.h_proto
;
306 /* If the original frame was an HSR tagged frame, just clone it to be sent
307 * unchanged. Otherwise, create a private frame especially tagged for 'port'.
309 struct sk_buff
*hsr_create_tagged_frame(struct hsr_frame_info
*frame
,
310 struct hsr_port
*port
)
312 unsigned char *dst
, *src
;
316 if (frame
->skb_hsr
) {
317 struct hsr_ethhdr
*hsr_ethhdr
=
318 (struct hsr_ethhdr
*)skb_mac_header(frame
->skb_hsr
);
320 /* set the lane id properly */
321 hsr_set_path_id(hsr_ethhdr
, port
);
322 return skb_clone(frame
->skb_hsr
, GFP_ATOMIC
);
323 } else if (port
->dev
->features
& NETIF_F_HW_HSR_TAG_INS
) {
324 return skb_clone(frame
->skb_std
, GFP_ATOMIC
);
327 /* Create the new skb with enough headroom to fit the HSR tag */
328 skb
= __pskb_copy(frame
->skb_std
,
329 skb_headroom(frame
->skb_std
) + HSR_HLEN
, GFP_ATOMIC
);
332 skb_reset_mac_header(skb
);
334 if (skb
->ip_summed
== CHECKSUM_PARTIAL
)
335 skb
->csum_start
+= HSR_HLEN
;
339 movelen
+= VLAN_HLEN
;
341 src
= skb_mac_header(skb
);
342 dst
= skb_push(skb
, HSR_HLEN
);
343 memmove(dst
, src
, movelen
);
344 skb_reset_mac_header(skb
);
346 /* skb_put_padto free skb on error and hsr_fill_tag returns NULL in
349 return hsr_fill_tag(skb
, frame
, port
, port
->hsr
->prot_version
);
352 struct sk_buff
*prp_create_tagged_frame(struct hsr_frame_info
*frame
,
353 struct hsr_port
*port
)
357 if (frame
->skb_prp
) {
358 struct prp_rct
*trailer
= skb_get_PRP_rct(frame
->skb_prp
);
361 prp_set_lan_id(trailer
, port
);
363 WARN_ONCE(!trailer
, "errored PRP skb");
366 return skb_clone(frame
->skb_prp
, GFP_ATOMIC
);
367 } else if (port
->dev
->features
& NETIF_F_HW_HSR_TAG_INS
) {
368 return skb_clone(frame
->skb_std
, GFP_ATOMIC
);
371 skb
= skb_copy_expand(frame
->skb_std
, 0,
372 skb_tailroom(frame
->skb_std
) + HSR_HLEN
,
374 return prp_fill_rct(skb
, frame
, port
);
377 static void hsr_deliver_master(struct sk_buff
*skb
, struct net_device
*dev
,
378 struct hsr_node
*node_src
)
380 bool was_multicast_frame
;
383 was_multicast_frame
= (skb
->pkt_type
== PACKET_MULTICAST
);
384 hsr_addr_subst_source(node_src
, skb
);
385 skb_pull(skb
, ETH_HLEN
);
388 if (res
== NET_RX_DROP
) {
389 dev
->stats
.rx_dropped
++;
391 dev
->stats
.rx_packets
++;
392 dev
->stats
.rx_bytes
+= recv_len
;
393 if (was_multicast_frame
)
394 dev
->stats
.multicast
++;
398 static int hsr_xmit(struct sk_buff
*skb
, struct hsr_port
*port
,
399 struct hsr_frame_info
*frame
)
401 if (frame
->port_rcv
->type
== HSR_PT_MASTER
) {
402 hsr_addr_subst_dest(frame
->node_src
, skb
, port
);
404 /* Address substitution (IEC62439-3 pp 26, 50): replace mac
405 * address of outgoing frame with that of the outgoing slave's.
407 ether_addr_copy(eth_hdr(skb
)->h_source
, port
->dev
->dev_addr
);
410 /* When HSR node is used as RedBox - the frame received from HSR ring
411 * requires source MAC address (SA) replacement to one which can be
412 * recognized by SAN devices (otherwise, frames are dropped by switch)
414 if (port
->type
== HSR_PT_INTERLINK
)
415 ether_addr_copy(eth_hdr(skb
)->h_source
,
416 port
->hsr
->macaddress_redbox
);
418 return dev_queue_xmit(skb
);
421 bool prp_drop_frame(struct hsr_frame_info
*frame
, struct hsr_port
*port
)
423 return ((frame
->port_rcv
->type
== HSR_PT_SLAVE_A
&&
424 port
->type
== HSR_PT_SLAVE_B
) ||
425 (frame
->port_rcv
->type
== HSR_PT_SLAVE_B
&&
426 port
->type
== HSR_PT_SLAVE_A
));
429 bool hsr_drop_frame(struct hsr_frame_info
*frame
, struct hsr_port
*port
)
433 if (port
->dev
->features
& NETIF_F_HW_HSR_FWD
)
434 return prp_drop_frame(frame
, port
);
436 /* RedBox specific frames dropping policies
438 * Do not send HSR supervisory frames to SAN devices
440 if (frame
->is_supervision
&& port
->type
== HSR_PT_INTERLINK
)
443 /* Do not forward to other HSR port (A or B) unicast frames which
444 * are addressed to interlink port (and are in the ProxyNodeTable).
446 skb
= frame
->skb_hsr
;
447 if (skb
&& prp_drop_frame(frame
, port
) &&
448 is_unicast_ether_addr(eth_hdr(skb
)->h_dest
) &&
449 hsr_is_node_in_db(&port
->hsr
->proxy_node_db
,
450 eth_hdr(skb
)->h_dest
)) {
454 /* Do not forward to port C (Interlink) frames from nodes A and B
455 * if DA is in NodeTable.
457 if ((frame
->port_rcv
->type
== HSR_PT_SLAVE_A
||
458 frame
->port_rcv
->type
== HSR_PT_SLAVE_B
) &&
459 port
->type
== HSR_PT_INTERLINK
) {
460 skb
= frame
->skb_hsr
;
461 if (skb
&& is_unicast_ether_addr(eth_hdr(skb
)->h_dest
) &&
462 hsr_is_node_in_db(&port
->hsr
->node_db
,
463 eth_hdr(skb
)->h_dest
)) {
468 /* Do not forward to port A and B unicast frames received on the
469 * interlink port if it is addressed to one of nodes registered in
470 * the ProxyNodeTable.
472 if ((port
->type
== HSR_PT_SLAVE_A
|| port
->type
== HSR_PT_SLAVE_B
) &&
473 frame
->port_rcv
->type
== HSR_PT_INTERLINK
) {
474 skb
= frame
->skb_std
;
475 if (skb
&& is_unicast_ether_addr(eth_hdr(skb
)->h_dest
) &&
476 hsr_is_node_in_db(&port
->hsr
->proxy_node_db
,
477 eth_hdr(skb
)->h_dest
)) {
485 /* Forward the frame through all devices except:
486 * - Back through the receiving device
487 * - If it's a HSR frame: through a device where it has passed before
488 * - if it's a PRP frame: through another PRP slave device (no bridge)
489 * - To the local HSR master only if the frame is directly addressed to it, or
490 * a non-supervision multicast or broadcast frame.
492 * HSR slave devices should insert a HSR tag into the frame, or forward the
493 * frame unchanged if it's already tagged. Interlink devices should strip HSR
494 * tags if they're of the non-HSR type (but only after duplicate discard). The
495 * master device always strips HSR tags.
497 static void hsr_forward_do(struct hsr_frame_info
*frame
)
499 struct hsr_port
*port
;
503 hsr_for_each_port(frame
->port_rcv
->hsr
, port
) {
504 struct hsr_priv
*hsr
= port
->hsr
;
505 /* Don't send frame back the way it came */
506 if (port
== frame
->port_rcv
)
509 /* Don't deliver locally unless we should */
510 if (port
->type
== HSR_PT_MASTER
&& !frame
->is_local_dest
)
513 /* Deliver frames directly addressed to us to master only */
514 if (port
->type
!= HSR_PT_MASTER
&& frame
->is_local_exclusive
)
517 /* If hardware duplicate generation is enabled, only send out
520 if ((port
->dev
->features
& NETIF_F_HW_HSR_DUP
) && sent
)
523 /* Don't send frame over port where it has been sent before.
524 * Also for SAN, this shouldn't be done.
526 if (!frame
->is_from_san
&&
527 hsr_register_frame_out(port
, frame
->node_src
,
531 if (frame
->is_supervision
&& port
->type
== HSR_PT_MASTER
&&
532 !frame
->is_proxy_supervision
) {
533 hsr_handle_sup_frame(frame
);
537 /* Check if frame is to be dropped. Eg. for PRP no forward
538 * between ports, or sending HSR supervision to RedBox.
540 if (hsr
->proto_ops
->drop_frame
&&
541 hsr
->proto_ops
->drop_frame(frame
, port
))
544 if (port
->type
== HSR_PT_SLAVE_A
||
545 port
->type
== HSR_PT_SLAVE_B
)
546 skb
= hsr
->proto_ops
->create_tagged_frame(frame
, port
);
548 skb
= hsr
->proto_ops
->get_untagged_frame(frame
, port
);
551 frame
->port_rcv
->dev
->stats
.rx_dropped
++;
555 skb
->dev
= port
->dev
;
556 if (port
->type
== HSR_PT_MASTER
) {
557 hsr_deliver_master(skb
, port
->dev
, frame
->node_src
);
559 if (!hsr_xmit(skb
, port
, frame
))
560 if (port
->type
== HSR_PT_SLAVE_A
||
561 port
->type
== HSR_PT_SLAVE_B
)
567 static void check_local_dest(struct hsr_priv
*hsr
, struct sk_buff
*skb
,
568 struct hsr_frame_info
*frame
)
570 if (hsr_addr_is_self(hsr
, eth_hdr(skb
)->h_dest
)) {
571 frame
->is_local_exclusive
= true;
572 skb
->pkt_type
= PACKET_HOST
;
574 frame
->is_local_exclusive
= false;
577 if (skb
->pkt_type
== PACKET_HOST
||
578 skb
->pkt_type
== PACKET_MULTICAST
||
579 skb
->pkt_type
== PACKET_BROADCAST
) {
580 frame
->is_local_dest
= true;
582 frame
->is_local_dest
= false;
586 static void handle_std_frame(struct sk_buff
*skb
,
587 struct hsr_frame_info
*frame
)
589 struct hsr_port
*port
= frame
->port_rcv
;
590 struct hsr_priv
*hsr
= port
->hsr
;
592 frame
->skb_hsr
= NULL
;
593 frame
->skb_prp
= NULL
;
594 frame
->skb_std
= skb
;
596 if (port
->type
!= HSR_PT_MASTER
)
597 frame
->is_from_san
= true;
599 if (port
->type
== HSR_PT_MASTER
||
600 port
->type
== HSR_PT_INTERLINK
) {
601 /* Sequence nr for the master/interlink node */
602 lockdep_assert_held(&hsr
->seqnr_lock
);
603 frame
->sequence_nr
= hsr
->sequence_nr
;
608 int hsr_fill_frame_info(__be16 proto
, struct sk_buff
*skb
,
609 struct hsr_frame_info
*frame
)
611 struct hsr_port
*port
= frame
->port_rcv
;
612 struct hsr_priv
*hsr
= port
->hsr
;
614 /* HSRv0 supervisory frames double as a tag so treat them as tagged. */
615 if ((!hsr
->prot_version
&& proto
== htons(ETH_P_PRP
)) ||
616 proto
== htons(ETH_P_HSR
)) {
617 /* Check if skb contains hsr_ethhdr */
618 if (skb
->mac_len
< sizeof(struct hsr_ethhdr
))
621 /* HSR tagged frame :- Data or Supervision */
622 frame
->skb_std
= NULL
;
623 frame
->skb_prp
= NULL
;
624 frame
->skb_hsr
= skb
;
625 frame
->sequence_nr
= hsr_get_skb_sequence_nr(skb
);
629 /* Standard frame or PRP from master port */
630 handle_std_frame(skb
, frame
);
635 int prp_fill_frame_info(__be16 proto
, struct sk_buff
*skb
,
636 struct hsr_frame_info
*frame
)
638 /* Supervision frame */
639 struct prp_rct
*rct
= skb_get_PRP_rct(skb
);
642 prp_check_lsdu_size(skb
, rct
, frame
->is_supervision
)) {
643 frame
->skb_hsr
= NULL
;
644 frame
->skb_std
= NULL
;
645 frame
->skb_prp
= skb
;
646 frame
->sequence_nr
= prp_get_skb_sequence_nr(rct
);
649 handle_std_frame(skb
, frame
);
654 static int fill_frame_info(struct hsr_frame_info
*frame
,
655 struct sk_buff
*skb
, struct hsr_port
*port
)
657 struct hsr_priv
*hsr
= port
->hsr
;
658 struct hsr_vlan_ethhdr
*vlan_hdr
;
659 struct list_head
*n_db
;
660 struct ethhdr
*ethhdr
;
664 /* Check if skb contains ethhdr */
665 if (skb
->mac_len
< sizeof(struct ethhdr
))
668 memset(frame
, 0, sizeof(*frame
));
669 frame
->is_supervision
= is_supervision_frame(port
->hsr
, skb
);
670 if (frame
->is_supervision
&& hsr
->redbox
)
671 frame
->is_proxy_supervision
=
672 is_proxy_supervision_frame(port
->hsr
, skb
);
674 n_db
= &hsr
->node_db
;
675 if (port
->type
== HSR_PT_INTERLINK
)
676 n_db
= &hsr
->proxy_node_db
;
678 frame
->node_src
= hsr_get_node(port
, n_db
, skb
,
679 frame
->is_supervision
, port
->type
);
680 if (!frame
->node_src
)
681 return -1; /* Unknown node and !is_supervision, or no mem */
683 ethhdr
= (struct ethhdr
*)skb_mac_header(skb
);
684 frame
->is_vlan
= false;
685 proto
= ethhdr
->h_proto
;
687 if (proto
== htons(ETH_P_8021Q
))
688 frame
->is_vlan
= true;
690 if (frame
->is_vlan
) {
691 vlan_hdr
= (struct hsr_vlan_ethhdr
*)ethhdr
;
692 proto
= vlan_hdr
->vlanhdr
.h_vlan_encapsulated_proto
;
694 netdev_warn_once(skb
->dev
, "VLAN not yet supported");
698 frame
->is_from_san
= false;
699 frame
->port_rcv
= port
;
700 ret
= hsr
->proto_ops
->fill_frame_info(proto
, skb
, frame
);
704 check_local_dest(port
->hsr
, skb
, frame
);
709 /* Must be called holding rcu read lock (because of the port parameter) */
710 void hsr_forward_skb(struct sk_buff
*skb
, struct hsr_port
*port
)
712 struct hsr_frame_info frame
;
715 if (fill_frame_info(&frame
, skb
, port
) < 0)
718 hsr_register_frame_in(frame
.node_src
, port
, frame
.sequence_nr
);
719 hsr_forward_do(&frame
);
721 /* Gets called for ingress frames as well as egress from master port.
722 * So check and increment stats for master port only here.
724 if (port
->type
== HSR_PT_MASTER
|| port
->type
== HSR_PT_INTERLINK
) {
725 port
->dev
->stats
.tx_packets
++;
726 port
->dev
->stats
.tx_bytes
+= skb
->len
;
729 kfree_skb(frame
.skb_hsr
);
730 kfree_skb(frame
.skb_prp
);
731 kfree_skb(frame
.skb_std
);
736 port
->dev
->stats
.tx_dropped
++;