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