batman-adv: Rename batadv_orig_ifinfo *_free_ref function to *_put
[cascardo/linux.git] / net / batman-adv / network-coding.c
1 /* Copyright (C) 2012-2016  B.A.T.M.A.N. contributors:
2  *
3  * Martin Hundebøll, Jeppe Ledet-Pedersen
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public
7  * License as published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include "network-coding.h"
19 #include "main.h"
20
21 #include <linux/atomic.h>
22 #include <linux/bitops.h>
23 #include <linux/byteorder/generic.h>
24 #include <linux/compiler.h>
25 #include <linux/debugfs.h>
26 #include <linux/errno.h>
27 #include <linux/etherdevice.h>
28 #include <linux/fs.h>
29 #include <linux/if_ether.h>
30 #include <linux/if_packet.h>
31 #include <linux/init.h>
32 #include <linux/jhash.h>
33 #include <linux/jiffies.h>
34 #include <linux/kernel.h>
35 #include <linux/kref.h>
36 #include <linux/list.h>
37 #include <linux/lockdep.h>
38 #include <linux/netdevice.h>
39 #include <linux/printk.h>
40 #include <linux/random.h>
41 #include <linux/rculist.h>
42 #include <linux/rcupdate.h>
43 #include <linux/seq_file.h>
44 #include <linux/skbuff.h>
45 #include <linux/slab.h>
46 #include <linux/spinlock.h>
47 #include <linux/stat.h>
48 #include <linux/stddef.h>
49 #include <linux/string.h>
50 #include <linux/workqueue.h>
51
52 #include "hard-interface.h"
53 #include "hash.h"
54 #include "originator.h"
55 #include "packet.h"
56 #include "routing.h"
57 #include "send.h"
58
59 static struct lock_class_key batadv_nc_coding_hash_lock_class_key;
60 static struct lock_class_key batadv_nc_decoding_hash_lock_class_key;
61
62 static void batadv_nc_worker(struct work_struct *work);
63 static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
64                                        struct batadv_hard_iface *recv_if);
65
66 /**
67  * batadv_nc_init - one-time initialization for network coding
68  *
69  * Return: 0 on success or negative error number in case of failure
70  */
71 int __init batadv_nc_init(void)
72 {
73         int ret;
74
75         /* Register our packet type */
76         ret = batadv_recv_handler_register(BATADV_CODED,
77                                            batadv_nc_recv_coded_packet);
78
79         return ret;
80 }
81
82 /**
83  * batadv_nc_start_timer - initialise the nc periodic worker
84  * @bat_priv: the bat priv with all the soft interface information
85  */
86 static void batadv_nc_start_timer(struct batadv_priv *bat_priv)
87 {
88         queue_delayed_work(batadv_event_workqueue, &bat_priv->nc.work,
89                            msecs_to_jiffies(10));
90 }
91
92 /**
93  * batadv_nc_tvlv_container_update - update the network coding tvlv container
94  *  after network coding setting change
95  * @bat_priv: the bat priv with all the soft interface information
96  */
97 static void batadv_nc_tvlv_container_update(struct batadv_priv *bat_priv)
98 {
99         char nc_mode;
100
101         nc_mode = atomic_read(&bat_priv->network_coding);
102
103         switch (nc_mode) {
104         case 0:
105                 batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_NC, 1);
106                 break;
107         case 1:
108                 batadv_tvlv_container_register(bat_priv, BATADV_TVLV_NC, 1,
109                                                NULL, 0);
110                 break;
111         }
112 }
113
114 /**
115  * batadv_nc_status_update - update the network coding tvlv container after
116  *  network coding setting change
117  * @net_dev: the soft interface net device
118  */
119 void batadv_nc_status_update(struct net_device *net_dev)
120 {
121         struct batadv_priv *bat_priv = netdev_priv(net_dev);
122
123         batadv_nc_tvlv_container_update(bat_priv);
124 }
125
126 /**
127  * batadv_nc_tvlv_ogm_handler_v1 - process incoming nc tvlv container
128  * @bat_priv: the bat priv with all the soft interface information
129  * @orig: the orig_node of the ogm
130  * @flags: flags indicating the tvlv state (see batadv_tvlv_handler_flags)
131  * @tvlv_value: tvlv buffer containing the gateway data
132  * @tvlv_value_len: tvlv buffer length
133  */
134 static void batadv_nc_tvlv_ogm_handler_v1(struct batadv_priv *bat_priv,
135                                           struct batadv_orig_node *orig,
136                                           u8 flags,
137                                           void *tvlv_value, u16 tvlv_value_len)
138 {
139         if (flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND)
140                 clear_bit(BATADV_ORIG_CAPA_HAS_NC, &orig->capabilities);
141         else
142                 set_bit(BATADV_ORIG_CAPA_HAS_NC, &orig->capabilities);
143 }
144
145 /**
146  * batadv_nc_mesh_init - initialise coding hash table and start house keeping
147  * @bat_priv: the bat priv with all the soft interface information
148  *
149  * Return: 0 on success or negative error number in case of failure
150  */
151 int batadv_nc_mesh_init(struct batadv_priv *bat_priv)
152 {
153         bat_priv->nc.timestamp_fwd_flush = jiffies;
154         bat_priv->nc.timestamp_sniffed_purge = jiffies;
155
156         if (bat_priv->nc.coding_hash || bat_priv->nc.decoding_hash)
157                 return 0;
158
159         bat_priv->nc.coding_hash = batadv_hash_new(128);
160         if (!bat_priv->nc.coding_hash)
161                 goto err;
162
163         batadv_hash_set_lock_class(bat_priv->nc.coding_hash,
164                                    &batadv_nc_coding_hash_lock_class_key);
165
166         bat_priv->nc.decoding_hash = batadv_hash_new(128);
167         if (!bat_priv->nc.decoding_hash)
168                 goto err;
169
170         batadv_hash_set_lock_class(bat_priv->nc.decoding_hash,
171                                    &batadv_nc_decoding_hash_lock_class_key);
172
173         INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker);
174         batadv_nc_start_timer(bat_priv);
175
176         batadv_tvlv_handler_register(bat_priv, batadv_nc_tvlv_ogm_handler_v1,
177                                      NULL, BATADV_TVLV_NC, 1,
178                                      BATADV_TVLV_HANDLER_OGM_CIFNOTFND);
179         batadv_nc_tvlv_container_update(bat_priv);
180         return 0;
181
182 err:
183         return -ENOMEM;
184 }
185
186 /**
187  * batadv_nc_init_bat_priv - initialise the nc specific bat_priv variables
188  * @bat_priv: the bat priv with all the soft interface information
189  */
190 void batadv_nc_init_bat_priv(struct batadv_priv *bat_priv)
191 {
192         atomic_set(&bat_priv->network_coding, 0);
193         bat_priv->nc.min_tq = 200;
194         bat_priv->nc.max_fwd_delay = 10;
195         bat_priv->nc.max_buffer_time = 200;
196 }
197
198 /**
199  * batadv_nc_init_orig - initialise the nc fields of an orig_node
200  * @orig_node: the orig_node which is going to be initialised
201  */
202 void batadv_nc_init_orig(struct batadv_orig_node *orig_node)
203 {
204         INIT_LIST_HEAD(&orig_node->in_coding_list);
205         INIT_LIST_HEAD(&orig_node->out_coding_list);
206         spin_lock_init(&orig_node->in_coding_list_lock);
207         spin_lock_init(&orig_node->out_coding_list_lock);
208 }
209
210 /**
211  * batadv_nc_node_release - release nc_node from lists and queue for free after
212  *  rcu grace period
213  * @ref: kref pointer of the nc_node
214  */
215 static void batadv_nc_node_release(struct kref *ref)
216 {
217         struct batadv_nc_node *nc_node;
218
219         nc_node = container_of(ref, struct batadv_nc_node, refcount);
220
221         batadv_orig_node_put(nc_node->orig_node);
222         kfree_rcu(nc_node, rcu);
223 }
224
225 /**
226  * batadv_nc_node_free_ref - decrement the nc_node refcounter and possibly
227  *  release it
228  * @nc_node: nc_node to be free'd
229  */
230 static void batadv_nc_node_free_ref(struct batadv_nc_node *nc_node)
231 {
232         kref_put(&nc_node->refcount, batadv_nc_node_release);
233 }
234
235 /**
236  * batadv_nc_path_release - release nc_path from lists and queue for free after
237  *  rcu grace period
238  * @ref: kref pointer of the nc_path
239  */
240 static void batadv_nc_path_release(struct kref *ref)
241 {
242         struct batadv_nc_path *nc_path;
243
244         nc_path = container_of(ref, struct batadv_nc_path, refcount);
245
246         kfree_rcu(nc_path, rcu);
247 }
248
249 /**
250  * batadv_nc_path_free_ref - decrement the nc_path refcounter and possibly
251  *  release it
252  * @nc_path: nc_path to be free'd
253  */
254 static void batadv_nc_path_free_ref(struct batadv_nc_path *nc_path)
255 {
256         kref_put(&nc_path->refcount, batadv_nc_path_release);
257 }
258
259 /**
260  * batadv_nc_packet_free - frees nc packet
261  * @nc_packet: the nc packet to free
262  */
263 static void batadv_nc_packet_free(struct batadv_nc_packet *nc_packet)
264 {
265         kfree_skb(nc_packet->skb);
266         batadv_nc_path_free_ref(nc_packet->nc_path);
267         kfree(nc_packet);
268 }
269
270 /**
271  * batadv_nc_to_purge_nc_node - checks whether an nc node has to be purged
272  * @bat_priv: the bat priv with all the soft interface information
273  * @nc_node: the nc node to check
274  *
275  * Return: true if the entry has to be purged now, false otherwise
276  */
277 static bool batadv_nc_to_purge_nc_node(struct batadv_priv *bat_priv,
278                                        struct batadv_nc_node *nc_node)
279 {
280         if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
281                 return true;
282
283         return batadv_has_timed_out(nc_node->last_seen, BATADV_NC_NODE_TIMEOUT);
284 }
285
286 /**
287  * batadv_nc_to_purge_nc_path_coding - checks whether an nc path has timed out
288  * @bat_priv: the bat priv with all the soft interface information
289  * @nc_path: the nc path to check
290  *
291  * Return: true if the entry has to be purged now, false otherwise
292  */
293 static bool batadv_nc_to_purge_nc_path_coding(struct batadv_priv *bat_priv,
294                                               struct batadv_nc_path *nc_path)
295 {
296         if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
297                 return true;
298
299         /* purge the path when no packets has been added for 10 times the
300          * max_fwd_delay time
301          */
302         return batadv_has_timed_out(nc_path->last_valid,
303                                     bat_priv->nc.max_fwd_delay * 10);
304 }
305
306 /**
307  * batadv_nc_to_purge_nc_path_decoding - checks whether an nc path has timed out
308  * @bat_priv: the bat priv with all the soft interface information
309  * @nc_path: the nc path to check
310  *
311  * Return: true if the entry has to be purged now, false otherwise
312  */
313 static bool batadv_nc_to_purge_nc_path_decoding(struct batadv_priv *bat_priv,
314                                                 struct batadv_nc_path *nc_path)
315 {
316         if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
317                 return true;
318
319         /* purge the path when no packets has been added for 10 times the
320          * max_buffer time
321          */
322         return batadv_has_timed_out(nc_path->last_valid,
323                                     bat_priv->nc.max_buffer_time * 10);
324 }
325
326 /**
327  * batadv_nc_purge_orig_nc_nodes - go through list of nc nodes and purge stale
328  *  entries
329  * @bat_priv: the bat priv with all the soft interface information
330  * @list: list of nc nodes
331  * @lock: nc node list lock
332  * @to_purge: function in charge to decide whether an entry has to be purged or
333  *            not. This function takes the nc node as argument and has to return
334  *            a boolean value: true if the entry has to be deleted, false
335  *            otherwise
336  */
337 static void
338 batadv_nc_purge_orig_nc_nodes(struct batadv_priv *bat_priv,
339                               struct list_head *list,
340                               spinlock_t *lock,
341                               bool (*to_purge)(struct batadv_priv *,
342                                                struct batadv_nc_node *))
343 {
344         struct batadv_nc_node *nc_node, *nc_node_tmp;
345
346         /* For each nc_node in list */
347         spin_lock_bh(lock);
348         list_for_each_entry_safe(nc_node, nc_node_tmp, list, list) {
349                 /* if an helper function has been passed as parameter,
350                  * ask it if the entry has to be purged or not
351                  */
352                 if (to_purge && !to_purge(bat_priv, nc_node))
353                         continue;
354
355                 batadv_dbg(BATADV_DBG_NC, bat_priv,
356                            "Removing nc_node %pM -> %pM\n",
357                            nc_node->addr, nc_node->orig_node->orig);
358                 list_del_rcu(&nc_node->list);
359                 batadv_nc_node_free_ref(nc_node);
360         }
361         spin_unlock_bh(lock);
362 }
363
364 /**
365  * batadv_nc_purge_orig - purges all nc node data attached of the given
366  *  originator
367  * @bat_priv: the bat priv with all the soft interface information
368  * @orig_node: orig_node with the nc node entries to be purged
369  * @to_purge: function in charge to decide whether an entry has to be purged or
370  *            not. This function takes the nc node as argument and has to return
371  *            a boolean value: true is the entry has to be deleted, false
372  *            otherwise
373  */
374 void batadv_nc_purge_orig(struct batadv_priv *bat_priv,
375                           struct batadv_orig_node *orig_node,
376                           bool (*to_purge)(struct batadv_priv *,
377                                            struct batadv_nc_node *))
378 {
379         /* Check ingoing nc_node's of this orig_node */
380         batadv_nc_purge_orig_nc_nodes(bat_priv, &orig_node->in_coding_list,
381                                       &orig_node->in_coding_list_lock,
382                                       to_purge);
383
384         /* Check outgoing nc_node's of this orig_node */
385         batadv_nc_purge_orig_nc_nodes(bat_priv, &orig_node->out_coding_list,
386                                       &orig_node->out_coding_list_lock,
387                                       to_purge);
388 }
389
390 /**
391  * batadv_nc_purge_orig_hash - traverse entire originator hash to check if they
392  *  have timed out nc nodes
393  * @bat_priv: the bat priv with all the soft interface information
394  */
395 static void batadv_nc_purge_orig_hash(struct batadv_priv *bat_priv)
396 {
397         struct batadv_hashtable *hash = bat_priv->orig_hash;
398         struct hlist_head *head;
399         struct batadv_orig_node *orig_node;
400         u32 i;
401
402         if (!hash)
403                 return;
404
405         /* For each orig_node */
406         for (i = 0; i < hash->size; i++) {
407                 head = &hash->table[i];
408
409                 rcu_read_lock();
410                 hlist_for_each_entry_rcu(orig_node, head, hash_entry)
411                         batadv_nc_purge_orig(bat_priv, orig_node,
412                                              batadv_nc_to_purge_nc_node);
413                 rcu_read_unlock();
414         }
415 }
416
417 /**
418  * batadv_nc_purge_paths - traverse all nc paths part of the hash and remove
419  *  unused ones
420  * @bat_priv: the bat priv with all the soft interface information
421  * @hash: hash table containing the nc paths to check
422  * @to_purge: function in charge to decide whether an entry has to be purged or
423  *            not. This function takes the nc node as argument and has to return
424  *            a boolean value: true is the entry has to be deleted, false
425  *            otherwise
426  */
427 static void batadv_nc_purge_paths(struct batadv_priv *bat_priv,
428                                   struct batadv_hashtable *hash,
429                                   bool (*to_purge)(struct batadv_priv *,
430                                                    struct batadv_nc_path *))
431 {
432         struct hlist_head *head;
433         struct hlist_node *node_tmp;
434         struct batadv_nc_path *nc_path;
435         spinlock_t *lock; /* Protects lists in hash */
436         u32 i;
437
438         for (i = 0; i < hash->size; i++) {
439                 head = &hash->table[i];
440                 lock = &hash->list_locks[i];
441
442                 /* For each nc_path in this bin */
443                 spin_lock_bh(lock);
444                 hlist_for_each_entry_safe(nc_path, node_tmp, head, hash_entry) {
445                         /* if an helper function has been passed as parameter,
446                          * ask it if the entry has to be purged or not
447                          */
448                         if (to_purge && !to_purge(bat_priv, nc_path))
449                                 continue;
450
451                         /* purging an non-empty nc_path should never happen, but
452                          * is observed under high CPU load. Delay the purging
453                          * until next iteration to allow the packet_list to be
454                          * emptied first.
455                          */
456                         if (!unlikely(list_empty(&nc_path->packet_list))) {
457                                 net_ratelimited_function(printk,
458                                                          KERN_WARNING
459                                                          "Skipping free of non-empty nc_path (%pM -> %pM)!\n",
460                                                          nc_path->prev_hop,
461                                                          nc_path->next_hop);
462                                 continue;
463                         }
464
465                         /* nc_path is unused, so remove it */
466                         batadv_dbg(BATADV_DBG_NC, bat_priv,
467                                    "Remove nc_path %pM -> %pM\n",
468                                    nc_path->prev_hop, nc_path->next_hop);
469                         hlist_del_rcu(&nc_path->hash_entry);
470                         batadv_nc_path_free_ref(nc_path);
471                 }
472                 spin_unlock_bh(lock);
473         }
474 }
475
476 /**
477  * batadv_nc_hash_key_gen - computes the nc_path hash key
478  * @key: buffer to hold the final hash key
479  * @src: source ethernet mac address going into the hash key
480  * @dst: destination ethernet mac address going into the hash key
481  */
482 static void batadv_nc_hash_key_gen(struct batadv_nc_path *key, const char *src,
483                                    const char *dst)
484 {
485         memcpy(key->prev_hop, src, sizeof(key->prev_hop));
486         memcpy(key->next_hop, dst, sizeof(key->next_hop));
487 }
488
489 /**
490  * batadv_nc_hash_choose - compute the hash value for an nc path
491  * @data: data to hash
492  * @size: size of the hash table
493  *
494  * Return: the selected index in the hash table for the given data.
495  */
496 static u32 batadv_nc_hash_choose(const void *data, u32 size)
497 {
498         const struct batadv_nc_path *nc_path = data;
499         u32 hash = 0;
500
501         hash = jhash(&nc_path->prev_hop, sizeof(nc_path->prev_hop), hash);
502         hash = jhash(&nc_path->next_hop, sizeof(nc_path->next_hop), hash);
503
504         return hash % size;
505 }
506
507 /**
508  * batadv_nc_hash_compare - comparing function used in the network coding hash
509  *  tables
510  * @node: node in the local table
511  * @data2: second object to compare the node to
512  *
513  * Return: 1 if the two entry are the same, 0 otherwise
514  */
515 static int batadv_nc_hash_compare(const struct hlist_node *node,
516                                   const void *data2)
517 {
518         const struct batadv_nc_path *nc_path1, *nc_path2;
519
520         nc_path1 = container_of(node, struct batadv_nc_path, hash_entry);
521         nc_path2 = data2;
522
523         /* Return 1 if the two keys are identical */
524         if (memcmp(nc_path1->prev_hop, nc_path2->prev_hop,
525                    sizeof(nc_path1->prev_hop)) != 0)
526                 return 0;
527
528         if (memcmp(nc_path1->next_hop, nc_path2->next_hop,
529                    sizeof(nc_path1->next_hop)) != 0)
530                 return 0;
531
532         return 1;
533 }
534
535 /**
536  * batadv_nc_hash_find - search for an existing nc path and return it
537  * @hash: hash table containing the nc path
538  * @data: search key
539  *
540  * Return: the nc_path if found, NULL otherwise.
541  */
542 static struct batadv_nc_path *
543 batadv_nc_hash_find(struct batadv_hashtable *hash,
544                     void *data)
545 {
546         struct hlist_head *head;
547         struct batadv_nc_path *nc_path, *nc_path_tmp = NULL;
548         int index;
549
550         if (!hash)
551                 return NULL;
552
553         index = batadv_nc_hash_choose(data, hash->size);
554         head = &hash->table[index];
555
556         rcu_read_lock();
557         hlist_for_each_entry_rcu(nc_path, head, hash_entry) {
558                 if (!batadv_nc_hash_compare(&nc_path->hash_entry, data))
559                         continue;
560
561                 if (!kref_get_unless_zero(&nc_path->refcount))
562                         continue;
563
564                 nc_path_tmp = nc_path;
565                 break;
566         }
567         rcu_read_unlock();
568
569         return nc_path_tmp;
570 }
571
572 /**
573  * batadv_nc_send_packet - send non-coded packet and free nc_packet struct
574  * @nc_packet: the nc packet to send
575  */
576 static void batadv_nc_send_packet(struct batadv_nc_packet *nc_packet)
577 {
578         batadv_send_skb_packet(nc_packet->skb,
579                                nc_packet->neigh_node->if_incoming,
580                                nc_packet->nc_path->next_hop);
581         nc_packet->skb = NULL;
582         batadv_nc_packet_free(nc_packet);
583 }
584
585 /**
586  * batadv_nc_sniffed_purge - Checks timestamp of given sniffed nc_packet.
587  * @bat_priv: the bat priv with all the soft interface information
588  * @nc_path: the nc path the packet belongs to
589  * @nc_packet: the nc packet to be checked
590  *
591  * Checks whether the given sniffed (overheard) nc_packet has hit its buffering
592  * timeout. If so, the packet is no longer kept and the entry deleted from the
593  * queue. Has to be called with the appropriate locks.
594  *
595  * Return: false as soon as the entry in the fifo queue has not been timed out
596  * yet and true otherwise.
597  */
598 static bool batadv_nc_sniffed_purge(struct batadv_priv *bat_priv,
599                                     struct batadv_nc_path *nc_path,
600                                     struct batadv_nc_packet *nc_packet)
601 {
602         unsigned long timeout = bat_priv->nc.max_buffer_time;
603         bool res = false;
604
605         lockdep_assert_held(&nc_path->packet_list_lock);
606
607         /* Packets are added to tail, so the remaining packets did not time
608          * out and we can stop processing the current queue
609          */
610         if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE &&
611             !batadv_has_timed_out(nc_packet->timestamp, timeout))
612                 goto out;
613
614         /* purge nc packet */
615         list_del(&nc_packet->list);
616         batadv_nc_packet_free(nc_packet);
617
618         res = true;
619
620 out:
621         return res;
622 }
623
624 /**
625  * batadv_nc_fwd_flush - Checks the timestamp of the given nc packet.
626  * @bat_priv: the bat priv with all the soft interface information
627  * @nc_path: the nc path the packet belongs to
628  * @nc_packet: the nc packet to be checked
629  *
630  * Checks whether the given nc packet has hit its forward timeout. If so, the
631  * packet is no longer delayed, immediately sent and the entry deleted from the
632  * queue. Has to be called with the appropriate locks.
633  *
634  * Return: false as soon as the entry in the fifo queue has not been timed out
635  * yet and true otherwise.
636  */
637 static bool batadv_nc_fwd_flush(struct batadv_priv *bat_priv,
638                                 struct batadv_nc_path *nc_path,
639                                 struct batadv_nc_packet *nc_packet)
640 {
641         unsigned long timeout = bat_priv->nc.max_fwd_delay;
642
643         lockdep_assert_held(&nc_path->packet_list_lock);
644
645         /* Packets are added to tail, so the remaining packets did not time
646          * out and we can stop processing the current queue
647          */
648         if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE &&
649             !batadv_has_timed_out(nc_packet->timestamp, timeout))
650                 return false;
651
652         /* Send packet */
653         batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
654         batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
655                            nc_packet->skb->len + ETH_HLEN);
656         list_del(&nc_packet->list);
657         batadv_nc_send_packet(nc_packet);
658
659         return true;
660 }
661
662 /**
663  * batadv_nc_process_nc_paths - traverse given nc packet pool and free timed out
664  *  nc packets
665  * @bat_priv: the bat priv with all the soft interface information
666  * @hash: to be processed hash table
667  * @process_fn: Function called to process given nc packet. Should return true
668  *              to encourage this function to proceed with the next packet.
669  *              Otherwise the rest of the current queue is skipped.
670  */
671 static void
672 batadv_nc_process_nc_paths(struct batadv_priv *bat_priv,
673                            struct batadv_hashtable *hash,
674                            bool (*process_fn)(struct batadv_priv *,
675                                               struct batadv_nc_path *,
676                                               struct batadv_nc_packet *))
677 {
678         struct hlist_head *head;
679         struct batadv_nc_packet *nc_packet, *nc_packet_tmp;
680         struct batadv_nc_path *nc_path;
681         bool ret;
682         int i;
683
684         if (!hash)
685                 return;
686
687         /* Loop hash table bins */
688         for (i = 0; i < hash->size; i++) {
689                 head = &hash->table[i];
690
691                 /* Loop coding paths */
692                 rcu_read_lock();
693                 hlist_for_each_entry_rcu(nc_path, head, hash_entry) {
694                         /* Loop packets */
695                         spin_lock_bh(&nc_path->packet_list_lock);
696                         list_for_each_entry_safe(nc_packet, nc_packet_tmp,
697                                                  &nc_path->packet_list, list) {
698                                 ret = process_fn(bat_priv, nc_path, nc_packet);
699                                 if (!ret)
700                                         break;
701                         }
702                         spin_unlock_bh(&nc_path->packet_list_lock);
703                 }
704                 rcu_read_unlock();
705         }
706 }
707
708 /**
709  * batadv_nc_worker - periodic task for house keeping related to network coding
710  * @work: kernel work struct
711  */
712 static void batadv_nc_worker(struct work_struct *work)
713 {
714         struct delayed_work *delayed_work;
715         struct batadv_priv_nc *priv_nc;
716         struct batadv_priv *bat_priv;
717         unsigned long timeout;
718
719         delayed_work = container_of(work, struct delayed_work, work);
720         priv_nc = container_of(delayed_work, struct batadv_priv_nc, work);
721         bat_priv = container_of(priv_nc, struct batadv_priv, nc);
722
723         batadv_nc_purge_orig_hash(bat_priv);
724         batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash,
725                               batadv_nc_to_purge_nc_path_coding);
726         batadv_nc_purge_paths(bat_priv, bat_priv->nc.decoding_hash,
727                               batadv_nc_to_purge_nc_path_decoding);
728
729         timeout = bat_priv->nc.max_fwd_delay;
730
731         if (batadv_has_timed_out(bat_priv->nc.timestamp_fwd_flush, timeout)) {
732                 batadv_nc_process_nc_paths(bat_priv, bat_priv->nc.coding_hash,
733                                            batadv_nc_fwd_flush);
734                 bat_priv->nc.timestamp_fwd_flush = jiffies;
735         }
736
737         if (batadv_has_timed_out(bat_priv->nc.timestamp_sniffed_purge,
738                                  bat_priv->nc.max_buffer_time)) {
739                 batadv_nc_process_nc_paths(bat_priv, bat_priv->nc.decoding_hash,
740                                            batadv_nc_sniffed_purge);
741                 bat_priv->nc.timestamp_sniffed_purge = jiffies;
742         }
743
744         /* Schedule a new check */
745         batadv_nc_start_timer(bat_priv);
746 }
747
748 /**
749  * batadv_can_nc_with_orig - checks whether the given orig node is suitable for
750  *  coding or not
751  * @bat_priv: the bat priv with all the soft interface information
752  * @orig_node: neighboring orig node which may be used as nc candidate
753  * @ogm_packet: incoming ogm packet also used for the checks
754  *
755  * Return: true if:
756  *  1) The OGM must have the most recent sequence number.
757  *  2) The TTL must be decremented by one and only one.
758  *  3) The OGM must be received from the first hop from orig_node.
759  *  4) The TQ value of the OGM must be above bat_priv->nc.min_tq.
760  */
761 static bool batadv_can_nc_with_orig(struct batadv_priv *bat_priv,
762                                     struct batadv_orig_node *orig_node,
763                                     struct batadv_ogm_packet *ogm_packet)
764 {
765         struct batadv_orig_ifinfo *orig_ifinfo;
766         u32 last_real_seqno;
767         u8 last_ttl;
768
769         orig_ifinfo = batadv_orig_ifinfo_get(orig_node, BATADV_IF_DEFAULT);
770         if (!orig_ifinfo)
771                 return false;
772
773         last_ttl = orig_ifinfo->last_ttl;
774         last_real_seqno = orig_ifinfo->last_real_seqno;
775         batadv_orig_ifinfo_put(orig_ifinfo);
776
777         if (last_real_seqno != ntohl(ogm_packet->seqno))
778                 return false;
779         if (last_ttl != ogm_packet->ttl + 1)
780                 return false;
781         if (!batadv_compare_eth(ogm_packet->orig, ogm_packet->prev_sender))
782                 return false;
783         if (ogm_packet->tq < bat_priv->nc.min_tq)
784                 return false;
785
786         return true;
787 }
788
789 /**
790  * batadv_nc_find_nc_node - search for an existing nc node and return it
791  * @orig_node: orig node originating the ogm packet
792  * @orig_neigh_node: neighboring orig node from which we received the ogm packet
793  *  (can be equal to orig_node)
794  * @in_coding: traverse incoming or outgoing network coding list
795  *
796  * Return: the nc_node if found, NULL otherwise.
797  */
798 static struct batadv_nc_node
799 *batadv_nc_find_nc_node(struct batadv_orig_node *orig_node,
800                         struct batadv_orig_node *orig_neigh_node,
801                         bool in_coding)
802 {
803         struct batadv_nc_node *nc_node, *nc_node_out = NULL;
804         struct list_head *list;
805
806         if (in_coding)
807                 list = &orig_neigh_node->in_coding_list;
808         else
809                 list = &orig_neigh_node->out_coding_list;
810
811         /* Traverse list of nc_nodes to orig_node */
812         rcu_read_lock();
813         list_for_each_entry_rcu(nc_node, list, list) {
814                 if (!batadv_compare_eth(nc_node->addr, orig_node->orig))
815                         continue;
816
817                 if (!kref_get_unless_zero(&nc_node->refcount))
818                         continue;
819
820                 /* Found a match */
821                 nc_node_out = nc_node;
822                 break;
823         }
824         rcu_read_unlock();
825
826         return nc_node_out;
827 }
828
829 /**
830  * batadv_nc_get_nc_node - retrieves an nc node or creates the entry if it was
831  *  not found
832  * @bat_priv: the bat priv with all the soft interface information
833  * @orig_node: orig node originating the ogm packet
834  * @orig_neigh_node: neighboring orig node from which we received the ogm packet
835  *  (can be equal to orig_node)
836  * @in_coding: traverse incoming or outgoing network coding list
837  *
838  * Return: the nc_node if found or created, NULL in case of an error.
839  */
840 static struct batadv_nc_node
841 *batadv_nc_get_nc_node(struct batadv_priv *bat_priv,
842                        struct batadv_orig_node *orig_node,
843                        struct batadv_orig_node *orig_neigh_node,
844                        bool in_coding)
845 {
846         struct batadv_nc_node *nc_node;
847         spinlock_t *lock; /* Used to lock list selected by "int in_coding" */
848         struct list_head *list;
849
850         /* Check if nc_node is already added */
851         nc_node = batadv_nc_find_nc_node(orig_node, orig_neigh_node, in_coding);
852
853         /* Node found */
854         if (nc_node)
855                 return nc_node;
856
857         nc_node = kzalloc(sizeof(*nc_node), GFP_ATOMIC);
858         if (!nc_node)
859                 return NULL;
860
861         if (!kref_get_unless_zero(&orig_neigh_node->refcount))
862                 goto free;
863
864         /* Initialize nc_node */
865         INIT_LIST_HEAD(&nc_node->list);
866         ether_addr_copy(nc_node->addr, orig_node->orig);
867         nc_node->orig_node = orig_neigh_node;
868         kref_init(&nc_node->refcount);
869         kref_get(&nc_node->refcount);
870
871         /* Select ingoing or outgoing coding node */
872         if (in_coding) {
873                 lock = &orig_neigh_node->in_coding_list_lock;
874                 list = &orig_neigh_node->in_coding_list;
875         } else {
876                 lock = &orig_neigh_node->out_coding_list_lock;
877                 list = &orig_neigh_node->out_coding_list;
878         }
879
880         batadv_dbg(BATADV_DBG_NC, bat_priv, "Adding nc_node %pM -> %pM\n",
881                    nc_node->addr, nc_node->orig_node->orig);
882
883         /* Add nc_node to orig_node */
884         spin_lock_bh(lock);
885         list_add_tail_rcu(&nc_node->list, list);
886         spin_unlock_bh(lock);
887
888         return nc_node;
889
890 free:
891         kfree(nc_node);
892         return NULL;
893 }
894
895 /**
896  * batadv_nc_update_nc_node - updates stored incoming and outgoing nc node
897  *  structs (best called on incoming OGMs)
898  * @bat_priv: the bat priv with all the soft interface information
899  * @orig_node: orig node originating the ogm packet
900  * @orig_neigh_node: neighboring orig node from which we received the ogm packet
901  *  (can be equal to orig_node)
902  * @ogm_packet: incoming ogm packet
903  * @is_single_hop_neigh: orig_node is a single hop neighbor
904  */
905 void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
906                               struct batadv_orig_node *orig_node,
907                               struct batadv_orig_node *orig_neigh_node,
908                               struct batadv_ogm_packet *ogm_packet,
909                               int is_single_hop_neigh)
910 {
911         struct batadv_nc_node *in_nc_node = NULL;
912         struct batadv_nc_node *out_nc_node = NULL;
913
914         /* Check if network coding is enabled */
915         if (!atomic_read(&bat_priv->network_coding))
916                 goto out;
917
918         /* check if orig node is network coding enabled */
919         if (!test_bit(BATADV_ORIG_CAPA_HAS_NC, &orig_node->capabilities))
920                 goto out;
921
922         /* accept ogms from 'good' neighbors and single hop neighbors */
923         if (!batadv_can_nc_with_orig(bat_priv, orig_node, ogm_packet) &&
924             !is_single_hop_neigh)
925                 goto out;
926
927         /* Add orig_node as in_nc_node on hop */
928         in_nc_node = batadv_nc_get_nc_node(bat_priv, orig_node,
929                                            orig_neigh_node, true);
930         if (!in_nc_node)
931                 goto out;
932
933         in_nc_node->last_seen = jiffies;
934
935         /* Add hop as out_nc_node on orig_node */
936         out_nc_node = batadv_nc_get_nc_node(bat_priv, orig_neigh_node,
937                                             orig_node, false);
938         if (!out_nc_node)
939                 goto out;
940
941         out_nc_node->last_seen = jiffies;
942
943 out:
944         if (in_nc_node)
945                 batadv_nc_node_free_ref(in_nc_node);
946         if (out_nc_node)
947                 batadv_nc_node_free_ref(out_nc_node);
948 }
949
950 /**
951  * batadv_nc_get_path - get existing nc_path or allocate a new one
952  * @bat_priv: the bat priv with all the soft interface information
953  * @hash: hash table containing the nc path
954  * @src: ethernet source address - first half of the nc path search key
955  * @dst: ethernet destination address - second half of the nc path search key
956  *
957  * Return: pointer to nc_path if the path was found or created, returns NULL
958  * on error.
959  */
960 static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv,
961                                                  struct batadv_hashtable *hash,
962                                                  u8 *src,
963                                                  u8 *dst)
964 {
965         int hash_added;
966         struct batadv_nc_path *nc_path, nc_path_key;
967
968         batadv_nc_hash_key_gen(&nc_path_key, src, dst);
969
970         /* Search for existing nc_path */
971         nc_path = batadv_nc_hash_find(hash, (void *)&nc_path_key);
972
973         if (nc_path) {
974                 /* Set timestamp to delay removal of nc_path */
975                 nc_path->last_valid = jiffies;
976                 return nc_path;
977         }
978
979         /* No existing nc_path was found; create a new */
980         nc_path = kzalloc(sizeof(*nc_path), GFP_ATOMIC);
981
982         if (!nc_path)
983                 return NULL;
984
985         /* Initialize nc_path */
986         INIT_LIST_HEAD(&nc_path->packet_list);
987         spin_lock_init(&nc_path->packet_list_lock);
988         kref_init(&nc_path->refcount);
989         kref_get(&nc_path->refcount);
990         nc_path->last_valid = jiffies;
991         ether_addr_copy(nc_path->next_hop, dst);
992         ether_addr_copy(nc_path->prev_hop, src);
993
994         batadv_dbg(BATADV_DBG_NC, bat_priv, "Adding nc_path %pM -> %pM\n",
995                    nc_path->prev_hop,
996                    nc_path->next_hop);
997
998         /* Add nc_path to hash table */
999         hash_added = batadv_hash_add(hash, batadv_nc_hash_compare,
1000                                      batadv_nc_hash_choose, &nc_path_key,
1001                                      &nc_path->hash_entry);
1002
1003         if (hash_added < 0) {
1004                 kfree(nc_path);
1005                 return NULL;
1006         }
1007
1008         return nc_path;
1009 }
1010
1011 /**
1012  * batadv_nc_random_weight_tq - scale the receivers TQ-value to avoid unfair
1013  *  selection of a receiver with slightly lower TQ than the other
1014  * @tq: to be weighted tq value
1015  *
1016  * Return: scaled tq value
1017  */
1018 static u8 batadv_nc_random_weight_tq(u8 tq)
1019 {
1020         u8 rand_val, rand_tq;
1021
1022         get_random_bytes(&rand_val, sizeof(rand_val));
1023
1024         /* randomize the estimated packet loss (max TQ - estimated TQ) */
1025         rand_tq = rand_val * (BATADV_TQ_MAX_VALUE - tq);
1026
1027         /* normalize the randomized packet loss */
1028         rand_tq /= BATADV_TQ_MAX_VALUE;
1029
1030         /* convert to (randomized) estimated tq again */
1031         return BATADV_TQ_MAX_VALUE - rand_tq;
1032 }
1033
1034 /**
1035  * batadv_nc_memxor - XOR destination with source
1036  * @dst: byte array to XOR into
1037  * @src: byte array to XOR from
1038  * @len: length of destination array
1039  */
1040 static void batadv_nc_memxor(char *dst, const char *src, unsigned int len)
1041 {
1042         unsigned int i;
1043
1044         for (i = 0; i < len; ++i)
1045                 dst[i] ^= src[i];
1046 }
1047
1048 /**
1049  * batadv_nc_code_packets - code a received unicast_packet with an nc packet
1050  *  into a coded_packet and send it
1051  * @bat_priv: the bat priv with all the soft interface information
1052  * @skb: data skb to forward
1053  * @ethhdr: pointer to the ethernet header inside the skb
1054  * @nc_packet: structure containing the packet to the skb can be coded with
1055  * @neigh_node: next hop to forward packet to
1056  *
1057  * Return: true if both packets are consumed, false otherwise.
1058  */
1059 static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,
1060                                    struct sk_buff *skb,
1061                                    struct ethhdr *ethhdr,
1062                                    struct batadv_nc_packet *nc_packet,
1063                                    struct batadv_neigh_node *neigh_node)
1064 {
1065         u8 tq_weighted_neigh, tq_weighted_coding, tq_tmp;
1066         struct sk_buff *skb_dest, *skb_src;
1067         struct batadv_unicast_packet *packet1;
1068         struct batadv_unicast_packet *packet2;
1069         struct batadv_coded_packet *coded_packet;
1070         struct batadv_neigh_node *neigh_tmp, *router_neigh;
1071         struct batadv_neigh_node *router_coding = NULL;
1072         struct batadv_neigh_ifinfo *router_neigh_ifinfo = NULL;
1073         struct batadv_neigh_ifinfo *router_coding_ifinfo = NULL;
1074         u8 *first_source, *first_dest, *second_source, *second_dest;
1075         __be32 packet_id1, packet_id2;
1076         size_t count;
1077         bool res = false;
1078         int coding_len;
1079         int unicast_size = sizeof(*packet1);
1080         int coded_size = sizeof(*coded_packet);
1081         int header_add = coded_size - unicast_size;
1082
1083         /* TODO: do we need to consider the outgoing interface for
1084          * coded packets?
1085          */
1086         router_neigh = batadv_orig_router_get(neigh_node->orig_node,
1087                                               BATADV_IF_DEFAULT);
1088         if (!router_neigh)
1089                 goto out;
1090
1091         router_neigh_ifinfo = batadv_neigh_ifinfo_get(router_neigh,
1092                                                       BATADV_IF_DEFAULT);
1093         if (!router_neigh_ifinfo)
1094                 goto out;
1095
1096         neigh_tmp = nc_packet->neigh_node;
1097         router_coding = batadv_orig_router_get(neigh_tmp->orig_node,
1098                                                BATADV_IF_DEFAULT);
1099         if (!router_coding)
1100                 goto out;
1101
1102         router_coding_ifinfo = batadv_neigh_ifinfo_get(router_coding,
1103                                                        BATADV_IF_DEFAULT);
1104         if (!router_coding_ifinfo)
1105                 goto out;
1106
1107         tq_tmp = router_neigh_ifinfo->bat_iv.tq_avg;
1108         tq_weighted_neigh = batadv_nc_random_weight_tq(tq_tmp);
1109         tq_tmp = router_coding_ifinfo->bat_iv.tq_avg;
1110         tq_weighted_coding = batadv_nc_random_weight_tq(tq_tmp);
1111
1112         /* Select one destination for the MAC-header dst-field based on
1113          * weighted TQ-values.
1114          */
1115         if (tq_weighted_neigh >= tq_weighted_coding) {
1116                 /* Destination from nc_packet is selected for MAC-header */
1117                 first_dest = nc_packet->nc_path->next_hop;
1118                 first_source = nc_packet->nc_path->prev_hop;
1119                 second_dest = neigh_node->addr;
1120                 second_source = ethhdr->h_source;
1121                 packet1 = (struct batadv_unicast_packet *)nc_packet->skb->data;
1122                 packet2 = (struct batadv_unicast_packet *)skb->data;
1123                 packet_id1 = nc_packet->packet_id;
1124                 packet_id2 = batadv_skb_crc32(skb,
1125                                               skb->data + sizeof(*packet2));
1126         } else {
1127                 /* Destination for skb is selected for MAC-header */
1128                 first_dest = neigh_node->addr;
1129                 first_source = ethhdr->h_source;
1130                 second_dest = nc_packet->nc_path->next_hop;
1131                 second_source = nc_packet->nc_path->prev_hop;
1132                 packet1 = (struct batadv_unicast_packet *)skb->data;
1133                 packet2 = (struct batadv_unicast_packet *)nc_packet->skb->data;
1134                 packet_id1 = batadv_skb_crc32(skb,
1135                                               skb->data + sizeof(*packet1));
1136                 packet_id2 = nc_packet->packet_id;
1137         }
1138
1139         /* Instead of zero padding the smallest data buffer, we
1140          * code into the largest.
1141          */
1142         if (skb->len <= nc_packet->skb->len) {
1143                 skb_dest = nc_packet->skb;
1144                 skb_src = skb;
1145         } else {
1146                 skb_dest = skb;
1147                 skb_src = nc_packet->skb;
1148         }
1149
1150         /* coding_len is used when decoding the packet shorter packet */
1151         coding_len = skb_src->len - unicast_size;
1152
1153         if (skb_linearize(skb_dest) < 0 || skb_linearize(skb_src) < 0)
1154                 goto out;
1155
1156         skb_push(skb_dest, header_add);
1157
1158         coded_packet = (struct batadv_coded_packet *)skb_dest->data;
1159         skb_reset_mac_header(skb_dest);
1160
1161         coded_packet->packet_type = BATADV_CODED;
1162         coded_packet->version = BATADV_COMPAT_VERSION;
1163         coded_packet->ttl = packet1->ttl;
1164
1165         /* Info about first unicast packet */
1166         ether_addr_copy(coded_packet->first_source, first_source);
1167         ether_addr_copy(coded_packet->first_orig_dest, packet1->dest);
1168         coded_packet->first_crc = packet_id1;
1169         coded_packet->first_ttvn = packet1->ttvn;
1170
1171         /* Info about second unicast packet */
1172         ether_addr_copy(coded_packet->second_dest, second_dest);
1173         ether_addr_copy(coded_packet->second_source, second_source);
1174         ether_addr_copy(coded_packet->second_orig_dest, packet2->dest);
1175         coded_packet->second_crc = packet_id2;
1176         coded_packet->second_ttl = packet2->ttl;
1177         coded_packet->second_ttvn = packet2->ttvn;
1178         coded_packet->coded_len = htons(coding_len);
1179
1180         /* This is where the magic happens: Code skb_src into skb_dest */
1181         batadv_nc_memxor(skb_dest->data + coded_size,
1182                          skb_src->data + unicast_size, coding_len);
1183
1184         /* Update counters accordingly */
1185         if (BATADV_SKB_CB(skb_src)->decoded &&
1186             BATADV_SKB_CB(skb_dest)->decoded) {
1187                 /* Both packets are recoded */
1188                 count = skb_src->len + ETH_HLEN;
1189                 count += skb_dest->len + ETH_HLEN;
1190                 batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE, 2);
1191                 batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE_BYTES, count);
1192         } else if (!BATADV_SKB_CB(skb_src)->decoded &&
1193                    !BATADV_SKB_CB(skb_dest)->decoded) {
1194                 /* Both packets are newly coded */
1195                 count = skb_src->len + ETH_HLEN;
1196                 count += skb_dest->len + ETH_HLEN;
1197                 batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE, 2);
1198                 batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE_BYTES, count);
1199         } else if (BATADV_SKB_CB(skb_src)->decoded &&
1200                    !BATADV_SKB_CB(skb_dest)->decoded) {
1201                 /* skb_src recoded and skb_dest is newly coded */
1202                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_RECODE);
1203                 batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE_BYTES,
1204                                    skb_src->len + ETH_HLEN);
1205                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_CODE);
1206                 batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE_BYTES,
1207                                    skb_dest->len + ETH_HLEN);
1208         } else if (!BATADV_SKB_CB(skb_src)->decoded &&
1209                    BATADV_SKB_CB(skb_dest)->decoded) {
1210                 /* skb_src is newly coded and skb_dest is recoded */
1211                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_CODE);
1212                 batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE_BYTES,
1213                                    skb_src->len + ETH_HLEN);
1214                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_RECODE);
1215                 batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE_BYTES,
1216                                    skb_dest->len + ETH_HLEN);
1217         }
1218
1219         /* skb_src is now coded into skb_dest, so free it */
1220         kfree_skb(skb_src);
1221
1222         /* avoid duplicate free of skb from nc_packet */
1223         nc_packet->skb = NULL;
1224         batadv_nc_packet_free(nc_packet);
1225
1226         /* Send the coded packet and return true */
1227         batadv_send_skb_packet(skb_dest, neigh_node->if_incoming, first_dest);
1228         res = true;
1229 out:
1230         if (router_neigh)
1231                 batadv_neigh_node_put(router_neigh);
1232         if (router_coding)
1233                 batadv_neigh_node_put(router_coding);
1234         if (router_neigh_ifinfo)
1235                 batadv_neigh_ifinfo_put(router_neigh_ifinfo);
1236         if (router_coding_ifinfo)
1237                 batadv_neigh_ifinfo_put(router_coding_ifinfo);
1238         return res;
1239 }
1240
1241 /**
1242  * batadv_nc_skb_coding_possible - true if a decoded skb is available at dst.
1243  * @skb: data skb to forward
1244  * @dst: destination mac address of the other skb to code with
1245  * @src: source mac address of skb
1246  *
1247  * Whenever we network code a packet we have to check whether we received it in
1248  * a network coded form. If so, we may not be able to use it for coding because
1249  * some neighbors may also have received (overheard) the packet in the network
1250  * coded form without being able to decode it. It is hard to know which of the
1251  * neighboring nodes was able to decode the packet, therefore we can only
1252  * re-code the packet if the source of the previous encoded packet is involved.
1253  * Since the source encoded the packet we can be certain it has all necessary
1254  * decode information.
1255  *
1256  * Return: true if coding of a decoded packet is allowed.
1257  */
1258 static bool batadv_nc_skb_coding_possible(struct sk_buff *skb, u8 *dst, u8 *src)
1259 {
1260         if (BATADV_SKB_CB(skb)->decoded && !batadv_compare_eth(dst, src))
1261                 return false;
1262         return true;
1263 }
1264
1265 /**
1266  * batadv_nc_path_search - Find the coding path matching in_nc_node and
1267  *  out_nc_node to retrieve a buffered packet that can be used for coding.
1268  * @bat_priv: the bat priv with all the soft interface information
1269  * @in_nc_node: pointer to skb next hop's neighbor nc node
1270  * @out_nc_node: pointer to skb source's neighbor nc node
1271  * @skb: data skb to forward
1272  * @eth_dst: next hop mac address of skb
1273  *
1274  * Return: true if coding of a decoded skb is allowed.
1275  */
1276 static struct batadv_nc_packet *
1277 batadv_nc_path_search(struct batadv_priv *bat_priv,
1278                       struct batadv_nc_node *in_nc_node,
1279                       struct batadv_nc_node *out_nc_node,
1280                       struct sk_buff *skb,
1281                       u8 *eth_dst)
1282 {
1283         struct batadv_nc_path *nc_path, nc_path_key;
1284         struct batadv_nc_packet *nc_packet_out = NULL;
1285         struct batadv_nc_packet *nc_packet, *nc_packet_tmp;
1286         struct batadv_hashtable *hash = bat_priv->nc.coding_hash;
1287         int idx;
1288
1289         if (!hash)
1290                 return NULL;
1291
1292         /* Create almost path key */
1293         batadv_nc_hash_key_gen(&nc_path_key, in_nc_node->addr,
1294                                out_nc_node->addr);
1295         idx = batadv_nc_hash_choose(&nc_path_key, hash->size);
1296
1297         /* Check for coding opportunities in this nc_path */
1298         rcu_read_lock();
1299         hlist_for_each_entry_rcu(nc_path, &hash->table[idx], hash_entry) {
1300                 if (!batadv_compare_eth(nc_path->prev_hop, in_nc_node->addr))
1301                         continue;
1302
1303                 if (!batadv_compare_eth(nc_path->next_hop, out_nc_node->addr))
1304                         continue;
1305
1306                 spin_lock_bh(&nc_path->packet_list_lock);
1307                 if (list_empty(&nc_path->packet_list)) {
1308                         spin_unlock_bh(&nc_path->packet_list_lock);
1309                         continue;
1310                 }
1311
1312                 list_for_each_entry_safe(nc_packet, nc_packet_tmp,
1313                                          &nc_path->packet_list, list) {
1314                         if (!batadv_nc_skb_coding_possible(nc_packet->skb,
1315                                                            eth_dst,
1316                                                            in_nc_node->addr))
1317                                 continue;
1318
1319                         /* Coding opportunity is found! */
1320                         list_del(&nc_packet->list);
1321                         nc_packet_out = nc_packet;
1322                         break;
1323                 }
1324
1325                 spin_unlock_bh(&nc_path->packet_list_lock);
1326                 break;
1327         }
1328         rcu_read_unlock();
1329
1330         return nc_packet_out;
1331 }
1332
1333 /**
1334  * batadv_nc_skb_src_search - Loops through the list of neighoring nodes of the
1335  *  skb's sender (may be equal to the originator).
1336  * @bat_priv: the bat priv with all the soft interface information
1337  * @skb: data skb to forward
1338  * @eth_dst: next hop mac address of skb
1339  * @eth_src: source mac address of skb
1340  * @in_nc_node: pointer to skb next hop's neighbor nc node
1341  *
1342  * Return: an nc packet if a suitable coding packet was found, NULL otherwise.
1343  */
1344 static struct batadv_nc_packet *
1345 batadv_nc_skb_src_search(struct batadv_priv *bat_priv,
1346                          struct sk_buff *skb,
1347                          u8 *eth_dst,
1348                          u8 *eth_src,
1349                          struct batadv_nc_node *in_nc_node)
1350 {
1351         struct batadv_orig_node *orig_node;
1352         struct batadv_nc_node *out_nc_node;
1353         struct batadv_nc_packet *nc_packet = NULL;
1354
1355         orig_node = batadv_orig_hash_find(bat_priv, eth_src);
1356         if (!orig_node)
1357                 return NULL;
1358
1359         rcu_read_lock();
1360         list_for_each_entry_rcu(out_nc_node,
1361                                 &orig_node->out_coding_list, list) {
1362                 /* Check if the skb is decoded and if recoding is possible */
1363                 if (!batadv_nc_skb_coding_possible(skb,
1364                                                    out_nc_node->addr, eth_src))
1365                         continue;
1366
1367                 /* Search for an opportunity in this nc_path */
1368                 nc_packet = batadv_nc_path_search(bat_priv, in_nc_node,
1369                                                   out_nc_node, skb, eth_dst);
1370                 if (nc_packet)
1371                         break;
1372         }
1373         rcu_read_unlock();
1374
1375         batadv_orig_node_put(orig_node);
1376         return nc_packet;
1377 }
1378
1379 /**
1380  * batadv_nc_skb_store_before_coding - set the ethernet src and dst of the
1381  *  unicast skb before it is stored for use in later decoding
1382  * @bat_priv: the bat priv with all the soft interface information
1383  * @skb: data skb to store
1384  * @eth_dst_new: new destination mac address of skb
1385  */
1386 static void batadv_nc_skb_store_before_coding(struct batadv_priv *bat_priv,
1387                                               struct sk_buff *skb,
1388                                               u8 *eth_dst_new)
1389 {
1390         struct ethhdr *ethhdr;
1391
1392         /* Copy skb header to change the mac header */
1393         skb = pskb_copy_for_clone(skb, GFP_ATOMIC);
1394         if (!skb)
1395                 return;
1396
1397         /* Set the mac header as if we actually sent the packet uncoded */
1398         ethhdr = eth_hdr(skb);
1399         ether_addr_copy(ethhdr->h_source, ethhdr->h_dest);
1400         ether_addr_copy(ethhdr->h_dest, eth_dst_new);
1401
1402         /* Set data pointer to MAC header to mimic packets from our tx path */
1403         skb_push(skb, ETH_HLEN);
1404
1405         /* Add the packet to the decoding packet pool */
1406         batadv_nc_skb_store_for_decoding(bat_priv, skb);
1407
1408         /* batadv_nc_skb_store_for_decoding() clones the skb, so we must free
1409          * our ref
1410          */
1411         kfree_skb(skb);
1412 }
1413
1414 /**
1415  * batadv_nc_skb_dst_search - Loops through list of neighboring nodes to dst.
1416  * @skb: data skb to forward
1417  * @neigh_node: next hop to forward packet to
1418  * @ethhdr: pointer to the ethernet header inside the skb
1419  *
1420  * Loops through list of neighboring nodes the next hop has a good connection to
1421  * (receives OGMs with a sufficient quality). We need to find a neighbor of our
1422  * next hop that potentially sent a packet which our next hop also received
1423  * (overheard) and has stored for later decoding.
1424  *
1425  * Return: true if the skb was consumed (encoded packet sent) or false otherwise
1426  */
1427 static bool batadv_nc_skb_dst_search(struct sk_buff *skb,
1428                                      struct batadv_neigh_node *neigh_node,
1429                                      struct ethhdr *ethhdr)
1430 {
1431         struct net_device *netdev = neigh_node->if_incoming->soft_iface;
1432         struct batadv_priv *bat_priv = netdev_priv(netdev);
1433         struct batadv_orig_node *orig_node = neigh_node->orig_node;
1434         struct batadv_nc_node *nc_node;
1435         struct batadv_nc_packet *nc_packet = NULL;
1436
1437         rcu_read_lock();
1438         list_for_each_entry_rcu(nc_node, &orig_node->in_coding_list, list) {
1439                 /* Search for coding opportunity with this in_nc_node */
1440                 nc_packet = batadv_nc_skb_src_search(bat_priv, skb,
1441                                                      neigh_node->addr,
1442                                                      ethhdr->h_source, nc_node);
1443
1444                 /* Opportunity was found, so stop searching */
1445                 if (nc_packet)
1446                         break;
1447         }
1448         rcu_read_unlock();
1449
1450         if (!nc_packet)
1451                 return false;
1452
1453         /* Save packets for later decoding */
1454         batadv_nc_skb_store_before_coding(bat_priv, skb,
1455                                           neigh_node->addr);
1456         batadv_nc_skb_store_before_coding(bat_priv, nc_packet->skb,
1457                                           nc_packet->neigh_node->addr);
1458
1459         /* Code and send packets */
1460         if (batadv_nc_code_packets(bat_priv, skb, ethhdr, nc_packet,
1461                                    neigh_node))
1462                 return true;
1463
1464         /* out of mem ? Coding failed - we have to free the buffered packet
1465          * to avoid memleaks. The skb passed as argument will be dealt with
1466          * by the calling function.
1467          */
1468         batadv_nc_send_packet(nc_packet);
1469         return false;
1470 }
1471
1472 /**
1473  * batadv_nc_skb_add_to_path - buffer skb for later encoding / decoding
1474  * @skb: skb to add to path
1475  * @nc_path: path to add skb to
1476  * @neigh_node: next hop to forward packet to
1477  * @packet_id: checksum to identify packet
1478  *
1479  * Return: true if the packet was buffered or false in case of an error.
1480  */
1481 static bool batadv_nc_skb_add_to_path(struct sk_buff *skb,
1482                                       struct batadv_nc_path *nc_path,
1483                                       struct batadv_neigh_node *neigh_node,
1484                                       __be32 packet_id)
1485 {
1486         struct batadv_nc_packet *nc_packet;
1487
1488         nc_packet = kzalloc(sizeof(*nc_packet), GFP_ATOMIC);
1489         if (!nc_packet)
1490                 return false;
1491
1492         /* Initialize nc_packet */
1493         nc_packet->timestamp = jiffies;
1494         nc_packet->packet_id = packet_id;
1495         nc_packet->skb = skb;
1496         nc_packet->neigh_node = neigh_node;
1497         nc_packet->nc_path = nc_path;
1498
1499         /* Add coding packet to list */
1500         spin_lock_bh(&nc_path->packet_list_lock);
1501         list_add_tail(&nc_packet->list, &nc_path->packet_list);
1502         spin_unlock_bh(&nc_path->packet_list_lock);
1503
1504         return true;
1505 }
1506
1507 /**
1508  * batadv_nc_skb_forward - try to code a packet or add it to the coding packet
1509  *  buffer
1510  * @skb: data skb to forward
1511  * @neigh_node: next hop to forward packet to
1512  *
1513  * Return: true if the skb was consumed (encoded packet sent) or false otherwise
1514  */
1515 bool batadv_nc_skb_forward(struct sk_buff *skb,
1516                            struct batadv_neigh_node *neigh_node)
1517 {
1518         const struct net_device *netdev = neigh_node->if_incoming->soft_iface;
1519         struct batadv_priv *bat_priv = netdev_priv(netdev);
1520         struct batadv_unicast_packet *packet;
1521         struct batadv_nc_path *nc_path;
1522         struct ethhdr *ethhdr = eth_hdr(skb);
1523         __be32 packet_id;
1524         u8 *payload;
1525
1526         /* Check if network coding is enabled */
1527         if (!atomic_read(&bat_priv->network_coding))
1528                 goto out;
1529
1530         /* We only handle unicast packets */
1531         payload = skb_network_header(skb);
1532         packet = (struct batadv_unicast_packet *)payload;
1533         if (packet->packet_type != BATADV_UNICAST)
1534                 goto out;
1535
1536         /* Try to find a coding opportunity and send the skb if one is found */
1537         if (batadv_nc_skb_dst_search(skb, neigh_node, ethhdr))
1538                 return true;
1539
1540         /* Find or create a nc_path for this src-dst pair */
1541         nc_path = batadv_nc_get_path(bat_priv,
1542                                      bat_priv->nc.coding_hash,
1543                                      ethhdr->h_source,
1544                                      neigh_node->addr);
1545
1546         if (!nc_path)
1547                 goto out;
1548
1549         /* Add skb to nc_path */
1550         packet_id = batadv_skb_crc32(skb, payload + sizeof(*packet));
1551         if (!batadv_nc_skb_add_to_path(skb, nc_path, neigh_node, packet_id))
1552                 goto free_nc_path;
1553
1554         /* Packet is consumed */
1555         return true;
1556
1557 free_nc_path:
1558         batadv_nc_path_free_ref(nc_path);
1559 out:
1560         /* Packet is not consumed */
1561         return false;
1562 }
1563
1564 /**
1565  * batadv_nc_skb_store_for_decoding - save a clone of the skb which can be used
1566  *  when decoding coded packets
1567  * @bat_priv: the bat priv with all the soft interface information
1568  * @skb: data skb to store
1569  */
1570 void batadv_nc_skb_store_for_decoding(struct batadv_priv *bat_priv,
1571                                       struct sk_buff *skb)
1572 {
1573         struct batadv_unicast_packet *packet;
1574         struct batadv_nc_path *nc_path;
1575         struct ethhdr *ethhdr = eth_hdr(skb);
1576         __be32 packet_id;
1577         u8 *payload;
1578
1579         /* Check if network coding is enabled */
1580         if (!atomic_read(&bat_priv->network_coding))
1581                 goto out;
1582
1583         /* Check for supported packet type */
1584         payload = skb_network_header(skb);
1585         packet = (struct batadv_unicast_packet *)payload;
1586         if (packet->packet_type != BATADV_UNICAST)
1587                 goto out;
1588
1589         /* Find existing nc_path or create a new */
1590         nc_path = batadv_nc_get_path(bat_priv,
1591                                      bat_priv->nc.decoding_hash,
1592                                      ethhdr->h_source,
1593                                      ethhdr->h_dest);
1594
1595         if (!nc_path)
1596                 goto out;
1597
1598         /* Clone skb and adjust skb->data to point at batman header */
1599         skb = skb_clone(skb, GFP_ATOMIC);
1600         if (unlikely(!skb))
1601                 goto free_nc_path;
1602
1603         if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
1604                 goto free_skb;
1605
1606         if (unlikely(!skb_pull_rcsum(skb, ETH_HLEN)))
1607                 goto free_skb;
1608
1609         /* Add skb to nc_path */
1610         packet_id = batadv_skb_crc32(skb, payload + sizeof(*packet));
1611         if (!batadv_nc_skb_add_to_path(skb, nc_path, NULL, packet_id))
1612                 goto free_skb;
1613
1614         batadv_inc_counter(bat_priv, BATADV_CNT_NC_BUFFER);
1615         return;
1616
1617 free_skb:
1618         kfree_skb(skb);
1619 free_nc_path:
1620         batadv_nc_path_free_ref(nc_path);
1621 out:
1622         return;
1623 }
1624
1625 /**
1626  * batadv_nc_skb_store_sniffed_unicast - check if a received unicast packet
1627  *  should be saved in the decoding buffer and, if so, store it there
1628  * @bat_priv: the bat priv with all the soft interface information
1629  * @skb: unicast skb to store
1630  */
1631 void batadv_nc_skb_store_sniffed_unicast(struct batadv_priv *bat_priv,
1632                                          struct sk_buff *skb)
1633 {
1634         struct ethhdr *ethhdr = eth_hdr(skb);
1635
1636         if (batadv_is_my_mac(bat_priv, ethhdr->h_dest))
1637                 return;
1638
1639         /* Set data pointer to MAC header to mimic packets from our tx path */
1640         skb_push(skb, ETH_HLEN);
1641
1642         batadv_nc_skb_store_for_decoding(bat_priv, skb);
1643 }
1644
1645 /**
1646  * batadv_nc_skb_decode_packet - decode given skb using the decode data stored
1647  *  in nc_packet
1648  * @bat_priv: the bat priv with all the soft interface information
1649  * @skb: unicast skb to decode
1650  * @nc_packet: decode data needed to decode the skb
1651  *
1652  * Return: pointer to decoded unicast packet if the packet was decoded or NULL
1653  * in case of an error.
1654  */
1655 static struct batadv_unicast_packet *
1656 batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
1657                             struct batadv_nc_packet *nc_packet)
1658 {
1659         const int h_size = sizeof(struct batadv_unicast_packet);
1660         const int h_diff = sizeof(struct batadv_coded_packet) - h_size;
1661         struct batadv_unicast_packet *unicast_packet;
1662         struct batadv_coded_packet coded_packet_tmp;
1663         struct ethhdr *ethhdr, ethhdr_tmp;
1664         u8 *orig_dest, ttl, ttvn;
1665         unsigned int coding_len;
1666         int err;
1667
1668         /* Save headers temporarily */
1669         memcpy(&coded_packet_tmp, skb->data, sizeof(coded_packet_tmp));
1670         memcpy(&ethhdr_tmp, skb_mac_header(skb), sizeof(ethhdr_tmp));
1671
1672         if (skb_cow(skb, 0) < 0)
1673                 return NULL;
1674
1675         if (unlikely(!skb_pull_rcsum(skb, h_diff)))
1676                 return NULL;
1677
1678         /* Data points to batman header, so set mac header 14 bytes before
1679          * and network to data
1680          */
1681         skb_set_mac_header(skb, -ETH_HLEN);
1682         skb_reset_network_header(skb);
1683
1684         /* Reconstruct original mac header */
1685         ethhdr = eth_hdr(skb);
1686         *ethhdr = ethhdr_tmp;
1687
1688         /* Select the correct unicast header information based on the location
1689          * of our mac address in the coded_packet header
1690          */
1691         if (batadv_is_my_mac(bat_priv, coded_packet_tmp.second_dest)) {
1692                 /* If we are the second destination the packet was overheard,
1693                  * so the Ethernet address must be copied to h_dest and
1694                  * pkt_type changed from PACKET_OTHERHOST to PACKET_HOST
1695                  */
1696                 ether_addr_copy(ethhdr->h_dest, coded_packet_tmp.second_dest);
1697                 skb->pkt_type = PACKET_HOST;
1698
1699                 orig_dest = coded_packet_tmp.second_orig_dest;
1700                 ttl = coded_packet_tmp.second_ttl;
1701                 ttvn = coded_packet_tmp.second_ttvn;
1702         } else {
1703                 orig_dest = coded_packet_tmp.first_orig_dest;
1704                 ttl = coded_packet_tmp.ttl;
1705                 ttvn = coded_packet_tmp.first_ttvn;
1706         }
1707
1708         coding_len = ntohs(coded_packet_tmp.coded_len);
1709
1710         if (coding_len > skb->len)
1711                 return NULL;
1712
1713         /* Here the magic is reversed:
1714          *   extract the missing packet from the received coded packet
1715          */
1716         batadv_nc_memxor(skb->data + h_size,
1717                          nc_packet->skb->data + h_size,
1718                          coding_len);
1719
1720         /* Resize decoded skb if decoded with larger packet */
1721         if (nc_packet->skb->len > coding_len + h_size) {
1722                 err = pskb_trim_rcsum(skb, coding_len + h_size);
1723                 if (err)
1724                         return NULL;
1725         }
1726
1727         /* Create decoded unicast packet */
1728         unicast_packet = (struct batadv_unicast_packet *)skb->data;
1729         unicast_packet->packet_type = BATADV_UNICAST;
1730         unicast_packet->version = BATADV_COMPAT_VERSION;
1731         unicast_packet->ttl = ttl;
1732         ether_addr_copy(unicast_packet->dest, orig_dest);
1733         unicast_packet->ttvn = ttvn;
1734
1735         batadv_nc_packet_free(nc_packet);
1736         return unicast_packet;
1737 }
1738
1739 /**
1740  * batadv_nc_find_decoding_packet - search through buffered decoding data to
1741  *  find the data needed to decode the coded packet
1742  * @bat_priv: the bat priv with all the soft interface information
1743  * @ethhdr: pointer to the ethernet header inside the coded packet
1744  * @coded: coded packet we try to find decode data for
1745  *
1746  * Return: pointer to nc packet if the needed data was found or NULL otherwise.
1747  */
1748 static struct batadv_nc_packet *
1749 batadv_nc_find_decoding_packet(struct batadv_priv *bat_priv,
1750                                struct ethhdr *ethhdr,
1751                                struct batadv_coded_packet *coded)
1752 {
1753         struct batadv_hashtable *hash = bat_priv->nc.decoding_hash;
1754         struct batadv_nc_packet *tmp_nc_packet, *nc_packet = NULL;
1755         struct batadv_nc_path *nc_path, nc_path_key;
1756         u8 *dest, *source;
1757         __be32 packet_id;
1758         int index;
1759
1760         if (!hash)
1761                 return NULL;
1762
1763         /* Select the correct packet id based on the location of our mac-addr */
1764         dest = ethhdr->h_source;
1765         if (!batadv_is_my_mac(bat_priv, coded->second_dest)) {
1766                 source = coded->second_source;
1767                 packet_id = coded->second_crc;
1768         } else {
1769                 source = coded->first_source;
1770                 packet_id = coded->first_crc;
1771         }
1772
1773         batadv_nc_hash_key_gen(&nc_path_key, source, dest);
1774         index = batadv_nc_hash_choose(&nc_path_key, hash->size);
1775
1776         /* Search for matching coding path */
1777         rcu_read_lock();
1778         hlist_for_each_entry_rcu(nc_path, &hash->table[index], hash_entry) {
1779                 /* Find matching nc_packet */
1780                 spin_lock_bh(&nc_path->packet_list_lock);
1781                 list_for_each_entry(tmp_nc_packet,
1782                                     &nc_path->packet_list, list) {
1783                         if (packet_id == tmp_nc_packet->packet_id) {
1784                                 list_del(&tmp_nc_packet->list);
1785
1786                                 nc_packet = tmp_nc_packet;
1787                                 break;
1788                         }
1789                 }
1790                 spin_unlock_bh(&nc_path->packet_list_lock);
1791
1792                 if (nc_packet)
1793                         break;
1794         }
1795         rcu_read_unlock();
1796
1797         if (!nc_packet)
1798                 batadv_dbg(BATADV_DBG_NC, bat_priv,
1799                            "No decoding packet found for %u\n", packet_id);
1800
1801         return nc_packet;
1802 }
1803
1804 /**
1805  * batadv_nc_recv_coded_packet - try to decode coded packet and enqueue the
1806  *  resulting unicast packet
1807  * @skb: incoming coded packet
1808  * @recv_if: pointer to interface this packet was received on
1809  *
1810  * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
1811  * otherwise.
1812  */
1813 static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
1814                                        struct batadv_hard_iface *recv_if)
1815 {
1816         struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1817         struct batadv_unicast_packet *unicast_packet;
1818         struct batadv_coded_packet *coded_packet;
1819         struct batadv_nc_packet *nc_packet;
1820         struct ethhdr *ethhdr;
1821         int hdr_size = sizeof(*coded_packet);
1822
1823         /* Check if network coding is enabled */
1824         if (!atomic_read(&bat_priv->network_coding))
1825                 return NET_RX_DROP;
1826
1827         /* Make sure we can access (and remove) header */
1828         if (unlikely(!pskb_may_pull(skb, hdr_size)))
1829                 return NET_RX_DROP;
1830
1831         coded_packet = (struct batadv_coded_packet *)skb->data;
1832         ethhdr = eth_hdr(skb);
1833
1834         /* Verify frame is destined for us */
1835         if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest) &&
1836             !batadv_is_my_mac(bat_priv, coded_packet->second_dest))
1837                 return NET_RX_DROP;
1838
1839         /* Update stat counter */
1840         if (batadv_is_my_mac(bat_priv, coded_packet->second_dest))
1841                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_SNIFFED);
1842
1843         nc_packet = batadv_nc_find_decoding_packet(bat_priv, ethhdr,
1844                                                    coded_packet);
1845         if (!nc_packet) {
1846                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE_FAILED);
1847                 return NET_RX_DROP;
1848         }
1849
1850         /* Make skb's linear, because decoding accesses the entire buffer */
1851         if (skb_linearize(skb) < 0)
1852                 goto free_nc_packet;
1853
1854         if (skb_linearize(nc_packet->skb) < 0)
1855                 goto free_nc_packet;
1856
1857         /* Decode the packet */
1858         unicast_packet = batadv_nc_skb_decode_packet(bat_priv, skb, nc_packet);
1859         if (!unicast_packet) {
1860                 batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE_FAILED);
1861                 goto free_nc_packet;
1862         }
1863
1864         /* Mark packet as decoded to do correct recoding when forwarding */
1865         BATADV_SKB_CB(skb)->decoded = true;
1866         batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE);
1867         batadv_add_counter(bat_priv, BATADV_CNT_NC_DECODE_BYTES,
1868                            skb->len + ETH_HLEN);
1869         return batadv_recv_unicast_packet(skb, recv_if);
1870
1871 free_nc_packet:
1872         batadv_nc_packet_free(nc_packet);
1873         return NET_RX_DROP;
1874 }
1875
1876 /**
1877  * batadv_nc_mesh_free - clean up network coding memory
1878  * @bat_priv: the bat priv with all the soft interface information
1879  */
1880 void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
1881 {
1882         batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_NC, 1);
1883         batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_NC, 1);
1884         cancel_delayed_work_sync(&bat_priv->nc.work);
1885
1886         batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL);
1887         batadv_hash_destroy(bat_priv->nc.coding_hash);
1888         batadv_nc_purge_paths(bat_priv, bat_priv->nc.decoding_hash, NULL);
1889         batadv_hash_destroy(bat_priv->nc.decoding_hash);
1890 }
1891
1892 /**
1893  * batadv_nc_nodes_seq_print_text - print the nc node information
1894  * @seq: seq file to print on
1895  * @offset: not used
1896  *
1897  * Return: always 0
1898  */
1899 int batadv_nc_nodes_seq_print_text(struct seq_file *seq, void *offset)
1900 {
1901         struct net_device *net_dev = (struct net_device *)seq->private;
1902         struct batadv_priv *bat_priv = netdev_priv(net_dev);
1903         struct batadv_hashtable *hash = bat_priv->orig_hash;
1904         struct batadv_hard_iface *primary_if;
1905         struct hlist_head *head;
1906         struct batadv_orig_node *orig_node;
1907         struct batadv_nc_node *nc_node;
1908         int i;
1909
1910         primary_if = batadv_seq_print_text_primary_if_get(seq);
1911         if (!primary_if)
1912                 goto out;
1913
1914         /* Traverse list of originators */
1915         for (i = 0; i < hash->size; i++) {
1916                 head = &hash->table[i];
1917
1918                 /* For each orig_node in this bin */
1919                 rcu_read_lock();
1920                 hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1921                         /* no need to print the orig node if it does not have
1922                          * network coding neighbors
1923                          */
1924                         if (list_empty(&orig_node->in_coding_list) &&
1925                             list_empty(&orig_node->out_coding_list))
1926                                 continue;
1927
1928                         seq_printf(seq, "Node:      %pM\n", orig_node->orig);
1929
1930                         seq_puts(seq, " Ingoing:  ");
1931                         /* For each in_nc_node to this orig_node */
1932                         list_for_each_entry_rcu(nc_node,
1933                                                 &orig_node->in_coding_list,
1934                                                 list)
1935                                 seq_printf(seq, "%pM ",
1936                                            nc_node->addr);
1937                         seq_puts(seq, "\n");
1938
1939                         seq_puts(seq, " Outgoing: ");
1940                         /* For out_nc_node to this orig_node */
1941                         list_for_each_entry_rcu(nc_node,
1942                                                 &orig_node->out_coding_list,
1943                                                 list)
1944                                 seq_printf(seq, "%pM ",
1945                                            nc_node->addr);
1946                         seq_puts(seq, "\n\n");
1947                 }
1948                 rcu_read_unlock();
1949         }
1950
1951 out:
1952         if (primary_if)
1953                 batadv_hardif_put(primary_if);
1954         return 0;
1955 }
1956
1957 /**
1958  * batadv_nc_init_debugfs - create nc folder and related files in debugfs
1959  * @bat_priv: the bat priv with all the soft interface information
1960  *
1961  * Return: 0 on success or negative error number in case of failure
1962  */
1963 int batadv_nc_init_debugfs(struct batadv_priv *bat_priv)
1964 {
1965         struct dentry *nc_dir, *file;
1966
1967         nc_dir = debugfs_create_dir("nc", bat_priv->debug_dir);
1968         if (!nc_dir)
1969                 goto out;
1970
1971         file = debugfs_create_u8("min_tq", S_IRUGO | S_IWUSR, nc_dir,
1972                                  &bat_priv->nc.min_tq);
1973         if (!file)
1974                 goto out;
1975
1976         file = debugfs_create_u32("max_fwd_delay", S_IRUGO | S_IWUSR, nc_dir,
1977                                   &bat_priv->nc.max_fwd_delay);
1978         if (!file)
1979                 goto out;
1980
1981         file = debugfs_create_u32("max_buffer_time", S_IRUGO | S_IWUSR, nc_dir,
1982                                   &bat_priv->nc.max_buffer_time);
1983         if (!file)
1984                 goto out;
1985
1986         return 0;
1987
1988 out:
1989         return -ENOMEM;
1990 }