linux/net/batman-adv/distributed-arp-table.c
<<
>>
Prefs
   1/* Copyright (C) 2011-2013 B.A.T.M.A.N. contributors:
   2 *
   3 * Antonio Quartulli
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of version 2 of the GNU General Public
   7 * License as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but
  10 * WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12 * General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write to the Free Software
  16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17 * 02110-1301, USA
  18 */
  19
  20#include <linux/if_ether.h>
  21#include <linux/if_arp.h>
  22#include <net/arp.h>
  23
  24#include "main.h"
  25#include "hash.h"
  26#include "distributed-arp-table.h"
  27#include "hard-interface.h"
  28#include "originator.h"
  29#include "send.h"
  30#include "types.h"
  31#include "translation-table.h"
  32#include "unicast.h"
  33
  34static void batadv_dat_purge(struct work_struct *work);
  35
  36/**
  37 * batadv_dat_start_timer - initialise the DAT periodic worker
  38 * @bat_priv: the bat priv with all the soft interface information
  39 */
  40static void batadv_dat_start_timer(struct batadv_priv *bat_priv)
  41{
  42        INIT_DELAYED_WORK(&bat_priv->dat.work, batadv_dat_purge);
  43        queue_delayed_work(batadv_event_workqueue, &bat_priv->dat.work,
  44                           msecs_to_jiffies(10000));
  45}
  46
  47/**
  48 * batadv_dat_entry_free_ref - decrements the dat_entry refcounter and possibly
  49 * free it
  50 * @dat_entry: the oentry to free
  51 */
  52static void batadv_dat_entry_free_ref(struct batadv_dat_entry *dat_entry)
  53{
  54        if (atomic_dec_and_test(&dat_entry->refcount))
  55                kfree_rcu(dat_entry, rcu);
  56}
  57
  58/**
  59 * batadv_dat_to_purge - checks whether a dat_entry has to be purged or not
  60 * @dat_entry: the entry to check
  61 *
  62 * Returns true if the entry has to be purged now, false otherwise
  63 */
  64static bool batadv_dat_to_purge(struct batadv_dat_entry *dat_entry)
  65{
  66        return batadv_has_timed_out(dat_entry->last_update,
  67                                    BATADV_DAT_ENTRY_TIMEOUT);
  68}
  69
  70/**
  71 * __batadv_dat_purge - delete entries from the DAT local storage
  72 * @bat_priv: the bat priv with all the soft interface information
  73 * @to_purge: function in charge to decide whether an entry has to be purged or
  74 *            not. This function takes the dat_entry as argument and has to
  75 *            returns a boolean value: true is the entry has to be deleted,
  76 *            false otherwise
  77 *
  78 * Loops over each entry in the DAT local storage and delete it if and only if
  79 * the to_purge function passed as argument returns true
  80 */
  81static void __batadv_dat_purge(struct batadv_priv *bat_priv,
  82                               bool (*to_purge)(struct batadv_dat_entry *))
  83{
  84        spinlock_t *list_lock; /* protects write access to the hash lists */
  85        struct batadv_dat_entry *dat_entry;
  86        struct hlist_node *node_tmp;
  87        struct hlist_head *head;
  88        uint32_t i;
  89
  90        if (!bat_priv->dat.hash)
  91                return;
  92
  93        for (i = 0; i < bat_priv->dat.hash->size; i++) {
  94                head = &bat_priv->dat.hash->table[i];
  95                list_lock = &bat_priv->dat.hash->list_locks[i];
  96
  97                spin_lock_bh(list_lock);
  98                hlist_for_each_entry_safe(dat_entry, node_tmp, head,
  99                                          hash_entry) {
 100                        /* if an helper function has been passed as parameter,
 101                         * ask it if the entry has to be purged or not
 102                         */
 103                        if (to_purge && !to_purge(dat_entry))
 104                                continue;
 105
 106                        hlist_del_rcu(&dat_entry->hash_entry);
 107                        batadv_dat_entry_free_ref(dat_entry);
 108                }
 109                spin_unlock_bh(list_lock);
 110        }
 111}
 112
 113/**
 114 * batadv_dat_purge - periodic task that deletes old entries from the local DAT
 115 * hash table
 116 * @work: kernel work struct
 117 */
 118static void batadv_dat_purge(struct work_struct *work)
 119{
 120        struct delayed_work *delayed_work;
 121        struct batadv_priv_dat *priv_dat;
 122        struct batadv_priv *bat_priv;
 123
 124        delayed_work = container_of(work, struct delayed_work, work);
 125        priv_dat = container_of(delayed_work, struct batadv_priv_dat, work);
 126        bat_priv = container_of(priv_dat, struct batadv_priv, dat);
 127
 128        __batadv_dat_purge(bat_priv, batadv_dat_to_purge);
 129        batadv_dat_start_timer(bat_priv);
 130}
 131
 132/**
 133 * batadv_compare_dat - comparing function used in the local DAT hash table
 134 * @node: node in the local table
 135 * @data2: second object to compare the node to
 136 *
 137 * Returns 1 if the two entry are the same, 0 otherwise
 138 */
 139static int batadv_compare_dat(const struct hlist_node *node, const void *data2)
 140{
 141        const void *data1 = container_of(node, struct batadv_dat_entry,
 142                                         hash_entry);
 143
 144        return (memcmp(data1, data2, sizeof(__be32)) == 0 ? 1 : 0);
 145}
 146
 147/**
 148 * batadv_arp_hw_src - extract the hw_src field from an ARP packet
 149 * @skb: ARP packet
 150 * @hdr_size: size of the possible header before the ARP packet
 151 *
 152 * Returns the value of the hw_src field in the ARP packet
 153 */
 154static uint8_t *batadv_arp_hw_src(struct sk_buff *skb, int hdr_size)
 155{
 156        uint8_t *addr;
 157
 158        addr = (uint8_t *)(skb->data + hdr_size);
 159        addr += ETH_HLEN + sizeof(struct arphdr);
 160
 161        return addr;
 162}
 163
 164/**
 165 * batadv_arp_ip_src - extract the ip_src field from an ARP packet
 166 * @skb: ARP packet
 167 * @hdr_size: size of the possible header before the ARP packet
 168 *
 169 * Returns the value of the ip_src field in the ARP packet
 170 */
 171static __be32 batadv_arp_ip_src(struct sk_buff *skb, int hdr_size)
 172{
 173        return *(__be32 *)(batadv_arp_hw_src(skb, hdr_size) + ETH_ALEN);
 174}
 175
 176/**
 177 * batadv_arp_hw_dst - extract the hw_dst field from an ARP packet
 178 * @skb: ARP packet
 179 * @hdr_size: size of the possible header before the ARP packet
 180 *
 181 * Returns the value of the hw_dst field in the ARP packet
 182 */
 183static uint8_t *batadv_arp_hw_dst(struct sk_buff *skb, int hdr_size)
 184{
 185        return batadv_arp_hw_src(skb, hdr_size) + ETH_ALEN + 4;
 186}
 187
 188/**
 189 * batadv_arp_ip_dst - extract the ip_dst field from an ARP packet
 190 * @skb: ARP packet
 191 * @hdr_size: size of the possible header before the ARP packet
 192 *
 193 * Returns the value of the ip_dst field in the ARP packet
 194 */
 195static __be32 batadv_arp_ip_dst(struct sk_buff *skb, int hdr_size)
 196{
 197        return *(__be32 *)(batadv_arp_hw_src(skb, hdr_size) + ETH_ALEN * 2 + 4);
 198}
 199
 200/**
 201 * batadv_hash_dat - compute the hash value for an IP address
 202 * @data: data to hash
 203 * @size: size of the hash table
 204 *
 205 * Returns the selected index in the hash table for the given data
 206 */
 207static uint32_t batadv_hash_dat(const void *data, uint32_t size)
 208{
 209        const unsigned char *key = data;
 210        uint32_t hash = 0;
 211        size_t i;
 212
 213        for (i = 0; i < 4; i++) {
 214                hash += key[i];
 215                hash += (hash << 10);
 216                hash ^= (hash >> 6);
 217        }
 218
 219        hash += (hash << 3);
 220        hash ^= (hash >> 11);
 221        hash += (hash << 15);
 222
 223        return hash % size;
 224}
 225
 226/**
 227 * batadv_dat_entry_hash_find - looks for a given dat_entry in the local hash
 228 * table
 229 * @bat_priv: the bat priv with all the soft interface information
 230 * @ip: search key
 231 *
 232 * Returns the dat_entry if found, NULL otherwise
 233 */
 234static struct batadv_dat_entry *
 235batadv_dat_entry_hash_find(struct batadv_priv *bat_priv, __be32 ip)
 236{
 237        struct hlist_head *head;
 238        struct batadv_dat_entry *dat_entry, *dat_entry_tmp = NULL;
 239        struct batadv_hashtable *hash = bat_priv->dat.hash;
 240        uint32_t index;
 241
 242        if (!hash)
 243                return NULL;
 244
 245        index = batadv_hash_dat(&ip, hash->size);
 246        head = &hash->table[index];
 247
 248        rcu_read_lock();
 249        hlist_for_each_entry_rcu(dat_entry, head, hash_entry) {
 250                if (dat_entry->ip != ip)
 251                        continue;
 252
 253                if (!atomic_inc_not_zero(&dat_entry->refcount))
 254                        continue;
 255
 256                dat_entry_tmp = dat_entry;
 257                break;
 258        }
 259        rcu_read_unlock();
 260
 261        return dat_entry_tmp;
 262}
 263
 264/**
 265 * batadv_dat_entry_add - add a new dat entry or update it if already exists
 266 * @bat_priv: the bat priv with all the soft interface information
 267 * @ip: ipv4 to add/edit
 268 * @mac_addr: mac address to assign to the given ipv4
 269 */
 270static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip,
 271                                 uint8_t *mac_addr)
 272{
 273        struct batadv_dat_entry *dat_entry;
 274        int hash_added;
 275
 276        dat_entry = batadv_dat_entry_hash_find(bat_priv, ip);
 277        /* if this entry is already known, just update it */
 278        if (dat_entry) {
 279                if (!batadv_compare_eth(dat_entry->mac_addr, mac_addr))
 280                        memcpy(dat_entry->mac_addr, mac_addr, ETH_ALEN);
 281                dat_entry->last_update = jiffies;
 282                batadv_dbg(BATADV_DBG_DAT, bat_priv,
 283                           "Entry updated: %pI4 %pM\n", &dat_entry->ip,
 284                           dat_entry->mac_addr);
 285                goto out;
 286        }
 287
 288        dat_entry = kmalloc(sizeof(*dat_entry), GFP_ATOMIC);
 289        if (!dat_entry)
 290                goto out;
 291
 292        dat_entry->ip = ip;
 293        memcpy(dat_entry->mac_addr, mac_addr, ETH_ALEN);
 294        dat_entry->last_update = jiffies;
 295        atomic_set(&dat_entry->refcount, 2);
 296
 297        hash_added = batadv_hash_add(bat_priv->dat.hash, batadv_compare_dat,
 298                                     batadv_hash_dat, &dat_entry->ip,
 299                                     &dat_entry->hash_entry);
 300
 301        if (unlikely(hash_added != 0)) {
 302                /* remove the reference for the hash */
 303                batadv_dat_entry_free_ref(dat_entry);
 304                goto out;
 305        }
 306
 307        batadv_dbg(BATADV_DBG_DAT, bat_priv, "New entry added: %pI4 %pM\n",
 308                   &dat_entry->ip, dat_entry->mac_addr);
 309
 310out:
 311        if (dat_entry)
 312                batadv_dat_entry_free_ref(dat_entry);
 313}
 314
 315#ifdef CONFIG_BATMAN_ADV_DEBUG
 316
 317/**
 318 * batadv_dbg_arp - print a debug message containing all the ARP packet details
 319 * @bat_priv: the bat priv with all the soft interface information
 320 * @skb: ARP packet
 321 * @type: ARP type
 322 * @hdr_size: size of the possible header before the ARP packet
 323 * @msg: message to print together with the debugging information
 324 */
 325static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb,
 326                           uint16_t type, int hdr_size, char *msg)
 327{
 328        struct batadv_unicast_4addr_packet *unicast_4addr_packet;
 329        struct batadv_bcast_packet *bcast_pkt;
 330        uint8_t *orig_addr;
 331        __be32 ip_src, ip_dst;
 332
 333        if (msg)
 334                batadv_dbg(BATADV_DBG_DAT, bat_priv, "%s\n", msg);
 335
 336        ip_src = batadv_arp_ip_src(skb, hdr_size);
 337        ip_dst = batadv_arp_ip_dst(skb, hdr_size);
 338        batadv_dbg(BATADV_DBG_DAT, bat_priv,
 339                   "ARP MSG = [src: %pM-%pI4 dst: %pM-%pI4]\n",
 340                   batadv_arp_hw_src(skb, hdr_size), &ip_src,
 341                   batadv_arp_hw_dst(skb, hdr_size), &ip_dst);
 342
 343        if (hdr_size == 0)
 344                return;
 345
 346        /* if the ARP packet is encapsulated in a batman packet, let's print
 347         * some debug messages
 348         */
 349        unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
 350
 351        switch (unicast_4addr_packet->u.header.packet_type) {
 352        case BATADV_UNICAST:
 353                batadv_dbg(BATADV_DBG_DAT, bat_priv,
 354                           "* encapsulated within a UNICAST packet\n");
 355                break;
 356        case BATADV_UNICAST_4ADDR:
 357                batadv_dbg(BATADV_DBG_DAT, bat_priv,
 358                           "* encapsulated within a UNICAST_4ADDR packet (src: %pM)\n",
 359                           unicast_4addr_packet->src);
 360                switch (unicast_4addr_packet->subtype) {
 361                case BATADV_P_DAT_DHT_PUT:
 362                        batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: DAT_DHT_PUT\n");
 363                        break;
 364                case BATADV_P_DAT_DHT_GET:
 365                        batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: DAT_DHT_GET\n");
 366                        break;
 367                case BATADV_P_DAT_CACHE_REPLY:
 368                        batadv_dbg(BATADV_DBG_DAT, bat_priv,
 369                                   "* type: DAT_CACHE_REPLY\n");
 370                        break;
 371                case BATADV_P_DATA:
 372                        batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: DATA\n");
 373                        break;
 374                default:
 375                        batadv_dbg(BATADV_DBG_DAT, bat_priv, "* type: Unknown (%u)!\n",
 376                                   unicast_4addr_packet->u.header.packet_type);
 377                }
 378                break;
 379        case BATADV_BCAST:
 380                bcast_pkt = (struct batadv_bcast_packet *)unicast_4addr_packet;
 381                orig_addr = bcast_pkt->orig;
 382                batadv_dbg(BATADV_DBG_DAT, bat_priv,
 383                           "* encapsulated within a BCAST packet (src: %pM)\n",
 384                           orig_addr);
 385                break;
 386        default:
 387                batadv_dbg(BATADV_DBG_DAT, bat_priv,
 388                           "* encapsulated within an unknown packet type (0x%x)\n",
 389                           unicast_4addr_packet->u.header.packet_type);
 390        }
 391}
 392
 393#else
 394
 395static void batadv_dbg_arp(struct batadv_priv *bat_priv, struct sk_buff *skb,
 396                           uint16_t type, int hdr_size, char *msg)
 397{
 398}
 399
 400#endif /* CONFIG_BATMAN_ADV_DEBUG */
 401
 402/**
 403 * batadv_is_orig_node_eligible - check whether a node can be a DHT candidate
 404 * @res: the array with the already selected candidates
 405 * @select: number of already selected candidates
 406 * @tmp_max: address of the currently evaluated node
 407 * @max: current round max address
 408 * @last_max: address of the last selected candidate
 409 * @candidate: orig_node under evaluation
 410 * @max_orig_node: last selected candidate
 411 *
 412 * Returns true if the node has been elected as next candidate or false othrwise
 413 */
 414static bool batadv_is_orig_node_eligible(struct batadv_dat_candidate *res,
 415                                         int select, batadv_dat_addr_t tmp_max,
 416                                         batadv_dat_addr_t max,
 417                                         batadv_dat_addr_t last_max,
 418                                         struct batadv_orig_node *candidate,
 419                                         struct batadv_orig_node *max_orig_node)
 420{
 421        bool ret = false;
 422        int j;
 423
 424        /* Check if this node has already been selected... */
 425        for (j = 0; j < select; j++)
 426                if (res[j].orig_node == candidate)
 427                        break;
 428        /* ..and possibly skip it */
 429        if (j < select)
 430                goto out;
 431        /* sanity check: has it already been selected? This should not happen */
 432        if (tmp_max > last_max)
 433                goto out;
 434        /* check if during this iteration an originator with a closer dht
 435         * address has already been found
 436         */
 437        if (tmp_max < max)
 438                goto out;
 439        /* this is an hash collision with the temporary selected node. Choose
 440         * the one with the lowest address
 441         */
 442        if ((tmp_max == max) && max_orig_node &&
 443            (batadv_compare_eth(candidate->orig, max_orig_node->orig) > 0))
 444                goto out;
 445
 446        ret = true;
 447out:
 448        return ret;
 449}
 450
 451/**
 452 * batadv_choose_next_candidate - select the next DHT candidate
 453 * @bat_priv: the bat priv with all the soft interface information
 454 * @cands: candidates array
 455 * @select: number of candidates already present in the array
 456 * @ip_key: key to look up in the DHT
 457 * @last_max: pointer where the address of the selected candidate will be saved
 458 */
 459static void batadv_choose_next_candidate(struct batadv_priv *bat_priv,
 460                                         struct batadv_dat_candidate *cands,
 461                                         int select, batadv_dat_addr_t ip_key,
 462                                         batadv_dat_addr_t *last_max)
 463{
 464        batadv_dat_addr_t max = 0, tmp_max = 0;
 465        struct batadv_orig_node *orig_node, *max_orig_node = NULL;
 466        struct batadv_hashtable *hash = bat_priv->orig_hash;
 467        struct hlist_head *head;
 468        int i;
 469
 470        /* if no node is eligible as candidate, leave the candidate type as
 471         * NOT_FOUND
 472         */
 473        cands[select].type = BATADV_DAT_CANDIDATE_NOT_FOUND;
 474
 475        /* iterate over the originator list and find the node with closest
 476         * dat_address which has not been selected yet
 477         */
 478        for (i = 0; i < hash->size; i++) {
 479                head = &hash->table[i];
 480
 481                rcu_read_lock();
 482                hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
 483                        /* the dht space is a ring and addresses are unsigned */
 484                        tmp_max = BATADV_DAT_ADDR_MAX - orig_node->dat_addr +
 485                                  ip_key;
 486
 487                        if (!batadv_is_orig_node_eligible(cands, select,
 488                                                          tmp_max, max,
 489                                                          *last_max, orig_node,
 490                                                          max_orig_node))
 491                                continue;
 492
 493                        if (!atomic_inc_not_zero(&orig_node->refcount))
 494                                continue;
 495
 496                        max = tmp_max;
 497                        if (max_orig_node)
 498                                batadv_orig_node_free_ref(max_orig_node);
 499                        max_orig_node = orig_node;
 500                }
 501                rcu_read_unlock();
 502        }
 503        if (max_orig_node) {
 504                cands[select].type = BATADV_DAT_CANDIDATE_ORIG;
 505                cands[select].orig_node = max_orig_node;
 506                batadv_dbg(BATADV_DBG_DAT, bat_priv,
 507                           "dat_select_candidates() %d: selected %pM addr=%u dist=%u\n",
 508                           select, max_orig_node->orig, max_orig_node->dat_addr,
 509                           max);
 510        }
 511        *last_max = max;
 512}
 513
 514/**
 515 * batadv_dat_select_candidates - selects the nodes which the DHT message has to
 516 * be sent to
 517 * @bat_priv: the bat priv with all the soft interface information
 518 * @ip_dst: ipv4 to look up in the DHT
 519 *
 520 * An originator O is selected if and only if its DHT_ID value is one of three
 521 * closest values (from the LEFT, with wrap around if needed) then the hash
 522 * value of the key. ip_dst is the key.
 523 *
 524 * Returns the candidate array of size BATADV_DAT_CANDIDATE_NUM
 525 */
 526static struct batadv_dat_candidate *
 527batadv_dat_select_candidates(struct batadv_priv *bat_priv, __be32 ip_dst)
 528{
 529        int select;
 530        batadv_dat_addr_t last_max = BATADV_DAT_ADDR_MAX, ip_key;
 531        struct batadv_dat_candidate *res;
 532
 533        if (!bat_priv->orig_hash)
 534                return NULL;
 535
 536        res = kmalloc(BATADV_DAT_CANDIDATES_NUM * sizeof(*res), GFP_ATOMIC);
 537        if (!res)
 538                return NULL;
 539
 540        ip_key = (batadv_dat_addr_t)batadv_hash_dat(&ip_dst,
 541                                                    BATADV_DAT_ADDR_MAX);
 542
 543        batadv_dbg(BATADV_DBG_DAT, bat_priv,
 544                   "dat_select_candidates(): IP=%pI4 hash(IP)=%u\n", &ip_dst,
 545                   ip_key);
 546
 547        for (select = 0; select < BATADV_DAT_CANDIDATES_NUM; select++)
 548                batadv_choose_next_candidate(bat_priv, res, select, ip_key,
 549                                             &last_max);
 550
 551        return res;
 552}
 553
 554/**
 555 * batadv_dat_send_data - send a payload to the selected candidates
 556 * @bat_priv: the bat priv with all the soft interface information
 557 * @skb: payload to send
 558 * @ip: the DHT key
 559 * @packet_subtype: unicast4addr packet subtype to use
 560 *
 561 * In this function the skb is copied by means of pskb_copy() and is sent as
 562 * unicast packet to each of the selected candidates
 563 *
 564 * Returns true if the packet is sent to at least one candidate, false otherwise
 565 */
 566static bool batadv_dat_send_data(struct batadv_priv *bat_priv,
 567                                 struct sk_buff *skb, __be32 ip,
 568                                 int packet_subtype)
 569{
 570        int i;
 571        bool ret = false;
 572        int send_status;
 573        struct batadv_neigh_node *neigh_node = NULL;
 574        struct sk_buff *tmp_skb;
 575        struct batadv_dat_candidate *cand;
 576
 577        cand = batadv_dat_select_candidates(bat_priv, ip);
 578        if (!cand)
 579                goto out;
 580
 581        batadv_dbg(BATADV_DBG_DAT, bat_priv, "DHT_SEND for %pI4\n", &ip);
 582
 583        for (i = 0; i < BATADV_DAT_CANDIDATES_NUM; i++) {
 584                if (cand[i].type == BATADV_DAT_CANDIDATE_NOT_FOUND)
 585                        continue;
 586
 587                neigh_node = batadv_orig_node_get_router(cand[i].orig_node);
 588                if (!neigh_node)
 589                        goto free_orig;
 590
 591                tmp_skb = pskb_copy(skb, GFP_ATOMIC);
 592                if (!batadv_unicast_4addr_prepare_skb(bat_priv, tmp_skb,
 593                                                      cand[i].orig_node,
 594                                                      packet_subtype)) {
 595                        kfree_skb(tmp_skb);
 596                        goto free_neigh;
 597                }
 598
 599                send_status = batadv_send_skb_packet(tmp_skb,
 600                                                     neigh_node->if_incoming,
 601                                                     neigh_node->addr);
 602                if (send_status == NET_XMIT_SUCCESS) {
 603                        /* count the sent packet */
 604                        switch (packet_subtype) {
 605                        case BATADV_P_DAT_DHT_GET:
 606                                batadv_inc_counter(bat_priv,
 607                                                   BATADV_CNT_DAT_GET_TX);
 608                                break;
 609                        case BATADV_P_DAT_DHT_PUT:
 610                                batadv_inc_counter(bat_priv,
 611                                                   BATADV_CNT_DAT_PUT_TX);
 612                                break;
 613                        }
 614
 615                        /* packet sent to a candidate: return true */
 616                        ret = true;
 617                }
 618free_neigh:
 619                batadv_neigh_node_free_ref(neigh_node);
 620free_orig:
 621                batadv_orig_node_free_ref(cand[i].orig_node);
 622        }
 623
 624out:
 625        kfree(cand);
 626        return ret;
 627}
 628
 629/**
 630 * batadv_dat_hash_free - free the local DAT hash table
 631 * @bat_priv: the bat priv with all the soft interface information
 632 */
 633static void batadv_dat_hash_free(struct batadv_priv *bat_priv)
 634{
 635        if (!bat_priv->dat.hash)
 636                return;
 637
 638        __batadv_dat_purge(bat_priv, NULL);
 639
 640        batadv_hash_destroy(bat_priv->dat.hash);
 641
 642        bat_priv->dat.hash = NULL;
 643}
 644
 645/**
 646 * batadv_dat_init - initialise the DAT internals
 647 * @bat_priv: the bat priv with all the soft interface information
 648 */
 649int batadv_dat_init(struct batadv_priv *bat_priv)
 650{
 651        if (bat_priv->dat.hash)
 652                return 0;
 653
 654        bat_priv->dat.hash = batadv_hash_new(1024);
 655
 656        if (!bat_priv->dat.hash)
 657                return -ENOMEM;
 658
 659        batadv_dat_start_timer(bat_priv);
 660
 661        return 0;
 662}
 663
 664/**
 665 * batadv_dat_free - free the DAT internals
 666 * @bat_priv: the bat priv with all the soft interface information
 667 */
 668void batadv_dat_free(struct batadv_priv *bat_priv)
 669{
 670        cancel_delayed_work_sync(&bat_priv->dat.work);
 671
 672        batadv_dat_hash_free(bat_priv);
 673}
 674
 675/**
 676 * batadv_dat_cache_seq_print_text - print the local DAT hash table
 677 * @seq: seq file to print on
 678 * @offset: not used
 679 */
 680int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset)
 681{
 682        struct net_device *net_dev = (struct net_device *)seq->private;
 683        struct batadv_priv *bat_priv = netdev_priv(net_dev);
 684        struct batadv_hashtable *hash = bat_priv->dat.hash;
 685        struct batadv_dat_entry *dat_entry;
 686        struct batadv_hard_iface *primary_if;
 687        struct hlist_head *head;
 688        unsigned long last_seen_jiffies;
 689        int last_seen_msecs, last_seen_secs, last_seen_mins;
 690        uint32_t i;
 691
 692        primary_if = batadv_seq_print_text_primary_if_get(seq);
 693        if (!primary_if)
 694                goto out;
 695
 696        seq_printf(seq, "Distributed ARP Table (%s):\n", net_dev->name);
 697        seq_printf(seq, "          %-7s          %-13s %5s\n", "IPv4", "MAC",
 698                   "last-seen");
 699
 700        for (i = 0; i < hash->size; i++) {
 701                head = &hash->table[i];
 702
 703                rcu_read_lock();
 704                hlist_for_each_entry_rcu(dat_entry, head, hash_entry) {
 705                        last_seen_jiffies = jiffies - dat_entry->last_update;
 706                        last_seen_msecs = jiffies_to_msecs(last_seen_jiffies);
 707                        last_seen_mins = last_seen_msecs / 60000;
 708                        last_seen_msecs = last_seen_msecs % 60000;
 709                        last_seen_secs = last_seen_msecs / 1000;
 710
 711                        seq_printf(seq, " * %15pI4 %14pM %6i:%02i\n",
 712                                   &dat_entry->ip, dat_entry->mac_addr,
 713                                   last_seen_mins, last_seen_secs);
 714                }
 715                rcu_read_unlock();
 716        }
 717
 718out:
 719        if (primary_if)
 720                batadv_hardif_free_ref(primary_if);
 721        return 0;
 722}
 723
 724/**
 725 * batadv_arp_get_type - parse an ARP packet and gets the type
 726 * @bat_priv: the bat priv with all the soft interface information
 727 * @skb: packet to analyse
 728 * @hdr_size: size of the possible header before the ARP packet in the skb
 729 *
 730 * Returns the ARP type if the skb contains a valid ARP packet, 0 otherwise
 731 */
 732static uint16_t batadv_arp_get_type(struct batadv_priv *bat_priv,
 733                                    struct sk_buff *skb, int hdr_size)
 734{
 735        struct arphdr *arphdr;
 736        struct ethhdr *ethhdr;
 737        __be32 ip_src, ip_dst;
 738        uint8_t *hw_src, *hw_dst;
 739        uint16_t type = 0;
 740
 741        /* pull the ethernet header */
 742        if (unlikely(!pskb_may_pull(skb, hdr_size + ETH_HLEN)))
 743                goto out;
 744
 745        ethhdr = (struct ethhdr *)(skb->data + hdr_size);
 746
 747        if (ethhdr->h_proto != htons(ETH_P_ARP))
 748                goto out;
 749
 750        /* pull the ARP payload */
 751        if (unlikely(!pskb_may_pull(skb, hdr_size + ETH_HLEN +
 752                                    arp_hdr_len(skb->dev))))
 753                goto out;
 754
 755        arphdr = (struct arphdr *)(skb->data + hdr_size + ETH_HLEN);
 756
 757        /* Check whether the ARP packet carries a valid
 758         * IP information
 759         */
 760        if (arphdr->ar_hrd != htons(ARPHRD_ETHER))
 761                goto out;
 762
 763        if (arphdr->ar_pro != htons(ETH_P_IP))
 764                goto out;
 765
 766        if (arphdr->ar_hln != ETH_ALEN)
 767                goto out;
 768
 769        if (arphdr->ar_pln != 4)
 770                goto out;
 771
 772        /* Check for bad reply/request. If the ARP message is not sane, DAT
 773         * will simply ignore it
 774         */
 775        ip_src = batadv_arp_ip_src(skb, hdr_size);
 776        ip_dst = batadv_arp_ip_dst(skb, hdr_size);
 777        if (ipv4_is_loopback(ip_src) || ipv4_is_multicast(ip_src) ||
 778            ipv4_is_loopback(ip_dst) || ipv4_is_multicast(ip_dst) ||
 779            ipv4_is_zeronet(ip_src) || ipv4_is_lbcast(ip_src) ||
 780            ipv4_is_zeronet(ip_dst) || ipv4_is_lbcast(ip_dst))
 781                goto out;
 782
 783        hw_src = batadv_arp_hw_src(skb, hdr_size);
 784        if (is_zero_ether_addr(hw_src) || is_multicast_ether_addr(hw_src))
 785                goto out;
 786
 787        /* we don't care about the destination MAC address in ARP requests */
 788        if (arphdr->ar_op != htons(ARPOP_REQUEST)) {
 789                hw_dst = batadv_arp_hw_dst(skb, hdr_size);
 790                if (is_zero_ether_addr(hw_dst) ||
 791                    is_multicast_ether_addr(hw_dst))
 792                        goto out;
 793        }
 794
 795        type = ntohs(arphdr->ar_op);
 796out:
 797        return type;
 798}
 799
 800/**
 801 * batadv_dat_snoop_outgoing_arp_request - snoop the ARP request and try to
 802 * answer using DAT
 803 * @bat_priv: the bat priv with all the soft interface information
 804 * @skb: packet to check
 805 *
 806 * Returns true if the message has been sent to the dht candidates, false
 807 * otherwise. In case of true the message has to be enqueued to permit the
 808 * fallback
 809 */
 810bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv,
 811                                           struct sk_buff *skb)
 812{
 813        uint16_t type = 0;
 814        __be32 ip_dst, ip_src;
 815        uint8_t *hw_src;
 816        bool ret = false;
 817        struct batadv_dat_entry *dat_entry = NULL;
 818        struct sk_buff *skb_new;
 819        struct batadv_hard_iface *primary_if = NULL;
 820
 821        if (!atomic_read(&bat_priv->distributed_arp_table))
 822                goto out;
 823
 824        type = batadv_arp_get_type(bat_priv, skb, 0);
 825        /* If the node gets an ARP_REQUEST it has to send a DHT_GET unicast
 826         * message to the selected DHT candidates
 827         */
 828        if (type != ARPOP_REQUEST)
 829                goto out;
 830
 831        batadv_dbg_arp(bat_priv, skb, type, 0, "Parsing outgoing ARP REQUEST");
 832
 833        ip_src = batadv_arp_ip_src(skb, 0);
 834        hw_src = batadv_arp_hw_src(skb, 0);
 835        ip_dst = batadv_arp_ip_dst(skb, 0);
 836
 837        batadv_dat_entry_add(bat_priv, ip_src, hw_src);
 838
 839        dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst);
 840        if (dat_entry) {
 841                primary_if = batadv_primary_if_get_selected(bat_priv);
 842                if (!primary_if)
 843                        goto out;
 844
 845                skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src,
 846                                     primary_if->soft_iface, ip_dst, hw_src,
 847                                     dat_entry->mac_addr, hw_src);
 848                if (!skb_new)
 849                        goto out;
 850
 851                skb_reset_mac_header(skb_new);
 852                skb_new->protocol = eth_type_trans(skb_new,
 853                                                   primary_if->soft_iface);
 854                bat_priv->stats.rx_packets++;
 855                bat_priv->stats.rx_bytes += skb->len + ETH_HLEN;
 856                primary_if->soft_iface->last_rx = jiffies;
 857
 858                netif_rx(skb_new);
 859                batadv_dbg(BATADV_DBG_DAT, bat_priv, "ARP request replied locally\n");
 860                ret = true;
 861        } else {
 862                /* Send the request on the DHT */
 863                ret = batadv_dat_send_data(bat_priv, skb, ip_dst,
 864                                           BATADV_P_DAT_DHT_GET);
 865        }
 866out:
 867        if (dat_entry)
 868                batadv_dat_entry_free_ref(dat_entry);
 869        if (primary_if)
 870                batadv_hardif_free_ref(primary_if);
 871        return ret;
 872}
 873
 874/**
 875 * batadv_dat_snoop_incoming_arp_request - snoop the ARP request and try to
 876 * answer using the local DAT storage
 877 * @bat_priv: the bat priv with all the soft interface information
 878 * @skb: packet to check
 879 * @hdr_size: size of the encapsulation header
 880 *
 881 * Returns true if the request has been answered, false otherwise
 882 */
 883bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
 884                                           struct sk_buff *skb, int hdr_size)
 885{
 886        uint16_t type;
 887        __be32 ip_src, ip_dst;
 888        uint8_t *hw_src;
 889        struct sk_buff *skb_new;
 890        struct batadv_hard_iface *primary_if = NULL;
 891        struct batadv_dat_entry *dat_entry = NULL;
 892        bool ret = false;
 893        int err;
 894
 895        if (!atomic_read(&bat_priv->distributed_arp_table))
 896                goto out;
 897
 898        type = batadv_arp_get_type(bat_priv, skb, hdr_size);
 899        if (type != ARPOP_REQUEST)
 900                goto out;
 901
 902        hw_src = batadv_arp_hw_src(skb, hdr_size);
 903        ip_src = batadv_arp_ip_src(skb, hdr_size);
 904        ip_dst = batadv_arp_ip_dst(skb, hdr_size);
 905
 906        batadv_dbg_arp(bat_priv, skb, type, hdr_size,
 907                       "Parsing incoming ARP REQUEST");
 908
 909        batadv_dat_entry_add(bat_priv, ip_src, hw_src);
 910
 911        dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst);
 912        if (!dat_entry)
 913                goto out;
 914
 915        primary_if = batadv_primary_if_get_selected(bat_priv);
 916        if (!primary_if)
 917                goto out;
 918
 919        skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src,
 920                             primary_if->soft_iface, ip_dst, hw_src,
 921                             dat_entry->mac_addr, hw_src);
 922
 923        if (!skb_new)
 924                goto out;
 925
 926        /* to preserve backwards compatibility, here the node has to answer
 927         * using the same packet type it received for the request. This is due
 928         * to that if a node is not using the 4addr packet format it may not
 929         * support it.
 930         */
 931        if (hdr_size == sizeof(struct batadv_unicast_4addr_packet))
 932                err = batadv_unicast_4addr_send_skb(bat_priv, skb_new,
 933                                                    BATADV_P_DAT_CACHE_REPLY);
 934        else
 935                err = batadv_unicast_send_skb(bat_priv, skb_new);
 936
 937        if (!err) {
 938                batadv_inc_counter(bat_priv, BATADV_CNT_DAT_CACHED_REPLY_TX);
 939                ret = true;
 940        }
 941out:
 942        if (dat_entry)
 943                batadv_dat_entry_free_ref(dat_entry);
 944        if (primary_if)
 945                batadv_hardif_free_ref(primary_if);
 946        if (ret)
 947                kfree_skb(skb);
 948        return ret;
 949}
 950
 951/**
 952 * batadv_dat_snoop_outgoing_arp_reply - snoop the ARP reply and fill the DHT
 953 * @bat_priv: the bat priv with all the soft interface information
 954 * @skb: packet to check
 955 */
 956void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
 957                                         struct sk_buff *skb)
 958{
 959        uint16_t type;
 960        __be32 ip_src, ip_dst;
 961        uint8_t *hw_src, *hw_dst;
 962
 963        if (!atomic_read(&bat_priv->distributed_arp_table))
 964                return;
 965
 966        type = batadv_arp_get_type(bat_priv, skb, 0);
 967        if (type != ARPOP_REPLY)
 968                return;
 969
 970        batadv_dbg_arp(bat_priv, skb, type, 0, "Parsing outgoing ARP REPLY");
 971
 972        hw_src = batadv_arp_hw_src(skb, 0);
 973        ip_src = batadv_arp_ip_src(skb, 0);
 974        hw_dst = batadv_arp_hw_dst(skb, 0);
 975        ip_dst = batadv_arp_ip_dst(skb, 0);
 976
 977        batadv_dat_entry_add(bat_priv, ip_src, hw_src);
 978        batadv_dat_entry_add(bat_priv, ip_dst, hw_dst);
 979
 980        /* Send the ARP reply to the candidates for both the IP addresses that
 981         * the node got within the ARP reply
 982         */
 983        batadv_dat_send_data(bat_priv, skb, ip_src, BATADV_P_DAT_DHT_PUT);
 984        batadv_dat_send_data(bat_priv, skb, ip_dst, BATADV_P_DAT_DHT_PUT);
 985}
 986/**
 987 * batadv_dat_snoop_incoming_arp_reply - snoop the ARP reply and fill the local
 988 * DAT storage only
 989 * @bat_priv: the bat priv with all the soft interface information
 990 * @skb: packet to check
 991 * @hdr_size: siaze of the encapsulation header
 992 */
 993bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
 994                                         struct sk_buff *skb, int hdr_size)
 995{
 996        uint16_t type;
 997        __be32 ip_src, ip_dst;
 998        uint8_t *hw_src, *hw_dst;
 999        bool ret = false;
1000
1001        if (!atomic_read(&bat_priv->distributed_arp_table))
1002                goto out;
1003
1004        type = batadv_arp_get_type(bat_priv, skb, hdr_size);
1005        if (type != ARPOP_REPLY)
1006                goto out;
1007
1008        batadv_dbg_arp(bat_priv, skb, type, hdr_size,
1009                       "Parsing incoming ARP REPLY");
1010
1011        hw_src = batadv_arp_hw_src(skb, hdr_size);
1012        ip_src = batadv_arp_ip_src(skb, hdr_size);
1013        hw_dst = batadv_arp_hw_dst(skb, hdr_size);
1014        ip_dst = batadv_arp_ip_dst(skb, hdr_size);
1015
1016        /* Update our internal cache with both the IP addresses the node got
1017         * within the ARP reply
1018         */
1019        batadv_dat_entry_add(bat_priv, ip_src, hw_src);
1020        batadv_dat_entry_add(bat_priv, ip_dst, hw_dst);
1021
1022        /* if this REPLY is directed to a client of mine, let's deliver the
1023         * packet to the interface
1024         */
1025        ret = !batadv_is_my_client(bat_priv, hw_dst);
1026out:
1027        if (ret)
1028                kfree_skb(skb);
1029        /* if ret == false -> packet has to be delivered to the interface */
1030        return ret;
1031}
1032
1033/**
1034 * batadv_dat_drop_broadcast_packet - check if an ARP request has to be dropped
1035 * (because the node has already got the reply via DAT) or not
1036 * @bat_priv: the bat priv with all the soft interface information
1037 * @forw_packet: the broadcast packet
1038 *
1039 * Returns true if the node can drop the packet, false otherwise
1040 */
1041bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
1042                                      struct batadv_forw_packet *forw_packet)
1043{
1044        uint16_t type;
1045        __be32 ip_dst;
1046        struct batadv_dat_entry *dat_entry = NULL;
1047        bool ret = false;
1048        const size_t bcast_len = sizeof(struct batadv_bcast_packet);
1049
1050        if (!atomic_read(&bat_priv->distributed_arp_table))
1051                goto out;
1052
1053        /* If this packet is an ARP_REQUEST and the node already has the
1054         * information that it is going to ask, then the packet can be dropped
1055         */
1056        if (forw_packet->num_packets)
1057                goto out;
1058
1059        type = batadv_arp_get_type(bat_priv, forw_packet->skb, bcast_len);
1060        if (type != ARPOP_REQUEST)
1061                goto out;
1062
1063        ip_dst = batadv_arp_ip_dst(forw_packet->skb, bcast_len);
1064        dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst);
1065        /* check if the node already got this entry */
1066        if (!dat_entry) {
1067                batadv_dbg(BATADV_DBG_DAT, bat_priv,
1068                           "ARP Request for %pI4: fallback\n", &ip_dst);
1069                goto out;
1070        }
1071
1072        batadv_dbg(BATADV_DBG_DAT, bat_priv,
1073                   "ARP Request for %pI4: fallback prevented\n", &ip_dst);
1074        ret = true;
1075
1076out:
1077        if (dat_entry)
1078                batadv_dat_entry_free_ref(dat_entry);
1079        return ret;
1080}
1081