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        /* Select ingoing or outgoing coding node */
 858        if (in_coding) {
 859                lock = &orig_neigh_node->in_coding_list_lock;
 860                list = &orig_neigh_node->in_coding_list;
 861        } else {
 862                lock = &orig_neigh_node->out_coding_list_lock;
 863                list = &orig_neigh_node->out_coding_list;
 864        }
 865
 866        spin_lock_bh(lock);
 867
 868        /* Check if nc_node is already added */
 869        nc_node = batadv_nc_find_nc_node(orig_node, orig_neigh_node, in_coding);
 870
 871        /* Node found */
 872        if (nc_node)
 873                goto unlock;
 874
 875        nc_node = kzalloc(sizeof(*nc_node), GFP_ATOMIC);
 876        if (!nc_node)
 877                goto unlock;
 878
 879        /* Initialize nc_node */
 880        INIT_LIST_HEAD(&nc_node->list);
 881        kref_init(&nc_node->refcount);
 882        ether_addr_copy(nc_node->addr, orig_node->orig);
 883        kref_get(&orig_neigh_node->refcount);
 884        nc_node->orig_node = orig_neigh_node;
 885
 886        batadv_dbg(BATADV_DBG_NC, bat_priv, "Adding nc_node %pM -> %pM\n",
 887                   nc_node->addr, nc_node->orig_node->orig);
 888
 889        /* Add nc_node to orig_node */
 890        kref_get(&nc_node->refcount);
 891        list_add_tail_rcu(&nc_node->list, list);
 892
 893unlock:
 894        spin_unlock_bh(lock);
 895
 896        return nc_node;
 897}
 898
 899/**
 900 * batadv_nc_update_nc_node() - updates stored incoming and outgoing nc node
 901 *  structs (best called on incoming OGMs)
 902 * @bat_priv: the bat priv with all the soft interface information
 903 * @orig_node: orig node originating the ogm packet
 904 * @orig_neigh_node: neighboring orig node from which we received the ogm packet
 905 *  (can be equal to orig_node)
 906 * @ogm_packet: incoming ogm packet
 907 * @is_single_hop_neigh: orig_node is a single hop neighbor
 908 */
 909void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
 910                              struct batadv_orig_node *orig_node,
 911                              struct batadv_orig_node *orig_neigh_node,
 912                              struct batadv_ogm_packet *ogm_packet,
 913                              int is_single_hop_neigh)
 914{
 915        struct batadv_nc_node *in_nc_node = NULL;
 916        struct batadv_nc_node *out_nc_node = NULL;
 917
 918        /* Check if network coding is enabled */
 919        if (!atomic_read(&bat_priv->network_coding))
 920                goto out;
 921
 922        /* check if orig node is network coding enabled */
 923        if (!test_bit(BATADV_ORIG_CAPA_HAS_NC, &orig_node->capabilities))
 924                goto out;
 925
 926        /* accept ogms from 'good' neighbors and single hop neighbors */
 927        if (!batadv_can_nc_with_orig(bat_priv, orig_node, ogm_packet) &&
 928            !is_single_hop_neigh)
 929                goto out;
 930
 931        /* Add orig_node as in_nc_node on hop */
 932        in_nc_node = batadv_nc_get_nc_node(bat_priv, orig_node,
 933                                           orig_neigh_node, true);
 934        if (!in_nc_node)
 935                goto out;
 936
 937        in_nc_node->last_seen = jiffies;
 938
 939        /* Add hop as out_nc_node on orig_node */
 940        out_nc_node = batadv_nc_get_nc_node(bat_priv, orig_neigh_node,
 941                                            orig_node, false);
 942        if (!out_nc_node)
 943                goto out;
 944
 945        out_nc_node->last_seen = jiffies;
 946
 947out:
 948        if (in_nc_node)
 949                batadv_nc_node_put(in_nc_node);
 950        if (out_nc_node)
 951                batadv_nc_node_put(out_nc_node);
 952}
 953
 954/**
 955 * batadv_nc_get_path() - get existing nc_path or allocate a new one
 956 * @bat_priv: the bat priv with all the soft interface information
 957 * @hash: hash table containing the nc path
 958 * @src: ethernet source address - first half of the nc path search key
 959 * @dst: ethernet destination address - second half of the nc path search key
 960 *
 961 * Return: pointer to nc_path if the path was found or created, returns NULL
 962 * on error.
 963 */
 964static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv,
 965                                                 struct batadv_hashtable *hash,
 966                                                 u8 *src,
 967                                                 u8 *dst)
 968{
 969        int hash_added;
 970        struct batadv_nc_path *nc_path, nc_path_key;
 971
 972        batadv_nc_hash_key_gen(&nc_path_key, src, dst);
 973
 974        /* Search for existing nc_path */
 975        nc_path = batadv_nc_hash_find(hash, (void *)&nc_path_key);
 976
 977        if (nc_path) {
 978                /* Set timestamp to delay removal of nc_path */
 979                nc_path->last_valid = jiffies;
 980                return nc_path;
 981        }
 982
 983        /* No existing nc_path was found; create a new */
 984        nc_path = kzalloc(sizeof(*nc_path), GFP_ATOMIC);
 985
 986        if (!nc_path)
 987                return NULL;
 988
 989        /* Initialize nc_path */
 990        INIT_LIST_HEAD(&nc_path->packet_list);
 991        spin_lock_init(&nc_path->packet_list_lock);
 992        kref_init(&nc_path->refcount);
 993        nc_path->last_valid = jiffies;
 994        ether_addr_copy(nc_path->next_hop, dst);
 995        ether_addr_copy(nc_path->prev_hop, src);
 996
 997        batadv_dbg(BATADV_DBG_NC, bat_priv, "Adding nc_path %pM -> %pM\n",
 998                   nc_path->prev_hop,
 999                   nc_path->next_hop);
1000
1001        /* Add nc_path to hash table */
1002        kref_get(&nc_path->refcount);
1003        hash_added = batadv_hash_add(hash, batadv_nc_hash_compare,
1004                                     batadv_nc_hash_choose, &nc_path_key,
1005                                     &nc_path->hash_entry);
1006
1007        if (hash_added < 0) {
1008                kfree(nc_path);
1009                return NULL;
1010        }
1011
1012        return nc_path;
1013}
1014
1015/**
1016 * batadv_nc_random_weight_tq() - scale the receivers TQ-value to avoid unfair
1017 *  selection of a receiver with slightly lower TQ than the other
1018 * @tq: to be weighted tq value
1019 *
1020 * Return: scaled tq value
1021 */
1022static u8 batadv_nc_random_weight_tq(u8 tq)
1023{
1024        u8 rand_val, rand_tq;
1025
1026        get_random_bytes(&rand_val, sizeof(rand_val));
1027
1028        /* randomize the estimated packet loss (max TQ - estimated TQ) */
1029        rand_tq = rand_val * (BATADV_TQ_MAX_VALUE - tq);
1030
1031        /* normalize the randomized packet loss */
1032        rand_tq /= BATADV_TQ_MAX_VALUE;
1033
1034        /* convert to (randomized) estimated tq again */
1035        return BATADV_TQ_MAX_VALUE - rand_tq;
1036}
1037
1038/**
1039 * batadv_nc_memxor() - XOR destination with source
1040 * @dst: byte array to XOR into
1041 * @src: byte array to XOR from
1042 * @len: length of destination array
1043 */
1044static void batadv_nc_memxor(char *dst, const char *src, unsigned int len)
1045{
1046        unsigned int i;
1047
1048        for (i = 0; i < len; ++i)
1049                dst[i] ^= src[i];
1050}
1051
1052/**
1053 * batadv_nc_code_packets() - code a received unicast_packet with an nc packet
1054 *  into a coded_packet and send it
1055 * @bat_priv: the bat priv with all the soft interface information
1056 * @skb: data skb to forward
1057 * @ethhdr: pointer to the ethernet header inside the skb
1058 * @nc_packet: structure containing the packet to the skb can be coded with
1059 * @neigh_node: next hop to forward packet to
1060 *
1061 * Return: true if both packets are consumed, false otherwise.
1062 */
1063static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,
1064                                   struct sk_buff *skb,
1065                                   struct ethhdr *ethhdr,
1066                                   struct batadv_nc_packet *nc_packet,
1067                                   struct batadv_neigh_node *neigh_node)
1068{
1069        u8 tq_weighted_neigh, tq_weighted_coding, tq_tmp;
1070        struct sk_buff *skb_dest, *skb_src;
1071        struct batadv_unicast_packet *packet1;
1072        struct batadv_unicast_packet *packet2;
1073        struct batadv_coded_packet *coded_packet;
1074        struct batadv_neigh_node *neigh_tmp, *router_neigh, *first_dest;
1075        struct batadv_neigh_node *router_coding = NULL, *second_dest;
1076        struct batadv_neigh_ifinfo *router_neigh_ifinfo = NULL;
1077        struct batadv_neigh_ifinfo *router_coding_ifinfo = NULL;
1078        u8 *first_source, *second_source;
1079        __be32 packet_id1, packet_id2;
1080        size_t count;
1081        bool res = false;
1082        int coding_len;
1083        int unicast_size = sizeof(*packet1);
1084        int coded_size = sizeof(*coded_packet);
1085        int header_add = coded_size - unicast_size;
1086
1087        /* TODO: do we need to consider the outgoing interface for
1088         * coded packets?
1089         */
1090        router_neigh = batadv_orig_router_get(neigh_node->orig_node,
1091                                              BATADV_IF_DEFAULT);
1092        if (!router_neigh)
1093                goto out;
1094
1095        router_neigh_ifinfo = batadv_neigh_ifinfo_get(router_neigh,
1096                                                      BATADV_IF_DEFAULT);
1097        if (!router_neigh_ifinfo)
1098                goto out;
1099
1100        neigh_tmp = nc_packet->neigh_node;
1101        router_coding = batadv_orig_router_get(neigh_tmp->orig_node,
1102                                               BATADV_IF_DEFAULT);
1103        if (!router_coding)
1104                goto out;
1105
1106        router_coding_ifinfo = batadv_neigh_ifinfo_get(router_coding,
1107                                                       BATADV_IF_DEFAULT);
1108        if (!router_coding_ifinfo)
1109                goto out;
1110
1111        tq_tmp = router_neigh_ifinfo->bat_iv.tq_avg;
1112        tq_weighted_neigh = batadv_nc_random_weight_tq(tq_tmp);
1113        tq_tmp = router_coding_ifinfo->bat_iv.tq_avg;
1114        tq_weighted_coding = batadv_nc_random_weight_tq(tq_tmp);
1115
1116        /* Select one destination for the MAC-header dst-field based on
1117         * weighted TQ-values.
1118         */
1119        if (tq_weighted_neigh >= tq_weighted_coding) {
1120                /* Destination from nc_packet is selected for MAC-header */
1121                first_dest = nc_packet->neigh_node;
1122                first_source = nc_packet->nc_path->prev_hop;
1123                second_dest = neigh_node;
1124                second_source = ethhdr->h_source;
1125                packet1 = (struct batadv_unicast_packet *)nc_packet->skb->data;
1126                packet2 = (struct batadv_unicast_packet *)skb->data;
1127                packet_id1 = nc_packet->packet_id;
1128                packet_id2 = batadv_skb_crc32(skb,
1129                                              skb->data + sizeof(*packet2));
1130        } else {
1131                /* Destination for skb is selected for MAC-header */
1132                first_dest = neigh_node;
1133                first_source = ethhdr->h_source;
1134                second_dest = nc_packet->neigh_node;
1135                second_source = nc_packet->nc_path->prev_hop;
1136                packet1 = (struct batadv_unicast_packet *)skb->data;
1137                packet2 = (struct batadv_unicast_packet *)nc_packet->skb->data;
1138                packet_id1 = batadv_skb_crc32(skb,
1139                                              skb->data + sizeof(*packet1));
1140                packet_id2 = nc_packet->packet_id;
1141        }
1142
1143        /* Instead of zero padding the smallest data buffer, we
1144         * code into the largest.
1145         */
1146        if (skb->len <= nc_packet->skb->len) {
1147                skb_dest = nc_packet->skb;
1148                skb_src = skb;
1149        } else {
1150                skb_dest = skb;
1151                skb_src = nc_packet->skb;
1152        }
1153
1154        /* coding_len is used when decoding the packet shorter packet */
1155        coding_len = skb_src->len - unicast_size;
1156
1157        if (skb_linearize(skb_dest) < 0 || skb_linearize(skb_src) < 0)
1158                goto out;
1159
1160        skb_push(skb_dest, header_add);
1161
1162        coded_packet = (struct batadv_coded_packet *)skb_dest->data;
1163        skb_reset_mac_header(skb_dest);
1164
1165        coded_packet->packet_type = BATADV_CODED;
1166        coded_packet->version = BATADV_COMPAT_VERSION;
1167        coded_packet->ttl = packet1->ttl;
1168
1169        /* Info about first unicast packet */
1170        ether_addr_copy(coded_packet->first_source, first_source);
1171        ether_addr_copy(coded_packet->first_orig_dest, packet1->dest);
1172        coded_packet->first_crc = packet_id1;
1173        coded_packet->first_ttvn = packet1->ttvn;
1174
1175        /* Info about second unicast packet */
1176        ether_addr_copy(coded_packet->second_dest, second_dest->addr);
1177        ether_addr_copy(coded_packet->second_source, second_source);
1178        ether_addr_copy(coded_packet->second_orig_dest, packet2->dest);
1179        coded_packet->second_crc = packet_id2;
1180        coded_packet->second_ttl = packet2->ttl;
1181        coded_packet->second_ttvn = packet2->ttvn;
1182        coded_packet->coded_len = htons(coding_len);
1183
1184        /* This is where the magic happens: Code skb_src into skb_dest */
1185        batadv_nc_memxor(skb_dest->data + coded_size,
1186                         skb_src->data + unicast_size, coding_len);
1187
1188        /* Update counters accordingly */
1189        if (BATADV_SKB_CB(skb_src)->decoded &&
1190            BATADV_SKB_CB(skb_dest)->decoded) {
1191                /* Both packets are recoded */
1192                count = skb_src->len + ETH_HLEN;
1193                count += skb_dest->len + ETH_HLEN;
1194                batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE, 2);
1195                batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE_BYTES, count);
1196        } else if (!BATADV_SKB_CB(skb_src)->decoded &&
1197                   !BATADV_SKB_CB(skb_dest)->decoded) {
1198                /* Both packets are newly coded */
1199                count = skb_src->len + ETH_HLEN;
1200                count += skb_dest->len + ETH_HLEN;
1201                batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE, 2);
1202                batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE_BYTES, count);
1203        } else if (BATADV_SKB_CB(skb_src)->decoded &&
1204                   !BATADV_SKB_CB(skb_dest)->decoded) {
1205                /* skb_src recoded and skb_dest is newly coded */
1206                batadv_inc_counter(bat_priv, BATADV_CNT_NC_RECODE);
1207                batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE_BYTES,
1208                                   skb_src->len + ETH_HLEN);
1209                batadv_inc_counter(bat_priv, BATADV_CNT_NC_CODE);
1210                batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE_BYTES,
1211                                   skb_dest->len + ETH_HLEN);
1212        } else if (!BATADV_SKB_CB(skb_src)->decoded &&
1213                   BATADV_SKB_CB(skb_dest)->decoded) {
1214                /* skb_src is newly coded and skb_dest is recoded */
1215                batadv_inc_counter(bat_priv, BATADV_CNT_NC_CODE);
1216                batadv_add_counter(bat_priv, BATADV_CNT_NC_CODE_BYTES,
1217                                   skb_src->len + ETH_HLEN);
1218                batadv_inc_counter(bat_priv, BATADV_CNT_NC_RECODE);
1219                batadv_add_counter(bat_priv, BATADV_CNT_NC_RECODE_BYTES,
1220                                   skb_dest->len + ETH_HLEN);
1221        }
1222
1223        /* skb_src is now coded into skb_dest, so free it */
1224        consume_skb(skb_src);
1225
1226        /* avoid duplicate free of skb from nc_packet */
1227        nc_packet->skb = NULL;
1228        batadv_nc_packet_free(nc_packet, false);
1229
1230        /* Send the coded packet and return true */
1231        batadv_send_unicast_skb(skb_dest, first_dest);
1232        res = true;
1233out:
1234        if (router_neigh)
1235                batadv_neigh_node_put(router_neigh);
1236        if (router_coding)
1237                batadv_neigh_node_put(router_coding);
1238        if (router_neigh_ifinfo)
1239                batadv_neigh_ifinfo_put(router_neigh_ifinfo);
1240        if (router_coding_ifinfo)
1241                batadv_neigh_ifinfo_put(router_coding_ifinfo);
1242        return res;
1243}
1244
1245/**
1246 * batadv_nc_skb_coding_possible() - true if a decoded skb is available at dst.
1247 * @skb: data skb to forward
1248 * @dst: destination mac address of the other skb to code with
1249 * @src: source mac address of skb
1250 *
1251 * Whenever we network code a packet we have to check whether we received it in
1252 * a network coded form. If so, we may not be able to use it for coding because
1253 * some neighbors may also have received (overheard) the packet in the network
1254 * coded form without being able to decode it. It is hard to know which of the
1255 * neighboring nodes was able to decode the packet, therefore we can only
1256 * re-code the packet if the source of the previous encoded packet is involved.
1257 * Since the source encoded the packet we can be certain it has all necessary
1258 * decode information.
1259 *
1260 * Return: true if coding of a decoded packet is allowed.
1261 */
1262static bool batadv_nc_skb_coding_possible(struct sk_buff *skb, u8 *dst, u8 *src)
1263{
1264        if (BATADV_SKB_CB(skb)->decoded && !batadv_compare_eth(dst, src))
1265                return false;
1266        return true;
1267}
1268
1269/**
1270 * batadv_nc_path_search() - Find the coding path matching in_nc_node and
1271 *  out_nc_node to retrieve a buffered packet that can be used for coding.
1272 * @bat_priv: the bat priv with all the soft interface information
1273 * @in_nc_node: pointer to skb next hop's neighbor nc node
1274 * @out_nc_node: pointer to skb source's neighbor nc node
1275 * @skb: data skb to forward
1276 * @eth_dst: next hop mac address of skb
1277 *
1278 * Return: true if coding of a decoded skb is allowed.
1279 */
1280static struct batadv_nc_packet *
1281batadv_nc_path_search(struct batadv_priv *bat_priv,
1282                      struct batadv_nc_node *in_nc_node,
1283                      struct batadv_nc_node *out_nc_node,
1284                      struct sk_buff *skb,
1285                      u8 *eth_dst)
1286{
1287        struct batadv_nc_path *nc_path, nc_path_key;
1288        struct batadv_nc_packet *nc_packet_out = NULL;
1289        struct batadv_nc_packet *nc_packet, *nc_packet_tmp;
1290        struct batadv_hashtable *hash = bat_priv->nc.coding_hash;
1291        int idx;
1292
1293        if (!hash)
1294                return NULL;
1295
1296        /* Create almost path key */
1297        batadv_nc_hash_key_gen(&nc_path_key, in_nc_node->addr,
1298                               out_nc_node->addr);
1299        idx = batadv_nc_hash_choose(&nc_path_key, hash->size);
1300
1301        /* Check for coding opportunities in this nc_path */
1302        rcu_read_lock();
1303        hlist_for_each_entry_rcu(nc_path, &hash->table[idx], hash_entry) {
1304                if (!batadv_compare_eth(nc_path->prev_hop, in_nc_node->addr))
1305                        continue;
1306
1307                if (!batadv_compare_eth(nc_path->next_hop, out_nc_node->addr))
1308                        continue;
1309
1310                spin_lock_bh(&nc_path->packet_list_lock);
1311                if (list_empty(&nc_path->packet_list)) {
1312                        spin_unlock_bh(&nc_path->packet_list_lock);
1313                        continue;
1314                }
1315
1316                list_for_each_entry_safe(nc_packet, nc_packet_tmp,
1317                                         &nc_path->packet_list, list) {
1318                        if (!batadv_nc_skb_coding_possible(nc_packet->skb,
1319                                                           eth_dst,
1320                                                           in_nc_node->addr))
1321                                continue;
1322
1323                        /* Coding opportunity is found! */
1324                        list_del(&nc_packet->list);
1325                        nc_packet_out = nc_packet;
1326                        break;
1327                }
1328
1329                spin_unlock_bh(&nc_path->packet_list_lock);
1330                break;
1331        }
1332        rcu_read_unlock();
1333
1334        return nc_packet_out;
1335}
1336
1337/**
1338 * batadv_nc_skb_src_search() - Loops through the list of neighoring nodes of
1339 *  the skb's sender (may be equal to the originator).
1340 * @bat_priv: the bat priv with all the soft interface information
1341 * @skb: data skb to forward
1342 * @eth_dst: next hop mac address of skb
1343 * @eth_src: source mac address of skb
1344 * @in_nc_node: pointer to skb next hop's neighbor nc node
1345 *
1346 * Return: an nc packet if a suitable coding packet was found, NULL otherwise.
1347 */
1348static struct batadv_nc_packet *
1349batadv_nc_skb_src_search(struct batadv_priv *bat_priv,
1350                         struct sk_buff *skb,
1351                         u8 *eth_dst,
1352                         u8 *eth_src,
1353                         struct batadv_nc_node *in_nc_node)
1354{
1355        struct batadv_orig_node *orig_node;
1356        struct batadv_nc_node *out_nc_node;
1357        struct batadv_nc_packet *nc_packet = NULL;
1358
1359        orig_node = batadv_orig_hash_find(bat_priv, eth_src);
1360        if (!orig_node)
1361                return NULL;
1362
1363        rcu_read_lock();
1364        list_for_each_entry_rcu(out_nc_node,
1365                                &orig_node->out_coding_list, list) {
1366                /* Check if the skb is decoded and if recoding is possible */
1367                if (!batadv_nc_skb_coding_possible(skb,
1368                                                   out_nc_node->addr, eth_src))
1369                        continue;
1370
1371                /* Search for an opportunity in this nc_path */
1372                nc_packet = batadv_nc_path_search(bat_priv, in_nc_node,
1373                                                  out_nc_node, skb, eth_dst);
1374                if (nc_packet)
1375                        break;
1376        }
1377        rcu_read_unlock();
1378
1379        batadv_orig_node_put(orig_node);
1380        return nc_packet;
1381}
1382
1383/**
1384 * batadv_nc_skb_store_before_coding() - set the ethernet src and dst of the
1385 *  unicast skb before it is stored for use in later decoding
1386 * @bat_priv: the bat priv with all the soft interface information
1387 * @skb: data skb to store
1388 * @eth_dst_new: new destination mac address of skb
1389 */
1390static void batadv_nc_skb_store_before_coding(struct batadv_priv *bat_priv,
1391                                              struct sk_buff *skb,
1392                                              u8 *eth_dst_new)
1393{
1394        struct ethhdr *ethhdr;
1395
1396        /* Copy skb header to change the mac header */
1397        skb = pskb_copy_for_clone(skb, GFP_ATOMIC);
1398        if (!skb)
1399                return;
1400
1401        /* Set the mac header as if we actually sent the packet uncoded */
1402        ethhdr = eth_hdr(skb);
1403        ether_addr_copy(ethhdr->h_source, ethhdr->h_dest);
1404        ether_addr_copy(ethhdr->h_dest, eth_dst_new);
1405
1406        /* Set data pointer to MAC header to mimic packets from our tx path */
1407        skb_push(skb, ETH_HLEN);
1408
1409        /* Add the packet to the decoding packet pool */
1410        batadv_nc_skb_store_for_decoding(bat_priv, skb);
1411
1412        /* batadv_nc_skb_store_for_decoding() clones the skb, so we must free
1413         * our ref
1414         */
1415        consume_skb(skb);
1416}
1417
1418/**
1419 * batadv_nc_skb_dst_search() - Loops through list of neighboring nodes to dst.
1420 * @skb: data skb to forward
1421 * @neigh_node: next hop to forward packet to
1422 * @ethhdr: pointer to the ethernet header inside the skb
1423 *
1424 * Loops through list of neighboring nodes the next hop has a good connection to
1425 * (receives OGMs with a sufficient quality). We need to find a neighbor of our
1426 * next hop that potentially sent a packet which our next hop also received
1427 * (overheard) and has stored for later decoding.
1428 *
1429 * Return: true if the skb was consumed (encoded packet sent) or false otherwise
1430 */
1431static bool batadv_nc_skb_dst_search(struct sk_buff *skb,
1432                                     struct batadv_neigh_node *neigh_node,
1433                                     struct ethhdr *ethhdr)
1434{
1435        struct net_device *netdev = neigh_node->if_incoming->soft_iface;
1436        struct batadv_priv *bat_priv = netdev_priv(netdev);
1437        struct batadv_orig_node *orig_node = neigh_node->orig_node;
1438        struct batadv_nc_node *nc_node;
1439        struct batadv_nc_packet *nc_packet = NULL;
1440
1441        rcu_read_lock();
1442        list_for_each_entry_rcu(nc_node, &orig_node->in_coding_list, list) {
1443                /* Search for coding opportunity with this in_nc_node */
1444                nc_packet = batadv_nc_skb_src_search(bat_priv, skb,
1445                                                     neigh_node->addr,
1446                                                     ethhdr->h_source, nc_node);
1447
1448                /* Opportunity was found, so stop searching */
1449                if (nc_packet)
1450                        break;
1451        }
1452        rcu_read_unlock();
1453
1454        if (!nc_packet)
1455                return false;
1456
1457        /* Save packets for later decoding */
1458        batadv_nc_skb_store_before_coding(bat_priv, skb,
1459                                          neigh_node->addr);
1460        batadv_nc_skb_store_before_coding(bat_priv, nc_packet->skb,
1461                                          nc_packet->neigh_node->addr);
1462
1463        /* Code and send packets */
1464        if (batadv_nc_code_packets(bat_priv, skb, ethhdr, nc_packet,
1465                                   neigh_node))
1466                return true;
1467
1468        /* out of mem ? Coding failed - we have to free the buffered packet
1469         * to avoid memleaks. The skb passed as argument will be dealt with
1470         * by the calling function.
1471         */
1472        batadv_nc_send_packet(nc_packet);
1473        return false;
1474}
1475
1476/**
1477 * batadv_nc_skb_add_to_path() - buffer skb for later encoding / decoding
1478 * @skb: skb to add to path
1479 * @nc_path: path to add skb to
1480 * @neigh_node: next hop to forward packet to
1481 * @packet_id: checksum to identify packet
1482 *
1483 * Return: true if the packet was buffered or false in case of an error.
1484 */
1485static bool batadv_nc_skb_add_to_path(struct sk_buff *skb,
1486                                      struct batadv_nc_path *nc_path,
1487                                      struct batadv_neigh_node *neigh_node,
1488                                      __be32 packet_id)
1489{
1490        struct batadv_nc_packet *nc_packet;
1491
1492        nc_packet = kzalloc(sizeof(*nc_packet), GFP_ATOMIC);
1493        if (!nc_packet)
1494                return false;
1495
1496        /* Initialize nc_packet */
1497        nc_packet->timestamp = jiffies;
1498        nc_packet->packet_id = packet_id;
1499        nc_packet->skb = skb;
1500        nc_packet->neigh_node = neigh_node;
1501        nc_packet->nc_path = nc_path;
1502
1503        /* Add coding packet to list */
1504        spin_lock_bh(&nc_path->packet_list_lock);
1505        list_add_tail(&nc_packet->list, &nc_path->packet_list);
1506        spin_unlock_bh(&nc_path->packet_list_lock);
1507
1508        return true;
1509}
1510
1511/**
1512 * batadv_nc_skb_forward() - try to code a packet or add it to the coding packet
1513 *  buffer
1514 * @skb: data skb to forward
1515 * @neigh_node: next hop to forward packet to
1516 *
1517 * Return: true if the skb was consumed (encoded packet sent) or false otherwise
1518 */
1519bool batadv_nc_skb_forward(struct sk_buff *skb,
1520                           struct batadv_neigh_node *neigh_node)
1521{
1522        const struct net_device *netdev = neigh_node->if_incoming->soft_iface;
1523        struct batadv_priv *bat_priv = netdev_priv(netdev);
1524        struct batadv_unicast_packet *packet;
1525        struct batadv_nc_path *nc_path;
1526        struct ethhdr *ethhdr = eth_hdr(skb);
1527        __be32 packet_id;
1528        u8 *payload;
1529
1530        /* Check if network coding is enabled */
1531        if (!atomic_read(&bat_priv->network_coding))
1532                goto out;
1533
1534        /* We only handle unicast packets */
1535        payload = skb_network_header(skb);
1536        packet = (struct batadv_unicast_packet *)payload;
1537        if (packet->packet_type != BATADV_UNICAST)
1538                goto out;
1539
1540        /* Try to find a coding opportunity and send the skb if one is found */
1541        if (batadv_nc_skb_dst_search(skb, neigh_node, ethhdr))
1542                return true;
1543
1544        /* Find or create a nc_path for this src-dst pair */
1545        nc_path = batadv_nc_get_path(bat_priv,
1546                                     bat_priv->nc.coding_hash,
1547                                     ethhdr->h_source,
1548                                     neigh_node->addr);
1549
1550        if (!nc_path)
1551                goto out;
1552
1553        /* Add skb to nc_path */
1554        packet_id = batadv_skb_crc32(skb, payload + sizeof(*packet));
1555        if (!batadv_nc_skb_add_to_path(skb, nc_path, neigh_node, packet_id))
1556                goto free_nc_path;
1557
1558        /* Packet is consumed */
1559        return true;
1560
1561free_nc_path:
1562        batadv_nc_path_put(nc_path);
1563out:
1564        /* Packet is not consumed */
1565        return false;
1566}
1567
1568/**
1569 * batadv_nc_skb_store_for_decoding() - save a clone of the skb which can be
1570 *  used when decoding coded packets
1571 * @bat_priv: the bat priv with all the soft interface information
1572 * @skb: data skb to store
1573 */
1574void batadv_nc_skb_store_for_decoding(struct batadv_priv *bat_priv,
1575                                      struct sk_buff *skb)
1576{
1577        struct batadv_unicast_packet *packet;
1578        struct batadv_nc_path *nc_path;
1579        struct ethhdr *ethhdr = eth_hdr(skb);
1580        __be32 packet_id;
1581        u8 *payload;
1582
1583        /* Check if network coding is enabled */
1584        if (!atomic_read(&bat_priv->network_coding))
1585                goto out;
1586
1587        /* Check for supported packet type */
1588        payload = skb_network_header(skb);
1589        packet = (struct batadv_unicast_packet *)payload;
1590        if (packet->packet_type != BATADV_UNICAST)
1591                goto out;
1592
1593        /* Find existing nc_path or create a new */
1594        nc_path = batadv_nc_get_path(bat_priv,
1595                                     bat_priv->nc.decoding_hash,
1596                                     ethhdr->h_source,
1597                                     ethhdr->h_dest);
1598
1599        if (!nc_path)
1600                goto out;
1601
1602        /* Clone skb and adjust skb->data to point at batman header */
1603        skb = skb_clone(skb, GFP_ATOMIC);
1604        if (unlikely(!skb))
1605                goto free_nc_path;
1606
1607        if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
1608                goto free_skb;
1609
1610        if (unlikely(!skb_pull_rcsum(skb, ETH_HLEN)))
1611                goto free_skb;
1612
1613        /* Add skb to nc_path */
1614        packet_id = batadv_skb_crc32(skb, payload + sizeof(*packet));
1615        if (!batadv_nc_skb_add_to_path(skb, nc_path, NULL, packet_id))
1616                goto free_skb;
1617
1618        batadv_inc_counter(bat_priv, BATADV_CNT_NC_BUFFER);
1619        return;
1620
1621free_skb:
1622        kfree_skb(skb);
1623free_nc_path:
1624        batadv_nc_path_put(nc_path);
1625out:
1626        return;
1627}
1628
1629/**
1630 * batadv_nc_skb_store_sniffed_unicast() - check if a received unicast packet
1631 *  should be saved in the decoding buffer and, if so, store it there
1632 * @bat_priv: the bat priv with all the soft interface information
1633 * @skb: unicast skb to store
1634 */
1635void batadv_nc_skb_store_sniffed_unicast(struct batadv_priv *bat_priv,
1636                                         struct sk_buff *skb)
1637{
1638        struct ethhdr *ethhdr = eth_hdr(skb);
1639
1640        if (batadv_is_my_mac(bat_priv, ethhdr->h_dest))
1641                return;
1642
1643        /* Set data pointer to MAC header to mimic packets from our tx path */
1644        skb_push(skb, ETH_HLEN);
1645
1646        batadv_nc_skb_store_for_decoding(bat_priv, skb);
1647}
1648
1649/**
1650 * batadv_nc_skb_decode_packet() - decode given skb using the decode data stored
1651 *  in nc_packet
1652 * @bat_priv: the bat priv with all the soft interface information
1653 * @skb: unicast skb to decode
1654 * @nc_packet: decode data needed to decode the skb
1655 *
1656 * Return: pointer to decoded unicast packet if the packet was decoded or NULL
1657 * in case of an error.
1658 */
1659static struct batadv_unicast_packet *
1660batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
1661                            struct batadv_nc_packet *nc_packet)
1662{
1663        const int h_size = sizeof(struct batadv_unicast_packet);
1664        const int h_diff = sizeof(struct batadv_coded_packet) - h_size;
1665        struct batadv_unicast_packet *unicast_packet;
1666        struct batadv_coded_packet coded_packet_tmp;
1667        struct ethhdr *ethhdr, ethhdr_tmp;
1668        u8 *orig_dest, ttl, ttvn;
1669        unsigned int coding_len;
1670        int err;
1671
1672        /* Save headers temporarily */
1673        memcpy(&coded_packet_tmp, skb->data, sizeof(coded_packet_tmp));
1674        memcpy(&ethhdr_tmp, skb_mac_header(skb), sizeof(ethhdr_tmp));
1675
1676        if (skb_cow(skb, 0) < 0)
1677                return NULL;
1678
1679        if (unlikely(!skb_pull_rcsum(skb, h_diff)))
1680                return NULL;
1681
1682        /* Data points to batman header, so set mac header 14 bytes before
1683         * and network to data
1684         */
1685        skb_set_mac_header(skb, -ETH_HLEN);
1686        skb_reset_network_header(skb);
1687
1688        /* Reconstruct original mac header */
1689        ethhdr = eth_hdr(skb);
1690        *ethhdr = ethhdr_tmp;
1691
1692        /* Select the correct unicast header information based on the location
1693         * of our mac address in the coded_packet header
1694         */
1695        if (batadv_is_my_mac(bat_priv, coded_packet_tmp.second_dest)) {
1696                /* If we are the second destination the packet was overheard,
1697                 * so the Ethernet address must be copied to h_dest and
1698                 * pkt_type changed from PACKET_OTHERHOST to PACKET_HOST
1699                 */
1700                ether_addr_copy(ethhdr->h_dest, coded_packet_tmp.second_dest);
1701                skb->pkt_type = PACKET_HOST;
1702
1703                orig_dest = coded_packet_tmp.second_orig_dest;
1704                ttl = coded_packet_tmp.second_ttl;
1705                ttvn = coded_packet_tmp.second_ttvn;
1706        } else {
1707                orig_dest = coded_packet_tmp.first_orig_dest;
1708                ttl = coded_packet_tmp.ttl;
1709                ttvn = coded_packet_tmp.first_ttvn;
1710        }
1711
1712        coding_len = ntohs(coded_packet_tmp.coded_len);
1713
1714        if (coding_len > skb->len)
1715                return NULL;
1716
1717        /* Here the magic is reversed:
1718         *   extract the missing packet from the received coded packet
1719         */
1720        batadv_nc_memxor(skb->data + h_size,
1721                         nc_packet->skb->data + h_size,
1722                         coding_len);
1723
1724        /* Resize decoded skb if decoded with larger packet */
1725        if (nc_packet->skb->len > coding_len + h_size) {
1726                err = pskb_trim_rcsum(skb, coding_len + h_size);
1727                if (err)
1728                        return NULL;
1729        }
1730
1731        /* Create decoded unicast packet */
1732        unicast_packet = (struct batadv_unicast_packet *)skb->data;
1733        unicast_packet->packet_type = BATADV_UNICAST;
1734        unicast_packet->version = BATADV_COMPAT_VERSION;
1735        unicast_packet->ttl = ttl;
1736        ether_addr_copy(unicast_packet->dest, orig_dest);
1737        unicast_packet->ttvn = ttvn;
1738
1739        batadv_nc_packet_free(nc_packet, false);
1740        return unicast_packet;
1741}
1742
1743/**
1744 * batadv_nc_find_decoding_packet() - search through buffered decoding data to
1745 *  find the data needed to decode the coded packet
1746 * @bat_priv: the bat priv with all the soft interface information
1747 * @ethhdr: pointer to the ethernet header inside the coded packet
1748 * @coded: coded packet we try to find decode data for
1749 *
1750 * Return: pointer to nc packet if the needed data was found or NULL otherwise.
1751 */
1752static struct batadv_nc_packet *
1753batadv_nc_find_decoding_packet(struct batadv_priv *bat_priv,
1754                               struct ethhdr *ethhdr,
1755                               struct batadv_coded_packet *coded)
1756{
1757        struct batadv_hashtable *hash = bat_priv->nc.decoding_hash;
1758        struct batadv_nc_packet *tmp_nc_packet, *nc_packet = NULL;
1759        struct batadv_nc_path *nc_path, nc_path_key;
1760        u8 *dest, *source;
1761        __be32 packet_id;
1762        int index;
1763
1764        if (!hash)
1765                return NULL;
1766
1767        /* Select the correct packet id based on the location of our mac-addr */
1768        dest = ethhdr->h_source;
1769        if (!batadv_is_my_mac(bat_priv, coded->second_dest)) {
1770                source = coded->second_source;
1771                packet_id = coded->second_crc;
1772        } else {
1773                source = coded->first_source;
1774                packet_id = coded->first_crc;
1775        }
1776
1777        batadv_nc_hash_key_gen(&nc_path_key, source, dest);
1778        index = batadv_nc_hash_choose(&nc_path_key, hash->size);
1779
1780        /* Search for matching coding path */
1781        rcu_read_lock();
1782        hlist_for_each_entry_rcu(nc_path, &hash->table[index], hash_entry) {
1783                /* Find matching nc_packet */
1784                spin_lock_bh(&nc_path->packet_list_lock);
1785                list_for_each_entry(tmp_nc_packet,
1786                                    &nc_path->packet_list, list) {
1787                        if (packet_id == tmp_nc_packet->packet_id) {
1788                                list_del(&tmp_nc_packet->list);
1789
1790                                nc_packet = tmp_nc_packet;
1791                                break;
1792                        }
1793                }
1794                spin_unlock_bh(&nc_path->packet_list_lock);
1795
1796                if (nc_packet)
1797                        break;
1798        }
1799        rcu_read_unlock();
1800
1801        if (!nc_packet)
1802                batadv_dbg(BATADV_DBG_NC, bat_priv,
1803                           "No decoding packet found for %u\n", packet_id);
1804
1805        return nc_packet;
1806}
1807
1808/**
1809 * batadv_nc_recv_coded_packet() - try to decode coded packet and enqueue the
1810 *  resulting unicast packet
1811 * @skb: incoming coded packet
1812 * @recv_if: pointer to interface this packet was received on
1813 *
1814 * Return: NET_RX_SUCCESS if the packet has been consumed or NET_RX_DROP
1815 * otherwise.
1816 */
1817static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
1818                                       struct batadv_hard_iface *recv_if)
1819{
1820        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1821        struct batadv_unicast_packet *unicast_packet;
1822        struct batadv_coded_packet *coded_packet;
1823        struct batadv_nc_packet *nc_packet;
1824        struct ethhdr *ethhdr;
1825        int hdr_size = sizeof(*coded_packet);
1826
1827        /* Check if network coding is enabled */
1828        if (!atomic_read(&bat_priv->network_coding))
1829                goto free_skb;
1830
1831        /* Make sure we can access (and remove) header */
1832        if (unlikely(!pskb_may_pull(skb, hdr_size)))
1833                goto free_skb;
1834
1835        coded_packet = (struct batadv_coded_packet *)skb->data;
1836        ethhdr = eth_hdr(skb);
1837
1838        /* Verify frame is destined for us */
1839        if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest) &&
1840            !batadv_is_my_mac(bat_priv, coded_packet->second_dest))
1841                goto free_skb;
1842
1843        /* Update stat counter */
1844        if (batadv_is_my_mac(bat_priv, coded_packet->second_dest))
1845                batadv_inc_counter(bat_priv, BATADV_CNT_NC_SNIFFED);
1846
1847        nc_packet = batadv_nc_find_decoding_packet(bat_priv, ethhdr,
1848                                                   coded_packet);
1849        if (!nc_packet) {
1850                batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE_FAILED);
1851                goto free_skb;
1852        }
1853
1854        /* Make skb's linear, because decoding accesses the entire buffer */
1855        if (skb_linearize(skb) < 0)
1856                goto free_nc_packet;
1857
1858        if (skb_linearize(nc_packet->skb) < 0)
1859                goto free_nc_packet;
1860
1861        /* Decode the packet */
1862        unicast_packet = batadv_nc_skb_decode_packet(bat_priv, skb, nc_packet);
1863        if (!unicast_packet) {
1864                batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE_FAILED);
1865                goto free_nc_packet;
1866        }
1867
1868        /* Mark packet as decoded to do correct recoding when forwarding */
1869        BATADV_SKB_CB(skb)->decoded = true;
1870        batadv_inc_counter(bat_priv, BATADV_CNT_NC_DECODE);
1871        batadv_add_counter(bat_priv, BATADV_CNT_NC_DECODE_BYTES,
1872                           skb->len + ETH_HLEN);
1873        return batadv_recv_unicast_packet(skb, recv_if);
1874
1875free_nc_packet:
1876        batadv_nc_packet_free(nc_packet, true);
1877free_skb:
1878        kfree_skb(skb);
1879
1880        return NET_RX_DROP;
1881}
1882
1883/**
1884 * batadv_nc_mesh_free() - clean up network coding memory
1885 * @bat_priv: the bat priv with all the soft interface information
1886 */
1887void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
1888{
1889        batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_NC, 1);
1890        batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_NC, 1);
1891        cancel_delayed_work_sync(&bat_priv->nc.work);
1892
1893        batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL);
1894        batadv_hash_destroy(bat_priv->nc.coding_hash);
1895        batadv_nc_purge_paths(bat_priv, bat_priv->nc.decoding_hash, NULL);
1896        batadv_hash_destroy(bat_priv->nc.decoding_hash);
1897}
1898
1899#ifdef CONFIG_BATMAN_ADV_DEBUGFS
1900/**
1901 * batadv_nc_nodes_seq_print_text() - print the nc node information
1902 * @seq: seq file to print on
1903 * @offset: not used
1904 *
1905 * Return: always 0
1906 */
1907int batadv_nc_nodes_seq_print_text(struct seq_file *seq, void *offset)
1908{
1909        struct net_device *net_dev = (struct net_device *)seq->private;
1910        struct batadv_priv *bat_priv = netdev_priv(net_dev);
1911        struct batadv_hashtable *hash = bat_priv->orig_hash;
1912        struct batadv_hard_iface *primary_if;
1913        struct hlist_head *head;
1914        struct batadv_orig_node *orig_node;
1915        struct batadv_nc_node *nc_node;
1916        int i;
1917
1918        primary_if = batadv_seq_print_text_primary_if_get(seq);
1919        if (!primary_if)
1920                goto out;
1921
1922        /* Traverse list of originators */
1923        for (i = 0; i < hash->size; i++) {
1924                head = &hash->table[i];
1925
1926                /* For each orig_node in this bin */
1927                rcu_read_lock();
1928                hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
1929                        /* no need to print the orig node if it does not have
1930                         * network coding neighbors
1931                         */
1932                        if (list_empty(&orig_node->in_coding_list) &&
1933                            list_empty(&orig_node->out_coding_list))
1934                                continue;
1935
1936                        seq_printf(seq, "Node:      %pM\n", orig_node->orig);
1937
1938                        seq_puts(seq, " Ingoing:  ");
1939                        /* For each in_nc_node to this orig_node */
1940                        list_for_each_entry_rcu(nc_node,
1941                                                &orig_node->in_coding_list,
1942                                                list)
1943                                seq_printf(seq, "%pM ",
1944                                           nc_node->addr);
1945                        seq_puts(seq, "\n Outgoing: ");
1946                        /* For out_nc_node to this orig_node */
1947                        list_for_each_entry_rcu(nc_node,
1948                                                &orig_node->out_coding_list,
1949                                                list)
1950                                seq_printf(seq, "%pM ",
1951                                           nc_node->addr);
1952                        seq_puts(seq, "\n\n");
1953                }
1954                rcu_read_unlock();
1955        }
1956
1957out:
1958        if (primary_if)
1959                batadv_hardif_put(primary_if);
1960        return 0;
1961}
1962
1963/**
1964 * batadv_nc_init_debugfs() - create nc folder and related files in debugfs
1965 * @bat_priv: the bat priv with all the soft interface information
1966 *
1967 * Return: 0 on success or negative error number in case of failure
1968 */
1969int batadv_nc_init_debugfs(struct batadv_priv *bat_priv)
1970{
1971        struct dentry *nc_dir, *file;
1972
1973        nc_dir = debugfs_create_dir("nc", bat_priv->debug_dir);
1974        if (!nc_dir)
1975                goto out;
1976
1977        file = debugfs_create_u8("min_tq", 0644, nc_dir, &bat_priv->nc.min_tq);
1978        if (!file)
1979                goto out;
1980
1981        file = debugfs_create_u32("max_fwd_delay", 0644, nc_dir,
1982                                  &bat_priv->nc.max_fwd_delay);
1983        if (!file)
1984                goto out;
1985
1986        file = debugfs_create_u32("max_buffer_time", 0644, nc_dir,
1987                                  &bat_priv->nc.max_buffer_time);
1988        if (!file)
1989                goto out;
1990
1991        return 0;
1992
1993out:
1994        return -ENOMEM;
1995}
1996#endif
1997