Merge tag 'for-5.0-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
[linux-2.6-microblaze.git] / net / batman-adv / bat_iv_ogm.c
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (C) 2007-2018  B.A.T.M.A.N. contributors:
3  *
4  * Marek Lindner, Simon Wunderlich
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of version 2 of the GNU General Public
8  * License as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, see <http://www.gnu.org/licenses/>.
17  */
18
19 #include "bat_iv_ogm.h"
20 #include "main.h"
21
22 #include <linux/atomic.h>
23 #include <linux/bitmap.h>
24 #include <linux/bitops.h>
25 #include <linux/bug.h>
26 #include <linux/byteorder/generic.h>
27 #include <linux/cache.h>
28 #include <linux/errno.h>
29 #include <linux/etherdevice.h>
30 #include <linux/gfp.h>
31 #include <linux/if_ether.h>
32 #include <linux/init.h>
33 #include <linux/jiffies.h>
34 #include <linux/kernel.h>
35 #include <linux/kref.h>
36 #include <linux/list.h>
37 #include <linux/netdevice.h>
38 #include <linux/netlink.h>
39 #include <linux/pkt_sched.h>
40 #include <linux/printk.h>
41 #include <linux/random.h>
42 #include <linux/rculist.h>
43 #include <linux/rcupdate.h>
44 #include <linux/seq_file.h>
45 #include <linux/skbuff.h>
46 #include <linux/slab.h>
47 #include <linux/spinlock.h>
48 #include <linux/stddef.h>
49 #include <linux/string.h>
50 #include <linux/types.h>
51 #include <linux/workqueue.h>
52 #include <net/genetlink.h>
53 #include <net/netlink.h>
54 #include <uapi/linux/batadv_packet.h>
55 #include <uapi/linux/batman_adv.h>
56
57 #include "bat_algo.h"
58 #include "bitarray.h"
59 #include "gateway_client.h"
60 #include "hard-interface.h"
61 #include "hash.h"
62 #include "log.h"
63 #include "netlink.h"
64 #include "network-coding.h"
65 #include "originator.h"
66 #include "routing.h"
67 #include "send.h"
68 #include "translation-table.h"
69 #include "tvlv.h"
70
71 static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work);
72
73 /**
74  * enum batadv_dup_status - duplicate status
75  */
76 enum batadv_dup_status {
77         /** @BATADV_NO_DUP: the packet is no duplicate */
78         BATADV_NO_DUP = 0,
79
80         /**
81          * @BATADV_ORIG_DUP: OGM is a duplicate in the originator (but not for
82          *  the neighbor)
83          */
84         BATADV_ORIG_DUP,
85
86         /** @BATADV_NEIGH_DUP: OGM is a duplicate for the neighbor */
87         BATADV_NEIGH_DUP,
88
89         /**
90          * @BATADV_PROTECTED: originator is currently protected (after reboot)
91          */
92         BATADV_PROTECTED,
93 };
94
95 /**
96  * batadv_ring_buffer_set() - update the ring buffer with the given value
97  * @lq_recv: pointer to the ring buffer
98  * @lq_index: index to store the value at
99  * @value: value to store in the ring buffer
100  */
101 static void batadv_ring_buffer_set(u8 lq_recv[], u8 *lq_index, u8 value)
102 {
103         lq_recv[*lq_index] = value;
104         *lq_index = (*lq_index + 1) % BATADV_TQ_GLOBAL_WINDOW_SIZE;
105 }
106
107 /**
108  * batadv_ring_buffer_avg() - compute the average of all non-zero values stored
109  * in the given ring buffer
110  * @lq_recv: pointer to the ring buffer
111  *
112  * Return: computed average value.
113  */
114 static u8 batadv_ring_buffer_avg(const u8 lq_recv[])
115 {
116         const u8 *ptr;
117         u16 count = 0;
118         u16 i = 0;
119         u16 sum = 0;
120
121         ptr = lq_recv;
122
123         while (i < BATADV_TQ_GLOBAL_WINDOW_SIZE) {
124                 if (*ptr != 0) {
125                         count++;
126                         sum += *ptr;
127                 }
128
129                 i++;
130                 ptr++;
131         }
132
133         if (count == 0)
134                 return 0;
135
136         return (u8)(sum / count);
137 }
138
139 /**
140  * batadv_iv_ogm_orig_get() - retrieve or create (if does not exist) an
141  *  originator
142  * @bat_priv: the bat priv with all the soft interface information
143  * @addr: mac address of the originator
144  *
145  * Return: the originator object corresponding to the passed mac address or NULL
146  * on failure.
147  * If the object does not exists it is created an initialised.
148  */
149 static struct batadv_orig_node *
150 batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
151 {
152         struct batadv_orig_node *orig_node;
153         int hash_added;
154
155         orig_node = batadv_orig_hash_find(bat_priv, addr);
156         if (orig_node)
157                 return orig_node;
158
159         orig_node = batadv_orig_node_new(bat_priv, addr);
160         if (!orig_node)
161                 return NULL;
162
163         spin_lock_init(&orig_node->bat_iv.ogm_cnt_lock);
164
165         kref_get(&orig_node->refcount);
166         hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig,
167                                      batadv_choose_orig, orig_node,
168                                      &orig_node->hash_entry);
169         if (hash_added != 0)
170                 goto free_orig_node_hash;
171
172         return orig_node;
173
174 free_orig_node_hash:
175         /* reference for batadv_hash_add */
176         batadv_orig_node_put(orig_node);
177         /* reference from batadv_orig_node_new */
178         batadv_orig_node_put(orig_node);
179
180         return NULL;
181 }
182
183 static struct batadv_neigh_node *
184 batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,
185                         const u8 *neigh_addr,
186                         struct batadv_orig_node *orig_node,
187                         struct batadv_orig_node *orig_neigh)
188 {
189         struct batadv_neigh_node *neigh_node;
190
191         neigh_node = batadv_neigh_node_get_or_create(orig_node,
192                                                      hard_iface, neigh_addr);
193         if (!neigh_node)
194                 goto out;
195
196         neigh_node->orig_node = orig_neigh;
197
198 out:
199         return neigh_node;
200 }
201
202 static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
203 {
204         struct batadv_ogm_packet *batadv_ogm_packet;
205         unsigned char *ogm_buff;
206         u32 random_seqno;
207
208         /* randomize initial seqno to avoid collision */
209         get_random_bytes(&random_seqno, sizeof(random_seqno));
210         atomic_set(&hard_iface->bat_iv.ogm_seqno, random_seqno);
211
212         hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN;
213         ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC);
214         if (!ogm_buff)
215                 return -ENOMEM;
216
217         hard_iface->bat_iv.ogm_buff = ogm_buff;
218
219         batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
220         batadv_ogm_packet->packet_type = BATADV_IV_OGM;
221         batadv_ogm_packet->version = BATADV_COMPAT_VERSION;
222         batadv_ogm_packet->ttl = 2;
223         batadv_ogm_packet->flags = BATADV_NO_FLAGS;
224         batadv_ogm_packet->reserved = 0;
225         batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
226
227         return 0;
228 }
229
230 static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
231 {
232         kfree(hard_iface->bat_iv.ogm_buff);
233         hard_iface->bat_iv.ogm_buff = NULL;
234 }
235
236 static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface)
237 {
238         struct batadv_ogm_packet *batadv_ogm_packet;
239         unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
240
241         batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
242         ether_addr_copy(batadv_ogm_packet->orig,
243                         hard_iface->net_dev->dev_addr);
244         ether_addr_copy(batadv_ogm_packet->prev_sender,
245                         hard_iface->net_dev->dev_addr);
246 }
247
248 static void
249 batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface)
250 {
251         struct batadv_ogm_packet *batadv_ogm_packet;
252         unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
253
254         batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
255         batadv_ogm_packet->ttl = BATADV_TTL;
256 }
257
258 /* when do we schedule our own ogm to be sent */
259 static unsigned long
260 batadv_iv_ogm_emit_send_time(const struct batadv_priv *bat_priv)
261 {
262         unsigned int msecs;
263
264         msecs = atomic_read(&bat_priv->orig_interval) - BATADV_JITTER;
265         msecs += prandom_u32() % (2 * BATADV_JITTER);
266
267         return jiffies + msecs_to_jiffies(msecs);
268 }
269
270 /* when do we schedule a ogm packet to be sent */
271 static unsigned long batadv_iv_ogm_fwd_send_time(void)
272 {
273         return jiffies + msecs_to_jiffies(prandom_u32() % (BATADV_JITTER / 2));
274 }
275
276 /* apply hop penalty for a normal link */
277 static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv)
278 {
279         int hop_penalty = atomic_read(&bat_priv->hop_penalty);
280         int new_tq;
281
282         new_tq = tq * (BATADV_TQ_MAX_VALUE - hop_penalty);
283         new_tq /= BATADV_TQ_MAX_VALUE;
284
285         return new_tq;
286 }
287
288 /**
289  * batadv_iv_ogm_aggr_packet() - checks if there is another OGM attached
290  * @buff_pos: current position in the skb
291  * @packet_len: total length of the skb
292  * @tvlv_len: tvlv length of the previously considered OGM
293  *
294  * Return: true if there is enough space for another OGM, false otherwise.
295  */
296 static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
297                                       __be16 tvlv_len)
298 {
299         int next_buff_pos = 0;
300
301         next_buff_pos += buff_pos + BATADV_OGM_HLEN;
302         next_buff_pos += ntohs(tvlv_len);
303
304         return (next_buff_pos <= packet_len) &&
305                (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
306 }
307
308 /* send a batman ogm to a given interface */
309 static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
310                                      struct batadv_hard_iface *hard_iface)
311 {
312         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
313         const char *fwd_str;
314         u8 packet_num;
315         s16 buff_pos;
316         struct batadv_ogm_packet *batadv_ogm_packet;
317         struct sk_buff *skb;
318         u8 *packet_pos;
319
320         if (hard_iface->if_status != BATADV_IF_ACTIVE)
321                 return;
322
323         packet_num = 0;
324         buff_pos = 0;
325         packet_pos = forw_packet->skb->data;
326         batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
327
328         /* adjust all flags and log packets */
329         while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
330                                          batadv_ogm_packet->tvlv_len)) {
331                 /* we might have aggregated direct link packets with an
332                  * ordinary base packet
333                  */
334                 if (forw_packet->direct_link_flags & BIT(packet_num) &&
335                     forw_packet->if_incoming == hard_iface)
336                         batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
337                 else
338                         batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
339
340                 if (packet_num > 0 || !forw_packet->own)
341                         fwd_str = "Forwarding";
342                 else
343                         fwd_str = "Sending own";
344
345                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
346                            "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s) on interface %s [%pM]\n",
347                            fwd_str, (packet_num > 0 ? "aggregated " : ""),
348                            batadv_ogm_packet->orig,
349                            ntohl(batadv_ogm_packet->seqno),
350                            batadv_ogm_packet->tq, batadv_ogm_packet->ttl,
351                            ((batadv_ogm_packet->flags & BATADV_DIRECTLINK) ?
352                             "on" : "off"),
353                            hard_iface->net_dev->name,
354                            hard_iface->net_dev->dev_addr);
355
356                 buff_pos += BATADV_OGM_HLEN;
357                 buff_pos += ntohs(batadv_ogm_packet->tvlv_len);
358                 packet_num++;
359                 packet_pos = forw_packet->skb->data + buff_pos;
360                 batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos;
361         }
362
363         /* create clone because function is called more than once */
364         skb = skb_clone(forw_packet->skb, GFP_ATOMIC);
365         if (skb) {
366                 batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX);
367                 batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES,
368                                    skb->len + ETH_HLEN);
369                 batadv_send_broadcast_skb(skb, hard_iface);
370         }
371 }
372
373 /* send a batman ogm packet */
374 static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
375 {
376         struct net_device *soft_iface;
377
378         if (!forw_packet->if_incoming) {
379                 pr_err("Error - can't forward packet: incoming iface not specified\n");
380                 return;
381         }
382
383         soft_iface = forw_packet->if_incoming->soft_iface;
384
385         if (WARN_ON(!forw_packet->if_outgoing))
386                 return;
387
388         if (WARN_ON(forw_packet->if_outgoing->soft_iface != soft_iface))
389                 return;
390
391         if (forw_packet->if_incoming->if_status != BATADV_IF_ACTIVE)
392                 return;
393
394         /* only for one specific outgoing interface */
395         batadv_iv_ogm_send_to_if(forw_packet, forw_packet->if_outgoing);
396 }
397
398 /**
399  * batadv_iv_ogm_can_aggregate() - find out if an OGM can be aggregated on an
400  *  existing forward packet
401  * @new_bat_ogm_packet: OGM packet to be aggregated
402  * @bat_priv: the bat priv with all the soft interface information
403  * @packet_len: (total) length of the OGM
404  * @send_time: timestamp (jiffies) when the packet is to be sent
405  * @directlink: true if this is a direct link packet
406  * @if_incoming: interface where the packet was received
407  * @if_outgoing: interface for which the retransmission should be considered
408  * @forw_packet: the forwarded packet which should be checked
409  *
410  * Return: true if new_packet can be aggregated with forw_packet
411  */
412 static bool
413 batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
414                             struct batadv_priv *bat_priv,
415                             int packet_len, unsigned long send_time,
416                             bool directlink,
417                             const struct batadv_hard_iface *if_incoming,
418                             const struct batadv_hard_iface *if_outgoing,
419                             const struct batadv_forw_packet *forw_packet)
420 {
421         struct batadv_ogm_packet *batadv_ogm_packet;
422         int aggregated_bytes = forw_packet->packet_len + packet_len;
423         struct batadv_hard_iface *primary_if = NULL;
424         bool res = false;
425         unsigned long aggregation_end_time;
426
427         batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data;
428         aggregation_end_time = send_time;
429         aggregation_end_time += msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
430
431         /* we can aggregate the current packet to this aggregated packet
432          * if:
433          *
434          * - the send time is within our MAX_AGGREGATION_MS time
435          * - the resulting packet wont be bigger than
436          *   MAX_AGGREGATION_BYTES
437          * otherwise aggregation is not possible
438          */
439         if (!time_before(send_time, forw_packet->send_time) ||
440             !time_after_eq(aggregation_end_time, forw_packet->send_time))
441                 return false;
442
443         if (aggregated_bytes > BATADV_MAX_AGGREGATION_BYTES)
444                 return false;
445
446         /* packet is not leaving on the same interface. */
447         if (forw_packet->if_outgoing != if_outgoing)
448                 return false;
449
450         /* check aggregation compatibility
451          * -> direct link packets are broadcasted on
452          *    their interface only
453          * -> aggregate packet if the current packet is
454          *    a "global" packet as well as the base
455          *    packet
456          */
457         primary_if = batadv_primary_if_get_selected(bat_priv);
458         if (!primary_if)
459                 return false;
460
461         /* packets without direct link flag and high TTL
462          * are flooded through the net
463          */
464         if (!directlink &&
465             !(batadv_ogm_packet->flags & BATADV_DIRECTLINK) &&
466             batadv_ogm_packet->ttl != 1 &&
467
468             /* own packets originating non-primary
469              * interfaces leave only that interface
470              */
471             (!forw_packet->own ||
472              forw_packet->if_incoming == primary_if)) {
473                 res = true;
474                 goto out;
475         }
476
477         /* if the incoming packet is sent via this one
478          * interface only - we still can aggregate
479          */
480         if (directlink &&
481             new_bat_ogm_packet->ttl == 1 &&
482             forw_packet->if_incoming == if_incoming &&
483
484             /* packets from direct neighbors or
485              * own secondary interface packets
486              * (= secondary interface packets in general)
487              */
488             (batadv_ogm_packet->flags & BATADV_DIRECTLINK ||
489              (forw_packet->own &&
490               forw_packet->if_incoming != primary_if))) {
491                 res = true;
492                 goto out;
493         }
494
495 out:
496         if (primary_if)
497                 batadv_hardif_put(primary_if);
498         return res;
499 }
500
501 /**
502  * batadv_iv_ogm_aggregate_new() - create a new aggregated packet and add this
503  *  packet to it.
504  * @packet_buff: pointer to the OGM
505  * @packet_len: (total) length of the OGM
506  * @send_time: timestamp (jiffies) when the packet is to be sent
507  * @direct_link: whether this OGM has direct link status
508  * @if_incoming: interface where the packet was received
509  * @if_outgoing: interface for which the retransmission should be considered
510  * @own_packet: true if it is a self-generated ogm
511  */
512 static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
513                                         int packet_len, unsigned long send_time,
514                                         bool direct_link,
515                                         struct batadv_hard_iface *if_incoming,
516                                         struct batadv_hard_iface *if_outgoing,
517                                         int own_packet)
518 {
519         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
520         struct batadv_forw_packet *forw_packet_aggr;
521         struct sk_buff *skb;
522         unsigned char *skb_buff;
523         unsigned int skb_size;
524         atomic_t *queue_left = own_packet ? NULL : &bat_priv->batman_queue_left;
525
526         if (atomic_read(&bat_priv->aggregated_ogms) &&
527             packet_len < BATADV_MAX_AGGREGATION_BYTES)
528                 skb_size = BATADV_MAX_AGGREGATION_BYTES;
529         else
530                 skb_size = packet_len;
531
532         skb_size += ETH_HLEN;
533
534         skb = netdev_alloc_skb_ip_align(NULL, skb_size);
535         if (!skb)
536                 return;
537
538         forw_packet_aggr = batadv_forw_packet_alloc(if_incoming, if_outgoing,
539                                                     queue_left, bat_priv, skb);
540         if (!forw_packet_aggr) {
541                 kfree_skb(skb);
542                 return;
543         }
544
545         forw_packet_aggr->skb->priority = TC_PRIO_CONTROL;
546         skb_reserve(forw_packet_aggr->skb, ETH_HLEN);
547
548         skb_buff = skb_put(forw_packet_aggr->skb, packet_len);
549         forw_packet_aggr->packet_len = packet_len;
550         memcpy(skb_buff, packet_buff, packet_len);
551
552         forw_packet_aggr->own = own_packet;
553         forw_packet_aggr->direct_link_flags = BATADV_NO_FLAGS;
554         forw_packet_aggr->send_time = send_time;
555
556         /* save packet direct link flag status */
557         if (direct_link)
558                 forw_packet_aggr->direct_link_flags |= 1;
559
560         INIT_DELAYED_WORK(&forw_packet_aggr->delayed_work,
561                           batadv_iv_send_outstanding_bat_ogm_packet);
562
563         batadv_forw_packet_ogmv1_queue(bat_priv, forw_packet_aggr, send_time);
564 }
565
566 /* aggregate a new packet into the existing ogm packet */
567 static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr,
568                                     const unsigned char *packet_buff,
569                                     int packet_len, bool direct_link)
570 {
571         unsigned long new_direct_link_flag;
572
573         skb_put_data(forw_packet_aggr->skb, packet_buff, packet_len);
574         forw_packet_aggr->packet_len += packet_len;
575         forw_packet_aggr->num_packets++;
576
577         /* save packet direct link flag status */
578         if (direct_link) {
579                 new_direct_link_flag = BIT(forw_packet_aggr->num_packets);
580                 forw_packet_aggr->direct_link_flags |= new_direct_link_flag;
581         }
582 }
583
584 /**
585  * batadv_iv_ogm_queue_add() - queue up an OGM for transmission
586  * @bat_priv: the bat priv with all the soft interface information
587  * @packet_buff: pointer to the OGM
588  * @packet_len: (total) length of the OGM
589  * @if_incoming: interface where the packet was received
590  * @if_outgoing: interface for which the retransmission should be considered
591  * @own_packet: true if it is a self-generated ogm
592  * @send_time: timestamp (jiffies) when the packet is to be sent
593  */
594 static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv,
595                                     unsigned char *packet_buff,
596                                     int packet_len,
597                                     struct batadv_hard_iface *if_incoming,
598                                     struct batadv_hard_iface *if_outgoing,
599                                     int own_packet, unsigned long send_time)
600 {
601         /* _aggr -> pointer to the packet we want to aggregate with
602          * _pos -> pointer to the position in the queue
603          */
604         struct batadv_forw_packet *forw_packet_aggr = NULL;
605         struct batadv_forw_packet *forw_packet_pos = NULL;
606         struct batadv_ogm_packet *batadv_ogm_packet;
607         bool direct_link;
608         unsigned long max_aggregation_jiffies;
609
610         batadv_ogm_packet = (struct batadv_ogm_packet *)packet_buff;
611         direct_link = !!(batadv_ogm_packet->flags & BATADV_DIRECTLINK);
612         max_aggregation_jiffies = msecs_to_jiffies(BATADV_MAX_AGGREGATION_MS);
613
614         /* find position for the packet in the forward queue */
615         spin_lock_bh(&bat_priv->forw_bat_list_lock);
616         /* own packets are not to be aggregated */
617         if (atomic_read(&bat_priv->aggregated_ogms) && !own_packet) {
618                 hlist_for_each_entry(forw_packet_pos,
619                                      &bat_priv->forw_bat_list, list) {
620                         if (batadv_iv_ogm_can_aggregate(batadv_ogm_packet,
621                                                         bat_priv, packet_len,
622                                                         send_time, direct_link,
623                                                         if_incoming,
624                                                         if_outgoing,
625                                                         forw_packet_pos)) {
626                                 forw_packet_aggr = forw_packet_pos;
627                                 break;
628                         }
629                 }
630         }
631
632         /* nothing to aggregate with - either aggregation disabled or no
633          * suitable aggregation packet found
634          */
635         if (!forw_packet_aggr) {
636                 /* the following section can run without the lock */
637                 spin_unlock_bh(&bat_priv->forw_bat_list_lock);
638
639                 /* if we could not aggregate this packet with one of the others
640                  * we hold it back for a while, so that it might be aggregated
641                  * later on
642                  */
643                 if (!own_packet && atomic_read(&bat_priv->aggregated_ogms))
644                         send_time += max_aggregation_jiffies;
645
646                 batadv_iv_ogm_aggregate_new(packet_buff, packet_len,
647                                             send_time, direct_link,
648                                             if_incoming, if_outgoing,
649                                             own_packet);
650         } else {
651                 batadv_iv_ogm_aggregate(forw_packet_aggr, packet_buff,
652                                         packet_len, direct_link);
653                 spin_unlock_bh(&bat_priv->forw_bat_list_lock);
654         }
655 }
656
657 static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
658                                   const struct ethhdr *ethhdr,
659                                   struct batadv_ogm_packet *batadv_ogm_packet,
660                                   bool is_single_hop_neigh,
661                                   bool is_from_best_next_hop,
662                                   struct batadv_hard_iface *if_incoming,
663                                   struct batadv_hard_iface *if_outgoing)
664 {
665         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
666         u16 tvlv_len;
667
668         if (batadv_ogm_packet->ttl <= 1) {
669                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n");
670                 return;
671         }
672
673         if (!is_from_best_next_hop) {
674                 /* Mark the forwarded packet when it is not coming from our
675                  * best next hop. We still need to forward the packet for our
676                  * neighbor link quality detection to work in case the packet
677                  * originated from a single hop neighbor. Otherwise we can
678                  * simply drop the ogm.
679                  */
680                 if (is_single_hop_neigh)
681                         batadv_ogm_packet->flags |= BATADV_NOT_BEST_NEXT_HOP;
682                 else
683                         return;
684         }
685
686         tvlv_len = ntohs(batadv_ogm_packet->tvlv_len);
687
688         batadv_ogm_packet->ttl--;
689         ether_addr_copy(batadv_ogm_packet->prev_sender, ethhdr->h_source);
690
691         /* apply hop penalty */
692         batadv_ogm_packet->tq = batadv_hop_penalty(batadv_ogm_packet->tq,
693                                                    bat_priv);
694
695         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
696                    "Forwarding packet: tq: %i, ttl: %i\n",
697                    batadv_ogm_packet->tq, batadv_ogm_packet->ttl);
698
699         if (is_single_hop_neigh)
700                 batadv_ogm_packet->flags |= BATADV_DIRECTLINK;
701         else
702                 batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK;
703
704         batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet,
705                                 BATADV_OGM_HLEN + tvlv_len,
706                                 if_incoming, if_outgoing, 0,
707                                 batadv_iv_ogm_fwd_send_time());
708 }
709
710 /**
711  * batadv_iv_ogm_slide_own_bcast_window() - bitshift own OGM broadcast windows
712  *  for the given interface
713  * @hard_iface: the interface for which the windows have to be shifted
714  */
715 static void
716 batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
717 {
718         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
719         struct batadv_hashtable *hash = bat_priv->orig_hash;
720         struct hlist_head *head;
721         struct batadv_orig_node *orig_node;
722         struct batadv_orig_ifinfo *orig_ifinfo;
723         unsigned long *word;
724         u32 i;
725         u8 *w;
726
727         for (i = 0; i < hash->size; i++) {
728                 head = &hash->table[i];
729
730                 rcu_read_lock();
731                 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
732                         hlist_for_each_entry_rcu(orig_ifinfo,
733                                                  &orig_node->ifinfo_list,
734                                                  list) {
735                                 if (orig_ifinfo->if_outgoing != hard_iface)
736                                         continue;
737
738                                 spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
739                                 word = orig_ifinfo->bat_iv.bcast_own;
740                                 batadv_bit_get_packet(bat_priv, word, 1, 0);
741                                 w = &orig_ifinfo->bat_iv.bcast_own_sum;
742                                 *w = bitmap_weight(word,
743                                                    BATADV_TQ_LOCAL_WINDOW_SIZE);
744                                 spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
745                         }
746                 }
747                 rcu_read_unlock();
748         }
749 }
750
751 static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
752 {
753         struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
754         unsigned char **ogm_buff = &hard_iface->bat_iv.ogm_buff;
755         struct batadv_ogm_packet *batadv_ogm_packet;
756         struct batadv_hard_iface *primary_if, *tmp_hard_iface;
757         int *ogm_buff_len = &hard_iface->bat_iv.ogm_buff_len;
758         u32 seqno;
759         u16 tvlv_len = 0;
760         unsigned long send_time;
761
762         if (hard_iface->if_status == BATADV_IF_NOT_IN_USE ||
763             hard_iface->if_status == BATADV_IF_TO_BE_REMOVED)
764                 return;
765
766         /* the interface gets activated here to avoid race conditions between
767          * the moment of activating the interface in
768          * hardif_activate_interface() where the originator mac is set and
769          * outdated packets (especially uninitialized mac addresses) in the
770          * packet queue
771          */
772         if (hard_iface->if_status == BATADV_IF_TO_BE_ACTIVATED)
773                 hard_iface->if_status = BATADV_IF_ACTIVE;
774
775         primary_if = batadv_primary_if_get_selected(bat_priv);
776
777         if (hard_iface == primary_if) {
778                 /* tt changes have to be committed before the tvlv data is
779                  * appended as it may alter the tt tvlv container
780                  */
781                 batadv_tt_local_commit_changes(bat_priv);
782                 tvlv_len = batadv_tvlv_container_ogm_append(bat_priv, ogm_buff,
783                                                             ogm_buff_len,
784                                                             BATADV_OGM_HLEN);
785         }
786
787         batadv_ogm_packet = (struct batadv_ogm_packet *)(*ogm_buff);
788         batadv_ogm_packet->tvlv_len = htons(tvlv_len);
789
790         /* change sequence number to network order */
791         seqno = (u32)atomic_read(&hard_iface->bat_iv.ogm_seqno);
792         batadv_ogm_packet->seqno = htonl(seqno);
793         atomic_inc(&hard_iface->bat_iv.ogm_seqno);
794
795         batadv_iv_ogm_slide_own_bcast_window(hard_iface);
796
797         send_time = batadv_iv_ogm_emit_send_time(bat_priv);
798
799         if (hard_iface != primary_if) {
800                 /* OGMs from secondary interfaces are only scheduled on their
801                  * respective interfaces.
802                  */
803                 batadv_iv_ogm_queue_add(bat_priv, *ogm_buff, *ogm_buff_len,
804                                         hard_iface, hard_iface, 1, send_time);
805                 goto out;
806         }
807
808         /* OGMs from primary interfaces are scheduled on all
809          * interfaces.
810          */
811         rcu_read_lock();
812         list_for_each_entry_rcu(tmp_hard_iface, &batadv_hardif_list, list) {
813                 if (tmp_hard_iface->soft_iface != hard_iface->soft_iface)
814                         continue;
815
816                 if (!kref_get_unless_zero(&tmp_hard_iface->refcount))
817                         continue;
818
819                 batadv_iv_ogm_queue_add(bat_priv, *ogm_buff,
820                                         *ogm_buff_len, hard_iface,
821                                         tmp_hard_iface, 1, send_time);
822
823                 batadv_hardif_put(tmp_hard_iface);
824         }
825         rcu_read_unlock();
826
827 out:
828         if (primary_if)
829                 batadv_hardif_put(primary_if);
830 }
831
832 /**
833  * batadv_iv_orig_ifinfo_sum() - Get bcast_own sum for originator over iterface
834  * @orig_node: originator which reproadcasted the OGMs directly
835  * @if_outgoing: interface which transmitted the original OGM and received the
836  *  direct rebroadcast
837  *
838  * Return: Number of replied (rebroadcasted) OGMs which were transmitted by
839  *  an originator and directly (without intermediate hop) received by a specific
840  *  interface
841  */
842 static u8 batadv_iv_orig_ifinfo_sum(struct batadv_orig_node *orig_node,
843                                     struct batadv_hard_iface *if_outgoing)
844 {
845         struct batadv_orig_ifinfo *orig_ifinfo;
846         u8 sum;
847
848         orig_ifinfo = batadv_orig_ifinfo_get(orig_node, if_outgoing);
849         if (!orig_ifinfo)
850                 return 0;
851
852         spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
853         sum = orig_ifinfo->bat_iv.bcast_own_sum;
854         spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
855
856         batadv_orig_ifinfo_put(orig_ifinfo);
857
858         return sum;
859 }
860
861 /**
862  * batadv_iv_ogm_orig_update() - use OGM to update corresponding data in an
863  *  originator
864  * @bat_priv: the bat priv with all the soft interface information
865  * @orig_node: the orig node who originally emitted the ogm packet
866  * @orig_ifinfo: ifinfo for the outgoing interface of the orig_node
867  * @ethhdr: Ethernet header of the OGM
868  * @batadv_ogm_packet: the ogm packet
869  * @if_incoming: interface where the packet was received
870  * @if_outgoing: interface for which the retransmission should be considered
871  * @dup_status: the duplicate status of this ogm packet.
872  */
873 static void
874 batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
875                           struct batadv_orig_node *orig_node,
876                           struct batadv_orig_ifinfo *orig_ifinfo,
877                           const struct ethhdr *ethhdr,
878                           const struct batadv_ogm_packet *batadv_ogm_packet,
879                           struct batadv_hard_iface *if_incoming,
880                           struct batadv_hard_iface *if_outgoing,
881                           enum batadv_dup_status dup_status)
882 {
883         struct batadv_neigh_ifinfo *neigh_ifinfo = NULL;
884         struct batadv_neigh_ifinfo *router_ifinfo = NULL;
885         struct batadv_neigh_node *neigh_node = NULL;
886         struct batadv_neigh_node *tmp_neigh_node = NULL;
887         struct batadv_neigh_node *router = NULL;
888         u8 sum_orig, sum_neigh;
889         u8 *neigh_addr;
890         u8 tq_avg;
891
892         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
893                    "%s(): Searching and updating originator entry of received packet\n",
894                    __func__);
895
896         rcu_read_lock();
897         hlist_for_each_entry_rcu(tmp_neigh_node,
898                                  &orig_node->neigh_list, list) {
899                 neigh_addr = tmp_neigh_node->addr;
900                 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
901                     tmp_neigh_node->if_incoming == if_incoming &&
902                     kref_get_unless_zero(&tmp_neigh_node->refcount)) {
903                         if (WARN(neigh_node, "too many matching neigh_nodes"))
904                                 batadv_neigh_node_put(neigh_node);
905                         neigh_node = tmp_neigh_node;
906                         continue;
907                 }
908
909                 if (dup_status != BATADV_NO_DUP)
910                         continue;
911
912                 /* only update the entry for this outgoing interface */
913                 neigh_ifinfo = batadv_neigh_ifinfo_get(tmp_neigh_node,
914                                                        if_outgoing);
915                 if (!neigh_ifinfo)
916                         continue;
917
918                 spin_lock_bh(&tmp_neigh_node->ifinfo_lock);
919                 batadv_ring_buffer_set(neigh_ifinfo->bat_iv.tq_recv,
920                                        &neigh_ifinfo->bat_iv.tq_index, 0);
921                 tq_avg = batadv_ring_buffer_avg(neigh_ifinfo->bat_iv.tq_recv);
922                 neigh_ifinfo->bat_iv.tq_avg = tq_avg;
923                 spin_unlock_bh(&tmp_neigh_node->ifinfo_lock);
924
925                 batadv_neigh_ifinfo_put(neigh_ifinfo);
926                 neigh_ifinfo = NULL;
927         }
928
929         if (!neigh_node) {
930                 struct batadv_orig_node *orig_tmp;
931
932                 orig_tmp = batadv_iv_ogm_orig_get(bat_priv, ethhdr->h_source);
933                 if (!orig_tmp)
934                         goto unlock;
935
936                 neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
937                                                      ethhdr->h_source,
938                                                      orig_node, orig_tmp);
939
940                 batadv_orig_node_put(orig_tmp);
941                 if (!neigh_node)
942                         goto unlock;
943         } else {
944                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
945                            "Updating existing last-hop neighbor of originator\n");
946         }
947
948         rcu_read_unlock();
949         neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
950         if (!neigh_ifinfo)
951                 goto out;
952
953         neigh_node->last_seen = jiffies;
954
955         spin_lock_bh(&neigh_node->ifinfo_lock);
956         batadv_ring_buffer_set(neigh_ifinfo->bat_iv.tq_recv,
957                                &neigh_ifinfo->bat_iv.tq_index,
958                                batadv_ogm_packet->tq);
959         tq_avg = batadv_ring_buffer_avg(neigh_ifinfo->bat_iv.tq_recv);
960         neigh_ifinfo->bat_iv.tq_avg = tq_avg;
961         spin_unlock_bh(&neigh_node->ifinfo_lock);
962
963         if (dup_status == BATADV_NO_DUP) {
964                 orig_ifinfo->last_ttl = batadv_ogm_packet->ttl;
965                 neigh_ifinfo->last_ttl = batadv_ogm_packet->ttl;
966         }
967
968         /* if this neighbor already is our next hop there is nothing
969          * to change
970          */
971         router = batadv_orig_router_get(orig_node, if_outgoing);
972         if (router == neigh_node)
973                 goto out;
974
975         if (router) {
976                 router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
977                 if (!router_ifinfo)
978                         goto out;
979
980                 /* if this neighbor does not offer a better TQ we won't
981                  * consider it
982                  */
983                 if (router_ifinfo->bat_iv.tq_avg > neigh_ifinfo->bat_iv.tq_avg)
984                         goto out;
985         }
986
987         /* if the TQ is the same and the link not more symmetric we
988          * won't consider it either
989          */
990         if (router_ifinfo &&
991             neigh_ifinfo->bat_iv.tq_avg == router_ifinfo->bat_iv.tq_avg) {
992                 sum_orig = batadv_iv_orig_ifinfo_sum(router->orig_node,
993                                                      router->if_incoming);
994                 sum_neigh = batadv_iv_orig_ifinfo_sum(neigh_node->orig_node,
995                                                       neigh_node->if_incoming);
996                 if (sum_orig >= sum_neigh)
997                         goto out;
998         }
999
1000         batadv_update_route(bat_priv, orig_node, if_outgoing, neigh_node);
1001         goto out;
1002
1003 unlock:
1004         rcu_read_unlock();
1005 out:
1006         if (neigh_node)
1007                 batadv_neigh_node_put(neigh_node);
1008         if (router)
1009                 batadv_neigh_node_put(router);
1010         if (neigh_ifinfo)
1011                 batadv_neigh_ifinfo_put(neigh_ifinfo);
1012         if (router_ifinfo)
1013                 batadv_neigh_ifinfo_put(router_ifinfo);
1014 }
1015
1016 /**
1017  * batadv_iv_ogm_calc_tq() - calculate tq for current received ogm packet
1018  * @orig_node: the orig node who originally emitted the ogm packet
1019  * @orig_neigh_node: the orig node struct of the neighbor who sent the packet
1020  * @batadv_ogm_packet: the ogm packet
1021  * @if_incoming: interface where the packet was received
1022  * @if_outgoing: interface for which the retransmission should be considered
1023  *
1024  * Return: true if the link can be considered bidirectional, false otherwise
1025  */
1026 static bool batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
1027                                   struct batadv_orig_node *orig_neigh_node,
1028                                   struct batadv_ogm_packet *batadv_ogm_packet,
1029                                   struct batadv_hard_iface *if_incoming,
1030                                   struct batadv_hard_iface *if_outgoing)
1031 {
1032         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1033         struct batadv_neigh_node *neigh_node = NULL, *tmp_neigh_node;
1034         struct batadv_neigh_ifinfo *neigh_ifinfo;
1035         u8 total_count;
1036         u8 orig_eq_count, neigh_rq_count, neigh_rq_inv, tq_own;
1037         unsigned int neigh_rq_inv_cube, neigh_rq_max_cube;
1038         unsigned int tq_asym_penalty, inv_asym_penalty;
1039         unsigned int combined_tq;
1040         unsigned int tq_iface_penalty;
1041         bool ret = false;
1042
1043         /* find corresponding one hop neighbor */
1044         rcu_read_lock();
1045         hlist_for_each_entry_rcu(tmp_neigh_node,
1046                                  &orig_neigh_node->neigh_list, list) {
1047                 if (!batadv_compare_eth(tmp_neigh_node->addr,
1048                                         orig_neigh_node->orig))
1049                         continue;
1050
1051                 if (tmp_neigh_node->if_incoming != if_incoming)
1052                         continue;
1053
1054                 if (!kref_get_unless_zero(&tmp_neigh_node->refcount))
1055                         continue;
1056
1057                 neigh_node = tmp_neigh_node;
1058                 break;
1059         }
1060         rcu_read_unlock();
1061
1062         if (!neigh_node)
1063                 neigh_node = batadv_iv_ogm_neigh_new(if_incoming,
1064                                                      orig_neigh_node->orig,
1065                                                      orig_neigh_node,
1066                                                      orig_neigh_node);
1067
1068         if (!neigh_node)
1069                 goto out;
1070
1071         /* if orig_node is direct neighbor update neigh_node last_seen */
1072         if (orig_node == orig_neigh_node)
1073                 neigh_node->last_seen = jiffies;
1074
1075         orig_node->last_seen = jiffies;
1076
1077         /* find packet count of corresponding one hop neighbor */
1078         orig_eq_count = batadv_iv_orig_ifinfo_sum(orig_neigh_node, if_incoming);
1079         neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
1080         if (neigh_ifinfo) {
1081                 neigh_rq_count = neigh_ifinfo->bat_iv.real_packet_count;
1082                 batadv_neigh_ifinfo_put(neigh_ifinfo);
1083         } else {
1084                 neigh_rq_count = 0;
1085         }
1086
1087         /* pay attention to not get a value bigger than 100 % */
1088         if (orig_eq_count > neigh_rq_count)
1089                 total_count = neigh_rq_count;
1090         else
1091                 total_count = orig_eq_count;
1092
1093         /* if we have too few packets (too less data) we set tq_own to zero
1094          * if we receive too few packets it is not considered bidirectional
1095          */
1096         if (total_count < BATADV_TQ_LOCAL_BIDRECT_SEND_MINIMUM ||
1097             neigh_rq_count < BATADV_TQ_LOCAL_BIDRECT_RECV_MINIMUM)
1098                 tq_own = 0;
1099         else
1100                 /* neigh_node->real_packet_count is never zero as we
1101                  * only purge old information when getting new
1102                  * information
1103                  */
1104                 tq_own = (BATADV_TQ_MAX_VALUE * total_count) /  neigh_rq_count;
1105
1106         /* 1 - ((1-x) ** 3), normalized to TQ_MAX_VALUE this does
1107          * affect the nearly-symmetric links only a little, but
1108          * punishes asymmetric links more.  This will give a value
1109          * between 0 and TQ_MAX_VALUE
1110          */
1111         neigh_rq_inv = BATADV_TQ_LOCAL_WINDOW_SIZE - neigh_rq_count;
1112         neigh_rq_inv_cube = neigh_rq_inv * neigh_rq_inv * neigh_rq_inv;
1113         neigh_rq_max_cube = BATADV_TQ_LOCAL_WINDOW_SIZE *
1114                             BATADV_TQ_LOCAL_WINDOW_SIZE *
1115                             BATADV_TQ_LOCAL_WINDOW_SIZE;
1116         inv_asym_penalty = BATADV_TQ_MAX_VALUE * neigh_rq_inv_cube;
1117         inv_asym_penalty /= neigh_rq_max_cube;
1118         tq_asym_penalty = BATADV_TQ_MAX_VALUE - inv_asym_penalty;
1119
1120         /* penalize if the OGM is forwarded on the same interface. WiFi
1121          * interfaces and other half duplex devices suffer from throughput
1122          * drops as they can't send and receive at the same time.
1123          */
1124         tq_iface_penalty = BATADV_TQ_MAX_VALUE;
1125         if (if_outgoing && if_incoming == if_outgoing &&
1126             batadv_is_wifi_hardif(if_outgoing))
1127                 tq_iface_penalty = batadv_hop_penalty(BATADV_TQ_MAX_VALUE,
1128                                                       bat_priv);
1129
1130         combined_tq = batadv_ogm_packet->tq *
1131                       tq_own *
1132                       tq_asym_penalty *
1133                       tq_iface_penalty;
1134         combined_tq /= BATADV_TQ_MAX_VALUE *
1135                        BATADV_TQ_MAX_VALUE *
1136                        BATADV_TQ_MAX_VALUE;
1137         batadv_ogm_packet->tq = combined_tq;
1138
1139         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1140                    "bidirectional: orig = %pM neigh = %pM => 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",
1141                    orig_node->orig, orig_neigh_node->orig, total_count,
1142                    neigh_rq_count, tq_own, tq_asym_penalty, tq_iface_penalty,
1143                    batadv_ogm_packet->tq, if_incoming->net_dev->name,
1144                    if_outgoing ? if_outgoing->net_dev->name : "DEFAULT");
1145
1146         /* if link has the minimum required transmission quality
1147          * consider it bidirectional
1148          */
1149         if (batadv_ogm_packet->tq >= BATADV_TQ_TOTAL_BIDRECT_LIMIT)
1150                 ret = true;
1151
1152 out:
1153         if (neigh_node)
1154                 batadv_neigh_node_put(neigh_node);
1155         return ret;
1156 }
1157
1158 /**
1159  * batadv_iv_ogm_update_seqnos() -  process a batman packet for all interfaces,
1160  *  adjust the sequence number and find out whether it is a duplicate
1161  * @ethhdr: ethernet header of the packet
1162  * @batadv_ogm_packet: OGM packet to be considered
1163  * @if_incoming: interface on which the OGM packet was received
1164  * @if_outgoing: interface for which the retransmission should be considered
1165  *
1166  * Return: duplicate status as enum batadv_dup_status
1167  */
1168 static enum batadv_dup_status
1169 batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
1170                             const struct batadv_ogm_packet *batadv_ogm_packet,
1171                             const struct batadv_hard_iface *if_incoming,
1172                             struct batadv_hard_iface *if_outgoing)
1173 {
1174         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1175         struct batadv_orig_node *orig_node;
1176         struct batadv_orig_ifinfo *orig_ifinfo = NULL;
1177         struct batadv_neigh_node *neigh_node;
1178         struct batadv_neigh_ifinfo *neigh_ifinfo;
1179         bool is_dup;
1180         s32 seq_diff;
1181         bool need_update = false;
1182         int set_mark;
1183         enum batadv_dup_status ret = BATADV_NO_DUP;
1184         u32 seqno = ntohl(batadv_ogm_packet->seqno);
1185         u8 *neigh_addr;
1186         u8 packet_count;
1187         unsigned long *bitmap;
1188
1189         orig_node = batadv_iv_ogm_orig_get(bat_priv, batadv_ogm_packet->orig);
1190         if (!orig_node)
1191                 return BATADV_NO_DUP;
1192
1193         orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
1194         if (WARN_ON(!orig_ifinfo)) {
1195                 batadv_orig_node_put(orig_node);
1196                 return 0;
1197         }
1198
1199         spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1200         seq_diff = seqno - orig_ifinfo->last_real_seqno;
1201
1202         /* signalize caller that the packet is to be dropped. */
1203         if (!hlist_empty(&orig_node->neigh_list) &&
1204             batadv_window_protected(bat_priv, seq_diff,
1205                                     BATADV_TQ_LOCAL_WINDOW_SIZE,
1206                                     &orig_ifinfo->batman_seqno_reset, NULL)) {
1207                 ret = BATADV_PROTECTED;
1208                 goto out;
1209         }
1210
1211         rcu_read_lock();
1212         hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
1213                 neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node,
1214                                                        if_outgoing);
1215                 if (!neigh_ifinfo)
1216                         continue;
1217
1218                 neigh_addr = neigh_node->addr;
1219                 is_dup = batadv_test_bit(neigh_ifinfo->bat_iv.real_bits,
1220                                          orig_ifinfo->last_real_seqno,
1221                                          seqno);
1222
1223                 if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
1224                     neigh_node->if_incoming == if_incoming) {
1225                         set_mark = 1;
1226                         if (is_dup)
1227                                 ret = BATADV_NEIGH_DUP;
1228                 } else {
1229                         set_mark = 0;
1230                         if (is_dup && ret != BATADV_NEIGH_DUP)
1231                                 ret = BATADV_ORIG_DUP;
1232                 }
1233
1234                 /* if the window moved, set the update flag. */
1235                 bitmap = neigh_ifinfo->bat_iv.real_bits;
1236                 need_update |= batadv_bit_get_packet(bat_priv, bitmap,
1237                                                      seq_diff, set_mark);
1238
1239                 packet_count = bitmap_weight(bitmap,
1240                                              BATADV_TQ_LOCAL_WINDOW_SIZE);
1241                 neigh_ifinfo->bat_iv.real_packet_count = packet_count;
1242                 batadv_neigh_ifinfo_put(neigh_ifinfo);
1243         }
1244         rcu_read_unlock();
1245
1246         if (need_update) {
1247                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1248                            "%s updating last_seqno: old %u, new %u\n",
1249                            if_outgoing ? if_outgoing->net_dev->name : "DEFAULT",
1250                            orig_ifinfo->last_real_seqno, seqno);
1251                 orig_ifinfo->last_real_seqno = seqno;
1252         }
1253
1254 out:
1255         spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1256         batadv_orig_node_put(orig_node);
1257         batadv_orig_ifinfo_put(orig_ifinfo);
1258         return ret;
1259 }
1260
1261 /**
1262  * batadv_iv_ogm_process_per_outif() - process a batman iv OGM for an outgoing
1263  *  interface
1264  * @skb: the skb containing the OGM
1265  * @ogm_offset: offset from skb->data to start of ogm header
1266  * @orig_node: the (cached) orig node for the originator of this OGM
1267  * @if_incoming: the interface where this packet was received
1268  * @if_outgoing: the interface for which the packet should be considered
1269  */
1270 static void
1271 batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset,
1272                                 struct batadv_orig_node *orig_node,
1273                                 struct batadv_hard_iface *if_incoming,
1274                                 struct batadv_hard_iface *if_outgoing)
1275 {
1276         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1277         struct batadv_hardif_neigh_node *hardif_neigh = NULL;
1278         struct batadv_neigh_node *router = NULL;
1279         struct batadv_neigh_node *router_router = NULL;
1280         struct batadv_orig_node *orig_neigh_node;
1281         struct batadv_orig_ifinfo *orig_ifinfo;
1282         struct batadv_neigh_node *orig_neigh_router = NULL;
1283         struct batadv_neigh_ifinfo *router_ifinfo = NULL;
1284         struct batadv_ogm_packet *ogm_packet;
1285         enum batadv_dup_status dup_status;
1286         bool is_from_best_next_hop = false;
1287         bool is_single_hop_neigh = false;
1288         bool sameseq, similar_ttl;
1289         struct sk_buff *skb_priv;
1290         struct ethhdr *ethhdr;
1291         u8 *prev_sender;
1292         bool is_bidirect;
1293
1294         /* create a private copy of the skb, as some functions change tq value
1295          * and/or flags.
1296          */
1297         skb_priv = skb_copy(skb, GFP_ATOMIC);
1298         if (!skb_priv)
1299                 return;
1300
1301         ethhdr = eth_hdr(skb_priv);
1302         ogm_packet = (struct batadv_ogm_packet *)(skb_priv->data + ogm_offset);
1303
1304         dup_status = batadv_iv_ogm_update_seqnos(ethhdr, ogm_packet,
1305                                                  if_incoming, if_outgoing);
1306         if (batadv_compare_eth(ethhdr->h_source, ogm_packet->orig))
1307                 is_single_hop_neigh = true;
1308
1309         if (dup_status == BATADV_PROTECTED) {
1310                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1311                            "Drop packet: packet within seqno protection time (sender: %pM)\n",
1312                            ethhdr->h_source);
1313                 goto out;
1314         }
1315
1316         if (ogm_packet->tq == 0) {
1317                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1318                            "Drop packet: originator packet with tq equal 0\n");
1319                 goto out;
1320         }
1321
1322         if (is_single_hop_neigh) {
1323                 hardif_neigh = batadv_hardif_neigh_get(if_incoming,
1324                                                        ethhdr->h_source);
1325                 if (hardif_neigh)
1326                         hardif_neigh->last_seen = jiffies;
1327         }
1328
1329         router = batadv_orig_router_get(orig_node, if_outgoing);
1330         if (router) {
1331                 router_router = batadv_orig_router_get(router->orig_node,
1332                                                        if_outgoing);
1333                 router_ifinfo = batadv_neigh_ifinfo_get(router, if_outgoing);
1334         }
1335
1336         if ((router_ifinfo && router_ifinfo->bat_iv.tq_avg != 0) &&
1337             (batadv_compare_eth(router->addr, ethhdr->h_source)))
1338                 is_from_best_next_hop = true;
1339
1340         prev_sender = ogm_packet->prev_sender;
1341         /* avoid temporary routing loops */
1342         if (router && router_router &&
1343             (batadv_compare_eth(router->addr, prev_sender)) &&
1344             !(batadv_compare_eth(ogm_packet->orig, prev_sender)) &&
1345             (batadv_compare_eth(router->addr, router_router->addr))) {
1346                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1347                            "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n",
1348                            ethhdr->h_source);
1349                 goto out;
1350         }
1351
1352         if (if_outgoing == BATADV_IF_DEFAULT)
1353                 batadv_tvlv_ogm_receive(bat_priv, ogm_packet, orig_node);
1354
1355         /* if sender is a direct neighbor the sender mac equals
1356          * originator mac
1357          */
1358         if (is_single_hop_neigh)
1359                 orig_neigh_node = orig_node;
1360         else
1361                 orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
1362                                                          ethhdr->h_source);
1363
1364         if (!orig_neigh_node)
1365                 goto out;
1366
1367         /* Update nc_nodes of the originator */
1368         batadv_nc_update_nc_node(bat_priv, orig_node, orig_neigh_node,
1369                                  ogm_packet, is_single_hop_neigh);
1370
1371         orig_neigh_router = batadv_orig_router_get(orig_neigh_node,
1372                                                    if_outgoing);
1373
1374         /* drop packet if sender is not a direct neighbor and if we
1375          * don't route towards it
1376          */
1377         if (!is_single_hop_neigh && !orig_neigh_router) {
1378                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1379                            "Drop packet: OGM via unknown neighbor!\n");
1380                 goto out_neigh;
1381         }
1382
1383         is_bidirect = batadv_iv_ogm_calc_tq(orig_node, orig_neigh_node,
1384                                             ogm_packet, if_incoming,
1385                                             if_outgoing);
1386
1387         /* update ranking if it is not a duplicate or has the same
1388          * seqno and similar ttl as the non-duplicate
1389          */
1390         orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
1391         if (!orig_ifinfo)
1392                 goto out_neigh;
1393
1394         sameseq = orig_ifinfo->last_real_seqno == ntohl(ogm_packet->seqno);
1395         similar_ttl = (orig_ifinfo->last_ttl - 3) <= ogm_packet->ttl;
1396
1397         if (is_bidirect && (dup_status == BATADV_NO_DUP ||
1398                             (sameseq && similar_ttl))) {
1399                 batadv_iv_ogm_orig_update(bat_priv, orig_node,
1400                                           orig_ifinfo, ethhdr,
1401                                           ogm_packet, if_incoming,
1402                                           if_outgoing, dup_status);
1403         }
1404         batadv_orig_ifinfo_put(orig_ifinfo);
1405
1406         /* only forward for specific interface, not for the default one. */
1407         if (if_outgoing == BATADV_IF_DEFAULT)
1408                 goto out_neigh;
1409
1410         /* is single hop (direct) neighbor */
1411         if (is_single_hop_neigh) {
1412                 /* OGMs from secondary interfaces should only scheduled once
1413                  * per interface where it has been received, not multiple times
1414                  */
1415                 if (ogm_packet->ttl <= 2 &&
1416                     if_incoming != if_outgoing) {
1417                         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1418                                    "Drop packet: OGM from secondary interface and wrong outgoing interface\n");
1419                         goto out_neigh;
1420                 }
1421                 /* mark direct link on incoming interface */
1422                 batadv_iv_ogm_forward(orig_node, ethhdr, ogm_packet,
1423                                       is_single_hop_neigh,
1424                                       is_from_best_next_hop, if_incoming,
1425                                       if_outgoing);
1426
1427                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1428                            "Forwarding packet: rebroadcast neighbor packet with direct link flag\n");
1429                 goto out_neigh;
1430         }
1431
1432         /* multihop originator */
1433         if (!is_bidirect) {
1434                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1435                            "Drop packet: not received via bidirectional link\n");
1436                 goto out_neigh;
1437         }
1438
1439         if (dup_status == BATADV_NEIGH_DUP) {
1440                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1441                            "Drop packet: duplicate packet received\n");
1442                 goto out_neigh;
1443         }
1444
1445         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1446                    "Forwarding packet: rebroadcast originator packet\n");
1447         batadv_iv_ogm_forward(orig_node, ethhdr, ogm_packet,
1448                               is_single_hop_neigh, is_from_best_next_hop,
1449                               if_incoming, if_outgoing);
1450
1451 out_neigh:
1452         if (orig_neigh_node && !is_single_hop_neigh)
1453                 batadv_orig_node_put(orig_neigh_node);
1454 out:
1455         if (router_ifinfo)
1456                 batadv_neigh_ifinfo_put(router_ifinfo);
1457         if (router)
1458                 batadv_neigh_node_put(router);
1459         if (router_router)
1460                 batadv_neigh_node_put(router_router);
1461         if (orig_neigh_router)
1462                 batadv_neigh_node_put(orig_neigh_router);
1463         if (hardif_neigh)
1464                 batadv_hardif_neigh_put(hardif_neigh);
1465
1466         consume_skb(skb_priv);
1467 }
1468
1469 /**
1470  * batadv_iv_ogm_process_reply() - Check OGM for direct reply and process it
1471  * @ogm_packet: rebroadcast OGM packet to process
1472  * @if_incoming: the interface where this packet was received
1473  * @orig_node: originator which reproadcasted the OGMs
1474  * @if_incoming_seqno: OGM sequence number when rebroadcast was received
1475  */
1476 static void batadv_iv_ogm_process_reply(struct batadv_ogm_packet *ogm_packet,
1477                                         struct batadv_hard_iface *if_incoming,
1478                                         struct batadv_orig_node *orig_node,
1479                                         u32 if_incoming_seqno)
1480 {
1481         struct batadv_orig_ifinfo *orig_ifinfo;
1482         s32 bit_pos;
1483         u8 *weight;
1484
1485         /* neighbor has to indicate direct link and it has to
1486          * come via the corresponding interface
1487          */
1488         if (!(ogm_packet->flags & BATADV_DIRECTLINK))
1489                 return;
1490
1491         if (!batadv_compare_eth(if_incoming->net_dev->dev_addr,
1492                                 ogm_packet->orig))
1493                 return;
1494
1495         orig_ifinfo = batadv_orig_ifinfo_get(orig_node, if_incoming);
1496         if (!orig_ifinfo)
1497                 return;
1498
1499         /* save packet seqno for bidirectional check */
1500         spin_lock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1501         bit_pos = if_incoming_seqno - 2;
1502         bit_pos -= ntohl(ogm_packet->seqno);
1503         batadv_set_bit(orig_ifinfo->bat_iv.bcast_own, bit_pos);
1504         weight = &orig_ifinfo->bat_iv.bcast_own_sum;
1505         *weight = bitmap_weight(orig_ifinfo->bat_iv.bcast_own,
1506                                 BATADV_TQ_LOCAL_WINDOW_SIZE);
1507         spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
1508
1509         batadv_orig_ifinfo_put(orig_ifinfo);
1510 }
1511
1512 /**
1513  * batadv_iv_ogm_process() - process an incoming batman iv OGM
1514  * @skb: the skb containing the OGM
1515  * @ogm_offset: offset to the OGM which should be processed (for aggregates)
1516  * @if_incoming: the interface where this packet was receved
1517  */
1518 static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
1519                                   struct batadv_hard_iface *if_incoming)
1520 {
1521         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1522         struct batadv_orig_node *orig_neigh_node, *orig_node;
1523         struct batadv_hard_iface *hard_iface;
1524         struct batadv_ogm_packet *ogm_packet;
1525         u32 if_incoming_seqno;
1526         bool has_directlink_flag;
1527         struct ethhdr *ethhdr;
1528         bool is_my_oldorig = false;
1529         bool is_my_addr = false;
1530         bool is_my_orig = false;
1531
1532         ogm_packet = (struct batadv_ogm_packet *)(skb->data + ogm_offset);
1533         ethhdr = eth_hdr(skb);
1534
1535         /* Silently drop when the batman packet is actually not a
1536          * correct packet.
1537          *
1538          * This might happen if a packet is padded (e.g. Ethernet has a
1539          * minimum frame length of 64 byte) and the aggregation interprets
1540          * it as an additional length.
1541          *
1542          * TODO: A more sane solution would be to have a bit in the
1543          * batadv_ogm_packet to detect whether the packet is the last
1544          * packet in an aggregation.  Here we expect that the padding
1545          * is always zero (or not 0x01)
1546          */
1547         if (ogm_packet->packet_type != BATADV_IV_OGM)
1548                 return;
1549
1550         /* could be changed by schedule_own_packet() */
1551         if_incoming_seqno = atomic_read(&if_incoming->bat_iv.ogm_seqno);
1552
1553         if (ogm_packet->flags & BATADV_DIRECTLINK)
1554                 has_directlink_flag = true;
1555         else
1556                 has_directlink_flag = false;
1557
1558         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1559                    "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",
1560                    ethhdr->h_source, if_incoming->net_dev->name,
1561                    if_incoming->net_dev->dev_addr, ogm_packet->orig,
1562                    ogm_packet->prev_sender, ntohl(ogm_packet->seqno),
1563                    ogm_packet->tq, ogm_packet->ttl,
1564                    ogm_packet->version, has_directlink_flag);
1565
1566         rcu_read_lock();
1567         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
1568                 if (hard_iface->if_status != BATADV_IF_ACTIVE)
1569                         continue;
1570
1571                 if (hard_iface->soft_iface != if_incoming->soft_iface)
1572                         continue;
1573
1574                 if (batadv_compare_eth(ethhdr->h_source,
1575                                        hard_iface->net_dev->dev_addr))
1576                         is_my_addr = true;
1577
1578                 if (batadv_compare_eth(ogm_packet->orig,
1579                                        hard_iface->net_dev->dev_addr))
1580                         is_my_orig = true;
1581
1582                 if (batadv_compare_eth(ogm_packet->prev_sender,
1583                                        hard_iface->net_dev->dev_addr))
1584                         is_my_oldorig = true;
1585         }
1586         rcu_read_unlock();
1587
1588         if (is_my_addr) {
1589                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1590                            "Drop packet: received my own broadcast (sender: %pM)\n",
1591                            ethhdr->h_source);
1592                 return;
1593         }
1594
1595         if (is_my_orig) {
1596                 orig_neigh_node = batadv_iv_ogm_orig_get(bat_priv,
1597                                                          ethhdr->h_source);
1598                 if (!orig_neigh_node)
1599                         return;
1600
1601                 batadv_iv_ogm_process_reply(ogm_packet, if_incoming,
1602                                             orig_neigh_node, if_incoming_seqno);
1603
1604                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1605                            "Drop packet: originator packet from myself (via neighbor)\n");
1606                 batadv_orig_node_put(orig_neigh_node);
1607                 return;
1608         }
1609
1610         if (is_my_oldorig) {
1611                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1612                            "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n",
1613                            ethhdr->h_source);
1614                 return;
1615         }
1616
1617         if (ogm_packet->flags & BATADV_NOT_BEST_NEXT_HOP) {
1618                 batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
1619                            "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n",
1620                            ethhdr->h_source);
1621                 return;
1622         }
1623
1624         orig_node = batadv_iv_ogm_orig_get(bat_priv, ogm_packet->orig);
1625         if (!orig_node)
1626                 return;
1627
1628         batadv_iv_ogm_process_per_outif(skb, ogm_offset, orig_node,
1629                                         if_incoming, BATADV_IF_DEFAULT);
1630
1631         rcu_read_lock();
1632         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
1633                 if (hard_iface->if_status != BATADV_IF_ACTIVE)
1634                         continue;
1635
1636                 if (hard_iface->soft_iface != bat_priv->soft_iface)
1637                         continue;
1638
1639                 if (!kref_get_unless_zero(&hard_iface->refcount))
1640                         continue;
1641
1642                 batadv_iv_ogm_process_per_outif(skb, ogm_offset, orig_node,
1643                                                 if_incoming, hard_iface);
1644
1645                 batadv_hardif_put(hard_iface);
1646         }
1647         rcu_read_unlock();
1648
1649         batadv_orig_node_put(orig_node);
1650 }
1651
1652 static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work)
1653 {
1654         struct delayed_work *delayed_work;
1655         struct batadv_forw_packet *forw_packet;
1656         struct batadv_priv *bat_priv;
1657         bool dropped = false;
1658
1659         delayed_work = to_delayed_work(work);
1660         forw_packet = container_of(delayed_work, struct batadv_forw_packet,
1661                                    delayed_work);
1662         bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
1663
1664         if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
1665                 dropped = true;
1666                 goto out;
1667         }
1668
1669         batadv_iv_ogm_emit(forw_packet);
1670
1671         /* we have to have at least one packet in the queue to determine the
1672          * queues wake up time unless we are shutting down.
1673          *
1674          * only re-schedule if this is the "original" copy, e.g. the OGM of the
1675          * primary interface should only be rescheduled once per period, but
1676          * this function will be called for the forw_packet instances of the
1677          * other secondary interfaces as well.
1678          */
1679         if (forw_packet->own &&
1680             forw_packet->if_incoming == forw_packet->if_outgoing)
1681                 batadv_iv_ogm_schedule(forw_packet->if_incoming);
1682
1683 out:
1684         /* do we get something for free()? */
1685         if (batadv_forw_packet_steal(forw_packet,
1686                                      &bat_priv->forw_bat_list_lock))
1687                 batadv_forw_packet_free(forw_packet, dropped);
1688 }
1689
1690 static int batadv_iv_ogm_receive(struct sk_buff *skb,
1691                                  struct batadv_hard_iface *if_incoming)
1692 {
1693         struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface);
1694         struct batadv_ogm_packet *ogm_packet;
1695         u8 *packet_pos;
1696         int ogm_offset;
1697         bool res;
1698         int ret = NET_RX_DROP;
1699
1700         res = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN);
1701         if (!res)
1702                 goto free_skb;
1703
1704         /* did we receive a B.A.T.M.A.N. IV OGM packet on an interface
1705          * that does not have B.A.T.M.A.N. IV enabled ?
1706          */
1707         if (bat_priv->algo_ops->iface.enable != batadv_iv_ogm_iface_enable)
1708                 goto free_skb;
1709
1710         batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_RX);
1711         batadv_add_counter(bat_priv, BATADV_CNT_MGMT_RX_BYTES,
1712                            skb->len + ETH_HLEN);
1713
1714         ogm_offset = 0;
1715         ogm_packet = (struct batadv_ogm_packet *)skb->data;
1716
1717         /* unpack the aggregated packets and process them one by one */
1718         while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
1719                                          ogm_packet->tvlv_len)) {
1720                 batadv_iv_ogm_process(skb, ogm_offset, if_incoming);
1721
1722                 ogm_offset += BATADV_OGM_HLEN;
1723                 ogm_offset += ntohs(ogm_packet->tvlv_len);
1724
1725                 packet_pos = skb->data + ogm_offset;
1726                 ogm_packet = (struct batadv_ogm_packet *)packet_pos;
1727         }
1728
1729         ret = NET_RX_SUCCESS;
1730
1731 free_skb:
1732         if (ret == NET_RX_SUCCESS)
1733                 consume_skb(skb);
1734         else
1735                 kfree_skb(skb);
1736
1737         return ret;
1738 }
1739
1740 #ifdef CONFIG_BATMAN_ADV_DEBUGFS
1741 /**
1742  * batadv_iv_ogm_orig_print_neigh() - print neighbors for the originator table
1743  * @orig_node: the orig_node for which the neighbors are printed
1744  * @if_outgoing: outgoing interface for these entries
1745  * @seq: debugfs table seq_file struct
1746  *
1747  * Must be called while holding an rcu lock.
1748  */
1749 static void
1750 batadv_iv_ogm_orig_print_neigh(struct batadv_orig_node *orig_node,
1751                                struct batadv_hard_iface *if_outgoing,
1752                                struct seq_file *seq)
1753 {
1754         struct batadv_neigh_node *neigh_node;
1755         struct batadv_neigh_ifinfo *n_ifinfo;
1756
1757         hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
1758                 n_ifinfo = batadv_neigh_ifinfo_get(neigh_node, if_outgoing);
1759                 if (!n_ifinfo)
1760                         continue;
1761
1762                 seq_printf(seq, " %pM (%3i)",
1763                            neigh_node->addr,
1764                            n_ifinfo->bat_iv.tq_avg);
1765
1766                 batadv_neigh_ifinfo_put(n_ifinfo);
1767         }
1768 }
1769
1770 /**
1771  * batadv_iv_ogm_orig_print() - print the originator table
1772  * @bat_priv: the bat priv with all the soft interface information
1773  * @seq: debugfs table seq_file struct
1774  * @if_outgoing: the outgoing interface for which this should be printed
1775  */
1776 static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv,
1777                                      struct seq_file *seq,
1778                                      struct batadv_hard_iface *if_outgoing)
1779 {
1780         struct batadv_neigh_node *neigh_node;
1781         struct batadv_hashtable *hash = bat_priv->orig_hash;
1782         int last_seen_msecs, last_seen_secs;
1783         struct batadv_orig_node *orig_node;
1784         struct batadv_neigh_ifinfo *n_ifinfo;
1785         unsigned long last_seen_jiffies;
1786         struct hlist_head *head;
1787         int batman_count = 0;
1788         u32 i;
1789
1790         seq_puts(seq,
1791                  "  Originator      last-seen (#/255)           Nexthop [outgoingIF]:   Potential nexthops ...\n");
1792
1793         for (i = 0; i < hash->size; i++) {
1794                 head = &hash->table[i];
1795
1796                 rcu_read_lock();
1797                 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1798                         neigh_node = batadv_orig_router_get(orig_node,
1799                                                             if_outgoing);
1800                         if (!neigh_node)
1801                                 continue;
1802
1803                         n_ifinfo = batadv_neigh_ifinfo_get(neigh_node,
1804                                                            if_outgoing);
1805                         if (!n_ifinfo)
1806                                 goto next;
1807
1808                         if (n_ifinfo->bat_iv.tq_avg == 0)
1809                                 goto next;
1810
1811                         last_seen_jiffies = jiffies - orig_node->last_seen;
1812                         last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
1813                         last_seen_secs = last_seen_msecs / 1000;
1814                         last_seen_msecs = last_seen_msecs % 1000;
1815
1816                         seq_printf(seq, "%pM %4i.%03is   (%3i) %pM [%10s]:",
1817                                    orig_node->orig, last_seen_secs,
1818                                    last_seen_msecs, n_ifinfo->bat_iv.tq_avg,
1819                                    neigh_node->addr,
1820                                    neigh_node->if_incoming->net_dev->name);
1821
1822                         batadv_iv_ogm_orig_print_neigh(orig_node, if_outgoing,
1823                                                        seq);
1824                         seq_putc(seq, '\n');
1825                         batman_count++;
1826
1827 next:
1828                         batadv_neigh_node_put(neigh_node);
1829                         if (n_ifinfo)
1830                                 batadv_neigh_ifinfo_put(n_ifinfo);
1831                 }
1832                 rcu_read_unlock();
1833         }
1834
1835         if (batman_count == 0)
1836                 seq_puts(seq, "No batman nodes in range ...\n");
1837 }
1838 #endif
1839
1840 /**
1841  * batadv_iv_ogm_neigh_get_tq_avg() - Get the TQ average for a neighbour on a
1842  *  given outgoing interface.
1843  * @neigh_node: Neighbour of interest
1844  * @if_outgoing: Outgoing interface of interest
1845  * @tq_avg: Pointer of where to store the TQ average
1846  *
1847  * Return: False if no average TQ available, otherwise true.
1848  */
1849 static bool
1850 batadv_iv_ogm_neigh_get_tq_avg(struct batadv_neigh_node *neigh_node,
1851                                struct batadv_hard_iface *if_outgoing,
1852                                u8 *tq_avg)
1853 {
1854         struct batadv_neigh_ifinfo *n_ifinfo;
1855
1856         n_ifinfo = batadv_neigh_ifinfo_get(neigh_node, if_outgoing);
1857         if (!n_ifinfo)
1858                 return false;
1859
1860         *tq_avg = n_ifinfo->bat_iv.tq_avg;
1861         batadv_neigh_ifinfo_put(n_ifinfo);
1862
1863         return true;
1864 }
1865
1866 /**
1867  * batadv_iv_ogm_orig_dump_subentry() - Dump an originator subentry into a
1868  *  message
1869  * @msg: Netlink message to dump into
1870  * @portid: Port making netlink request
1871  * @seq: Sequence number of netlink message
1872  * @bat_priv: The bat priv with all the soft interface information
1873  * @if_outgoing: Limit dump to entries with this outgoing interface
1874  * @orig_node: Originator to dump
1875  * @neigh_node: Single hops neighbour
1876  * @best: Is the best originator
1877  *
1878  * Return: Error code, or 0 on success
1879  */
1880 static int
1881 batadv_iv_ogm_orig_dump_subentry(struct sk_buff *msg, u32 portid, u32 seq,
1882                                  struct batadv_priv *bat_priv,
1883                                  struct batadv_hard_iface *if_outgoing,
1884                                  struct batadv_orig_node *orig_node,
1885                                  struct batadv_neigh_node *neigh_node,
1886                                  bool best)
1887 {
1888         void *hdr;
1889         u8 tq_avg;
1890         unsigned int last_seen_msecs;
1891
1892         last_seen_msecs = jiffies_to_msecs(jiffies - orig_node->last_seen);
1893
1894         if (!batadv_iv_ogm_neigh_get_tq_avg(neigh_node, if_outgoing, &tq_avg))
1895                 return 0;
1896
1897         if (if_outgoing != BATADV_IF_DEFAULT &&
1898             if_outgoing != neigh_node->if_incoming)
1899                 return 0;
1900
1901         hdr = genlmsg_put(msg, portid, seq, &batadv_netlink_family,
1902                           NLM_F_MULTI, BATADV_CMD_GET_ORIGINATORS);
1903         if (!hdr)
1904                 return -ENOBUFS;
1905
1906         if (nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN,
1907                     orig_node->orig) ||
1908             nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN,
1909                     neigh_node->addr) ||
1910             nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
1911                         neigh_node->if_incoming->net_dev->ifindex) ||
1912             nla_put_u8(msg, BATADV_ATTR_TQ, tq_avg) ||
1913             nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS,
1914                         last_seen_msecs))
1915                 goto nla_put_failure;
1916
1917         if (best && nla_put_flag(msg, BATADV_ATTR_FLAG_BEST))
1918                 goto nla_put_failure;
1919
1920         genlmsg_end(msg, hdr);
1921         return 0;
1922
1923  nla_put_failure:
1924         genlmsg_cancel(msg, hdr);
1925         return -EMSGSIZE;
1926 }
1927
1928 /**
1929  * batadv_iv_ogm_orig_dump_entry() - Dump an originator entry into a message
1930  * @msg: Netlink message to dump into
1931  * @portid: Port making netlink request
1932  * @seq: Sequence number of netlink message
1933  * @bat_priv: The bat priv with all the soft interface information
1934  * @if_outgoing: Limit dump to entries with this outgoing interface
1935  * @orig_node: Originator to dump
1936  * @sub_s: Number of sub entries to skip
1937  *
1938  * This function assumes the caller holds rcu_read_lock().
1939  *
1940  * Return: Error code, or 0 on success
1941  */
1942 static int
1943 batadv_iv_ogm_orig_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
1944                               struct batadv_priv *bat_priv,
1945                               struct batadv_hard_iface *if_outgoing,
1946                               struct batadv_orig_node *orig_node, int *sub_s)
1947 {
1948         struct batadv_neigh_node *neigh_node_best;
1949         struct batadv_neigh_node *neigh_node;
1950         int sub = 0;
1951         bool best;
1952         u8 tq_avg_best;
1953
1954         neigh_node_best = batadv_orig_router_get(orig_node, if_outgoing);
1955         if (!neigh_node_best)
1956                 goto out;
1957
1958         if (!batadv_iv_ogm_neigh_get_tq_avg(neigh_node_best, if_outgoing,
1959                                             &tq_avg_best))
1960                 goto out;
1961
1962         if (tq_avg_best == 0)
1963                 goto out;
1964
1965         hlist_for_each_entry_rcu(neigh_node, &orig_node->neigh_list, list) {
1966                 if (sub++ < *sub_s)
1967                         continue;
1968
1969                 best = (neigh_node == neigh_node_best);
1970
1971                 if (batadv_iv_ogm_orig_dump_subentry(msg, portid, seq,
1972                                                      bat_priv, if_outgoing,
1973                                                      orig_node, neigh_node,
1974                                                      best)) {
1975                         batadv_neigh_node_put(neigh_node_best);
1976
1977                         *sub_s = sub - 1;
1978                         return -EMSGSIZE;
1979                 }
1980         }
1981
1982  out:
1983         if (neigh_node_best)
1984                 batadv_neigh_node_put(neigh_node_best);
1985
1986         *sub_s = 0;
1987         return 0;
1988 }
1989
1990 /**
1991  * batadv_iv_ogm_orig_dump_bucket() - Dump an originator bucket into a
1992  *  message
1993  * @msg: Netlink message to dump into
1994  * @portid: Port making netlink request
1995  * @seq: Sequence number of netlink message
1996  * @bat_priv: The bat priv with all the soft interface information
1997  * @if_outgoing: Limit dump to entries with this outgoing interface
1998  * @head: Bucket to be dumped
1999  * @idx_s: Number of entries to be skipped
2000  * @sub: Number of sub entries to be skipped
2001  *
2002  * Return: Error code, or 0 on success
2003  */
2004 static int
2005 batadv_iv_ogm_orig_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
2006                                struct batadv_priv *bat_priv,
2007                                struct batadv_hard_iface *if_outgoing,
2008                                struct hlist_head *head, int *idx_s, int *sub)
2009 {
2010         struct batadv_orig_node *orig_node;
2011         int idx = 0;
2012
2013         rcu_read_lock();
2014         hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
2015                 if (idx++ < *idx_s)
2016                         continue;
2017
2018                 if (batadv_iv_ogm_orig_dump_entry(msg, portid, seq, bat_priv,
2019                                                   if_outgoing, orig_node,
2020                                                   sub)) {
2021                         rcu_read_unlock();
2022                         *idx_s = idx - 1;
2023                         return -EMSGSIZE;
2024                 }
2025         }
2026         rcu_read_unlock();
2027
2028         *idx_s = 0;
2029         *sub = 0;
2030         return 0;
2031 }
2032
2033 /**
2034  * batadv_iv_ogm_orig_dump() - Dump the originators into a message
2035  * @msg: Netlink message to dump into
2036  * @cb: Control block containing additional options
2037  * @bat_priv: The bat priv with all the soft interface information
2038  * @if_outgoing: Limit dump to entries with this outgoing interface
2039  */
2040 static void
2041 batadv_iv_ogm_orig_dump(struct sk_buff *msg, struct netlink_callback *cb,
2042                         struct batadv_priv *bat_priv,
2043                         struct batadv_hard_iface *if_outgoing)
2044 {
2045         struct batadv_hashtable *hash = bat_priv->orig_hash;
2046         struct hlist_head *head;
2047         int bucket = cb->args[0];
2048         int idx = cb->args[1];
2049         int sub = cb->args[2];
2050         int portid = NETLINK_CB(cb->skb).portid;
2051
2052         while (bucket < hash->size) {
2053                 head = &hash->table[bucket];
2054
2055                 if (batadv_iv_ogm_orig_dump_bucket(msg, portid,
2056                                                    cb->nlh->nlmsg_seq,
2057                                                    bat_priv, if_outgoing, head,
2058                                                    &idx, &sub))
2059                         break;
2060
2061                 bucket++;
2062         }
2063
2064         cb->args[0] = bucket;
2065         cb->args[1] = idx;
2066         cb->args[2] = sub;
2067 }
2068
2069 #ifdef CONFIG_BATMAN_ADV_DEBUGFS
2070 /**
2071  * batadv_iv_hardif_neigh_print() - print a single hop neighbour node
2072  * @seq: neighbour table seq_file struct
2073  * @hardif_neigh: hardif neighbour information
2074  */
2075 static void
2076 batadv_iv_hardif_neigh_print(struct seq_file *seq,
2077                              struct batadv_hardif_neigh_node *hardif_neigh)
2078 {
2079         int last_secs, last_msecs;
2080
2081         last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000;
2082         last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000;
2083
2084         seq_printf(seq, "   %10s   %pM %4i.%03is\n",
2085                    hardif_neigh->if_incoming->net_dev->name,
2086                    hardif_neigh->addr, last_secs, last_msecs);
2087 }
2088
2089 /**
2090  * batadv_iv_ogm_neigh_print() - print the single hop neighbour list
2091  * @bat_priv: the bat priv with all the soft interface information
2092  * @seq: neighbour table seq_file struct
2093  */
2094 static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
2095                                   struct seq_file *seq)
2096 {
2097         struct net_device *net_dev = (struct net_device *)seq->private;
2098         struct batadv_hardif_neigh_node *hardif_neigh;
2099         struct batadv_hard_iface *hard_iface;
2100         int batman_count = 0;
2101
2102         seq_puts(seq, "           IF        Neighbor      last-seen\n");
2103
2104         rcu_read_lock();
2105         list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
2106                 if (hard_iface->soft_iface != net_dev)
2107                         continue;
2108
2109                 hlist_for_each_entry_rcu(hardif_neigh,
2110                                          &hard_iface->neigh_list, list) {
2111                         batadv_iv_hardif_neigh_print(seq, hardif_neigh);
2112                         batman_count++;
2113                 }
2114         }
2115         rcu_read_unlock();
2116
2117         if (batman_count == 0)
2118                 seq_puts(seq, "No batman nodes in range ...\n");
2119 }
2120 #endif
2121
2122 /**
2123  * batadv_iv_ogm_neigh_diff() - calculate tq difference of two neighbors
2124  * @neigh1: the first neighbor object of the comparison
2125  * @if_outgoing1: outgoing interface for the first neighbor
2126  * @neigh2: the second neighbor object of the comparison
2127  * @if_outgoing2: outgoing interface for the second neighbor
2128  * @diff: pointer to integer receiving the calculated difference
2129  *
2130  * The content of *@diff is only valid when this function returns true.
2131  * It is less, equal to or greater than 0 if the metric via neigh1 is lower,
2132  * the same as or higher than the metric via neigh2
2133  *
2134  * Return: true when the difference could be calculated, false otherwise
2135  */
2136 static bool batadv_iv_ogm_neigh_diff(struct batadv_neigh_node *neigh1,
2137                                      struct batadv_hard_iface *if_outgoing1,
2138                                      struct batadv_neigh_node *neigh2,
2139                                      struct batadv_hard_iface *if_outgoing2,
2140                                      int *diff)
2141 {
2142         struct batadv_neigh_ifinfo *neigh1_ifinfo, *neigh2_ifinfo;
2143         u8 tq1, tq2;
2144         bool ret = true;
2145
2146         neigh1_ifinfo = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
2147         neigh2_ifinfo = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
2148
2149         if (!neigh1_ifinfo || !neigh2_ifinfo) {
2150                 ret = false;
2151                 goto out;
2152         }
2153
2154         tq1 = neigh1_ifinfo->bat_iv.tq_avg;
2155         tq2 = neigh2_ifinfo->bat_iv.tq_avg;
2156         *diff = (int)tq1 - (int)tq2;
2157
2158 out:
2159         if (neigh1_ifinfo)
2160                 batadv_neigh_ifinfo_put(neigh1_ifinfo);
2161         if (neigh2_ifinfo)
2162                 batadv_neigh_ifinfo_put(neigh2_ifinfo);
2163
2164         return ret;
2165 }
2166
2167 /**
2168  * batadv_iv_ogm_neigh_dump_neigh() - Dump a neighbour into a netlink message
2169  * @msg: Netlink message to dump into
2170  * @portid: Port making netlink request
2171  * @seq: Sequence number of netlink message
2172  * @hardif_neigh: Neighbour to be dumped
2173  *
2174  * Return: Error code, or 0 on success
2175  */
2176 static int
2177 batadv_iv_ogm_neigh_dump_neigh(struct sk_buff *msg, u32 portid, u32 seq,
2178                                struct batadv_hardif_neigh_node *hardif_neigh)
2179 {
2180         void *hdr;
2181         unsigned int last_seen_msecs;
2182
2183         last_seen_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen);
2184
2185         hdr = genlmsg_put(msg, portid, seq, &batadv_netlink_family,
2186                           NLM_F_MULTI, BATADV_CMD_GET_NEIGHBORS);
2187         if (!hdr)
2188                 return -ENOBUFS;
2189
2190         if (nla_put(msg, BATADV_ATTR_NEIGH_ADDRESS, ETH_ALEN,
2191                     hardif_neigh->addr) ||
2192             nla_put_u32(msg, BATADV_ATTR_HARD_IFINDEX,
2193                         hardif_neigh->if_incoming->net_dev->ifindex) ||
2194             nla_put_u32(msg, BATADV_ATTR_LAST_SEEN_MSECS,
2195                         last_seen_msecs))
2196                 goto nla_put_failure;
2197
2198         genlmsg_end(msg, hdr);
2199         return 0;
2200
2201  nla_put_failure:
2202         genlmsg_cancel(msg, hdr);
2203         return -EMSGSIZE;
2204 }
2205
2206 /**
2207  * batadv_iv_ogm_neigh_dump_hardif() - Dump the neighbours of a hard interface
2208  *  into a message
2209  * @msg: Netlink message to dump into
2210  * @portid: Port making netlink request
2211  * @seq: Sequence number of netlink message
2212  * @bat_priv: The bat priv with all the soft interface information
2213  * @hard_iface: Hard interface to dump the neighbours for
2214  * @idx_s: Number of entries to skip
2215  *
2216  * This function assumes the caller holds rcu_read_lock().
2217  *
2218  * Return: Error code, or 0 on success
2219  */
2220 static int
2221 batadv_iv_ogm_neigh_dump_hardif(struct sk_buff *msg, u32 portid, u32 seq,
2222                                 struct batadv_priv *bat_priv,
2223                                 struct batadv_hard_iface *hard_iface,
2224                                 int *idx_s)
2225 {
2226         struct batadv_hardif_neigh_node *hardif_neigh;
2227         int idx = 0;
2228
2229         hlist_for_each_entry_rcu(hardif_neigh,
2230                                  &hard_iface->neigh_list, list) {
2231                 if (idx++ < *idx_s)
2232                         continue;
2233
2234                 if (batadv_iv_ogm_neigh_dump_neigh(msg, portid, seq,
2235                                                    hardif_neigh)) {
2236                         *idx_s = idx - 1;
2237                         return -EMSGSIZE;
2238                 }
2239         }
2240
2241         *idx_s = 0;
2242         return 0;
2243 }
2244
2245 /**
2246  * batadv_iv_ogm_neigh_dump() - Dump the neighbours into a message
2247  * @msg: Netlink message to dump into
2248  * @cb: Control block containing additional options
2249  * @bat_priv: The bat priv with all the soft interface information
2250  * @single_hardif: Limit dump to this hard interfaace
2251  */
2252 static void
2253 batadv_iv_ogm_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb,
2254                          struct batadv_priv *bat_priv,
2255                          struct batadv_hard_iface *single_hardif)
2256 {
2257         struct batadv_hard_iface *hard_iface;
2258         int i_hardif = 0;
2259         int i_hardif_s = cb->args[0];
2260         int idx = cb->args[1];
2261         int portid = NETLINK_CB(cb->skb).portid;
2262
2263         rcu_read_lock();
2264         if (single_hardif) {
2265                 if (i_hardif_s == 0) {
2266                         if (batadv_iv_ogm_neigh_dump_hardif(msg, portid,
2267                                                             cb->nlh->nlmsg_seq,
2268                                                             bat_priv,
2269                                                             single_hardif,
2270                                                             &idx) == 0)
2271                                 i_hardif++;
2272                 }
2273         } else {
2274                 list_for_each_entry_rcu(hard_iface, &batadv_hardif_list,
2275                                         list) {
2276                         if (hard_iface->soft_iface != bat_priv->soft_iface)
2277                                 continue;
2278
2279                         if (i_hardif++ < i_hardif_s)
2280                                 continue;
2281
2282                         if (batadv_iv_ogm_neigh_dump_hardif(msg, portid,
2283                                                             cb->nlh->nlmsg_seq,
2284                                                             bat_priv,
2285                                                             hard_iface, &idx)) {
2286                                 i_hardif--;
2287                                 break;
2288                         }
2289                 }
2290         }
2291         rcu_read_unlock();
2292
2293         cb->args[0] = i_hardif;
2294         cb->args[1] = idx;
2295 }
2296
2297 /**
2298  * batadv_iv_ogm_neigh_cmp() - compare the metrics of two neighbors
2299  * @neigh1: the first neighbor object of the comparison
2300  * @if_outgoing1: outgoing interface for the first neighbor
2301  * @neigh2: the second neighbor object of the comparison
2302  * @if_outgoing2: outgoing interface for the second neighbor
2303  *
2304  * Return: a value less, equal to or greater than 0 if the metric via neigh1 is
2305  * lower, the same as or higher than the metric via neigh2
2306  */
2307 static int batadv_iv_ogm_neigh_cmp(struct batadv_neigh_node *neigh1,
2308                                    struct batadv_hard_iface *if_outgoing1,
2309                                    struct batadv_neigh_node *neigh2,
2310                                    struct batadv_hard_iface *if_outgoing2)
2311 {
2312         bool ret;
2313         int diff;
2314
2315         ret = batadv_iv_ogm_neigh_diff(neigh1, if_outgoing1, neigh2,
2316                                        if_outgoing2, &diff);
2317         if (!ret)
2318                 return 0;
2319
2320         return diff;
2321 }
2322
2323 /**
2324  * batadv_iv_ogm_neigh_is_sob() - check if neigh1 is similarly good or better
2325  *  than neigh2 from the metric prospective
2326  * @neigh1: the first neighbor object of the comparison
2327  * @if_outgoing1: outgoing interface for the first neighbor
2328  * @neigh2: the second neighbor object of the comparison
2329  * @if_outgoing2: outgoing interface for the second neighbor
2330  *
2331  * Return: true if the metric via neigh1 is equally good or better than
2332  * the metric via neigh2, false otherwise.
2333  */
2334 static bool
2335 batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
2336                            struct batadv_hard_iface *if_outgoing1,
2337                            struct batadv_neigh_node *neigh2,
2338                            struct batadv_hard_iface *if_outgoing2)
2339 {
2340         bool ret;
2341         int diff;
2342
2343         ret = batadv_iv_ogm_neigh_diff(neigh1, if_outgoing1, neigh2,
2344                                        if_outgoing2, &diff);
2345         if (!ret)
2346                 return false;
2347
2348         ret = diff > -BATADV_TQ_SIMILARITY_THRESHOLD;
2349         return ret;
2350 }
2351
2352 static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface)
2353 {
2354         /* begin scheduling originator messages on that interface */
2355         batadv_iv_ogm_schedule(hard_iface);
2356 }
2357
2358 /**
2359  * batadv_iv_init_sel_class() - initialize GW selection class
2360  * @bat_priv: the bat priv with all the soft interface information
2361  */
2362 static void batadv_iv_init_sel_class(struct batadv_priv *bat_priv)
2363 {
2364         /* set default TQ difference threshold to 20 */
2365         atomic_set(&bat_priv->gw.sel_class, 20);
2366 }
2367
2368 static struct batadv_gw_node *
2369 batadv_iv_gw_get_best_gw_node(struct batadv_priv *bat_priv)
2370 {
2371         struct batadv_neigh_node *router;
2372         struct batadv_neigh_ifinfo *router_ifinfo;
2373         struct batadv_gw_node *gw_node, *curr_gw = NULL;
2374         u64 max_gw_factor = 0;
2375         u64 tmp_gw_factor = 0;
2376         u8 max_tq = 0;
2377         u8 tq_avg;
2378         struct batadv_orig_node *orig_node;
2379
2380         rcu_read_lock();
2381         hlist_for_each_entry_rcu(gw_node, &bat_priv->gw.gateway_list, list) {
2382                 orig_node = gw_node->orig_node;
2383                 router = batadv_orig_router_get(orig_node, BATADV_IF_DEFAULT);
2384                 if (!router)
2385                         continue;
2386
2387                 router_ifinfo = batadv_neigh_ifinfo_get(router,
2388                                                         BATADV_IF_DEFAULT);
2389                 if (!router_ifinfo)
2390                         goto next;
2391
2392                 if (!kref_get_unless_zero(&gw_node->refcount))
2393                         goto next;
2394
2395                 tq_avg = router_ifinfo->bat_iv.tq_avg;
2396
2397                 switch (atomic_read(&bat_priv->gw.sel_class)) {
2398                 case 1: /* fast connection */
2399                         tmp_gw_factor = tq_avg * tq_avg;
2400                         tmp_gw_factor *= gw_node->bandwidth_down;
2401                         tmp_gw_factor *= 100 * 100;
2402                         tmp_gw_factor >>= 18;
2403
2404                         if (tmp_gw_factor > max_gw_factor ||
2405                             (tmp_gw_factor == max_gw_factor &&
2406                              tq_avg > max_tq)) {
2407                                 if (curr_gw)
2408                                         batadv_gw_node_put(curr_gw);
2409                                 curr_gw = gw_node;
2410                                 kref_get(&curr_gw->refcount);
2411                         }
2412                         break;
2413
2414                 default: /* 2:  stable connection (use best statistic)
2415                           * 3:  fast-switch (use best statistic but change as
2416                           *     soon as a better gateway appears)
2417                           * XX: late-switch (use best statistic but change as
2418                           *     soon as a better gateway appears which has
2419                           *     $routing_class more tq points)
2420                           */
2421                         if (tq_avg > max_tq) {
2422                                 if (curr_gw)
2423                                         batadv_gw_node_put(curr_gw);
2424                                 curr_gw = gw_node;
2425                                 kref_get(&curr_gw->refcount);
2426                         }
2427                         break;
2428                 }
2429
2430                 if (tq_avg > max_tq)
2431                         max_tq = tq_avg;
2432
2433                 if (tmp_gw_factor > max_gw_factor)
2434                         max_gw_factor = tmp_gw_factor;
2435
2436                 batadv_gw_node_put(gw_node);
2437
2438 next:
2439                 batadv_neigh_node_put(router);
2440                 if (router_ifinfo)
2441                         batadv_neigh_ifinfo_put(router_ifinfo);
2442         }
2443         rcu_read_unlock();
2444
2445         return curr_gw;
2446 }
2447
2448 static bool batadv_iv_gw_is_eligible(struct batadv_priv *bat_priv,
2449                                      struct batadv_orig_node *curr_gw_orig,
2450                                      struct batadv_orig_node *orig_node)
2451 {
2452         struct batadv_neigh_ifinfo *router_orig_ifinfo = NULL;
2453         struct batadv_neigh_ifinfo *router_gw_ifinfo = NULL;
2454         struct batadv_neigh_node *router_gw = NULL;
2455         struct batadv_neigh_node *router_orig = NULL;
2456         u8 gw_tq_avg, orig_tq_avg;
2457         bool ret = false;
2458
2459         /* dynamic re-election is performed only on fast or late switch */
2460         if (atomic_read(&bat_priv->gw.sel_class) <= 2)
2461                 return false;
2462
2463         router_gw = batadv_orig_router_get(curr_gw_orig, BATADV_IF_DEFAULT);
2464         if (!router_gw) {
2465                 ret = true;
2466                 goto out;
2467         }
2468
2469         router_gw_ifinfo = batadv_neigh_ifinfo_get(router_gw,
2470                                                    BATADV_IF_DEFAULT);
2471         if (!router_gw_ifinfo) {
2472                 ret = true;
2473                 goto out;
2474         }
2475
2476         router_orig = batadv_orig_router_get(orig_node, BATADV_IF_DEFAULT);
2477         if (!router_orig)
2478                 goto out;
2479
2480         router_orig_ifinfo = batadv_neigh_ifinfo_get(router_orig,
2481                                                      BATADV_IF_DEFAULT);
2482         if (!router_orig_ifinfo)
2483                 goto out;
2484
2485         gw_tq_avg = router_gw_ifinfo->bat_iv.tq_avg;
2486         orig_tq_avg = router_orig_ifinfo->bat_iv.tq_avg;
2487
2488         /* the TQ value has to be better */
2489         if (orig_tq_avg < gw_tq_avg)
2490                 goto out;
2491
2492         /* if the routing class is greater than 3 the value tells us how much
2493          * greater the TQ value of the new gateway must be
2494          */
2495         if ((atomic_read(&bat_priv->gw.sel_class) > 3) &&
2496             (orig_tq_avg - gw_tq_avg < atomic_read(&bat_priv->gw.sel_class)))
2497                 goto out;
2498
2499         batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
2500                    "Restarting gateway selection: better gateway found (tq curr: %i, tq new: %i)\n",
2501                    gw_tq_avg, orig_tq_avg);
2502
2503         ret = true;
2504 out:
2505         if (router_gw_ifinfo)
2506                 batadv_neigh_ifinfo_put(router_gw_ifinfo);
2507         if (router_orig_ifinfo)
2508                 batadv_neigh_ifinfo_put(router_orig_ifinfo);
2509         if (router_gw)
2510                 batadv_neigh_node_put(router_gw);
2511         if (router_orig)
2512                 batadv_neigh_node_put(router_orig);
2513
2514         return ret;
2515 }
2516
2517 #ifdef CONFIG_BATMAN_ADV_DEBUGFS
2518 /* fails if orig_node has no router */
2519 static int batadv_iv_gw_write_buffer_text(struct batadv_priv *bat_priv,
2520                                           struct seq_file *seq,
2521                                           const struct batadv_gw_node *gw_node)
2522 {
2523         struct batadv_gw_node *curr_gw;
2524         struct batadv_neigh_node *router;
2525         struct batadv_neigh_ifinfo *router_ifinfo = NULL;
2526         int ret = -1;
2527
2528         router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
2529         if (!router)
2530                 goto out;
2531
2532         router_ifinfo = batadv_neigh_ifinfo_get(router, BATADV_IF_DEFAULT);
2533         if (!router_ifinfo)
2534                 goto out;
2535
2536         curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
2537
2538         seq_printf(seq, "%s %pM (%3i) %pM [%10s]: %u.%u/%u.%u MBit\n",
2539                    (curr_gw == gw_node ? "=>" : "  "),
2540                    gw_node->orig_node->orig,
2541                    router_ifinfo->bat_iv.tq_avg, router->addr,
2542                    router->if_incoming->net_dev->name,
2543                    gw_node->bandwidth_down / 10,
2544                    gw_node->bandwidth_down % 10,
2545                    gw_node->bandwidth_up / 10,
2546                    gw_node->bandwidth_up % 10);
2547         ret = seq_has_overflowed(seq) ? -1 : 0;
2548
2549         if (curr_gw)
2550                 batadv_gw_node_put(curr_gw);
2551 out:
2552         if (router_ifinfo)
2553                 batadv_neigh_ifinfo_put(router_ifinfo);
2554         if (router)
2555                 batadv_neigh_node_put(router);
2556         return ret;
2557 }
2558
2559 static void batadv_iv_gw_print(struct batadv_priv *bat_priv,
2560                                struct seq_file *seq)
2561 {
2562         struct batadv_gw_node *gw_node;
2563         int gw_count = 0;
2564
2565         seq_puts(seq,
2566                  "      Gateway      (#/255)           Nexthop [outgoingIF]: advertised uplink bandwidth\n");
2567
2568         rcu_read_lock();
2569         hlist_for_each_entry_rcu(gw_node, &bat_priv->gw.gateway_list, list) {
2570                 /* fails if orig_node has no router */
2571                 if (batadv_iv_gw_write_buffer_text(bat_priv, seq, gw_node) < 0)
2572                         continue;
2573
2574                 gw_count++;
2575         }
2576         rcu_read_unlock();
2577
2578         if (gw_count == 0)
2579                 seq_puts(seq, "No gateways in range ...\n");
2580 }
2581 #endif
2582
2583 /**
2584  * batadv_iv_gw_dump_entry() - Dump a gateway into a message
2585  * @msg: Netlink message to dump into
2586  * @portid: Port making netlink request
2587  * @cb: Control block containing additional options
2588  * @bat_priv: The bat priv with all the soft interface information
2589  * @gw_node: Gateway to be dumped
2590  *
2591  * Return: Error code, or 0 on success
2592  */
2593 static int batadv_iv_gw_dump_entry(struct sk_buff *msg, u32 portid,
2594                                    struct netlink_callback *cb,
2595                                    struct batadv_priv *bat_priv,
2596                                    struct batadv_gw_node *gw_node)
2597 {
2598         struct batadv_neigh_ifinfo *router_ifinfo = NULL;
2599         struct batadv_neigh_node *router;
2600         struct batadv_gw_node *curr_gw = NULL;
2601         int ret = 0;
2602         void *hdr;
2603
2604         router = batadv_orig_router_get(gw_node->orig_node, BATADV_IF_DEFAULT);
2605         if (!router)
2606                 goto out;
2607
2608         router_ifinfo = batadv_neigh_ifinfo_get(router, BATADV_IF_DEFAULT);
2609         if (!router_ifinfo)
2610                 goto out;
2611
2612         curr_gw = batadv_gw_get_selected_gw_node(bat_priv);
2613
2614         hdr = genlmsg_put(msg, portid, cb->nlh->nlmsg_seq,
2615                           &batadv_netlink_family, NLM_F_MULTI,
2616                           BATADV_CMD_GET_GATEWAYS);
2617         if (!hdr) {
2618                 ret = -ENOBUFS;
2619                 goto out;
2620         }
2621
2622         genl_dump_check_consistent(cb, hdr);
2623
2624         ret = -EMSGSIZE;
2625
2626         if (curr_gw == gw_node)
2627                 if (nla_put_flag(msg, BATADV_ATTR_FLAG_BEST)) {
2628                         genlmsg_cancel(msg, hdr);
2629                         goto out;
2630                 }
2631
2632         if (nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN,
2633                     gw_node->orig_node->orig) ||
2634             nla_put_u8(msg, BATADV_ATTR_TQ, router_ifinfo->bat_iv.tq_avg) ||
2635             nla_put(msg, BATADV_ATTR_ROUTER, ETH_ALEN,
2636                     router->addr) ||
2637             nla_put_string(msg, BATADV_ATTR_HARD_IFNAME,
2638                            router->if_incoming->net_dev->name) ||
2639             nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_DOWN,
2640                         gw_node->bandwidth_down) ||
2641             nla_put_u32(msg, BATADV_ATTR_BANDWIDTH_UP,
2642                         gw_node->bandwidth_up)) {
2643                 genlmsg_cancel(msg, hdr);
2644                 goto out;
2645         }
2646
2647         genlmsg_end(msg, hdr);
2648         ret = 0;
2649
2650 out:
2651         if (curr_gw)
2652                 batadv_gw_node_put(curr_gw);
2653         if (router_ifinfo)
2654                 batadv_neigh_ifinfo_put(router_ifinfo);
2655         if (router)
2656                 batadv_neigh_node_put(router);
2657         return ret;
2658 }
2659
2660 /**
2661  * batadv_iv_gw_dump() - Dump gateways into a message
2662  * @msg: Netlink message to dump into
2663  * @cb: Control block containing additional options
2664  * @bat_priv: The bat priv with all the soft interface information
2665  */
2666 static void batadv_iv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb,
2667                               struct batadv_priv *bat_priv)
2668 {
2669         int portid = NETLINK_CB(cb->skb).portid;
2670         struct batadv_gw_node *gw_node;
2671         int idx_skip = cb->args[0];
2672         int idx = 0;
2673
2674         spin_lock_bh(&bat_priv->gw.list_lock);
2675         cb->seq = bat_priv->gw.generation << 1 | 1;
2676
2677         hlist_for_each_entry(gw_node, &bat_priv->gw.gateway_list, list) {
2678                 if (idx++ < idx_skip)
2679                         continue;
2680
2681                 if (batadv_iv_gw_dump_entry(msg, portid, cb, bat_priv,
2682                                             gw_node)) {
2683                         idx_skip = idx - 1;
2684                         goto unlock;
2685                 }
2686         }
2687
2688         idx_skip = idx;
2689 unlock:
2690         spin_unlock_bh(&bat_priv->gw.list_lock);
2691
2692         cb->args[0] = idx_skip;
2693 }
2694
2695 static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
2696         .name = "BATMAN_IV",
2697         .iface = {
2698                 .activate = batadv_iv_iface_activate,
2699                 .enable = batadv_iv_ogm_iface_enable,
2700                 .disable = batadv_iv_ogm_iface_disable,
2701                 .update_mac = batadv_iv_ogm_iface_update_mac,
2702                 .primary_set = batadv_iv_ogm_primary_iface_set,
2703         },
2704         .neigh = {
2705                 .cmp = batadv_iv_ogm_neigh_cmp,
2706                 .is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
2707 #ifdef CONFIG_BATMAN_ADV_DEBUGFS
2708                 .print = batadv_iv_neigh_print,
2709 #endif
2710                 .dump = batadv_iv_ogm_neigh_dump,
2711         },
2712         .orig = {
2713 #ifdef CONFIG_BATMAN_ADV_DEBUGFS
2714                 .print = batadv_iv_ogm_orig_print,
2715 #endif
2716                 .dump = batadv_iv_ogm_orig_dump,
2717         },
2718         .gw = {
2719                 .init_sel_class = batadv_iv_init_sel_class,
2720                 .get_best_gw_node = batadv_iv_gw_get_best_gw_node,
2721                 .is_eligible = batadv_iv_gw_is_eligible,
2722 #ifdef CONFIG_BATMAN_ADV_DEBUGFS
2723                 .print = batadv_iv_gw_print,
2724 #endif
2725                 .dump = batadv_iv_gw_dump,
2726         },
2727 };
2728
2729 /**
2730  * batadv_iv_init() - B.A.T.M.A.N. IV initialization function
2731  *
2732  * Return: 0 on success or negative error number in case of failure
2733  */
2734 int __init batadv_iv_init(void)
2735 {
2736         int ret;
2737
2738         /* batman originator packet */
2739         ret = batadv_recv_handler_register(BATADV_IV_OGM,
2740                                            batadv_iv_ogm_receive);
2741         if (ret < 0)
2742                 goto out;
2743
2744         ret = batadv_algo_register(&batadv_batman_iv);
2745         if (ret < 0)
2746                 goto handler_unregister;
2747
2748         goto out;
2749
2750 handler_unregister:
2751         batadv_recv_handler_unregister(BATADV_IV_OGM);
2752 out:
2753         return ret;
2754 }