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