Lines Matching refs:frame

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.
93 /* if this is a redbox supervision frame we need to verify
121 struct hsr_frame_info *frame)
139 if (frame->is_vlan)
149 struct sk_buff *hsr_get_untagged_frame(struct hsr_frame_info *frame,
152 if (!frame->skb_std) {
153 if (frame->skb_hsr)
154 frame->skb_std =
155 create_stripped_skb_hsr(frame->skb_hsr, frame);
158 "Unexpected frame received in hsr_get_untagged_frame()\n");
160 if (!frame->skb_std)
164 return skb_clone(frame->skb_std, GFP_ATOMIC);
167 struct sk_buff *prp_get_untagged_frame(struct hsr_frame_info *frame,
170 if (!frame->skb_std) {
171 if (frame->skb_prp) {
173 skb_trim(frame->skb_prp,
174 frame->skb_prp->len - HSR_HLEN);
175 frame->skb_std =
176 __pskb_copy(frame->skb_prp,
177 skb_headroom(frame->skb_prp),
181 WARN_ONCE(1, "%s:%d: Unexpected frame received (port_src %s)\n",
187 return skb_clone(frame->skb_std, GFP_ATOMIC);
207 struct hsr_frame_info *frame,
217 if (frame->is_vlan)
225 if (frame->is_vlan)
229 trailer->sequence_nr = htons(frame->sequence_nr);
250 struct hsr_frame_info *frame,
261 if (frame->is_vlan)
268 hsr_ethhdr->hsr_tag.sequence_nr = htons(frame->sequence_nr);
277 /* If the original frame was an HSR tagged frame, just clone it to be sent
278 * unchanged. Otherwise, create a private frame especially tagged for 'port'.
280 struct sk_buff *hsr_create_tagged_frame(struct hsr_frame_info *frame,
287 if (frame->skb_hsr) {
289 (struct hsr_ethhdr *)skb_mac_header(frame->skb_hsr);
293 return skb_clone(frame->skb_hsr, GFP_ATOMIC);
295 return skb_clone(frame->skb_std, GFP_ATOMIC);
299 skb = __pskb_copy(frame->skb_std,
300 skb_headroom(frame->skb_std) + HSR_HLEN, GFP_ATOMIC);
309 if (frame->is_vlan)
320 return hsr_fill_tag(skb, frame, port, port->hsr->prot_version);
323 struct sk_buff *prp_create_tagged_frame(struct hsr_frame_info *frame,
328 if (frame->skb_prp) {
329 struct prp_rct *trailer = skb_get_PRP_rct(frame->skb_prp);
337 return skb_clone(frame->skb_prp, GFP_ATOMIC);
339 return skb_clone(frame->skb_std, GFP_ATOMIC);
342 skb = skb_copy_expand(frame->skb_std, 0,
343 skb_tailroom(frame->skb_std) + HSR_HLEN,
345 return prp_fill_rct(skb, frame, port);
370 struct hsr_frame_info *frame)
372 if (frame->port_rcv->type == HSR_PT_MASTER) {
373 hsr_addr_subst_dest(frame->node_src, skb, port);
376 * address of outgoing frame with that of the outgoing slave's.
383 bool prp_drop_frame(struct hsr_frame_info *frame, struct hsr_port *port)
385 return ((frame->port_rcv->type == HSR_PT_SLAVE_A &&
387 (frame->port_rcv->type == HSR_PT_SLAVE_B &&
391 bool hsr_drop_frame(struct hsr_frame_info *frame, struct hsr_port *port)
394 return prp_drop_frame(frame, port);
399 /* Forward the frame through all devices except:
401 * - If it's a HSR frame: through a device where it has passed before
402 * - if it's a PRP frame: through another PRP slave device (no bridge)
403 * - To the local HSR master only if the frame is directly addressed to it, or
404 * a non-supervision multicast or broadcast frame.
406 * HSR slave devices should insert a HSR tag into the frame, or forward the
407 * frame unchanged if it's already tagged. Interlink devices should strip HSR
411 static void hsr_forward_do(struct hsr_frame_info *frame)
417 hsr_for_each_port(frame->port_rcv->hsr, port) {
419 /* Don't send frame back the way it came */
420 if (port == frame->port_rcv)
424 if (port->type == HSR_PT_MASTER && !frame->is_local_dest)
428 if (port->type != HSR_PT_MASTER && frame->is_local_exclusive)
437 /* Don't send frame over port where it has been sent before.
440 if (!frame->is_from_san &&
441 hsr_register_frame_out(port, frame->node_src,
442 frame->sequence_nr))
445 if (frame->is_supervision && port->type == HSR_PT_MASTER) {
446 hsr_handle_sup_frame(frame);
450 /* Check if frame is to be dropped. Eg. for PRP no forward
454 hsr->proto_ops->drop_frame(frame, port))
458 skb = hsr->proto_ops->create_tagged_frame(frame, port);
460 skb = hsr->proto_ops->get_untagged_frame(frame, port);
463 frame->port_rcv->dev->stats.rx_dropped++;
469 hsr_deliver_master(skb, port->dev, frame->node_src);
471 if (!hsr_xmit(skb, port, frame))
478 struct hsr_frame_info *frame)
481 frame->is_local_exclusive = true;
484 frame->is_local_exclusive = false;
490 frame->is_local_dest = true;
492 frame->is_local_dest = false;
497 struct hsr_frame_info *frame)
499 struct hsr_port *port = frame->port_rcv;
502 frame->skb_hsr = NULL;
503 frame->skb_prp = NULL;
504 frame->skb_std = skb;
507 frame->is_from_san = true;
511 frame->sequence_nr = hsr->sequence_nr;
517 struct hsr_frame_info *frame)
519 struct hsr_port *port = frame->port_rcv;
529 /* HSR tagged frame :- Data or Supervision */
530 frame->skb_std = NULL;
531 frame->skb_prp = NULL;
532 frame->skb_hsr = skb;
533 frame->sequence_nr = hsr_get_skb_sequence_nr(skb);
537 /* Standard frame or PRP from master port */
538 handle_std_frame(skb, frame);
544 struct hsr_frame_info *frame)
546 /* Supervision frame */
550 prp_check_lsdu_size(skb, rct, frame->is_supervision)) {
551 frame->skb_hsr = NULL;
552 frame->skb_std = NULL;
553 frame->skb_prp = skb;
554 frame->sequence_nr = prp_get_skb_sequence_nr(rct);
557 handle_std_frame(skb, frame);
562 static int fill_frame_info(struct hsr_frame_info *frame,
575 memset(frame, 0, sizeof(*frame));
576 frame->is_supervision = is_supervision_frame(port->hsr, skb);
577 frame->node_src = hsr_get_node(port, &hsr->node_db, skb,
578 frame->is_supervision,
580 if (!frame->node_src)
584 frame->is_vlan = false;
588 frame->is_vlan = true;
590 if (frame->is_vlan) {
598 frame->is_from_san = false;
599 frame->port_rcv = port;
600 ret = hsr->proto_ops->fill_frame_info(proto, skb, frame);
604 check_local_dest(port->hsr, skb, frame);
612 struct hsr_frame_info frame;
615 if (fill_frame_info(&frame, skb, port) < 0)
618 hsr_register_frame_in(frame.node_src, port, frame.sequence_nr);
619 hsr_forward_do(&frame);
629 kfree_skb(frame.skb_hsr);
630 kfree_skb(frame.skb_prp);
631 kfree_skb(frame.skb_std);