On Wednesday, February 27, 2013 17:58:15 Linus Lüssing wrote:
> +/**
> + * batadv_canceled_packets_free - Frees canceled forward packets
> + * @head: A list of to be freed forw_packets
> + *
> + * This function canceles the scheduling of any packet in the provided
> list, + * waits for any possibly running packet forwarding thread to
> finish and + * finally, safely frees this forward packet.
> + *
> + * This function might sleep.
> + */
> +static void batadv_canceled_packets_free(struct hlist_head *head)
> +{
> + struct batadv_forw_packet *forw_packet;
> + struct hlist_node *tmp_node, *safe_tmp_node;
> +
> + hlist_for_each_entry_safe(forw_packet, tmp_node, safe_tmp_node,
> head, + canceled_list) {
> + cancel_delayed_work_sync(&forw_packet->delayed_work);
> +
> + hlist_del(&forw_packet->canceled_list);
> + batadv_forw_packet_free(forw_packet);
> + }
> +}
I don't quite see how your patch can work when only one interface is
deactivated and not the mesh as a whole. batadv_purge_outstanding_packets()
also is called from batadv_hardif_disable_interface() in which case the
broadcast packets re-arm themselves by appending the work item to their
respective queues. That is why we have the magic "pending" check in the
cleanup functions.
Cheers,
Marek