Lines Matching refs:forw_packet

459  * @forw_packet: The packet to free
465 void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet,
469 kfree_skb(forw_packet->skb);
471 consume_skb(forw_packet->skb);
473 batadv_hardif_put(forw_packet->if_incoming);
474 batadv_hardif_put(forw_packet->if_outgoing);
475 if (forw_packet->queue_left)
476 atomic_inc(forw_packet->queue_left);
477 kfree(forw_packet);
485 * @bat_priv: The bat_priv for the mesh of this forw_packet
501 struct batadv_forw_packet *forw_packet;
519 forw_packet = kmalloc(sizeof(*forw_packet), GFP_ATOMIC);
520 if (!forw_packet)
529 INIT_HLIST_NODE(&forw_packet->list);
530 INIT_HLIST_NODE(&forw_packet->cleanup_list);
531 forw_packet->skb = skb;
532 forw_packet->queue_left = queue_left;
533 forw_packet->if_incoming = if_incoming;
534 forw_packet->if_outgoing = if_outgoing;
535 forw_packet->num_packets = 0;
537 return forw_packet;
548 * @forw_packet: the forwarding packet to check
556 batadv_forw_packet_was_stolen(struct batadv_forw_packet *forw_packet)
558 return !hlist_unhashed(&forw_packet->cleanup_list);
562 * batadv_forw_packet_steal() - claim a forw_packet for free()
563 * @forw_packet: the forwarding packet to steal
566 * This function tries to steal a specific forw_packet from global
573 bool batadv_forw_packet_steal(struct batadv_forw_packet *forw_packet,
578 if (batadv_forw_packet_was_stolen(forw_packet)) {
583 hlist_del_init(&forw_packet->list);
586 hlist_add_fake(&forw_packet->cleanup_list);
598 * This function claims responsibility to free any forw_packet queued on the
610 struct batadv_forw_packet *forw_packet;
613 hlist_for_each_entry_safe(forw_packet, safe_tmp_node,
619 forw_packet->if_incoming != hard_iface &&
620 forw_packet->if_outgoing != hard_iface)
623 hlist_del(&forw_packet->list);
624 hlist_add_head(&forw_packet->cleanup_list, cleanup_list);
640 struct batadv_forw_packet *forw_packet;
643 hlist_for_each_entry_safe(forw_packet, safe_tmp_node, head,
645 cancel_delayed_work_sync(&forw_packet->delayed_work);
647 hlist_del(&forw_packet->cleanup_list);
648 batadv_forw_packet_free(forw_packet, true);
654 * @forw_packet: the forwarding packet to queue
667 * Caller needs to ensure that forw_packet->delayed_work was initialized.
669 static void batadv_forw_packet_queue(struct batadv_forw_packet *forw_packet,
676 if (batadv_forw_packet_was_stolen(forw_packet)) {
680 WARN_ONCE(hlist_fake(&forw_packet->cleanup_list),
687 hlist_del_init(&forw_packet->list);
688 hlist_add_head(&forw_packet->list, head);
691 &forw_packet->delayed_work,
699 * @forw_packet: the forwarding packet to queue
704 * Caller needs to ensure that forw_packet->delayed_work was initialized.
708 struct batadv_forw_packet *forw_packet,
711 batadv_forw_packet_queue(forw_packet, &bat_priv->forw_bcast_list_lock,
718 * @forw_packet: the forwarding packet to queue
723 * Caller needs to ensure that forw_packet->delayed_work was initialized.
726 struct batadv_forw_packet *forw_packet,
729 batadv_forw_packet_queue(forw_packet, &bat_priv->forw_bat_list_lock,
758 struct batadv_forw_packet *forw_packet;
766 forw_packet = batadv_forw_packet_alloc(if_in, if_out,
769 if (!forw_packet)
772 forw_packet->own = own_packet;
774 INIT_DELAYED_WORK(&forw_packet->delayed_work,
779 batadv_forw_packet_bcast_queue(bat_priv, forw_packet, send_time);
1004 * @forw_packet: the forwarding packet to check
1016 batadv_forw_packet_bcasts_left(struct batadv_forw_packet *forw_packet)
1018 return BATADV_SKB_CB(forw_packet->skb)->num_bcasts;
1024 * @forw_packet: the packet to decrease the counter for
1027 batadv_forw_packet_bcasts_dec(struct batadv_forw_packet *forw_packet)
1029 BATADV_SKB_CB(forw_packet->skb)->num_bcasts--;
1034 * @forw_packet: the packet to check
1038 bool batadv_forw_packet_is_rebroadcast(struct batadv_forw_packet *forw_packet)
1040 unsigned char num_bcasts = BATADV_SKB_CB(forw_packet->skb)->num_bcasts;
1042 return num_bcasts != forw_packet->if_outgoing->num_bcasts;
1054 struct batadv_forw_packet *forw_packet;
1061 forw_packet = container_of(delayed_work, struct batadv_forw_packet,
1063 bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
1070 if (batadv_dat_drop_broadcast_packet(bat_priv, forw_packet)) {
1076 skb1 = skb_clone(forw_packet->skb, GFP_ATOMIC);
1080 batadv_send_broadcast_skb(skb1, forw_packet->if_outgoing);
1081 batadv_forw_packet_bcasts_dec(forw_packet);
1083 if (batadv_forw_packet_bcasts_left(forw_packet)) {
1084 batadv_forw_packet_bcast_queue(bat_priv, forw_packet,
1091 if (batadv_forw_packet_steal(forw_packet,
1093 batadv_forw_packet_free(forw_packet, dropped);