]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - net/batman-adv/bat_iv_ogm.c
batman-adv: Keep includes ordered by filename
[mirror_ubuntu-bionic-kernel.git] / net / batman-adv / bat_iv_ogm.c
1 /* Copyright (C) 2007-2016 B.A.T.M.A.N. contributors:
2 *
3 * Marek Lindner, Simon Wunderlich
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 2 of the GNU General Public
7 * License as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, see <http://www.gnu.org/licenses/>.
16 */
17
18 #include "bat_algo.h"
19 #include "main.h"
20
21 #include <linux/atomic.h>
22 #include <linux/bitmap.h>
23 #include <linux/bitops.h>
24 #include <linux/bug.h>
25 #include <linux/byteorder/generic.h>
26 #include <linux/cache.h>
27 #include <linux/errno.h>
28 #include <linux/etherdevice.h>
29 #include <linux/fs.h>
30 #include <linux/if_ether.h>
31 #include <linux/init.h>
32 #include <linux/jiffies.h>
33 #include <linux/kernel.h>
34 #include <linux/kref.h>
35 #include <linux/list.h>
36 #include <linux/lockdep.h>
37 #include <linux/netdevice.h>
38 #include <linux/pkt_sched.h>
39 #include <linux/printk.h>
40 #include <linux/random.h>
41 #include <linux/rculist.h>
42 #include <linux/rcupdate.h>
43 #include <linux/seq_file.h>
44 #include <linux/skbuff.h>
45 #include <linux/slab.h>
46 #include <linux/spinlock.h>
47 #include <linux/stddef.h>
48 #include <linux/string.h>
49 #include <linux/types.h>
50 #include <linux/workqueue.h>
51
52 #include "bitarray.h"
53 #include "hard-interface.h"
54 #include "hash.h"
55 #include "network-coding.h"
56 #include "originator.h"
57 #include "packet.h"
58 #include "routing.h"
59 #include "send.h"
60 #include "translation-table.h"
61
62 static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work);
63
64 /**
65 * enum batadv_dup_status - duplicate status
66 * @BATADV_NO_DUP: the packet is no duplicate
67 * @BATADV_ORIG_DUP: OGM is a duplicate in the originator (but not for the
68 * neighbor)
69 * @BATADV_NEIGH_DUP: OGM is a duplicate for the neighbor
70 * @BATADV_PROTECTED: originator is currently protected (after reboot)
71 */
72 enum batadv_dup_status {
73 BATADV_NO_DUP = 0,
74 BATADV_ORIG_DUP,
75 BATADV_NEIGH_DUP,
76 BATADV_PROTECTED,
77 };
78
79 /**
80 * batadv_ring_buffer_set - update the ring buffer with the given value
81 * @lq_recv: pointer to the ring buffer
82 * @lq_index: index to store the value at
83 * @value: value to store in the ring buffer
84 */
85 static void batadv_ring_buffer_set(u8 lq_recv[], u8 *lq_index, u8 value)
86 {
87 lq_recv[*lq_index] = value;
88 *lq_index = (*lq_index + 1) % BATADV_TQ_GLOBAL_WINDOW_SIZE;
89 }
90
91 /**
92 * batadv_ring_buffer_avg - compute the average of all non-zero values stored
93 * in the given ring buffer
94 * @lq_recv: pointer to the ring buffer
95 *
96 * Return: computed average value.
97 */
98 static u8 batadv_ring_buffer_avg(const u8 lq_recv[])
99 {
100 const u8 *ptr;
101 u16 count = 0;
102 u16 i = 0;
103 u16 sum = 0;
104
105 ptr = lq_recv;
106
107 while (i < BATADV_TQ_GLOBAL_WINDOW_SIZE) {
108 if (*ptr != 0) {
109 count++;
110 sum += *ptr;
111 }
112
113 i++;
114 ptr++;
115 }
116
117 if (count == 0)
118 return 0;
119
120 return (u8)(sum / count);
121 }
122
123 /**
124 * batadv_iv_ogm_orig_free - free the private resources allocated for this
125 * orig_node
126 * @orig_node: the orig_node for which the resources have to be free'd
127 */
128 static void batadv_iv_ogm_orig_free(struct batadv_orig_node *orig_node)
129 {
130 kfree(orig_node->bat_iv.bcast_own);
131 kfree(orig_node->bat_iv.bcast_own_sum);
132 }
133
134 /**
135 * batadv_iv_ogm_orig_add_if - change the private structures of the orig_node to
136 * include the new hard-interface
137 * @orig_node: the orig_node that has to be changed
138 * @max_if_num: the current amount of interfaces
139 *
140 * Return: 0 on success, a negative error code otherwise.
141 */
142 static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node,
143 int max_if_num)
144 {
145 void *data_ptr;
146 size_t old_size;
147 int ret = -ENOMEM;
148
149 spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
150
151 old_size = (max_if_num - 1) * sizeof(unsigned long) * BATADV_NUM_WORDS;
152 data_ptr = kmalloc_array(max_if_num,
153 BATADV_NUM_WORDS * sizeof(unsigned long),
154 GFP_ATOMIC);
155 if (!data_ptr)
156 goto unlock;
157
158 memcpy(data_ptr, orig_node->bat_iv.bcast_own, old_size);
159 kfree(orig_node->bat_iv.bcast_own);
160 orig_node->bat_iv.bcast_own = data_ptr;
161
162 data_ptr = kmalloc_array(max_if_num, sizeof(u8), GFP_ATOMIC);
163 if (!data_ptr)
164 goto unlock;
165
166 memcpy(data_ptr, orig_node->bat_iv.bcast_own_sum,
167 (max_if_num - 1) * sizeof(u8));
168 kfree(orig_node->bat_iv.bcast_own_sum);
169 orig_node->bat_iv.bcast_own_sum = data_ptr;
170
171 ret = 0;
172
173 unlock:
174 spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
175
176 return ret;
177 }
178
179 /**
180 * batadv_iv_ogm_drop_bcast_own_entry - drop section of bcast_own
181 * @orig_node: the orig_node that has to be changed
182 * @max_if_num: the current amount of interfaces
183 * @del_if_num: the index of the interface being removed
184 */
185 static void
186 batadv_iv_ogm_drop_bcast_own_entry(struct batadv_orig_node *orig_node,
187 int max_if_num, int del_if_num)
188 {
189 size_t chunk_size;
190 size_t if_offset;
191 void *data_ptr;
192
193 lockdep_assert_held(&orig_node->bat_iv.ogm_cnt_lock);
194
195 chunk_size = sizeof(unsigned long) * BATADV_NUM_WORDS;
196 data_ptr = kmalloc_array(max_if_num, chunk_size, GFP_ATOMIC);
197 if (!data_ptr)
198 /* use old buffer when new one could not be allocated */
199 data_ptr = orig_node->bat_iv.bcast_own;
200
201 /* copy first part */
202 memmove(data_ptr, orig_node->bat_iv.bcast_own, del_if_num * chunk_size);
203
204 /* copy second part */
205 if_offset = (del_if_num + 1) * chunk_size;
206 memmove((char *)data_ptr + del_if_num * chunk_size,
207 (uint8_t *)orig_node->bat_iv.bcast_own + if_offset,
208 (max_if_num - del_if_num) * chunk_size);
209
210 /* bcast_own was shrunk down in new buffer; free old one */
211 if (orig_node->bat_iv.bcast_own != data_ptr) {
212 kfree(orig_node->bat_iv.bcast_own);
213 orig_node->bat_iv.bcast_own = data_ptr;
214 }
215 }
216
217 /**
218 * batadv_iv_ogm_drop_bcast_own_sum_entry - drop section of bcast_own_sum
219 * @orig_node: the orig_node that has to be changed
220 * @max_if_num: the current amount of interfaces
221 * @del_if_num: the index of the interface being removed
222 */
223 static void
224 batadv_iv_ogm_drop_bcast_own_sum_entry(struct batadv_orig_node *orig_node,
225 int max_if_num, int del_if_num)
226 {
227 size_t if_offset;
228 void *data_ptr;
229
230 lockdep_assert_held(&orig_node->bat_iv.ogm_cnt_lock);
231
232 data_ptr = kmalloc_array(max_if_num, sizeof(u8), GFP_ATOMIC);
233 if (!data_ptr)
234 /* use old buffer when new one could not be allocated */
235 data_ptr = orig_node->bat_iv.bcast_own_sum;
236
237 memmove(data_ptr, orig_node->bat_iv.bcast_own_sum,
238 del_if_num * sizeof(u8));
239
240 if_offset = (del_if_num + 1) * sizeof(u8);
241 memmove((char *)data_ptr + del_if_num * sizeof(u8),
242 orig_node->bat_iv.bcast_own_sum + if_offset,
243 (max_if_num - del_if_num) * sizeof(u8));
244
245 /* bcast_own_sum was shrunk down in new buffer; free old one */
246 if (orig_node->bat_iv.bcast_own_sum != data_ptr) {
247 kfree(orig_node->bat_iv.bcast_own_sum);
248 orig_node->bat_iv.bcast_own_sum = data_ptr;
249 }
250 }
251
252 /**
253 * batadv_iv_ogm_orig_del_if - change the private structures of the orig_node to
254 * exclude the removed interface
255 * @orig_node: the orig_node that has to be changed
256 * @max_if_num: the current amount of interfaces
257 * @del_if_num: the index of the interface being removed
258 *
259 * Return: 0 on success, a negative error code otherwise.
260 */
261 static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node,
262 int max_if_num, int del_if_num)
263 {
264 spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
265
266 if (max_if_num == 0) {
267 kfree(orig_node->bat_iv.bcast_own);
268 kfree(orig_node->bat_iv.bcast_own_sum);
269 orig_node->bat_iv.bcast_own = NULL;
270 orig_node->bat_iv.bcast_own_sum = NULL;
271 } else {
272 batadv_iv_ogm_drop_bcast_own_entry(orig_node, max_if_num,
273 del_if_num);
274 batadv_iv_ogm_drop_bcast_own_sum_entry(orig_node, max_if_num,
275 del_if_num);
276 }
277
278 spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
279
280 return 0;
281 }
282
283 /**
284 * batadv_iv_ogm_orig_get - retrieve or create (if does not exist) an originator
285 * @bat_priv: the bat priv with all the soft interface information
286 * @addr: mac address of the originator
287 *
288 * Return: the originator object corresponding to the passed mac address or NULL
289 * on failure.
290 * If the object does not exists it is created an initialised.
291 */
292 static struct batadv_orig_node *
293 batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
294 {
295 struct batadv_orig_node *orig_node;
296 int size, hash_added;
297
298 orig_node = batadv_orig_hash_find(bat_priv, addr);
299 if (orig_node)
300 return orig_node;
301
302 orig_node = batadv_orig_node_new(bat_priv, addr);
303 if (!orig_node)
304 return NULL;
305
306 spin_lock_init(&orig_node->bat_iv.ogm_cnt_lock);
307
308 size = bat_priv->num_ifaces * sizeof(unsigned long) * BATADV_NUM_WORDS;
309 orig_node->bat_iv.bcast_own = kzalloc(size, GFP_ATOMIC);
310 if (!orig_node->bat_iv.bcast_own)
311 goto free_orig_node;
312
313 size = bat_priv->num_ifaces * sizeof(u8);
314 orig_node->bat_iv.bcast_own_sum = kzalloc(size, GFP_ATOMIC);
315 if (!orig_node->bat_iv.bcast_own_sum)
316 goto free_orig_node;
317
318 hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig,
319 batadv_choose_orig, orig_node,
320 &orig_node->hash_entry);
321 if (hash_added != 0)
322 goto free_orig_node;
323
324 return orig_node;
325
326 free_orig_node:
327 /* free twice, as batadv_orig_node_new sets refcount to 2 */
328 batadv_orig_node_put(orig_node);
329 batadv_orig_node_put(orig_node);
330
331 return NULL;
332 }
333
334 static struct batadv_neigh_node *
335 batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,
336 const u8 *neigh_addr,
337 struct batadv_orig_node *orig_node,
338 struct batadv_orig_node *orig_neigh)
339 {
340 struct batadv_neigh_node *neigh_node;
341
342 neigh_node = batadv_neigh_node_get_or_create(orig_node,
343 hard_iface, neigh_addr);
344 if (!neigh_node)
345 goto out;
346
347 neigh_node->orig_node = orig_neigh;
348
349 out:
350 return neigh_node;
351 }
352
353 static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
354 {
355 struct batadv_ogm_packet *batadv_ogm_packet;
356 unsigned char *ogm_buff;
357 u32 random_seqno;
358
359 /* randomize initial seqno to avoid collision */
360 get_random_bytes(&random_seqno, sizeof(random_seqno));
361 atomic_set(&hard_iface->bat_iv.ogm_seqno, random_seqno);
362
363 hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN;
364 ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC);
365 if (!ogm_buff)
366 return -ENOMEM;
367
368 hard_iface->bat_iv.ogm_buff = ogm_buff;
369
370 batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
371 batadv_ogm_packet->packet_type = BATADV_IV_OGM;
372 batadv_ogm_packet->version = BATADV_COMPAT_VERSION;
373 batadv_ogm_packet->ttl = 2;
374 batadv_ogm_packet->flags = BATADV_NO_FLAGS;
375 batadv_ogm_packet->reserved = 0;
376 batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
377
378 return 0;
379 }
380
381 static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
382 {
383 kfree(hard_iface->bat_iv.ogm_buff);
384 hard_iface->bat_iv.ogm_buff = NULL;
385 }
386
387 static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface)
388 {
389 struct batadv_ogm_packet *batadv_ogm_packet;
390 unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
391
392 batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
393 ether_addr_copy(batadv_ogm_packet->orig,
394 hard_iface->net_dev->dev_addr);
395 ether_addr_copy(batadv_ogm_packet->prev_sender,
396 hard_iface->net_dev->dev_addr);
397 }
398
399 static void
400 batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface)
401 {
402 struct batadv_ogm_packet *batadv_ogm_packet;
403 unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
404
405 batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
406 batadv_ogm_packet->ttl = BATADV_TTL;
407 }
408
409 /* when do we schedule our own ogm to be sent */
410 static unsigned long
411 batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv)
412 {
413 unsigned int msecs;
414
415 msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
416 msecs += prandom_u32() % (2 * BATADV_JITTER);
417
418 return jiffies + msecs_to_jiffies(msecs);
419 }
420
421 /* when do we schedule a ogm packet to be sent */
422 static unsigned long batadv_iv_ogm_fwd_send_time(void)
423 {
424 return jiffies + msecs_to_jiffies(prandom_u32() % (BATADV_JITTER / 2));
425 }
426
427 /* apply hop penalty for a normal link */
428 static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv)
429 {
430 int hop_penalty = atomic_read(&bat_priv->hop_penalty);
431 int new_tq;
432
433 new_tq = tq * (BATADV_TQ_MAX_VALUE - hop_penalty);
434 new_tq /= BATADV_TQ_MAX_VALUE;
435
436 return new_tq;
437 }
438
439 /**
440 * batadv_iv_ogm_aggr_packet - checks if there is another OGM attached
441 * @buff_pos: current position in the skb
442 * @packet_len: total length of the skb
443 * @tvlv_len: tvlv length of the previously considered OGM
444 *
445 * Return: true if there is enough space for another OGM, false otherwise.
446 */
447 static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
448 __be16 tvlv_len)
449 {
450 int next_buff_pos = 0;
451
452 next_buff_pos += buff_pos + BATADV_OGM_HLEN;
453 next_buff_pos += ntohs(tvlv_len);
454
455 return (next_buff_pos <= packet_len) &&
456 (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
457 }
458
459 /* send a batman ogm to a given interface */
460 static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
461 struct batadv_hard_iface *hard_iface)
462 {
463 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
464 const char *fwd_str;
465 u8 packet_num;
466 s16 buff_pos;
467 struct batadv_ogm_packet *batadv_ogm_packet;
468 struct sk_buff *skb;
469 u8 *packet_pos;
470
471 if (hard_iface->if_status != BATADV_IF_ACTIVE)
472 return;
473
474 packet_num = 0;
475 buff_pos = 0;
476 packet_pos = forw_packet->skb->data;
477 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
478
479 /* adjust all flags and log packets */
480 while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
481 batadv_ogm_packet->tvlv_len)) {
482 /* we might have aggregated direct link packets with an
483 * ordinary base packet
484 */
485 if (forw_packet->direct_link_flags & BIT(packet_num) &&
486 forw_packet->if_incoming == hard_iface)
487 batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
488 else
489 batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
490
491 if (packet_num > 0 || !forw_packet->own)
492 fwd_str = "Forwarding";
493 else
494 fwd_str = "Sending own";
495
496 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
497 "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s) on interface %s [%pM]\n",
498 fwd_str, (packet_num > 0 ? "aggregated " : ""),
499 batadv_ogm_packet->orig,
500 ntohl(batadv_ogm_packet->seqno),
501 batadv_ogm_packet->tq, batadv_ogm_packet->ttl,
502 ((batadv_ogm_packet->flags & BATADV_DIRECTLINK) ?
503 "on" : "off"),
504 hard_iface->net_dev->name,
505 hard_iface->net_dev->dev_addr);
506
507 buff_pos += BATADV_OGM_HLEN;
508 buff_pos += ntohs(batadv_ogm_packet->tvlv_len);
509 packet_num++;
510 packet_pos = forw_packet->skb->data + buff_pos;
511 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
512 }
513
514 /* create clone because function is called more than once */
515 skb = skb_clone(forw_packet->skb, GFP_ATOMIC);
516 if (skb) {
517 batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX);
518 batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES,
519 skb->len + ETH_HLEN);
520 batadv_send_broadcast_skb(skb, hard_iface);
521 }
522 }
523
524 /* send a batman ogm packet */
525 static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
526 {
527 struct net_device *soft_iface;
528 struct batadv_priv *bat_priv;
529 struct batadv_hard_iface *primary_if = NULL;
530
531 if (!forw_packet->if_incoming) {
532 pr_err("Error - can't forward packet: incoming iface not specified\n");
533 goto out;
534 }
535
536 soft_iface = forw_packet->if_incoming->soft_iface;
537 bat_priv = netdev_priv(soft_iface);
538
539 if (WARN_ON(!forw_packet->if_outgoing))
540 goto out;
541
542 if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface))
543 goto out;
544
545 if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE)
546 goto out;
547
548 primary_if = batadv_primary_if_get_selected(bat_priv);
549 if (!primary_if)
550 goto out;
551
552 /* only for one specific outgoing interface */
553 batadv_iv_ogm_send_to_if(forw_packet, forw_packet->if_outgoing);
554
555 out:
556 if (primary_if)
557 batadv_hardif_put(primary_if);
558 }
559
560 /**
561 * batadv_iv_ogm_can_aggregate - find out if an OGM can be aggregated on an
562 * existing forward packet
563 * @new_bat_ogm_packet: OGM packet to be aggregated
564 * @bat_priv: the bat priv with all the soft interface information
565 * @packet_len: (total) length of the OGM
566 * @send_time: timestamp (jiffies) when the packet is to be sent
567 * @directlink: true if this is a direct link packet
568 * @if_incoming: interface where the packet was received
569 * @if_outgoing: interface for which the retransmission should be considered
570 * @forw_packet: the forwarded packet which should be checked
571 *
572 * Return: true if new_packet can be aggregated with forw_packet
573 */
574 static bool
575 batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
576 struct batadv_priv *bat_priv,
577 int packet_len, unsigned long send_time,
578 bool directlink,
579 const struct batadv_hard_iface *if_incoming,
580 const struct batadv_hard_iface *if_outgoing,
581 const struct batadv_forw_packet *forw_packet)
582 {
583 struct batadv_ogm_packet *batadv_ogm_packet;
584 int aggregated_bytes = forw_packet->packet_len + packet_len;
585 struct batadv_hard_iface *primary_if = NULL;
586 bool res = false;
587 unsigned long aggregation_end_time;
588
589 batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data;
590 aggregation_end_time = send_time;
591 aggregation_end_time += msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
592
593 /* we can aggregate the current packet to this aggregated packet
594 * if:
595 *
596 * - the send time is within our MAX_AGGREGATION_MS time
597 * - the resulting packet wont be bigger than
598 * MAX_AGGREGATION_BYTES
599 * otherwise aggregation is not possible
600 */
601 if (!time_before(send_time, forw_packet->send_time) ||
602 !time_after_eq(aggregation_end_time, forw_packet->send_time))
603 return false;
604
605 if (aggregated_bytes > BATADV_MAX_AGGREGATION_BYTES)
606 return false;
607
608 /* packet is not leaving on the same interface. */
609 if (forw_packet->if_outgoing != if_outgoing)
610 return false;
611
612 /* check aggregation compatibility
613 * -> direct link packets are broadcasted on
614 * their interface only
615 * -> aggregate packet if the current packet is
616 * a "global" packet as well as the base
617 * packet
618 */
619 primary_if = batadv_primary_if_get_selected(bat_priv);
620 if (!primary_if)
621 return false;
622
623 /* packets without direct link flag and high TTL
624 * are flooded through the net
625 */
626 if (!directlink &&
627 !(batadv_ogm_packet->flags & BATADV_DIRECTLINK) &&
628 batadv_ogm_packet->ttl != 1 &&
629
630 /* own packets originating non-primary
631 * interfaces leave only that interface
632 */
633 (!forw_packet->own ||
634 forw_packet->if_incoming == primary_if)) {
635 res = true;
636 goto out;
637 }
638
639 /* if the incoming packet is sent via this one
640 * interface only - we still can aggregate
641 */
642 if (directlink &&
643 new_bat_ogm_packet->ttl == 1 &&
644 forw_packet->if_incoming == if_incoming &&
645
646 /* packets from direct neighbors or
647 * own secondary interface packets
648 * (= secondary interface packets in general)
649 */
650 (batadv_ogm_packet->flags & BATADV_DIRECTLINK ||
651 (forw_packet->own &&
652 forw_packet->if_incoming != primary_if))) {
653 res = true;
654 goto out;
655 }
656
657 out:
658 if (primary_if)
659 batadv_hardif_put(primary_if);
660 return res;
661 }
662
663 /**
664 * batadv_iv_ogm_aggregate_new - create a new aggregated packet and add this
665 * packet to it.
666 * @packet_buff: pointer to the OGM
667 * @packet_len: (total) length of the OGM
668 * @send_time: timestamp (jiffies) when the packet is to be sent
669 * @direct_link: whether this OGM has direct link status
670 * @if_incoming: interface where the packet was received
671 * @if_outgoing: interface for which the retransmission should be considered
672 * @own_packet: true if it is a self-generated ogm
673 */
674 static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
675 int packet_len, unsigned long send_time,
676 bool direct_link,
677 struct batadv_hard_iface *if_incoming,
678 struct batadv_hard_iface *if_outgoing,
679 int own_packet)
680 {
681 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
682 struct batadv_forw_packet *forw_packet_aggr;
683 unsigned char *skb_buff;
684 unsigned int skb_size;
685
686 /* own packet should always be scheduled */
687 if (!own_packet) {
688 if (!batadv_atomic_dec_not_zero(&bat_priv->batman_queue_left)) {
689 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
690 "batman packet queue full\n");
691 return;
692 }
693 }
694
695 forw_packet_aggr = kmalloc(sizeof(*forw_packet_aggr), GFP_ATOMIC);
696 if (!forw_packet_aggr)
697 goto out_nomem;
698
699 if (atomic_read(&bat_priv->aggregated_ogms) &&
700 packet_len < BATADV_MAX_AGGREGATION_BYTES)
701 skb_size = BATADV_MAX_AGGREGATION_BYTES;
702 else
703 skb_size = packet_len;
704
705 skb_size += ETH_HLEN;
706
707 forw_packet_aggr->skb = netdev_alloc_skb_ip_align(NULL, skb_size);
708 if (!forw_packet_aggr->skb)
709 goto out_free_forw_packet;
710 forw_packet_aggr->skb->priority = TC_PRIO_CONTROL;
711 skb_reserve(forw_packet_aggr->skb, ETH_HLEN);
712
713 skb_buff = skb_put(forw_packet_aggr->skb, packet_len);
714 forw_packet_aggr->packet_len = packet_len;
715 memcpy(skb_buff, packet_buff, packet_len);
716
717 kref_get(&if_incoming->refcount);
718 kref_get(&if_outgoing->refcount);
719 forw_packet_aggr->own = own_packet;
720 forw_packet_aggr->if_incoming = if_incoming;
721 forw_packet_aggr->if_outgoing = if_outgoing;
722 forw_packet_aggr->num_packets = 0;
723 forw_packet_aggr->direct_link_flags = BATADV_NO_FLAGS;
724 forw_packet_aggr->send_time = send_time;
725
726 /* save packet direct link flag status */
727 if (direct_link)
728 forw_packet_aggr->direct_link_flags |= 1;
729
730 /* add new packet to packet list */
731 spin_lock_bh(&bat_priv->forw_bat_list_lock);
732 hlist_add_head(&forw_packet_aggr->list, &bat_priv->forw_bat_list);
733 spin_unlock_bh(&bat_priv->forw_bat_list_lock);
734
735 /* start timer for this packet */
736 INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work,
737 batadv_iv_send_outstanding_bat_ogm_packet);
738 queue_delayed_work(batadv_event_workqueue,
739 &forw_packet_aggr->delayed_work,
740 send_time - jiffies);
741
742 return;
743 out_free_forw_packet:
744 kfree(forw_packet_aggr);
745 out_nomem:
746 if (!own_packet)
747 atomic_inc(&bat_priv->batman_queue_left);
748 }
749
750 /* aggregate a new packet into the existing ogm packet */
751 static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr,
752 const unsigned char *packet_buff,
753 int packet_len, bool direct_link)
754 {
755 unsigned char *skb_buff;
756 unsigned long new_direct_link_flag;
757
758 skb_buff = skb_put(forw_packet_aggr->skb, packet_len);
759 memcpy(skb_buff, packet_buff, packet_len);
760 forw_packet_aggr->packet_len += packet_len;
761 forw_packet_aggr->num_packets++;
762
763 /* save packet direct link flag status */
764 if (direct_link) {
765 new_direct_link_flag = BIT(forw_packet_aggr->num_packets);
766 forw_packet_aggr->direct_link_flags |= new_direct_link_flag;
767 }
768 }
769
770 /**
771 * batadv_iv_ogm_queue_add - queue up an OGM for transmission
772 * @bat_priv: the bat priv with all the soft interface information
773 * @packet_buff: pointer to the OGM
774 * @packet_len: (total) length of the OGM
775 * @if_incoming: interface where the packet was received
776 * @if_outgoing: interface for which the retransmission should be considered
777 * @own_packet: true if it is a self-generated ogm
778 * @send_time: timestamp (jiffies) when the packet is to be sent
779 */
780 static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv,
781 unsigned char *packet_buff,
782 int packet_len,
783 struct batadv_hard_iface *if_incoming,
784 struct batadv_hard_iface *if_outgoing,
785 int own_packet, unsigned long send_time)
786 {
787 /* _aggr -> pointer to the packet we want to aggregate with
788 * _pos -> pointer to the position in the queue
789 */
790 struct batadv_forw_packet *forw_packet_aggr = NULL;
791 struct batadv_forw_packet *forw_packet_pos = NULL;
792 struct batadv_ogm_packet *batadv_ogm_packet;
793 bool direct_link;
794 unsigned long max_aggregation_jiffies;
795
796 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff;
797 direct_link = !!(batadv_ogm_packet->flags & BATADV_DIRECTLINK);
798 max_aggregation_jiffies = msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
799
800 /* find position for the packet in the forward queue */
801 spin_lock_bh(&bat_priv->forw_bat_list_lock);
802 /* own packets are not to be aggregated */
803 if (atomic_read(&bat_priv->aggregated_ogms) && !own_packet) {
804 hlist_for_each_entry(forw_packet_pos,
805 &bat_priv->forw_bat_list, list) {
806 if (batadv_iv_ogm_can_aggregate(batadv_ogm_packet,
807 bat_priv, packet_len,
808 send_time, direct_link,
809 if_incoming,
810 if_outgoing,
811 forw_packet_pos)) {
812 forw_packet_aggr = forw_packet_pos;
813 break;
814 }
815 }
816 }
817
818 /* nothing to aggregate with - either aggregation disabled or no
819 * suitable aggregation packet found
820 */
821 if (!forw_packet_aggr) {
822 /* the following section can run without the lock */
823 spin_unlock_bh(&bat_priv->forw_bat_list_lock);
824
825 /* if we could not aggregate this packet with one of the others
826 * we hold it back for a while, so that it might be aggregated
827 * later on
828 */
829 if (!own_packet && atomic_read(&bat_priv->aggregated_ogms))
830 send_time += max_aggregation_jiffies;
831
832 batadv_iv_ogm_aggregate_new(packet_buff, packet_len,
833 send_time, direct_link,
834 if_incoming, if_outgoing,
835 own_packet);
836 } else {
837 batadv_iv_ogm_aggregate(forw_packet_aggr, packet_buff,
838 packet_len, direct_link);
839 spin_unlock_bh(&bat_priv->forw_bat_list_lock);
840 }
841 }
842
843 static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
844 const struct ethhdr *ethhdr,
845 struct batadv_ogm_packet *batadv_ogm_packet,
846 bool is_single_hop_neigh,
847 bool is_from_best_next_hop,
848 struct batadv_hard_iface *if_incoming,
849 struct batadv_hard_iface *if_outgoing)
850 {
851 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
852 u16 tvlv_len;
853
854 if (batadv_ogm_packet->ttl <= 1) {
855 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n");
856 return;
857 }
858
859 if (!is_from_best_next_hop) {
860 /* Mark the forwarded packet when it is not coming from our
861 * best next hop. We still need to forward the packet for our
862 * neighbor link quality detection to work in case the packet
863 * originated from a single hop neighbor. Otherwise we can
864 * simply drop the ogm.
865 */
866 if (is_single_hop_neigh)
867 batadv_ogm_packet->flags |= BATADV_NOT_BEST_NEXT_HOP;
868 else
869 return;
870 }
871
872 tvlv_len = ntohs(batadv_ogm_packet->tvlv_len);
873
874 batadv_ogm_packet->ttl--;
875 ether_addr_copy(batadv_ogm_packet->prev_sender, ethhdr->h_source);
876
877 /* apply hop penalty */
878 batadv_ogm_packet->tq = batadv_hop_penalty(batadv_ogm_packet->tq,
879 bat_priv);
880
881 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
882 "Forwarding packet: tq: %i, ttl: %i\n",
883 batadv_ogm_packet->tq, batadv_ogm_packet->ttl);
884
885 if (is_single_hop_neigh)
886 batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
887 else
888 batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
889
890 batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet,
891 BATADV_OGM_HLEN + tvlv_len,
892 if_incoming, if_outgoing, 0,
893 batadv_iv_ogm_fwd_send_time());
894 }
895
896 /**
897 * batadv_iv_ogm_slide_own_bcast_window - bitshift own OGM broadcast windows for
898 * the given interface
899 * @hard_iface: the interface for which the windows have to be shifted
900 */
901 static void
902 batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
903 {
904 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
905 struct batadv_hashtable *hash = bat_priv->orig_hash;
906 struct hlist_head *head;
907 struct batadv_orig_node *orig_node;
908 unsigned long *word;
909 u32 i;
910 size_t word_index;
911 u8 *w;
912 int if_num;
913
914 for (i = 0; i < hash->size; i++) {
915 head = &hash->table[i];
916
917 rcu_read_lock();
918 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
919 spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
920 word_index = hard_iface->if_num * BATADV_NUM_WORDS;
921 word = &orig_node->bat_iv.bcast_own[word_index];
922
923 batadv_bit_get_packet(bat_priv, word, 1, 0);
924 if_num = hard_iface->if_num;
925 w = &orig_node->bat_iv.bcast_own_sum[if_num];
926 *w = bitmap_weight(word, BATADV_TQ_LOCAL_WINDOW_SIZE);
927 spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
928 }
929 rcu_read_unlock();
930 }
931 }
932
933 static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
934 {
935 struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
936 unsigned char **ogm_buff = &hard_iface->bat_iv.ogm_buff;
937 struct batadv_ogm_packet *batadv_ogm_packet;
938 struct batadv_hard_iface *primary_if, *tmp_hard_iface;
939 int *ogm_buff_len = &hard_iface->bat_iv.ogm_buff_len;
940 u32 seqno;
941 u16 tvlv_len = 0;
942 unsigned long send_time;
943
944 if ((hard_iface->if_status == BATADV_IF_NOT_IN_USE) ||
945 (hard_iface->if_status == BATADV_IF_TO_BE_REMOVED))
946 return;
947
948 /* the interface gets activated here to avoid race conditions between
949 * the moment of activating the interface in
950 * hardif_activate_interface() where the originator mac is set and
951 * outdated packets (especially uninitialized mac addresses) in the
952 * packet queue
953 */
954 if (hard_iface->if_status == BATADV_IF_TO_BE_ACTIVATED)
955 hard_iface->if_status = BATADV_IF_ACTIVE;
956
957 primary_if = batadv_primary_if_get_selected(bat_priv);
958
959 if (hard_iface == primary_if) {
960 /* tt changes have to be committed before the tvlv data is
961 * appended as it may alter the tt tvlv container
962 */
963 batadv_tt_local_commit_changes(bat_priv);
964 tvlv_len = batadv_tvlv_container_ogm_append(bat_priv, ogm_buff,
965 ogm_buff_len,
966 BATADV_OGM_HLEN);
967 }
968
969 batadv_ogm_packet = (struct batadv_ogm_packet *)(*ogm_buff);
970 batadv_ogm_packet->tvlv_len = htons(tvlv_len);
971
972 /* change sequence number to network order */
973 seqno = (u32)atomic_read(&hard_iface->bat_iv.ogm_seqno);
974 batadv_ogm_packet->seqno = htonl(seqno);
975 atomic_inc(&hard_iface->bat_iv.ogm_seqno);
976
977 batadv_iv_ogm_slide_own_bcast_window(hard_iface);
978
979 send_time = batadv_iv_ogm_emit_send_time(bat_priv);
980
981 if (hard_iface != primary_if) {
982 /* OGMs from secondary interfaces are only scheduled on their
983 * respective interfaces.
984 */
985 batadv_iv_ogm_queue_add(bat_priv, *ogm_buff, *ogm_buff_len,
986 hard_iface, hard_iface, 1, send_time);
987 goto out;
988 }
989
990 /* OGMs from primary interfaces are scheduled on all
991 * interfaces.
992 */
993 rcu_read_lock();
994 list_for_each_entry_rcu(tmp_hard_iface, &batadv_hardif_list, list) {
995 if (tmp_hard_iface->soft_iface != hard_iface->soft_iface)
996 continue;
997
998 if (!kref_get_unless_zero(&tmp_hard_iface->refcount))
999 continue;
1000
1001 batadv_iv_ogm_queue_add(bat_priv, *ogm_buff,
1002 *ogm_buff_len, hard_iface,
1003 tmp_hard_iface, 1, send_time);
1004
1005 batadv_hardif_put(tmp_hard_iface);
1006 }
1007 rcu_read_unlock();
1008
1009 out:
1010 if (primary_if)
1011 batadv_hardif_put(primary_if);
1012 }
1013
1014 /**
1015 * batadv_iv_ogm_orig_update - use OGM to update corresponding data in an
1016 * originator
1017 * @bat_priv: the bat priv with all the soft interface information
1018 * @orig_node: the orig node who originally emitted the ogm packet
1019 * @orig_ifinfo: ifinfo for the outgoing interface of the orig_node
1020 * @ethhdr: Ethernet header of the OGM
1021 * @batadv_ogm_packet: the ogm packet
1022 * @if_incoming: interface where the packet was received
1023 * @if_outgoing: interface for which the retransmission should be considered
1024 * @dup_status: the duplicate status of this ogm packet.
1025 */
1026 static void
1027 batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
1028 struct batadv_orig_node *orig_node,
1029 struct batadv_orig_ifinfo *orig_ifinfo,
1030 const struct ethhdr *ethhdr,
1031 const struct batadv_ogm_packet *batadv_ogm_packet,
1032 struct batadv_hard_iface *if_incoming,
1033 struct batadv_hard_iface *if_outgoing,
1034 enum batadv_dup_status dup_status)
1035 {
1036 struct batadv_neigh_ifinfo *neigh_ifinfo = NULL;
1037 struct batadv_neigh_ifinfo *router_ifinfo = NULL;
1038 struct batadv_neigh_node *neigh_node = NULL;
1039 struct batadv_neigh_node *tmp_neigh_node = NULL;
1040 struct batadv_neigh_node *router = NULL;
1041 struct batadv_orig_node *orig_node_tmp;
1042 int if_num;
1043 u8 sum_orig, sum_neigh;
1044 u8 *neigh_addr;
1045 u8 tq_avg;
1046
1047 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1048 "update_originator(): Searching and updating originator entry of received packet\n");
1049
1050 rcu_read_lock();
1051 hlist_for_each_entry_rcu(tmp_neigh_node,
1052 &orig_node->neigh_list, list) {
1053 neigh_addr = tmp_neigh_node->addr;
1054 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
1055 tmp_neigh_node->if_incoming == if_incoming &&
1056 kref_get_unless_zero(&tmp_neigh_node->refcount)) {
1057 if (WARN(neigh_node, "too many matching neigh_nodes"))
1058 batadv_neigh_node_put(neigh_node);
1059 neigh_node = tmp_neigh_node;
1060 continue;
1061 }
1062
1063 if (dup_status != BATADV_NO_DUP)
1064 continue;
1065
1066 /* only update the entry for this outgoing interface */
1067 neigh_ifinfo = batadv_neigh_ifinfo_get(tmp_neigh_node,
1068 if_outgoing);
1069 if (!neigh_ifinfo)
1070 continue;
1071
1072 spin_lock_bh(&tmp_neigh_node->ifinfo_lock);
1073 batadv_ring_buffer_set(neigh_ifinfo->bat_iv.tq_recv,
1074 &neigh_ifinfo->bat_iv.tq_index, 0);
1075 tq_avg = batadv_ring_buffer_avg(neigh_ifinfo->bat_iv.tq_recv);
1076 neigh_ifinfo->bat_iv.tq_avg = tq_avg;
1077 spin_unlock_bh(&tmp_neigh_node->ifinfo_lock);
1078
1079 batadv_neigh_ifinfo_put(neigh_ifinfo);
1080 neigh_ifinfo = NULL;
1081 }
1082
1083 if (!neigh_node) {
1084 struct batadv_orig_node *orig_tmp;
1085
1086 orig_tmp = batadv_iv_ogm_orig_get(bat_priv, ethhdr->h_source);
1087 if (!orig_tmp)
1088 goto unlock;
1089
1090 neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
1091 ethhdr->h_source,
1092 orig_node, orig_tmp);
1093
1094 batadv_orig_node_put(orig_tmp);
1095 if (!neigh_node)
1096 goto unlock;
1097 } else {
1098 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1099 "Updating existing last-hop neighbor of originator\n");
1100 }
1101
1102 rcu_read_unlock();
1103 neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
1104 if (!neigh_ifinfo)
1105 goto out;
1106
1107 neigh_node->last_seen = jiffies;
1108
1109 spin_lock_bh(&neigh_node->ifinfo_lock);
1110 batadv_ring_buffer_set(neigh_ifinfo->bat_iv.tq_recv,
1111 &neigh_ifinfo->bat_iv.tq_index,
1112 batadv_ogm_packet->tq);
1113 tq_avg = batadv_ring_buffer_avg(neigh_ifinfo->bat_iv.tq_recv);
1114 neigh_ifinfo->bat_iv.tq_avg = tq_avg;
1115 spin_unlock_bh(&neigh_node->ifinfo_lock);
1116
1117 if (dup_status == BATADV_NO_DUP) {
1118 orig_ifinfo->last_ttl = batadv_ogm_packet->ttl;
1119 neigh_ifinfo->last_ttl = batadv_ogm_packet->ttl;
1120 }
1121
1122 /* if this neighbor already is our next hop there is nothing
1123 * to change
1124 */
1125 router = batadv_orig_router_get(orig_node, if_outgoing);
1126 if (router == neigh_node)
1127 goto out;
1128
1129 if (router) {
1130 router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
1131 if (!router_ifinfo)
1132 goto out;
1133
1134 /* if this neighbor does not offer a better TQ we won't
1135 * consider it
1136 */
1137 if (router_ifinfo->bat_iv.tq_avg > neigh_ifinfo->bat_iv.tq_avg)
1138 goto out;
1139 }
1140
1141 /* if the TQ is the same and the link not more symmetric we
1142 * won't consider it either
1143 */
1144 if (router_ifinfo &&
1145 neigh_ifinfo->bat_iv.tq_avg == router_ifinfo->bat_iv.tq_avg) {
1146 orig_node_tmp = router->orig_node;
1147 spin_lock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1148 if_num = router->if_incoming->if_num;
1149 sum_orig = orig_node_tmp->bat_iv.bcast_own_sum[if_num];
1150 spin_unlock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1151
1152 orig_node_tmp = neigh_node->orig_node;
1153 spin_lock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1154 if_num = neigh_node->if_incoming->if_num;
1155 sum_neigh = orig_node_tmp->bat_iv.bcast_own_sum[if_num];
1156 spin_unlock_bh(&orig_node_tmp->bat_iv.ogm_cnt_lock);
1157
1158 if (sum_orig >= sum_neigh)
1159 goto out;
1160 }
1161
1162 batadv_update_route(bat_priv, orig_node, if_outgoing, neigh_node);
1163 goto out;
1164
1165 unlock:
1166 rcu_read_unlock();
1167 out:
1168 if (neigh_node)
1169 batadv_neigh_node_put(neigh_node);
1170 if (router)
1171 batadv_neigh_node_put(router);
1172 if (neigh_ifinfo)
1173 batadv_neigh_ifinfo_put(neigh_ifinfo);
1174 if (router_ifinfo)
1175 batadv_neigh_ifinfo_put(router_ifinfo);
1176 }
1177
1178 /**
1179 * batadv_iv_ogm_calc_tq - calculate tq for current received ogm packet
1180 * @orig_node: the orig node who originally emitted the ogm packet
1181 * @orig_neigh_node: the orig node struct of the neighbor who sent the packet
1182 * @batadv_ogm_packet: the ogm packet
1183 * @if_incoming: interface where the packet was received
1184 * @if_outgoing: interface for which the retransmission should be considered
1185 *
1186 * Return: true if the link can be considered bidirectional, false otherwise
1187 */
1188 static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
1189 struct batadv_orig_node *orig_neigh_node,
1190 struct batadv_ogm_packet *batadv_ogm_packet,
1191 struct batadv_hard_iface *if_incoming,
1192 struct batadv_hard_iface *if_outgoing)
1193 {
1194 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1195 struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node;
1196 struct batadv_neigh_ifinfo *neigh_ifinfo;
1197 u8 total_count;
1198 u8 orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
1199 unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
1200 int if_num;
1201 unsigned int tq_asym_penalty, inv_asym_penalty;
1202 unsigned int combined_tq;
1203 unsigned int tq_iface_penalty;
1204 bool ret = false;
1205
1206 /* find corresponding one hop neighbor */
1207 rcu_read_lock();
1208 hlist_for_each_entry_rcu(tmp_neigh_node,
1209 &orig_neigh_node->neigh_list, list) {
1210 if (!batadv_compare_eth(tmp_neigh_node->addr,
1211 orig_neigh_node->orig))
1212 continue;
1213
1214 if (tmp_neigh_node->if_incoming != if_incoming)
1215 continue;
1216
1217 if (!kref_get_unless_zero(&tmp_neigh_node->refcount))
1218 continue;
1219
1220 neigh_node = tmp_neigh_node;
1221 break;
1222 }
1223 rcu_read_unlock();
1224
1225 if (!neigh_node)
1226 neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
1227 orig_neigh_node->orig,
1228 orig_neigh_node,
1229 orig_neigh_node);
1230
1231 if (!neigh_node)
1232 goto out;
1233
1234 /* if orig_node is direct neighbor update neigh_node last_seen */
1235 if (orig_node == orig_neigh_node)
1236 neigh_node->last_seen = jiffies;
1237
1238 orig_node->last_seen = jiffies;
1239
1240 /* find packet count of corresponding one hop neighbor */
1241 spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1242 if_num = if_incoming->if_num;
1243 orig_eq_count = orig_neigh_node->bat_iv.bcast_own_sum[if_num];
1244 neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
1245 if (neigh_ifinfo) {
1246 neigh_rq_count = neigh_ifinfo->bat_iv.real_packet_count;
1247 batadv_neigh_ifinfo_put(neigh_ifinfo);
1248 } else {
1249 neigh_rq_count = 0;
1250 }
1251 spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1252
1253 /* pay attention to not get a value bigger than 100 % */
1254 if (orig_eq_count > neigh_rq_count)
1255 total_count = neigh_rq_count;
1256 else
1257 total_count = orig_eq_count;
1258
1259 /* if we have too few packets (too less data) we set tq_own to zero
1260 * if we receive too few packets it is not considered bidirectional
1261 */
1262 if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM ||
1263 neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM)
1264 tq_own = 0;
1265 else
1266 /* neigh_node->real_packet_count is never zero as we
1267 * only purge old information when getting new
1268 * information
1269 */
1270 tq_own = (BATADV_TQ_MAX_VALUE * total_count) / neigh_rq_count;
1271
1272 /* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
1273 * affect the nearly-symmetric links only a little, but
1274 * punishes asymmetric links more. This will give a value
1275 * between 0 and TQ_MAX_VALUE
1276 */
1277 neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count;
1278 neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv;
1279 neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE *
1280 BATADV_TQ_LOCAL_WINDOW_SIZE *
1281 BATADV_TQ_LOCAL_WINDOW_SIZE;
1282 inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube;
1283 inv_asym_penalty /= neigh_rq_max_cube;
1284 tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty;
1285
1286 /* penalize if the OGM is forwarded on the same interface. WiFi
1287 * interfaces and other half duplex devices suffer from throughput
1288 * drops as they can't send and receive at the same time.
1289 */
1290 tq_iface_penalty = BATADV_TQ_MAX_VALUE;
1291 if (if_outgoing && (if_incoming == if_outgoing) &&
1292 batadv_is_wifi_netdev(if_outgoing->net_dev))
1293 tq_iface_penalty = batadv_hop_penalty(BATADV_TQ_MAX_VALUE,
1294 bat_priv);
1295
1296 combined_tq = batadv_ogm_packet->tq *
1297 tq_own *
1298 tq_asym_penalty *
1299 tq_iface_penalty;
1300 combined_tq /= BATADV_TQ_MAX_VALUE *
1301 BATADV_TQ_MAX_VALUE *
1302 BATADV_TQ_MAX_VALUE;
1303 batadv_ogm_packet->tq = combined_tq;
1304
1305 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1306 "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, iface_penalty: %3i, total tq: %3i, if_incoming = %s, if_outgoing = %s\n",
1307 orig_node->orig, orig_neigh_node->orig, total_count,
1308 neigh_rq_count, tq_own, tq_asym_penalty, tq_iface_penalty,
1309 batadv_ogm_packet->tq, if_incoming->net_dev->name,
1310 if_outgoing ? if_outgoing->net_dev->name : "DEFAULT");
1311
1312 /* if link has the minimum required transmission quality
1313 * consider it bidirectional
1314 */
1315 if (batadv_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT)
1316 ret = true;
1317
1318 out:
1319 if (neigh_node)
1320 batadv_neigh_node_put(neigh_node);
1321 return ret;
1322 }
1323
1324 /**
1325 * batadv_iv_ogm_update_seqnos - process a batman packet for all interfaces,
1326 * adjust the sequence number and find out whether it is a duplicate
1327 * @ethhdr: ethernet header of the packet
1328 * @batadv_ogm_packet: OGM packet to be considered
1329 * @if_incoming: interface on which the OGM packet was received
1330 * @if_outgoing: interface for which the retransmission should be considered
1331 *
1332 * Return: duplicate status as enum batadv_dup_status
1333 */
1334 static enum batadv_dup_status
1335 batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
1336 const struct batadv_ogm_packet *batadv_ogm_packet,
1337 const struct batadv_hard_iface *if_incoming,
1338 struct batadv_hard_iface *if_outgoing)
1339 {
1340 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1341 struct batadv_orig_node *orig_node;
1342 struct batadv_orig_ifinfo *orig_ifinfo = NULL;
1343 struct batadv_neigh_node *neigh_node;
1344 struct batadv_neigh_ifinfo *neigh_ifinfo;
1345 bool is_dup;
1346 s32 seq_diff;
1347 bool need_update = false;
1348 int set_mark;
1349 enum batadv_dup_status ret = BATADV_NO_DUP;
1350 u32 seqno = ntohl(batadv_ogm_packet->seqno);
1351 u8 *neigh_addr;
1352 u8 packet_count;
1353 unsigned long *bitmap;
1354
1355 orig_node = batadv_iv_ogm_orig_get(bat_priv, batadv_ogm_packet->orig);
1356 if (!orig_node)
1357 return BATADV_NO_DUP;
1358
1359 orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
1360 if (WARN_ON(!orig_ifinfo)) {
1361 batadv_orig_node_put(orig_node);
1362 return 0;
1363 }
1364
1365 spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1366 seq_diff = seqno - orig_ifinfo->last_real_seqno;
1367
1368 /* signalize caller that the packet is to be dropped. */
1369 if (!hlist_empty(&orig_node->neigh_list) &&
1370 batadv_window_protected(bat_priv, seq_diff,
1371 BATADV_TQ_LOCAL_WINDOW_SIZE,
1372 &orig_ifinfo->batman_seqno_reset, NULL)) {
1373 ret = BATADV_PROTECTED;
1374 goto out;
1375 }
1376
1377 rcu_read_lock();
1378 hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
1379 neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node,
1380 if_outgoing);
1381 if (!neigh_ifinfo)
1382 continue;
1383
1384 neigh_addr = neigh_node->addr;
1385 is_dup = batadv_test_bit(neigh_ifinfo->bat_iv.real_bits,
1386 orig_ifinfo->last_real_seqno,
1387 seqno);
1388
1389 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
1390 neigh_node->if_incoming == if_incoming) {
1391 set_mark = 1;
1392 if (is_dup)
1393 ret = BATADV_NEIGH_DUP;
1394 } else {
1395 set_mark = 0;
1396 if (is_dup && (ret != BATADV_NEIGH_DUP))
1397 ret = BATADV_ORIG_DUP;
1398 }
1399
1400 /* if the window moved, set the update flag. */
1401 bitmap = neigh_ifinfo->bat_iv.real_bits;
1402 need_update |= batadv_bit_get_packet(bat_priv, bitmap,
1403 seq_diff, set_mark);
1404
1405 packet_count = bitmap_weight(bitmap,
1406 BATADV_TQ_LOCAL_WINDOW_SIZE);
1407 neigh_ifinfo->bat_iv.real_packet_count = packet_count;
1408 batadv_neigh_ifinfo_put(neigh_ifinfo);
1409 }
1410 rcu_read_unlock();
1411
1412 if (need_update) {
1413 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1414 "%s updating last_seqno: old %u, new %u\n",
1415 if_outgoing ? if_outgoing->net_dev->name : "DEFAULT",
1416 orig_ifinfo->last_real_seqno, seqno);
1417 orig_ifinfo->last_real_seqno = seqno;
1418 }
1419
1420 out:
1421 spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1422 batadv_orig_node_put(orig_node);
1423 batadv_orig_ifinfo_put(orig_ifinfo);
1424 return ret;
1425 }
1426
1427 /**
1428 * batadv_iv_ogm_process_per_outif - process a batman iv OGM for an outgoing if
1429 * @skb: the skb containing the OGM
1430 * @ogm_offset: offset from skb->data to start of ogm header
1431 * @orig_node: the (cached) orig node for the originator of this OGM
1432 * @if_incoming: the interface where this packet was received
1433 * @if_outgoing: the interface for which the packet should be considered
1434 */
1435 static void
1436 batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset,
1437 struct batadv_orig_node *orig_node,
1438 struct batadv_hard_iface *if_incoming,
1439 struct batadv_hard_iface *if_outgoing)
1440 {
1441 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1442 struct batadv_hardif_neigh_node *hardif_neigh = NULL;
1443 struct batadv_neigh_node *router = NULL;
1444 struct batadv_neigh_node *router_router = NULL;
1445 struct batadv_orig_node *orig_neigh_node;
1446 struct batadv_orig_ifinfo *orig_ifinfo;
1447 struct batadv_neigh_node *orig_neigh_router = NULL;
1448 struct batadv_neigh_ifinfo *router_ifinfo = NULL;
1449 struct batadv_ogm_packet *ogm_packet;
1450 enum batadv_dup_status dup_status;
1451 bool is_from_best_next_hop = false;
1452 bool is_single_hop_neigh = false;
1453 bool sameseq, similar_ttl;
1454 struct sk_buff *skb_priv;
1455 struct ethhdr *ethhdr;
1456 u8 *prev_sender;
1457 bool is_bidirect;
1458
1459 /* create a private copy of the skb, as some functions change tq value
1460 * and/or flags.
1461 */
1462 skb_priv = skb_copy(skb, GFP_ATOMIC);
1463 if (!skb_priv)
1464 return;
1465
1466 ethhdr = eth_hdr(skb_priv);
1467 ogm_packet = (struct batadv_ogm_packet *)(skb_priv->data + ogm_offset);
1468
1469 dup_status = batadv_iv_ogm_update_seqnos(ethhdr, ogm_packet,
1470 if_incoming, if_outgoing);
1471 if (batadv_compare_eth(ethhdr->h_source, ogm_packet->orig))
1472 is_single_hop_neigh = true;
1473
1474 if (dup_status == BATADV_PROTECTED) {
1475 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1476 "Drop packet: packet within seqno protection time (sender: %pM)\n",
1477 ethhdr->h_source);
1478 goto out;
1479 }
1480
1481 if (ogm_packet->tq == 0) {
1482 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1483 "Drop packet: originator packet with tq equal 0\n");
1484 goto out;
1485 }
1486
1487 if (is_single_hop_neigh) {
1488 hardif_neigh = batadv_hardif_neigh_get(if_incoming,
1489 ethhdr->h_source);
1490 if (hardif_neigh)
1491 hardif_neigh->last_seen = jiffies;
1492 }
1493
1494 router = batadv_orig_router_get(orig_node, if_outgoing);
1495 if (router) {
1496 router_router = batadv_orig_router_get(router->orig_node,
1497 if_outgoing);
1498 router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
1499 }
1500
1501 if ((router_ifinfo && router_ifinfo->bat_iv.tq_avg != 0) &&
1502 (batadv_compare_eth(router->addr, ethhdr->h_source)))
1503 is_from_best_next_hop = true;
1504
1505 prev_sender = ogm_packet->prev_sender;
1506 /* avoid temporary routing loops */
1507 if (router && router_router &&
1508 (batadv_compare_eth(router->addr, prev_sender)) &&
1509 !(batadv_compare_eth(ogm_packet->orig, prev_sender)) &&
1510 (batadv_compare_eth(router->addr, router_router->addr))) {
1511 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1512 "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n",
1513 ethhdr->h_source);
1514 goto out;
1515 }
1516
1517 if (if_outgoing == BATADV_IF_DEFAULT)
1518 batadv_tvlv_ogm_receive(bat_priv, ogm_packet, orig_node);
1519
1520 /* if sender is a direct neighbor the sender mac equals
1521 * originator mac
1522 */
1523 if (is_single_hop_neigh)
1524 orig_neigh_node = orig_node;
1525 else
1526 orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
1527 ethhdr->h_source);
1528
1529 if (!orig_neigh_node)
1530 goto out;
1531
1532 /* Update nc_nodes of the originator */
1533 batadv_nc_update_nc_node(bat_priv, orig_node, orig_neigh_node,
1534 ogm_packet, is_single_hop_neigh);
1535
1536 orig_neigh_router = batadv_orig_router_get(orig_neigh_node,
1537 if_outgoing);
1538
1539 /* drop packet if sender is not a direct neighbor and if we
1540 * don't route towards it
1541 */
1542 if (!is_single_hop_neigh && (!orig_neigh_router)) {
1543 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1544 "Drop packet: OGM via unknown neighbor!\n");
1545 goto out_neigh;
1546 }
1547
1548 is_bidirect = batadv_iv_ogm_calc_tq(orig_node, orig_neigh_node,
1549 ogm_packet, if_incoming,
1550 if_outgoing);
1551
1552 /* update ranking if it is not a duplicate or has the same
1553 * seqno and similar ttl as the non-duplicate
1554 */
1555 orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
1556 if (!orig_ifinfo)
1557 goto out_neigh;
1558
1559 sameseq = orig_ifinfo->last_real_seqno == ntohl(ogm_packet->seqno);
1560 similar_ttl = (orig_ifinfo->last_ttl - 3) <= ogm_packet->ttl;
1561
1562 if (is_bidirect && ((dup_status == BATADV_NO_DUP) ||
1563 (sameseq && similar_ttl))) {
1564 batadv_iv_ogm_orig_update(bat_priv, orig_node,
1565 orig_ifinfo, ethhdr,
1566 ogm_packet, if_incoming,
1567 if_outgoing, dup_status);
1568 }
1569 batadv_orig_ifinfo_put(orig_ifinfo);
1570
1571 /* only forward for specific interface, not for the default one. */
1572 if (if_outgoing == BATADV_IF_DEFAULT)
1573 goto out_neigh;
1574
1575 /* is single hop (direct) neighbor */
1576 if (is_single_hop_neigh) {
1577 /* OGMs from secondary interfaces should only scheduled once
1578 * per interface where it has been received, not multiple times
1579 */
1580 if ((ogm_packet->ttl <= 2) &&
1581 (if_incoming != if_outgoing)) {
1582 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1583 "Drop packet: OGM from secondary interface and wrong outgoing interface\n");
1584 goto out_neigh;
1585 }
1586 /* mark direct link on incoming interface */
1587 batadv_iv_ogm_forward(orig_node, ethhdr, ogm_packet,
1588 is_single_hop_neigh,
1589 is_from_best_next_hop, if_incoming,
1590 if_outgoing);
1591
1592 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1593 "Forwarding packet: rebroadcast neighbor packet with direct link flag\n");
1594 goto out_neigh;
1595 }
1596
1597 /* multihop originator */
1598 if (!is_bidirect) {
1599 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1600 "Drop packet: not received via bidirectional link\n");
1601 goto out_neigh;
1602 }
1603
1604 if (dup_status == BATADV_NEIGH_DUP) {
1605 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1606 "Drop packet: duplicate packet received\n");
1607 goto out_neigh;
1608 }
1609
1610 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1611 "Forwarding packet: rebroadcast originator packet\n");
1612 batadv_iv_ogm_forward(orig_node, ethhdr, ogm_packet,
1613 is_single_hop_neigh, is_from_best_next_hop,
1614 if_incoming, if_outgoing);
1615
1616 out_neigh:
1617 if ((orig_neigh_node) && (!is_single_hop_neigh))
1618 batadv_orig_node_put(orig_neigh_node);
1619 out:
1620 if (router_ifinfo)
1621 batadv_neigh_ifinfo_put(router_ifinfo);
1622 if (router)
1623 batadv_neigh_node_put(router);
1624 if (router_router)
1625 batadv_neigh_node_put(router_router);
1626 if (orig_neigh_router)
1627 batadv_neigh_node_put(orig_neigh_router);
1628 if (hardif_neigh)
1629 batadv_hardif_neigh_put(hardif_neigh);
1630
1631 kfree_skb(skb_priv);
1632 }
1633
1634 /**
1635 * batadv_iv_ogm_process - process an incoming batman iv OGM
1636 * @skb: the skb containing the OGM
1637 * @ogm_offset: offset to the OGM which should be processed (for aggregates)
1638 * @if_incoming: the interface where this packet was receved
1639 */
1640 static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
1641 struct batadv_hard_iface *if_incoming)
1642 {
1643 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1644 struct batadv_orig_node *orig_neigh_node, *orig_node;
1645 struct batadv_hard_iface *hard_iface;
1646 struct batadv_ogm_packet *ogm_packet;
1647 u32 if_incoming_seqno;
1648 bool has_directlink_flag;
1649 struct ethhdr *ethhdr;
1650 bool is_my_oldorig = false;
1651 bool is_my_addr = false;
1652 bool is_my_orig = false;
1653
1654 ogm_packet = (struct batadv_ogm_packet *)(skb->data + ogm_offset);
1655 ethhdr = eth_hdr(skb);
1656
1657 /* Silently drop when the batman packet is actually not a
1658 * correct packet.
1659 *
1660 * This might happen if a packet is padded (e.g. Ethernet has a
1661 * minimum frame length of 64 byte) and the aggregation interprets
1662 * it as an additional length.
1663 *
1664 * TODO: A more sane solution would be to have a bit in the
1665 * batadv_ogm_packet to detect whether the packet is the last
1666 * packet in an aggregation. Here we expect that the padding
1667 * is always zero (or not 0x01)
1668 */
1669 if (ogm_packet->packet_type != BATADV_IV_OGM)
1670 return;
1671
1672 /* could be changed by schedule_own_packet() */
1673 if_incoming_seqno = atomic_read(&if_incoming->bat_iv.ogm_seqno);
1674
1675 if (ogm_packet->flags & BATADV_DIRECTLINK)
1676 has_directlink_flag = true;
1677 else
1678 has_directlink_flag = false;
1679
1680 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1681 "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, tq %d, TTL %d, V %d, IDF %d)\n",
1682 ethhdr->h_source, if_incoming->net_dev->name,
1683 if_incoming->net_dev->dev_addr, ogm_packet->orig,
1684 ogm_packet->prev_sender, ntohl(ogm_packet->seqno),
1685 ogm_packet->tq, ogm_packet->ttl,
1686 ogm_packet->version, has_directlink_flag);
1687
1688 rcu_read_lock();
1689 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
1690 if (hard_iface->if_status != BATADV_IF_ACTIVE)
1691 continue;
1692
1693 if (hard_iface->soft_iface != if_incoming->soft_iface)
1694 continue;
1695
1696 if (batadv_compare_eth(ethhdr->h_source,
1697 hard_iface->net_dev->dev_addr))
1698 is_my_addr = true;
1699
1700 if (batadv_compare_eth(ogm_packet->orig,
1701 hard_iface->net_dev->dev_addr))
1702 is_my_orig = true;
1703
1704 if (batadv_compare_eth(ogm_packet->prev_sender,
1705 hard_iface->net_dev->dev_addr))
1706 is_my_oldorig = true;
1707 }
1708 rcu_read_unlock();
1709
1710 if (is_my_addr) {
1711 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1712 "Drop packet: received my own broadcast (sender: %pM)\n",
1713 ethhdr->h_source);
1714 return;
1715 }
1716
1717 if (is_my_orig) {
1718 unsigned long *word;
1719 int offset;
1720 s32 bit_pos;
1721 s16 if_num;
1722 u8 *weight;
1723
1724 orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
1725 ethhdr->h_source);
1726 if (!orig_neigh_node)
1727 return;
1728
1729 /* neighbor has to indicate direct link and it has to
1730 * come via the corresponding interface
1731 * save packet seqno for bidirectional check
1732 */
1733 if (has_directlink_flag &&
1734 batadv_compare_eth(if_incoming->net_dev->dev_addr,
1735 ogm_packet->orig)) {
1736 if_num = if_incoming->if_num;
1737 offset = if_num * BATADV_NUM_WORDS;
1738
1739 spin_lock_bh(&orig_neigh_node->bat_iv.ogm_cnt_lock);
1740 word = &orig_neigh_node->bat_iv.bcast_own[offset];
1741 bit_pos = if_incoming_seqno - 2;
1742 bit_pos -= ntohl(ogm_packet->seqno);
1743 batadv_set_bit(word, bit_pos);
1744 weight = &orig_neigh_node->bat_iv.bcast_own_sum[if_num];
1745 *weight = bitmap_weight(word,
1746 BATADV_TQ_LOCAL_WINDOW_SIZE);
1747 spin_unlock_bh(&orig_neigh_node->bat_iv.ogm_cnt_lock);
1748 }
1749
1750 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1751 "Drop packet: originator packet from myself (via neighbor)\n");
1752 batadv_orig_node_put(orig_neigh_node);
1753 return;
1754 }
1755
1756 if (is_my_oldorig) {
1757 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1758 "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n",
1759 ethhdr->h_source);
1760 return;
1761 }
1762
1763 if (ogm_packet->flags & BATADV_NOT_BEST_NEXT_HOP) {
1764 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1765 "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n",
1766 ethhdr->h_source);
1767 return;
1768 }
1769
1770 orig_node = batadv_iv_ogm_orig_get(bat_priv, ogm_packet->orig);
1771 if (!orig_node)
1772 return;
1773
1774 batadv_iv_ogm_process_per_outif(skb, ogm_offset, orig_node,
1775 if_incoming, BATADV_IF_DEFAULT);
1776
1777 rcu_read_lock();
1778 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
1779 if (hard_iface->if_status != BATADV_IF_ACTIVE)
1780 continue;
1781
1782 if (hard_iface->soft_iface != bat_priv->soft_iface)
1783 continue;
1784
1785 if (!kref_get_unless_zero(&hard_iface->refcount))
1786 continue;
1787
1788 batadv_iv_ogm_process_per_outif(skb, ogm_offset, orig_node,
1789 if_incoming, hard_iface);
1790
1791 batadv_hardif_put(hard_iface);
1792 }
1793 rcu_read_unlock();
1794
1795 batadv_orig_node_put(orig_node);
1796 }
1797
1798 static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work)
1799 {
1800 struct delayed_work *delayed_work;
1801 struct batadv_forw_packet *forw_packet;
1802 struct batadv_priv *bat_priv;
1803
1804 delayed_work = to_delayed_work(work);
1805 forw_packet = container_of(delayed_work, struct batadv_forw_packet,
1806 delayed_work);
1807 bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
1808 spin_lock_bh(&bat_priv->forw_bat_list_lock);
1809 hlist_del(&forw_packet->list);
1810 spin_unlock_bh(&bat_priv->forw_bat_list_lock);
1811
1812 if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
1813 goto out;
1814
1815 batadv_iv_ogm_emit(forw_packet);
1816
1817 /* we have to have at least one packet in the queue to determine the
1818 * queues wake up time unless we are shutting down.
1819 *
1820 * only re-schedule if this is the "original" copy, e.g. the OGM of the
1821 * primary interface should only be rescheduled once per period, but
1822 * this function will be called for the forw_packet instances of the
1823 * other secondary interfaces as well.
1824 */
1825 if (forw_packet->own &&
1826 forw_packet->if_incoming == forw_packet->if_outgoing)
1827 batadv_iv_ogm_schedule(forw_packet->if_incoming);
1828
1829 out:
1830 /* don't count own packet */
1831 if (!forw_packet->own)
1832 atomic_inc(&bat_priv->batman_queue_left);
1833
1834 batadv_forw_packet_free(forw_packet);
1835 }
1836
1837 static int batadv_iv_ogm_receive(struct sk_buff *skb,
1838 struct batadv_hard_iface *if_incoming)
1839 {
1840 struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1841 struct batadv_ogm_packet *ogm_packet;
1842 u8 *packet_pos;
1843 int ogm_offset;
1844 bool ret;
1845
1846 ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN);
1847 if (!ret)
1848 return NET_RX_DROP;
1849
1850 /* did we receive a B.A.T.M.A.N. IV OGM packet on an interface
1851 * that does not have B.A.T.M.A.N. IV enabled ?
1852 */
1853 if (bat_priv->bat_algo_ops->bat_iface_enable !=
1854 batadv_iv_ogm_iface_enable)
1855 return NET_RX_DROP;
1856
1857 batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
1858 batadv_add_counter(bat_priv, BATADV_CNT_MGMT_RX_BYTES,
1859 skb->len + ETH_HLEN);
1860
1861 ogm_offset = 0;
1862 ogm_packet = (struct batadv_ogm_packet *)skb->data;
1863
1864 /* unpack the aggregated packets and process them one by one */
1865 while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
1866 ogm_packet->tvlv_len)) {
1867 batadv_iv_ogm_process(skb, ogm_offset, if_incoming);
1868
1869 ogm_offset += BATADV_OGM_HLEN;
1870 ogm_offset += ntohs(ogm_packet->tvlv_len);
1871
1872 packet_pos = skb->data + ogm_offset;
1873 ogm_packet = (struct batadv_ogm_packet *)packet_pos;
1874 }
1875
1876 kfree_skb(skb);
1877 return NET_RX_SUCCESS;
1878 }
1879
1880 /**
1881 * batadv_iv_ogm_orig_print_neigh - print neighbors for the originator table
1882 * @orig_node: the orig_node for which the neighbors are printed
1883 * @if_outgoing: outgoing interface for these entries
1884 * @seq: debugfs table seq_file struct
1885 *
1886 * Must be called while holding an rcu lock.
1887 */
1888 static void
1889 batadv_iv_ogm_orig_print_neigh(struct batadv_orig_node *orig_node,
1890 struct batadv_hard_iface *if_outgoing,
1891 struct seq_file *seq)
1892 {
1893 struct batadv_neigh_node *neigh_node;
1894 struct batadv_neigh_ifinfo *n_ifinfo;
1895
1896 hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
1897 n_ifinfo = batadv_neigh_ifinfo_get(neigh_node, if_outgoing);
1898 if (!n_ifinfo)
1899 continue;
1900
1901 seq_printf(seq, " %pM (%3i)",
1902 neigh_node->addr,
1903 n_ifinfo->bat_iv.tq_avg);
1904
1905 batadv_neigh_ifinfo_put(n_ifinfo);
1906 }
1907 }
1908
1909 /**
1910 * batadv_iv_ogm_orig_print - print the originator table
1911 * @bat_priv: the bat priv with all the soft interface information
1912 * @seq: debugfs table seq_file struct
1913 * @if_outgoing: the outgoing interface for which this should be printed
1914 */
1915 static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv,
1916 struct seq_file *seq,
1917 struct batadv_hard_iface *if_outgoing)
1918 {
1919 struct batadv_neigh_node *neigh_node;
1920 struct batadv_hashtable *hash = bat_priv->orig_hash;
1921 int last_seen_msecs, last_seen_secs;
1922 struct batadv_orig_node *orig_node;
1923 struct batadv_neigh_ifinfo *n_ifinfo;
1924 unsigned long last_seen_jiffies;
1925 struct hlist_head *head;
1926 int batman_count = 0;
1927 u32 i;
1928
1929 seq_puts(seq,
1930 " Originator last-seen (#/255) Nexthop [outgoingIF]: Potential nexthops ...\n");
1931
1932 for (i = 0; i < hash->size; i++) {
1933 head = &hash->table[i];
1934
1935 rcu_read_lock();
1936 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1937 neigh_node = batadv_orig_router_get(orig_node,
1938 if_outgoing);
1939 if (!neigh_node)
1940 continue;
1941
1942 n_ifinfo = batadv_neigh_ifinfo_get(neigh_node,
1943 if_outgoing);
1944 if (!n_ifinfo)
1945 goto next;
1946
1947 if (n_ifinfo->bat_iv.tq_avg == 0)
1948 goto next;
1949
1950 last_seen_jiffies = jiffies - orig_node->last_seen;
1951 last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
1952 last_seen_secs = last_seen_msecs / 1000;
1953 last_seen_msecs = last_seen_msecs % 1000;
1954
1955 seq_printf(seq, "%pM %4i.%03is (%3i) %pM [%10s]:",
1956 orig_node->orig, last_seen_secs,
1957 last_seen_msecs, n_ifinfo->bat_iv.tq_avg,
1958 neigh_node->addr,
1959 neigh_node->if_incoming->net_dev->name);
1960
1961 batadv_iv_ogm_orig_print_neigh(orig_node, if_outgoing,
1962 seq);
1963 seq_puts(seq, "\n");
1964 batman_count++;
1965
1966 next:
1967 batadv_neigh_node_put(neigh_node);
1968 if (n_ifinfo)
1969 batadv_neigh_ifinfo_put(n_ifinfo);
1970 }
1971 rcu_read_unlock();
1972 }
1973
1974 if (batman_count == 0)
1975 seq_puts(seq, "No batman nodes in range ...\n");
1976 }
1977
1978 /**
1979 * batadv_iv_hardif_neigh_print - print a single hop neighbour node
1980 * @seq: neighbour table seq_file struct
1981 * @hardif_neigh: hardif neighbour information
1982 */
1983 static void
1984 batadv_iv_hardif_neigh_print(struct seq_file *seq,
1985 struct batadv_hardif_neigh_node *hardif_neigh)
1986 {
1987 int last_secs, last_msecs;
1988
1989 last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000;
1990 last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000;
1991
1992 seq_printf(seq, " %10s %pM %4i.%03is\n",
1993 hardif_neigh->if_incoming->net_dev->name,
1994 hardif_neigh->addr, last_secs, last_msecs);
1995 }
1996
1997 /**
1998 * batadv_iv_ogm_neigh_print - print the single hop neighbour list
1999 * @bat_priv: the bat priv with all the soft interface information
2000 * @seq: neighbour table seq_file struct
2001 */
2002 static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
2003 struct seq_file *seq)
2004 {
2005 struct net_device *net_dev = (struct net_device *)seq->private;
2006 struct batadv_hardif_neigh_node *hardif_neigh;
2007 struct batadv_hard_iface *hard_iface;
2008 int batman_count = 0;
2009
2010 seq_puts(seq, " IF Neighbor last-seen\n");
2011
2012 rcu_read_lock();
2013 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
2014 if (hard_iface->soft_iface != net_dev)
2015 continue;
2016
2017 hlist_for_each_entry_rcu(hardif_neigh,
2018 &hard_iface->neigh_list, list) {
2019 batadv_iv_hardif_neigh_print(seq, hardif_neigh);
2020 batman_count++;
2021 }
2022 }
2023 rcu_read_unlock();
2024
2025 if (batman_count == 0)
2026 seq_puts(seq, "No batman nodes in range ...\n");
2027 }
2028
2029 /**
2030 * batadv_iv_ogm_neigh_cmp - compare the metrics of two neighbors
2031 * @neigh1: the first neighbor object of the comparison
2032 * @if_outgoing1: outgoing interface for the first neighbor
2033 * @neigh2: the second neighbor object of the comparison
2034 * @if_outgoing2: outgoing interface for the second neighbor
2035 *
2036 * Return: a value less, equal to or greater than 0 if the metric via neigh1 is
2037 * lower, the same as or higher than the metric via neigh2
2038 */
2039 static int batadv_iv_ogm_neigh_cmp(struct batadv_neigh_node *neigh1,
2040 struct batadv_hard_iface *if_outgoing1,
2041 struct batadv_neigh_node *neigh2,
2042 struct batadv_hard_iface *if_outgoing2)
2043 {
2044 struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
2045 u8 tq1, tq2;
2046 int diff;
2047
2048 neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
2049 neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
2050
2051 if (!neigh1_ifinfo || !neigh2_ifinfo) {
2052 diff = 0;
2053 goto out;
2054 }
2055
2056 tq1 = neigh1_ifinfo->bat_iv.tq_avg;
2057 tq2 = neigh2_ifinfo->bat_iv.tq_avg;
2058 diff = tq1 - tq2;
2059
2060 out:
2061 if (neigh1_ifinfo)
2062 batadv_neigh_ifinfo_put(neigh1_ifinfo);
2063 if (neigh2_ifinfo)
2064 batadv_neigh_ifinfo_put(neigh2_ifinfo);
2065
2066 return diff;
2067 }
2068
2069 /**
2070 * batadv_iv_ogm_neigh_is_sob - check if neigh1 is similarly good or better
2071 * than neigh2 from the metric prospective
2072 * @neigh1: the first neighbor object of the comparison
2073 * @if_outgoing1: outgoing interface for the first neighbor
2074 * @neigh2: the second neighbor object of the comparison
2075 * @if_outgoing2: outgoing interface for the second neighbor
2076 *
2077 * Return: true if the metric via neigh1 is equally good or better than
2078 * the metric via neigh2, false otherwise.
2079 */
2080 static bool
2081 batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
2082 struct batadv_hard_iface *if_outgoing1,
2083 struct batadv_neigh_node *neigh2,
2084 struct batadv_hard_iface *if_outgoing2)
2085 {
2086 struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
2087 u8 tq1, tq2;
2088 bool ret;
2089
2090 neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
2091 neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
2092
2093 /* we can't say that the metric is better */
2094 if (!neigh1_ifinfo || !neigh2_ifinfo) {
2095 ret = false;
2096 goto out;
2097 }
2098
2099 tq1 = neigh1_ifinfo->bat_iv.tq_avg;
2100 tq2 = neigh2_ifinfo->bat_iv.tq_avg;
2101 ret = (tq1 - tq2) > -BATADV_TQ_SIMILARITY_THRESHOLD;
2102
2103 out:
2104 if (neigh1_ifinfo)
2105 batadv_neigh_ifinfo_put(neigh1_ifinfo);
2106 if (neigh2_ifinfo)
2107 batadv_neigh_ifinfo_put(neigh2_ifinfo);
2108
2109 return ret;
2110 }
2111
2112 static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
2113 {
2114 /* begin scheduling originator messages on that interface */
2115 batadv_iv_ogm_schedule(hard_iface);
2116 }
2117
2118 static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
2119 .name = "BATMAN_IV",
2120 .bat_iface_activate = batadv_iv_iface_activate,
2121 .bat_iface_enable = batadv_iv_ogm_iface_enable,
2122 .bat_iface_disable = batadv_iv_ogm_iface_disable,
2123 .bat_iface_update_mac = batadv_iv_ogm_iface_update_mac,
2124 .bat_primary_iface_set = batadv_iv_ogm_primary_iface_set,
2125 .bat_neigh_cmp = batadv_iv_ogm_neigh_cmp,
2126 .bat_neigh_is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
2127 .bat_neigh_print = batadv_iv_neigh_print,
2128 .bat_orig_print = batadv_iv_ogm_orig_print,
2129 .bat_orig_free = batadv_iv_ogm_orig_free,
2130 .bat_orig_add_if = batadv_iv_ogm_orig_add_if,
2131 .bat_orig_del_if = batadv_iv_ogm_orig_del_if,
2132 };
2133
2134 int __init batadv_iv_init(void)
2135 {
2136 int ret;
2137
2138 /* batman originator packet */
2139 ret = batadv_recv_handler_register(BATADV_IV_OGM,
2140 batadv_iv_ogm_receive);
2141 if (ret < 0)
2142 goto out;
2143
2144 ret = batadv_algo_register(&batadv_batman_iv);
2145 if (ret < 0)
2146 goto handler_unregister;
2147
2148 goto out;
2149
2150 handler_unregister:
2151 batadv_recv_handler_unregister(BATADV_IV_OGM);
2152 out:
2153 return ret;
2154 }