Blame view

net/batman-adv/send.c 11.2 KB
0b8739314   Antonio Quartulli   batman-adv: updat...
1
  /* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
c6c8fea29   Sven Eckelmann   net: Add batman-a...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   *
   * Marek Lindner, Simon Wunderlich
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of version 2 of the GNU General Public
   * License as published by the Free Software Foundation.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
   * 02110-1301, USA
c6c8fea29   Sven Eckelmann   net: Add batman-a...
18
19
20
   */
  
  #include "main.h"
c384ea3ec   Antonio Quartulli   batman-adv: Distr...
21
  #include "distributed-arp-table.h"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
22
23
24
25
26
  #include "send.h"
  #include "routing.h"
  #include "translation-table.h"
  #include "soft-interface.h"
  #include "hard-interface.h"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
27
  #include "vis.h"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
28
29
  #include "gateway_common.h"
  #include "originator.h"
612d2b4fe   Martin Hundebøll   batman-adv: netwo...
30
  #include "network-coding.h"
c6c8fea29   Sven Eckelmann   net: Add batman-a...
31

af5d4f773   Antonio Quartulli   batman-adv: use E...
32
  #include <linux/if_ether.h>
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
33
  static void batadv_send_outstanding_bcast_packet(struct work_struct *work);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
34

c6c8fea29   Sven Eckelmann   net: Add batman-a...
35
  /* send out an already prepared packet to the given address via the
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
36
37
   * specified batman interface
   */
56303d34a   Sven Eckelmann   batman-adv: Prefi...
38
39
  int batadv_send_skb_packet(struct sk_buff *skb,
  			   struct batadv_hard_iface *hard_iface,
9455e34cb   Sven Eckelmann   batman-adv: Prefi...
40
  			   const uint8_t *dst_addr)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
41
  {
612d2b4fe   Martin Hundebøll   batman-adv: netwo...
42
  	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
43
  	struct ethhdr *ethhdr;
e9a4f295e   Sven Eckelmann   batman-adv: Prefi...
44
  	if (hard_iface->if_status != BATADV_IF_ACTIVE)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
45
  		goto send_skb_err;
e6c10f433   Marek Lindner   batman-adv: renam...
46
  	if (unlikely(!hard_iface->net_dev))
c6c8fea29   Sven Eckelmann   net: Add batman-a...
47
  		goto send_skb_err;
e6c10f433   Marek Lindner   batman-adv: renam...
48
  	if (!(hard_iface->net_dev->flags & IFF_UP)) {
679695813   Sven Eckelmann   batman-adv: use s...
49
50
51
  		pr_warn("Interface %s is not up - can't send packet via that interface!
  ",
  			hard_iface->net_dev->name);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
52
53
54
55
  		goto send_skb_err;
  	}
  
  	/* push to the ethernet header. */
04b482a21   Sven Eckelmann   batman-adv: Prefi...
56
  	if (batadv_skb_head_push(skb, ETH_HLEN) < 0)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
57
58
59
  		goto send_skb_err;
  
  	skb_reset_mac_header(skb);
40e0c4f51   Sven Eckelmann   batman-adv: Remov...
60
  	ethhdr = (struct ethhdr *)skb_mac_header(skb);
e6c10f433   Marek Lindner   batman-adv: renam...
61
  	memcpy(ethhdr->h_source, hard_iface->net_dev->dev_addr, ETH_ALEN);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
62
  	memcpy(ethhdr->h_dest, dst_addr, ETH_ALEN);
af5d4f773   Antonio Quartulli   batman-adv: use E...
63
  	ethhdr->h_proto = __constant_htons(ETH_P_BATMAN);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
64
65
66
  
  	skb_set_network_header(skb, ETH_HLEN);
  	skb->priority = TC_PRIO_CONTROL;
af5d4f773   Antonio Quartulli   batman-adv: use E...
67
  	skb->protocol = __constant_htons(ETH_P_BATMAN);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
68

e6c10f433   Marek Lindner   batman-adv: renam...
69
  	skb->dev = hard_iface->net_dev;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
70

612d2b4fe   Martin Hundebøll   batman-adv: netwo...
71
72
  	/* Save a clone of the skb to use when decoding coded packets */
  	batadv_nc_skb_store_for_decoding(bat_priv, skb);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
73
74
  	/* dev_queue_xmit() returns a negative result on error.	 However on
  	 * congestion and traffic shaping, it drops and returns NET_XMIT_DROP
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
75
76
  	 * (which is > 0). This will not be treated as an error.
  	 */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
77
78
79
80
81
  	return dev_queue_xmit(skb);
  send_skb_err:
  	kfree_skb(skb);
  	return NET_XMIT_DROP;
  }
bb351ba0b   Martin Hundebøll   batman-adv: Add w...
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  /**
   * batadv_send_skb_to_orig - Lookup next-hop and transmit skb.
   * @skb: Packet to be transmitted.
   * @orig_node: Final destination of the packet.
   * @recv_if: Interface used when receiving the packet (can be NULL).
   *
   * Looks up the best next-hop towards the passed originator and passes the
   * skb on for preparation of MAC header. If the packet originated from this
   * host, NULL can be passed as recv_if and no interface alternating is
   * attempted.
   *
   * Returns TRUE on success; FALSE otherwise.
   */
  bool batadv_send_skb_to_orig(struct sk_buff *skb,
  			     struct batadv_orig_node *orig_node,
  			     struct batadv_hard_iface *recv_if)
  {
  	struct batadv_priv *bat_priv = orig_node->bat_priv;
  	struct batadv_neigh_node *neigh_node;
  
  	/* batadv_find_router() increases neigh_nodes refcount if found. */
  	neigh_node = batadv_find_router(bat_priv, orig_node, recv_if);
  	if (!neigh_node)
  		return false;
  
  	/* route it */
  	batadv_send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
  
  	batadv_neigh_node_free_ref(neigh_node);
  
  	return true;
  }
56303d34a   Sven Eckelmann   batman-adv: Prefi...
114
  void batadv_schedule_bat_ogm(struct batadv_hard_iface *hard_iface)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
115
  {
56303d34a   Sven Eckelmann   batman-adv: Prefi...
116
  	struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
117

e9a4f295e   Sven Eckelmann   batman-adv: Prefi...
118
119
  	if ((hard_iface->if_status == BATADV_IF_NOT_IN_USE) ||
  	    (hard_iface->if_status == BATADV_IF_TO_BE_REMOVED))
c6c8fea29   Sven Eckelmann   net: Add batman-a...
120
  		return;
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
121
  	/* the interface gets activated here to avoid race conditions between
c6c8fea29   Sven Eckelmann   net: Add batman-a...
122
123
124
125
126
  	 * the moment of activating the interface in
  	 * hardif_activate_interface() where the originator mac is set and
  	 * outdated packets (especially uninitialized mac addresses) in the
  	 * packet queue
  	 */
e9a4f295e   Sven Eckelmann   batman-adv: Prefi...
127
128
  	if (hard_iface->if_status == BATADV_IF_TO_BE_ACTIVATED)
  		hard_iface->if_status = BATADV_IF_ACTIVE;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
129

be9aa4c1e   Marek Lindner   batman-adv: turn ...
130
  	bat_priv->bat_algo_ops->bat_ogm_schedule(hard_iface);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
131
  }
56303d34a   Sven Eckelmann   batman-adv: Prefi...
132
  static void batadv_forw_packet_free(struct batadv_forw_packet *forw_packet)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
133
134
135
  {
  	if (forw_packet->skb)
  		kfree_skb(forw_packet->skb);
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
136
  	if (forw_packet->if_incoming)
e5d89254b   Sven Eckelmann   batman-adv: Prefi...
137
  		batadv_hardif_free_ref(forw_packet->if_incoming);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
138
139
  	kfree(forw_packet);
  }
56303d34a   Sven Eckelmann   batman-adv: Prefi...
140
141
142
143
  static void
  _batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv,
  				 struct batadv_forw_packet *forw_packet,
  				 unsigned long send_time)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
144
145
146
147
148
149
150
151
152
  {
  	INIT_HLIST_NODE(&forw_packet->list);
  
  	/* add new packet to packet list */
  	spin_lock_bh(&bat_priv->forw_bcast_list_lock);
  	hlist_add_head(&forw_packet->list, &bat_priv->forw_bcast_list);
  	spin_unlock_bh(&bat_priv->forw_bcast_list_lock);
  
  	/* start timer for this packet */
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
153
  	queue_delayed_work(batadv_event_workqueue, &forw_packet->delayed_work,
c6c8fea29   Sven Eckelmann   net: Add batman-a...
154
155
  			   send_time);
  }
c6c8fea29   Sven Eckelmann   net: Add batman-a...
156
  /* add a broadcast packet to the queue and setup timers. broadcast packets
015758d00   Antonio Quartulli   batman-adv: corre...
157
   * are sent multiple times to increase probability for being received.
c6c8fea29   Sven Eckelmann   net: Add batman-a...
158
159
160
161
162
   *
   * This function returns NETDEV_TX_OK on success and NETDEV_TX_BUSY on
   * errors.
   *
   * The skb is not consumed, so the caller should make sure that the
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
163
164
   * skb is freed.
   */
56303d34a   Sven Eckelmann   batman-adv: Prefi...
165
  int batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv,
9455e34cb   Sven Eckelmann   batman-adv: Prefi...
166
167
  				    const struct sk_buff *skb,
  				    unsigned long delay)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
168
  {
56303d34a   Sven Eckelmann   batman-adv: Prefi...
169
170
  	struct batadv_hard_iface *primary_if = NULL;
  	struct batadv_forw_packet *forw_packet;
964126901   Sven Eckelmann   batman-adv: Prefi...
171
  	struct batadv_bcast_packet *bcast_packet;
747e4221a   Sven Eckelmann   batman-adv: Add c...
172
  	struct sk_buff *newskb;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
173

3e34819e0   Sven Eckelmann   batman-adv: Prefi...
174
  	if (!batadv_atomic_dec_not_zero(&bat_priv->bcast_queue_left)) {
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
175
176
177
  		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
  			   "bcast packet queue full
  ");
c6c8fea29   Sven Eckelmann   net: Add batman-a...
178
179
  		goto out;
  	}
e5d89254b   Sven Eckelmann   batman-adv: Prefi...
180
  	primary_if = batadv_primary_if_get_selected(bat_priv);
32ae9b221   Marek Lindner   batman-adv: Make ...
181
  	if (!primary_if)
ca06c6eb9   Marek Lindner   batman-adv: reset...
182
  		goto out_and_inc;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
183

704509b8d   Sven Eckelmann   batman-adv: Calcu...
184
  	forw_packet = kmalloc(sizeof(*forw_packet), GFP_ATOMIC);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
185
186
187
  
  	if (!forw_packet)
  		goto out_and_inc;
747e4221a   Sven Eckelmann   batman-adv: Add c...
188
189
  	newskb = skb_copy(skb, GFP_ATOMIC);
  	if (!newskb)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
190
191
192
  		goto packet_free;
  
  	/* as we have a copy now, it is safe to decrease the TTL */
964126901   Sven Eckelmann   batman-adv: Prefi...
193
  	bcast_packet = (struct batadv_bcast_packet *)newskb->data;
76543d14a   Sven Eckelmann   batman-adv: Expli...
194
  	bcast_packet->header.ttl--;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
195

747e4221a   Sven Eckelmann   batman-adv: Add c...
196
  	skb_reset_mac_header(newskb);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
197

747e4221a   Sven Eckelmann   batman-adv: Add c...
198
  	forw_packet->skb = newskb;
32ae9b221   Marek Lindner   batman-adv: Make ...
199
  	forw_packet->if_incoming = primary_if;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
200
201
202
  
  	/* how often did we send the bcast packet ? */
  	forw_packet->num_packets = 0;
724144420   Antonio Quartulli   batman-adv: a del...
203
204
  	INIT_DELAYED_WORK(&forw_packet->delayed_work,
  			  batadv_send_outstanding_bcast_packet);
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
205
  	_batadv_add_bcast_packet_to_list(bat_priv, forw_packet, delay);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
206
207
208
209
210
211
212
  	return NETDEV_TX_OK;
  
  packet_free:
  	kfree(forw_packet);
  out_and_inc:
  	atomic_inc(&bat_priv->bcast_queue_left);
  out:
32ae9b221   Marek Lindner   batman-adv: Make ...
213
  	if (primary_if)
e5d89254b   Sven Eckelmann   batman-adv: Prefi...
214
  		batadv_hardif_free_ref(primary_if);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
215
216
  	return NETDEV_TX_BUSY;
  }
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
217
  static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
218
  {
56303d34a   Sven Eckelmann   batman-adv: Prefi...
219
  	struct batadv_hard_iface *hard_iface;
bbb1f90ef   Sven Eckelmann   batman-adv: Don't...
220
  	struct delayed_work *delayed_work;
56303d34a   Sven Eckelmann   batman-adv: Prefi...
221
  	struct batadv_forw_packet *forw_packet;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
222
  	struct sk_buff *skb1;
56303d34a   Sven Eckelmann   batman-adv: Prefi...
223
224
  	struct net_device *soft_iface;
  	struct batadv_priv *bat_priv;
bbb1f90ef   Sven Eckelmann   batman-adv: Don't...
225
  	delayed_work = container_of(work, struct delayed_work, work);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
226
227
228
229
  	forw_packet = container_of(delayed_work, struct batadv_forw_packet,
  				   delayed_work);
  	soft_iface = forw_packet->if_incoming->soft_iface;
  	bat_priv = netdev_priv(soft_iface);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
230
231
232
233
  
  	spin_lock_bh(&bat_priv->forw_bcast_list_lock);
  	hlist_del(&forw_packet->list);
  	spin_unlock_bh(&bat_priv->forw_bcast_list_lock);
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
234
  	if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
235
  		goto out;
c384ea3ec   Antonio Quartulli   batman-adv: Distr...
236
237
  	if (batadv_dat_drop_broadcast_packet(bat_priv, forw_packet))
  		goto out;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
238
239
  	/* rebroadcast packet */
  	rcu_read_lock();
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
240
  	list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
e6c10f433   Marek Lindner   batman-adv: renam...
241
  		if (hard_iface->soft_iface != soft_iface)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
242
243
244
245
246
  			continue;
  
  		/* send a copy of the saved skb */
  		skb1 = skb_clone(forw_packet->skb, GFP_ATOMIC);
  		if (skb1)
9455e34cb   Sven Eckelmann   batman-adv: Prefi...
247
  			batadv_send_skb_packet(skb1, hard_iface,
3193e8fdf   Sven Eckelmann   batman-adv: Prefi...
248
  					       batadv_broadcast_addr);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
249
250
251
252
253
254
255
  	}
  	rcu_read_unlock();
  
  	forw_packet->num_packets++;
  
  	/* if we still have some more bcasts to send */
  	if (forw_packet->num_packets < 3) {
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
256
257
  		_batadv_add_bcast_packet_to_list(bat_priv, forw_packet,
  						 msecs_to_jiffies(5));
c6c8fea29   Sven Eckelmann   net: Add batman-a...
258
259
260
261
  		return;
  	}
  
  out:
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
262
  	batadv_forw_packet_free(forw_packet);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
263
264
  	atomic_inc(&bat_priv->bcast_queue_left);
  }
9455e34cb   Sven Eckelmann   batman-adv: Prefi...
265
  void batadv_send_outstanding_bat_ogm_packet(struct work_struct *work)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
266
  {
bbb1f90ef   Sven Eckelmann   batman-adv: Don't...
267
  	struct delayed_work *delayed_work;
56303d34a   Sven Eckelmann   batman-adv: Prefi...
268
269
  	struct batadv_forw_packet *forw_packet;
  	struct batadv_priv *bat_priv;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
270

bbb1f90ef   Sven Eckelmann   batman-adv: Don't...
271
  	delayed_work = container_of(work, struct delayed_work, work);
56303d34a   Sven Eckelmann   batman-adv: Prefi...
272
273
  	forw_packet = container_of(delayed_work, struct batadv_forw_packet,
  				   delayed_work);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
274
275
276
277
  	bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
  	spin_lock_bh(&bat_priv->forw_bat_list_lock);
  	hlist_del(&forw_packet->list);
  	spin_unlock_bh(&bat_priv->forw_bat_list_lock);
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
278
  	if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
279
  		goto out;
01c4224b5   Marek Lindner   batman-adv: conve...
280
  	bat_priv->bat_algo_ops->bat_ogm_emit(forw_packet);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
281

9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
282
  	/* we have to have at least one packet in the queue
c6c8fea29   Sven Eckelmann   net: Add batman-a...
283
284
285
286
  	 * to determine the queues wake up time unless we are
  	 * shutting down
  	 */
  	if (forw_packet->own)
9455e34cb   Sven Eckelmann   batman-adv: Prefi...
287
  		batadv_schedule_bat_ogm(forw_packet->if_incoming);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
288
289
290
291
292
  
  out:
  	/* don't count own packet */
  	if (!forw_packet->own)
  		atomic_inc(&bat_priv->batman_queue_left);
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
293
  	batadv_forw_packet_free(forw_packet);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
294
  }
56303d34a   Sven Eckelmann   batman-adv: Prefi...
295
296
297
  void
  batadv_purge_outstanding_packets(struct batadv_priv *bat_priv,
  				 const struct batadv_hard_iface *hard_iface)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
298
  {
56303d34a   Sven Eckelmann   batman-adv: Prefi...
299
  	struct batadv_forw_packet *forw_packet;
b67bfe0d4   Sasha Levin   hlist: drop the n...
300
  	struct hlist_node *safe_tmp_node;
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
301
  	bool pending;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
302

e6c10f433   Marek Lindner   batman-adv: renam...
303
  	if (hard_iface)
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
304
  		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
305
306
307
  			   "purge_outstanding_packets(): %s
  ",
  			   hard_iface->net_dev->name);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
308
  	else
39c75a51e   Sven Eckelmann   batman-adv: Prefi...
309
  		batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1eda58bfc   Sven Eckelmann   batman-adv: Prefi...
310
311
  			   "purge_outstanding_packets()
  ");
c6c8fea29   Sven Eckelmann   net: Add batman-a...
312
313
314
  
  	/* free bcast list */
  	spin_lock_bh(&bat_priv->forw_bcast_list_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
315
  	hlist_for_each_entry_safe(forw_packet, safe_tmp_node,
c6c8fea29   Sven Eckelmann   net: Add batman-a...
316
  				  &bat_priv->forw_bcast_list, list) {
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
317
  		/* if purge_outstanding_packets() was called with an argument
c6c8fea29   Sven Eckelmann   net: Add batman-a...
318
319
  		 * we delete only packets belonging to the given interface
  		 */
e6c10f433   Marek Lindner   batman-adv: renam...
320
321
  		if ((hard_iface) &&
  		    (forw_packet->if_incoming != hard_iface))
c6c8fea29   Sven Eckelmann   net: Add batman-a...
322
323
324
  			continue;
  
  		spin_unlock_bh(&bat_priv->forw_bcast_list_lock);
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
325
  		/* batadv_send_outstanding_bcast_packet() will lock the list to
c6c8fea29   Sven Eckelmann   net: Add batman-a...
326
327
  		 * delete the item from the list
  		 */
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
328
  		pending = cancel_delayed_work_sync(&forw_packet->delayed_work);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
329
  		spin_lock_bh(&bat_priv->forw_bcast_list_lock);
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
330
331
332
  
  		if (pending) {
  			hlist_del(&forw_packet->list);
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
333
  			batadv_forw_packet_free(forw_packet);
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
334
  		}
c6c8fea29   Sven Eckelmann   net: Add batman-a...
335
336
337
338
339
  	}
  	spin_unlock_bh(&bat_priv->forw_bcast_list_lock);
  
  	/* free batman packet list */
  	spin_lock_bh(&bat_priv->forw_bat_list_lock);
b67bfe0d4   Sasha Levin   hlist: drop the n...
340
  	hlist_for_each_entry_safe(forw_packet, safe_tmp_node,
c6c8fea29   Sven Eckelmann   net: Add batman-a...
341
  				  &bat_priv->forw_bat_list, list) {
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
342
  		/* if purge_outstanding_packets() was called with an argument
c6c8fea29   Sven Eckelmann   net: Add batman-a...
343
344
  		 * we delete only packets belonging to the given interface
  		 */
e6c10f433   Marek Lindner   batman-adv: renam...
345
346
  		if ((hard_iface) &&
  		    (forw_packet->if_incoming != hard_iface))
c6c8fea29   Sven Eckelmann   net: Add batman-a...
347
348
349
  			continue;
  
  		spin_unlock_bh(&bat_priv->forw_bat_list_lock);
9cfc7bd60   Sven Eckelmann   batman-adv: Refor...
350
  		/* send_outstanding_bat_packet() will lock the list to
c6c8fea29   Sven Eckelmann   net: Add batman-a...
351
352
  		 * delete the item from the list
  		 */
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
353
  		pending = cancel_delayed_work_sync(&forw_packet->delayed_work);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
354
  		spin_lock_bh(&bat_priv->forw_bat_list_lock);
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
355
356
357
  
  		if (pending) {
  			hlist_del(&forw_packet->list);
bb079c82e   Sven Eckelmann   batman-adv: Prefi...
358
  			batadv_forw_packet_free(forw_packet);
6d5808d4a   Sven Eckelmann   batman-adv: Add m...
359
  		}
c6c8fea29   Sven Eckelmann   net: Add batman-a...
360
361
362
  	}
  	spin_unlock_bh(&bat_priv->forw_bat_list_lock);
  }