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
;
286 /* pad to minimum packet size which is 60 + 6 (HSR tag) */
287 if (skb_put_padto(skb
, ETH_ZLEN
+ HSR_HLEN
))
290 lsdu_size
= skb
->len
- 14;
294 pc
= skb_mac_header(skb
);
296 /* This 4-byte shift (size of a vlan tag) does not
297 * mean that the ethhdr starts there. But rather it
298 * provides the proper environment for accessing
299 * the fields, such as hsr_tag etc., just like
300 * when the vlan tag is not there. This is because
301 * the hsr tag is after the vlan tag.
303 hsr_ethhdr
= (struct hsr_ethhdr
*)(pc
+ VLAN_HLEN
);
305 hsr_ethhdr
= (struct hsr_ethhdr
*)pc
;
307 hsr_set_path_id(hsr_ethhdr
, port
);
308 set_hsr_tag_LSDU_size(&hsr_ethhdr
->hsr_tag
, lsdu_size
);
309 hsr_ethhdr
->hsr_tag
.sequence_nr
= htons(frame
->sequence_nr
);
310 hsr_ethhdr
->hsr_tag
.encap_proto
= hsr_ethhdr
->ethhdr
.h_proto
;
311 hsr_ethhdr
->ethhdr
.h_proto
= htons(proto_version
?
312 ETH_P_HSR
: ETH_P_PRP
);
313 skb
->protocol
= hsr_ethhdr
->ethhdr
.h_proto
;
318 /* If the original frame was an HSR tagged frame, just clone it to be sent
319 * unchanged. Otherwise, create a private frame especially tagged for 'port'.
321 struct sk_buff
*hsr_create_tagged_frame(struct hsr_frame_info
*frame
,
322 struct hsr_port
*port
)
324 unsigned char *dst
, *src
;
328 if (frame
->skb_hsr
) {
329 struct hsr_ethhdr
*hsr_ethhdr
=
330 (struct hsr_ethhdr
*)skb_mac_header(frame
->skb_hsr
);
332 /* set the lane id properly */
333 hsr_set_path_id(hsr_ethhdr
, port
);
334 return skb_clone(frame
->skb_hsr
, GFP_ATOMIC
);
335 } else if (port
->dev
->features
& NETIF_F_HW_HSR_TAG_INS
) {
336 return skb_clone(frame
->skb_std
, GFP_ATOMIC
);
339 /* Create the new skb with enough headroom to fit the HSR tag */
340 skb
= __pskb_copy(frame
->skb_std
,
341 skb_headroom(frame
->skb_std
) + HSR_HLEN
, GFP_ATOMIC
);
344 skb_reset_mac_header(skb
);
346 if (skb
->ip_summed
== CHECKSUM_PARTIAL
)
347 skb
->csum_start
+= HSR_HLEN
;
351 movelen
+= VLAN_HLEN
;
353 src
= skb_mac_header(skb
);
354 dst
= skb_push(skb
, HSR_HLEN
);
355 memmove(dst
, src
, movelen
);
356 skb_reset_mac_header(skb
);
358 /* skb_put_padto free skb on error and hsr_fill_tag returns NULL in
361 return hsr_fill_tag(skb
, frame
, port
, port
->hsr
->prot_version
);
364 struct sk_buff
*prp_create_tagged_frame(struct hsr_frame_info
*frame
,
365 struct hsr_port
*port
)
369 if (frame
->skb_prp
) {
370 struct prp_rct
*trailer
= skb_get_PRP_rct(frame
->skb_prp
);
373 prp_set_lan_id(trailer
, port
);
375 WARN_ONCE(!trailer
, "errored PRP skb");
378 return skb_clone(frame
->skb_prp
, GFP_ATOMIC
);
379 } else if (port
->dev
->features
& NETIF_F_HW_HSR_TAG_INS
) {
380 return skb_clone(frame
->skb_std
, GFP_ATOMIC
);
383 skb
= skb_copy_expand(frame
->skb_std
, skb_headroom(frame
->skb_std
),
384 skb_tailroom(frame
->skb_std
) + HSR_HLEN
,
386 return prp_fill_rct(skb
, frame
, port
);
389 static void hsr_deliver_master(struct sk_buff
*skb
, struct net_device
*dev
,
390 struct hsr_node
*node_src
)
392 bool was_multicast_frame
;
395 was_multicast_frame
= (skb
->pkt_type
== PACKET_MULTICAST
);
396 hsr_addr_subst_source(node_src
, skb
);
397 skb_pull(skb
, ETH_HLEN
);
400 if (res
== NET_RX_DROP
) {
401 dev
->stats
.rx_dropped
++;
403 dev
->stats
.rx_packets
++;
404 dev
->stats
.rx_bytes
+= recv_len
;
405 if (was_multicast_frame
)
406 dev
->stats
.multicast
++;
410 static int hsr_xmit(struct sk_buff
*skb
, struct hsr_port
*port
,
411 struct hsr_frame_info
*frame
)
413 if (frame
->port_rcv
->type
== HSR_PT_MASTER
) {
414 hsr_addr_subst_dest(frame
->node_src
, skb
, port
);
416 /* Address substitution (IEC62439-3 pp 26, 50): replace mac
417 * address of outgoing frame with that of the outgoing slave's.
419 ether_addr_copy(eth_hdr(skb
)->h_source
, port
->dev
->dev_addr
);
422 /* When HSR node is used as RedBox - the frame received from HSR ring
423 * requires source MAC address (SA) replacement to one which can be
424 * recognized by SAN devices (otherwise, frames are dropped by switch)
426 if (port
->type
== HSR_PT_INTERLINK
)
427 ether_addr_copy(eth_hdr(skb
)->h_source
,
428 port
->hsr
->macaddress_redbox
);
430 return dev_queue_xmit(skb
);
433 bool prp_drop_frame(struct hsr_frame_info
*frame
, struct hsr_port
*port
)
435 return ((frame
->port_rcv
->type
== HSR_PT_SLAVE_A
&&
436 port
->type
== HSR_PT_SLAVE_B
) ||
437 (frame
->port_rcv
->type
== HSR_PT_SLAVE_B
&&
438 port
->type
== HSR_PT_SLAVE_A
));
441 bool hsr_drop_frame(struct hsr_frame_info
*frame
, struct hsr_port
*port
)
445 if (port
->dev
->features
& NETIF_F_HW_HSR_FWD
)
446 return prp_drop_frame(frame
, port
);
448 /* RedBox specific frames dropping policies
450 * Do not send HSR supervisory frames to SAN devices
452 if (frame
->is_supervision
&& port
->type
== HSR_PT_INTERLINK
)
455 /* Do not forward to other HSR port (A or B) unicast frames which
456 * are addressed to interlink port (and are in the ProxyNodeTable).
458 skb
= frame
->skb_hsr
;
459 if (skb
&& prp_drop_frame(frame
, port
) &&
460 is_unicast_ether_addr(eth_hdr(skb
)->h_dest
) &&
461 hsr_is_node_in_db(&port
->hsr
->proxy_node_db
,
462 eth_hdr(skb
)->h_dest
)) {
466 /* Do not forward to port C (Interlink) frames from nodes A and B
467 * if DA is in NodeTable.
469 if ((frame
->port_rcv
->type
== HSR_PT_SLAVE_A
||
470 frame
->port_rcv
->type
== HSR_PT_SLAVE_B
) &&
471 port
->type
== HSR_PT_INTERLINK
) {
472 skb
= frame
->skb_hsr
;
473 if (skb
&& is_unicast_ether_addr(eth_hdr(skb
)->h_dest
) &&
474 hsr_is_node_in_db(&port
->hsr
->node_db
,
475 eth_hdr(skb
)->h_dest
)) {
480 /* Do not forward to port A and B unicast frames received on the
481 * interlink port if it is addressed to one of nodes registered in
482 * the ProxyNodeTable.
484 if ((port
->type
== HSR_PT_SLAVE_A
|| port
->type
== HSR_PT_SLAVE_B
) &&
485 frame
->port_rcv
->type
== HSR_PT_INTERLINK
) {
486 skb
= frame
->skb_std
;
487 if (skb
&& is_unicast_ether_addr(eth_hdr(skb
)->h_dest
) &&
488 hsr_is_node_in_db(&port
->hsr
->proxy_node_db
,
489 eth_hdr(skb
)->h_dest
)) {
497 /* Forward the frame through all devices except:
498 * - Back through the receiving device
499 * - If it's a HSR frame: through a device where it has passed before
500 * - if it's a PRP frame: through another PRP slave device (no bridge)
501 * - To the local HSR master only if the frame is directly addressed to it, or
502 * a non-supervision multicast or broadcast frame.
504 * HSR slave devices should insert a HSR tag into the frame, or forward the
505 * frame unchanged if it's already tagged. Interlink devices should strip HSR
506 * tags if they're of the non-HSR type (but only after duplicate discard). The
507 * master device always strips HSR tags.
509 static void hsr_forward_do(struct hsr_frame_info
*frame
)
511 struct hsr_port
*port
;
515 hsr_for_each_port(frame
->port_rcv
->hsr
, port
) {
516 struct hsr_priv
*hsr
= port
->hsr
;
517 /* Don't send frame back the way it came */
518 if (port
== frame
->port_rcv
)
521 /* Don't deliver locally unless we should */
522 if (port
->type
== HSR_PT_MASTER
&& !frame
->is_local_dest
)
525 /* Deliver frames directly addressed to us to master only */
526 if (port
->type
!= HSR_PT_MASTER
&& frame
->is_local_exclusive
)
529 /* If hardware duplicate generation is enabled, only send out
532 if ((port
->dev
->features
& NETIF_F_HW_HSR_DUP
) && sent
)
535 /* Don't send frame over port where it has been sent before.
536 * Also for SAN, this shouldn't be done.
538 if (!frame
->is_from_san
&&
539 hsr_register_frame_out(port
, frame
->node_src
,
543 if (frame
->is_supervision
&& port
->type
== HSR_PT_MASTER
&&
544 !frame
->is_proxy_supervision
) {
545 hsr_handle_sup_frame(frame
);
549 /* Check if frame is to be dropped. Eg. for PRP no forward
550 * between ports, or sending HSR supervision to RedBox.
552 if (hsr
->proto_ops
->drop_frame
&&
553 hsr
->proto_ops
->drop_frame(frame
, port
))
556 if (port
->type
== HSR_PT_SLAVE_A
||
557 port
->type
== HSR_PT_SLAVE_B
)
558 skb
= hsr
->proto_ops
->create_tagged_frame(frame
, port
);
560 skb
= hsr
->proto_ops
->get_untagged_frame(frame
, port
);
563 frame
->port_rcv
->dev
->stats
.rx_dropped
++;
567 skb
->dev
= port
->dev
;
568 if (port
->type
== HSR_PT_MASTER
) {
569 hsr_deliver_master(skb
, port
->dev
, frame
->node_src
);
571 if (!hsr_xmit(skb
, port
, frame
))
572 if (port
->type
== HSR_PT_SLAVE_A
||
573 port
->type
== HSR_PT_SLAVE_B
)
579 static void check_local_dest(struct hsr_priv
*hsr
, struct sk_buff
*skb
,
580 struct hsr_frame_info
*frame
)
582 if (hsr_addr_is_self(hsr
, eth_hdr(skb
)->h_dest
)) {
583 frame
->is_local_exclusive
= true;
584 skb
->pkt_type
= PACKET_HOST
;
586 frame
->is_local_exclusive
= false;
589 if (skb
->pkt_type
== PACKET_HOST
||
590 skb
->pkt_type
== PACKET_MULTICAST
||
591 skb
->pkt_type
== PACKET_BROADCAST
) {
592 frame
->is_local_dest
= true;
594 frame
->is_local_dest
= false;
598 static void handle_std_frame(struct sk_buff
*skb
,
599 struct hsr_frame_info
*frame
)
601 struct hsr_port
*port
= frame
->port_rcv
;
602 struct hsr_priv
*hsr
= port
->hsr
;
604 frame
->skb_hsr
= NULL
;
605 frame
->skb_prp
= NULL
;
606 frame
->skb_std
= skb
;
608 if (port
->type
!= HSR_PT_MASTER
)
609 frame
->is_from_san
= true;
611 if (port
->type
== HSR_PT_MASTER
||
612 port
->type
== HSR_PT_INTERLINK
) {
613 /* Sequence nr for the master/interlink node */
614 lockdep_assert_held(&hsr
->seqnr_lock
);
615 frame
->sequence_nr
= hsr
->sequence_nr
;
620 int hsr_fill_frame_info(__be16 proto
, struct sk_buff
*skb
,
621 struct hsr_frame_info
*frame
)
623 struct hsr_port
*port
= frame
->port_rcv
;
624 struct hsr_priv
*hsr
= port
->hsr
;
626 /* HSRv0 supervisory frames double as a tag so treat them as tagged. */
627 if ((!hsr
->prot_version
&& proto
== htons(ETH_P_PRP
)) ||
628 proto
== htons(ETH_P_HSR
)) {
629 /* Check if skb contains hsr_ethhdr */
630 if (skb
->mac_len
< sizeof(struct hsr_ethhdr
))
633 /* HSR tagged frame :- Data or Supervision */
634 frame
->skb_std
= NULL
;
635 frame
->skb_prp
= NULL
;
636 frame
->skb_hsr
= skb
;
637 frame
->sequence_nr
= hsr_get_skb_sequence_nr(skb
);
641 /* Standard frame or PRP from master port */
642 handle_std_frame(skb
, frame
);
647 int prp_fill_frame_info(__be16 proto
, struct sk_buff
*skb
,
648 struct hsr_frame_info
*frame
)
650 /* Supervision frame */
651 struct prp_rct
*rct
= skb_get_PRP_rct(skb
);
654 prp_check_lsdu_size(skb
, rct
, frame
->is_supervision
)) {
655 frame
->skb_hsr
= NULL
;
656 frame
->skb_std
= NULL
;
657 frame
->skb_prp
= skb
;
658 frame
->sequence_nr
= prp_get_skb_sequence_nr(rct
);
661 handle_std_frame(skb
, frame
);
666 static int fill_frame_info(struct hsr_frame_info
*frame
,
667 struct sk_buff
*skb
, struct hsr_port
*port
)
669 struct hsr_priv
*hsr
= port
->hsr
;
670 struct hsr_vlan_ethhdr
*vlan_hdr
;
671 struct list_head
*n_db
;
672 struct ethhdr
*ethhdr
;
676 /* Check if skb contains ethhdr */
677 if (skb
->mac_len
< sizeof(struct ethhdr
))
680 memset(frame
, 0, sizeof(*frame
));
681 frame
->is_supervision
= is_supervision_frame(port
->hsr
, skb
);
682 if (frame
->is_supervision
&& hsr
->redbox
)
683 frame
->is_proxy_supervision
=
684 is_proxy_supervision_frame(port
->hsr
, skb
);
686 n_db
= &hsr
->node_db
;
687 if (port
->type
== HSR_PT_INTERLINK
)
688 n_db
= &hsr
->proxy_node_db
;
690 frame
->node_src
= hsr_get_node(port
, n_db
, skb
,
691 frame
->is_supervision
, port
->type
);
692 if (!frame
->node_src
)
693 return -1; /* Unknown node and !is_supervision, or no mem */
695 ethhdr
= (struct ethhdr
*)skb_mac_header(skb
);
696 frame
->is_vlan
= false;
697 proto
= ethhdr
->h_proto
;
699 if (proto
== htons(ETH_P_8021Q
))
700 frame
->is_vlan
= true;
702 if (frame
->is_vlan
) {
703 vlan_hdr
= (struct hsr_vlan_ethhdr
*)ethhdr
;
704 proto
= vlan_hdr
->vlanhdr
.h_vlan_encapsulated_proto
;
707 frame
->is_from_san
= false;
708 frame
->port_rcv
= port
;
709 ret
= hsr
->proto_ops
->fill_frame_info(proto
, skb
, frame
);
713 check_local_dest(port
->hsr
, skb
, frame
);
718 /* Must be called holding rcu read lock (because of the port parameter) */
719 void hsr_forward_skb(struct sk_buff
*skb
, struct hsr_port
*port
)
721 struct hsr_frame_info frame
;
724 if (fill_frame_info(&frame
, skb
, port
) < 0)
727 hsr_register_frame_in(frame
.node_src
, port
, frame
.sequence_nr
);
728 hsr_forward_do(&frame
);
730 /* Gets called for ingress frames as well as egress from master port.
731 * So check and increment stats for master port only here.
733 if (port
->type
== HSR_PT_MASTER
|| port
->type
== HSR_PT_INTERLINK
) {
734 port
->dev
->stats
.tx_packets
++;
735 port
->dev
->stats
.tx_bytes
+= skb
->len
;
738 kfree_skb(frame
.skb_hsr
);
739 kfree_skb(frame
.skb_prp
);
740 kfree_skb(frame
.skb_std
);
745 port
->dev
->stats
.tx_dropped
++;