linux/net/batman-adv/routing.c
<<
>>
Prefs
   1/* Copyright (C) 2007-2013 B.A.T.M.A.N. contributors:
   2 *
   3 * Marek Lindner, Simon Wunderlich
   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 "main.h"
  21#include "routing.h"
  22#include "send.h"
  23#include "soft-interface.h"
  24#include "hard-interface.h"
  25#include "icmp_socket.h"
  26#include "translation-table.h"
  27#include "originator.h"
  28#include "vis.h"
  29#include "unicast.h"
  30#include "bridge_loop_avoidance.h"
  31#include "distributed-arp-table.h"
  32#include "network-coding.h"
  33
  34static int batadv_route_unicast_packet(struct sk_buff *skb,
  35                                       struct batadv_hard_iface *recv_if);
  36
  37static void _batadv_update_route(struct batadv_priv *bat_priv,
  38                                 struct batadv_orig_node *orig_node,
  39                                 struct batadv_neigh_node *neigh_node)
  40{
  41        struct batadv_neigh_node *curr_router;
  42
  43        curr_router = batadv_orig_node_get_router(orig_node);
  44
  45        /* route deleted */
  46        if ((curr_router) && (!neigh_node)) {
  47                batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
  48                           "Deleting route towards: %pM\n", orig_node->orig);
  49                batadv_tt_global_del_orig(bat_priv, orig_node,
  50                                          "Deleted route towards originator");
  51
  52        /* route added */
  53        } else if ((!curr_router) && (neigh_node)) {
  54                batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
  55                           "Adding route towards: %pM (via %pM)\n",
  56                           orig_node->orig, neigh_node->addr);
  57        /* route changed */
  58        } else if (neigh_node && curr_router) {
  59                batadv_dbg(BATADV_DBG_ROUTES, bat_priv,
  60                           "Changing route towards: %pM (now via %pM - was via %pM)\n",
  61                           orig_node->orig, neigh_node->addr,
  62                           curr_router->addr);
  63        }
  64
  65        if (curr_router)
  66                batadv_neigh_node_free_ref(curr_router);
  67
  68        /* increase refcount of new best neighbor */
  69        if (neigh_node && !atomic_inc_not_zero(&neigh_node->refcount))
  70                neigh_node = NULL;
  71
  72        spin_lock_bh(&orig_node->neigh_list_lock);
  73        rcu_assign_pointer(orig_node->router, neigh_node);
  74        spin_unlock_bh(&orig_node->neigh_list_lock);
  75
  76        /* decrease refcount of previous best neighbor */
  77        if (curr_router)
  78                batadv_neigh_node_free_ref(curr_router);
  79}
  80
  81void batadv_update_route(struct batadv_priv *bat_priv,
  82                         struct batadv_orig_node *orig_node,
  83                         struct batadv_neigh_node *neigh_node)
  84{
  85        struct batadv_neigh_node *router = NULL;
  86
  87        if (!orig_node)
  88                goto out;
  89
  90        router = batadv_orig_node_get_router(orig_node);
  91
  92        if (router != neigh_node)
  93                _batadv_update_route(bat_priv, orig_node, neigh_node);
  94
  95out:
  96        if (router)
  97                batadv_neigh_node_free_ref(router);
  98}
  99
 100/* caller must hold the neigh_list_lock */
 101void batadv_bonding_candidate_del(struct batadv_orig_node *orig_node,
 102                                  struct batadv_neigh_node *neigh_node)
 103{
 104        /* this neighbor is not part of our candidate list */
 105        if (list_empty(&neigh_node->bonding_list))
 106                goto out;
 107
 108        list_del_rcu(&neigh_node->bonding_list);
 109        INIT_LIST_HEAD(&neigh_node->bonding_list);
 110        batadv_neigh_node_free_ref(neigh_node);
 111        atomic_dec(&orig_node->bond_candidates);
 112
 113out:
 114        return;
 115}
 116
 117void batadv_bonding_candidate_add(struct batadv_orig_node *orig_node,
 118                                  struct batadv_neigh_node *neigh_node)
 119{
 120        struct batadv_neigh_node *tmp_neigh_node, *router = NULL;
 121        uint8_t interference_candidate = 0;
 122
 123        spin_lock_bh(&orig_node->neigh_list_lock);
 124
 125        /* only consider if it has the same primary address ...  */
 126        if (!batadv_compare_eth(orig_node->orig,
 127                                neigh_node->orig_node->primary_addr))
 128                goto candidate_del;
 129
 130        router = batadv_orig_node_get_router(orig_node);
 131        if (!router)
 132                goto candidate_del;
 133
 134        /* ... and is good enough to be considered */
 135        if (neigh_node->tq_avg < router->tq_avg - BATADV_BONDING_TQ_THRESHOLD)
 136                goto candidate_del;
 137
 138        /* check if we have another candidate with the same mac address or
 139         * interface. If we do, we won't select this candidate because of
 140         * possible interference.
 141         */
 142        hlist_for_each_entry_rcu(tmp_neigh_node,
 143                                 &orig_node->neigh_list, list) {
 144                if (tmp_neigh_node == neigh_node)
 145                        continue;
 146
 147                /* we only care if the other candidate is even
 148                 * considered as candidate.
 149                 */
 150                if (list_empty(&tmp_neigh_node->bonding_list))
 151                        continue;
 152
 153                if ((neigh_node->if_incoming == tmp_neigh_node->if_incoming) ||
 154                    (batadv_compare_eth(neigh_node->addr,
 155                                        tmp_neigh_node->addr))) {
 156                        interference_candidate = 1;
 157                        break;
 158                }
 159        }
 160
 161        /* don't care further if it is an interference candidate */
 162        if (interference_candidate)
 163                goto candidate_del;
 164
 165        /* this neighbor already is part of our candidate list */
 166        if (!list_empty(&neigh_node->bonding_list))
 167                goto out;
 168
 169        if (!atomic_inc_not_zero(&neigh_node->refcount))
 170                goto out;
 171
 172        list_add_rcu(&neigh_node->bonding_list, &orig_node->bond_list);
 173        atomic_inc(&orig_node->bond_candidates);
 174        goto out;
 175
 176candidate_del:
 177        batadv_bonding_candidate_del(orig_node, neigh_node);
 178
 179out:
 180        spin_unlock_bh(&orig_node->neigh_list_lock);
 181
 182        if (router)
 183                batadv_neigh_node_free_ref(router);
 184}
 185
 186/* copy primary address for bonding */
 187void
 188batadv_bonding_save_primary(const struct batadv_orig_node *orig_node,
 189                            struct batadv_orig_node *orig_neigh_node,
 190                            const struct batadv_ogm_packet *batman_ogm_packet)
 191{
 192        if (!(batman_ogm_packet->flags & BATADV_PRIMARIES_FIRST_HOP))
 193                return;
 194
 195        memcpy(orig_neigh_node->primary_addr, orig_node->orig, ETH_ALEN);
 196}
 197
 198/* checks whether the host restarted and is in the protection time.
 199 * returns:
 200 *  0 if the packet is to be accepted
 201 *  1 if the packet is to be ignored.
 202 */
 203int batadv_window_protected(struct batadv_priv *bat_priv, int32_t seq_num_diff,
 204                            unsigned long *last_reset)
 205{
 206        if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
 207            seq_num_diff >= BATADV_EXPECTED_SEQNO_RANGE) {
 208                if (!batadv_has_timed_out(*last_reset,
 209                                          BATADV_RESET_PROTECTION_MS))
 210                        return 1;
 211
 212                *last_reset = jiffies;
 213                batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
 214                           "old packet received, start protection\n");
 215        }
 216
 217        return 0;
 218}
 219
 220bool batadv_check_management_packet(struct sk_buff *skb,
 221                                    struct batadv_hard_iface *hard_iface,
 222                                    int header_len)
 223{
 224        struct ethhdr *ethhdr;
 225
 226        /* drop packet if it has not necessary minimum size */
 227        if (unlikely(!pskb_may_pull(skb, header_len)))
 228                return false;
 229
 230        ethhdr = eth_hdr(skb);
 231
 232        /* packet with broadcast indication but unicast recipient */
 233        if (!is_broadcast_ether_addr(ethhdr->h_dest))
 234                return false;
 235
 236        /* packet with broadcast sender address */
 237        if (is_broadcast_ether_addr(ethhdr->h_source))
 238                return false;
 239
 240        /* create a copy of the skb, if needed, to modify it. */
 241        if (skb_cow(skb, 0) < 0)
 242                return false;
 243
 244        /* keep skb linear */
 245        if (skb_linearize(skb) < 0)
 246                return false;
 247
 248        return true;
 249}
 250
 251static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
 252                                      struct sk_buff *skb, size_t icmp_len)
 253{
 254        struct batadv_hard_iface *primary_if = NULL;
 255        struct batadv_orig_node *orig_node = NULL;
 256        struct batadv_icmp_packet_rr *icmp_packet;
 257        int ret = NET_RX_DROP;
 258
 259        icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
 260
 261        /* add data to device queue */
 262        if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
 263                batadv_socket_receive_packet(icmp_packet, icmp_len);
 264                goto out;
 265        }
 266
 267        primary_if = batadv_primary_if_get_selected(bat_priv);
 268        if (!primary_if)
 269                goto out;
 270
 271        /* answer echo request (ping) */
 272        /* get routing information */
 273        orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
 274        if (!orig_node)
 275                goto out;
 276
 277        /* create a copy of the skb, if needed, to modify it. */
 278        if (skb_cow(skb, ETH_HLEN) < 0)
 279                goto out;
 280
 281        icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
 282
 283        memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
 284        memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
 285        icmp_packet->msg_type = BATADV_ECHO_REPLY;
 286        icmp_packet->header.ttl = BATADV_TTL;
 287
 288        if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
 289                ret = NET_RX_SUCCESS;
 290
 291out:
 292        if (primary_if)
 293                batadv_hardif_free_ref(primary_if);
 294        if (orig_node)
 295                batadv_orig_node_free_ref(orig_node);
 296        return ret;
 297}
 298
 299static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
 300                                         struct sk_buff *skb)
 301{
 302        struct batadv_hard_iface *primary_if = NULL;
 303        struct batadv_orig_node *orig_node = NULL;
 304        struct batadv_icmp_packet *icmp_packet;
 305        int ret = NET_RX_DROP;
 306
 307        icmp_packet = (struct batadv_icmp_packet *)skb->data;
 308
 309        /* send TTL exceeded if packet is an echo request (traceroute) */
 310        if (icmp_packet->msg_type != BATADV_ECHO_REQUEST) {
 311                pr_debug("Warning - can't forward icmp packet from %pM to %pM: ttl exceeded\n",
 312                         icmp_packet->orig, icmp_packet->dst);
 313                goto out;
 314        }
 315
 316        primary_if = batadv_primary_if_get_selected(bat_priv);
 317        if (!primary_if)
 318                goto out;
 319
 320        /* get routing information */
 321        orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->orig);
 322        if (!orig_node)
 323                goto out;
 324
 325        /* create a copy of the skb, if needed, to modify it. */
 326        if (skb_cow(skb, ETH_HLEN) < 0)
 327                goto out;
 328
 329        icmp_packet = (struct batadv_icmp_packet *)skb->data;
 330
 331        memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
 332        memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
 333        icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
 334        icmp_packet->header.ttl = BATADV_TTL;
 335
 336        if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
 337                ret = NET_RX_SUCCESS;
 338
 339out:
 340        if (primary_if)
 341                batadv_hardif_free_ref(primary_if);
 342        if (orig_node)
 343                batadv_orig_node_free_ref(orig_node);
 344        return ret;
 345}
 346
 347
 348int batadv_recv_icmp_packet(struct sk_buff *skb,
 349                            struct batadv_hard_iface *recv_if)
 350{
 351        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
 352        struct batadv_icmp_packet_rr *icmp_packet;
 353        struct ethhdr *ethhdr;
 354        struct batadv_orig_node *orig_node = NULL;
 355        int hdr_size = sizeof(struct batadv_icmp_packet);
 356        int ret = NET_RX_DROP;
 357
 358        /* we truncate all incoming icmp packets if they don't match our size */
 359        if (skb->len >= sizeof(struct batadv_icmp_packet_rr))
 360                hdr_size = sizeof(struct batadv_icmp_packet_rr);
 361
 362        /* drop packet if it has not necessary minimum size */
 363        if (unlikely(!pskb_may_pull(skb, hdr_size)))
 364                goto out;
 365
 366        ethhdr = eth_hdr(skb);
 367
 368        /* packet with unicast indication but broadcast recipient */
 369        if (is_broadcast_ether_addr(ethhdr->h_dest))
 370                goto out;
 371
 372        /* packet with broadcast sender address */
 373        if (is_broadcast_ether_addr(ethhdr->h_source))
 374                goto out;
 375
 376        /* not for me */
 377        if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
 378                goto out;
 379
 380        icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
 381
 382        /* add record route information if not full */
 383        if ((hdr_size == sizeof(struct batadv_icmp_packet_rr)) &&
 384            (icmp_packet->rr_cur < BATADV_RR_LEN)) {
 385                memcpy(&(icmp_packet->rr[icmp_packet->rr_cur]),
 386                       ethhdr->h_dest, ETH_ALEN);
 387                icmp_packet->rr_cur++;
 388        }
 389
 390        /* packet for me */
 391        if (batadv_is_my_mac(bat_priv, icmp_packet->dst))
 392                return batadv_recv_my_icmp_packet(bat_priv, skb, hdr_size);
 393
 394        /* TTL exceeded */
 395        if (icmp_packet->header.ttl < 2)
 396                return batadv_recv_icmp_ttl_exceeded(bat_priv, skb);
 397
 398        /* get routing information */
 399        orig_node = batadv_orig_hash_find(bat_priv, icmp_packet->dst);
 400        if (!orig_node)
 401                goto out;
 402
 403        /* create a copy of the skb, if needed, to modify it. */
 404        if (skb_cow(skb, ETH_HLEN) < 0)
 405                goto out;
 406
 407        icmp_packet = (struct batadv_icmp_packet_rr *)skb->data;
 408
 409        /* decrement ttl */
 410        icmp_packet->header.ttl--;
 411
 412        /* route it */
 413        if (batadv_send_skb_to_orig(skb, orig_node, recv_if) != NET_XMIT_DROP)
 414                ret = NET_RX_SUCCESS;
 415
 416out:
 417        if (orig_node)
 418                batadv_orig_node_free_ref(orig_node);
 419        return ret;
 420}
 421
 422/* In the bonding case, send the packets in a round
 423 * robin fashion over the remaining interfaces.
 424 *
 425 * This method rotates the bonding list and increases the
 426 * returned router's refcount.
 427 */
 428static struct batadv_neigh_node *
 429batadv_find_bond_router(struct batadv_orig_node *primary_orig,
 430                        const struct batadv_hard_iface *recv_if)
 431{
 432        struct batadv_neigh_node *tmp_neigh_node;
 433        struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
 434
 435        rcu_read_lock();
 436        list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
 437                                bonding_list) {
 438                if (!first_candidate)
 439                        first_candidate = tmp_neigh_node;
 440
 441                /* recv_if == NULL on the first node. */
 442                if (tmp_neigh_node->if_incoming == recv_if)
 443                        continue;
 444
 445                if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
 446                        continue;
 447
 448                router = tmp_neigh_node;
 449                break;
 450        }
 451
 452        /* use the first candidate if nothing was found. */
 453        if (!router && first_candidate &&
 454            atomic_inc_not_zero(&first_candidate->refcount))
 455                router = first_candidate;
 456
 457        if (!router)
 458                goto out;
 459
 460        /* selected should point to the next element
 461         * after the current router
 462         */
 463        spin_lock_bh(&primary_orig->neigh_list_lock);
 464        /* this is a list_move(), which unfortunately
 465         * does not exist as rcu version
 466         */
 467        list_del_rcu(&primary_orig->bond_list);
 468        list_add_rcu(&primary_orig->bond_list,
 469                     &router->bonding_list);
 470        spin_unlock_bh(&primary_orig->neigh_list_lock);
 471
 472out:
 473        rcu_read_unlock();
 474        return router;
 475}
 476
 477/* Interface Alternating: Use the best of the
 478 * remaining candidates which are not using
 479 * this interface.
 480 *
 481 * Increases the returned router's refcount
 482 */
 483static struct batadv_neigh_node *
 484batadv_find_ifalter_router(struct batadv_orig_node *primary_orig,
 485                           const struct batadv_hard_iface *recv_if)
 486{
 487        struct batadv_neigh_node *tmp_neigh_node;
 488        struct batadv_neigh_node *router = NULL, *first_candidate = NULL;
 489
 490        rcu_read_lock();
 491        list_for_each_entry_rcu(tmp_neigh_node, &primary_orig->bond_list,
 492                                bonding_list) {
 493                if (!first_candidate)
 494                        first_candidate = tmp_neigh_node;
 495
 496                /* recv_if == NULL on the first node. */
 497                if (tmp_neigh_node->if_incoming == recv_if)
 498                        continue;
 499
 500                if (router && tmp_neigh_node->tq_avg <= router->tq_avg)
 501                        continue;
 502
 503                if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
 504                        continue;
 505
 506                /* decrement refcount of previously selected router */
 507                if (router)
 508                        batadv_neigh_node_free_ref(router);
 509
 510                /* we found a better router (or at least one valid router) */
 511                router = tmp_neigh_node;
 512        }
 513
 514        /* use the first candidate if nothing was found. */
 515        if (!router && first_candidate &&
 516            atomic_inc_not_zero(&first_candidate->refcount))
 517                router = first_candidate;
 518
 519        rcu_read_unlock();
 520        return router;
 521}
 522
 523/**
 524 * batadv_check_unicast_packet - Check for malformed unicast packets
 525 * @bat_priv: the bat priv with all the soft interface information
 526 * @skb: packet to check
 527 * @hdr_size: size of header to pull
 528 *
 529 * Check for short header and bad addresses in given packet. Returns negative
 530 * value when check fails and 0 otherwise. The negative value depends on the
 531 * reason: -ENODATA for bad header, -EBADR for broadcast destination or source,
 532 * and -EREMOTE for non-local (other host) destination.
 533 */
 534static int batadv_check_unicast_packet(struct batadv_priv *bat_priv,
 535                                       struct sk_buff *skb, int hdr_size)
 536{
 537        struct ethhdr *ethhdr;
 538
 539        /* drop packet if it has not necessary minimum size */
 540        if (unlikely(!pskb_may_pull(skb, hdr_size)))
 541                return -ENODATA;
 542
 543        ethhdr = eth_hdr(skb);
 544
 545        /* packet with unicast indication but broadcast recipient */
 546        if (is_broadcast_ether_addr(ethhdr->h_dest))
 547                return -EBADR;
 548
 549        /* packet with broadcast sender address */
 550        if (is_broadcast_ether_addr(ethhdr->h_source))
 551                return -EBADR;
 552
 553        /* not for me */
 554        if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
 555                return -EREMOTE;
 556
 557        return 0;
 558}
 559
 560int batadv_recv_tt_query(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
 561{
 562        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
 563        struct batadv_tt_query_packet *tt_query;
 564        uint16_t tt_size;
 565        int hdr_size = sizeof(*tt_query);
 566        char tt_flag;
 567        size_t packet_size;
 568
 569        if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
 570                return NET_RX_DROP;
 571
 572        /* I could need to modify it */
 573        if (skb_cow(skb, sizeof(struct batadv_tt_query_packet)) < 0)
 574                goto out;
 575
 576        tt_query = (struct batadv_tt_query_packet *)skb->data;
 577
 578        switch (tt_query->flags & BATADV_TT_QUERY_TYPE_MASK) {
 579        case BATADV_TT_REQUEST:
 580                batadv_inc_counter(bat_priv, BATADV_CNT_TT_REQUEST_RX);
 581
 582                /* If we cannot provide an answer the tt_request is
 583                 * forwarded
 584                 */
 585                if (!batadv_send_tt_response(bat_priv, tt_query)) {
 586                        if (tt_query->flags & BATADV_TT_FULL_TABLE)
 587                                tt_flag = 'F';
 588                        else
 589                                tt_flag = '.';
 590
 591                        batadv_dbg(BATADV_DBG_TT, bat_priv,
 592                                   "Routing TT_REQUEST to %pM [%c]\n",
 593                                   tt_query->dst,
 594                                   tt_flag);
 595                        return batadv_route_unicast_packet(skb, recv_if);
 596                }
 597                break;
 598        case BATADV_TT_RESPONSE:
 599                batadv_inc_counter(bat_priv, BATADV_CNT_TT_RESPONSE_RX);
 600
 601                if (batadv_is_my_mac(bat_priv, tt_query->dst)) {
 602                        /* packet needs to be linearized to access the TT
 603                         * changes
 604                         */
 605                        if (skb_linearize(skb) < 0)
 606                                goto out;
 607                        /* skb_linearize() possibly changed skb->data */
 608                        tt_query = (struct batadv_tt_query_packet *)skb->data;
 609
 610                        tt_size = batadv_tt_len(ntohs(tt_query->tt_data));
 611
 612                        /* Ensure we have all the claimed data */
 613                        packet_size = sizeof(struct batadv_tt_query_packet);
 614                        packet_size += tt_size;
 615                        if (unlikely(skb_headlen(skb) < packet_size))
 616                                goto out;
 617
 618                        batadv_handle_tt_response(bat_priv, tt_query);
 619                } else {
 620                        if (tt_query->flags & BATADV_TT_FULL_TABLE)
 621                                tt_flag =  'F';
 622                        else
 623                                tt_flag = '.';
 624                        batadv_dbg(BATADV_DBG_TT, bat_priv,
 625                                   "Routing TT_RESPONSE to %pM [%c]\n",
 626                                   tt_query->dst,
 627                                   tt_flag);
 628                        return batadv_route_unicast_packet(skb, recv_if);
 629                }
 630                break;
 631        }
 632
 633out:
 634        /* returning NET_RX_DROP will make the caller function kfree the skb */
 635        return NET_RX_DROP;
 636}
 637
 638int batadv_recv_roam_adv(struct sk_buff *skb, struct batadv_hard_iface *recv_if)
 639{
 640        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
 641        struct batadv_roam_adv_packet *roam_adv_packet;
 642        struct batadv_orig_node *orig_node;
 643
 644        if (batadv_check_unicast_packet(bat_priv, skb,
 645                                        sizeof(*roam_adv_packet)) < 0)
 646                goto out;
 647
 648        batadv_inc_counter(bat_priv, BATADV_CNT_TT_ROAM_ADV_RX);
 649
 650        roam_adv_packet = (struct batadv_roam_adv_packet *)skb->data;
 651
 652        if (!batadv_is_my_mac(bat_priv, roam_adv_packet->dst))
 653                return batadv_route_unicast_packet(skb, recv_if);
 654
 655        /* check if it is a backbone gateway. we don't accept
 656         * roaming advertisement from it, as it has the same
 657         * entries as we have.
 658         */
 659        if (batadv_bla_is_backbone_gw_orig(bat_priv, roam_adv_packet->src))
 660                goto out;
 661
 662        orig_node = batadv_orig_hash_find(bat_priv, roam_adv_packet->src);
 663        if (!orig_node)
 664                goto out;
 665
 666        batadv_dbg(BATADV_DBG_TT, bat_priv,
 667                   "Received ROAMING_ADV from %pM (client %pM)\n",
 668                   roam_adv_packet->src, roam_adv_packet->client);
 669
 670        batadv_tt_global_add(bat_priv, orig_node, roam_adv_packet->client,
 671                             BATADV_TT_CLIENT_ROAM,
 672                             atomic_read(&orig_node->last_ttvn) + 1);
 673
 674        batadv_orig_node_free_ref(orig_node);
 675out:
 676        /* returning NET_RX_DROP will make the caller function kfree the skb */
 677        return NET_RX_DROP;
 678}
 679
 680/* find a suitable router for this originator, and use
 681 * bonding if possible. increases the found neighbors
 682 * refcount.
 683 */
 684struct batadv_neigh_node *
 685batadv_find_router(struct batadv_priv *bat_priv,
 686                   struct batadv_orig_node *orig_node,
 687                   const struct batadv_hard_iface *recv_if)
 688{
 689        struct batadv_orig_node *primary_orig_node;
 690        struct batadv_orig_node *router_orig;
 691        struct batadv_neigh_node *router;
 692        static uint8_t zero_mac[ETH_ALEN] = {0, 0, 0, 0, 0, 0};
 693        int bonding_enabled;
 694        uint8_t *primary_addr;
 695
 696        if (!orig_node)
 697                return NULL;
 698
 699        router = batadv_orig_node_get_router(orig_node);
 700        if (!router)
 701                goto err;
 702
 703        /* without bonding, the first node should
 704         * always choose the default router.
 705         */
 706        bonding_enabled = atomic_read(&bat_priv->bonding);
 707
 708        rcu_read_lock();
 709        /* select default router to output */
 710        router_orig = router->orig_node;
 711        if (!router_orig)
 712                goto err_unlock;
 713
 714        if ((!recv_if) && (!bonding_enabled))
 715                goto return_router;
 716
 717        primary_addr = router_orig->primary_addr;
 718
 719        /* if we have something in the primary_addr, we can search
 720         * for a potential bonding candidate.
 721         */
 722        if (batadv_compare_eth(primary_addr, zero_mac))
 723                goto return_router;
 724
 725        /* find the orig_node which has the primary interface. might
 726         * even be the same as our router_orig in many cases
 727         */
 728        if (batadv_compare_eth(primary_addr, router_orig->orig)) {
 729                primary_orig_node = router_orig;
 730        } else {
 731                primary_orig_node = batadv_orig_hash_find(bat_priv,
 732                                                          primary_addr);
 733                if (!primary_orig_node)
 734                        goto return_router;
 735
 736                batadv_orig_node_free_ref(primary_orig_node);
 737        }
 738
 739        /* with less than 2 candidates, we can't do any
 740         * bonding and prefer the original router.
 741         */
 742        if (atomic_read(&primary_orig_node->bond_candidates) < 2)
 743                goto return_router;
 744
 745        /* all nodes between should choose a candidate which
 746         * is is not on the interface where the packet came
 747         * in.
 748         */
 749        batadv_neigh_node_free_ref(router);
 750
 751        if (bonding_enabled)
 752                router = batadv_find_bond_router(primary_orig_node, recv_if);
 753        else
 754                router = batadv_find_ifalter_router(primary_orig_node, recv_if);
 755
 756return_router:
 757        if (router && router->if_incoming->if_status != BATADV_IF_ACTIVE)
 758                goto err_unlock;
 759
 760        rcu_read_unlock();
 761        return router;
 762err_unlock:
 763        rcu_read_unlock();
 764err:
 765        if (router)
 766                batadv_neigh_node_free_ref(router);
 767        return NULL;
 768}
 769
 770static int batadv_route_unicast_packet(struct sk_buff *skb,
 771                                       struct batadv_hard_iface *recv_if)
 772{
 773        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
 774        struct batadv_orig_node *orig_node = NULL;
 775        struct batadv_neigh_node *neigh_node = NULL;
 776        struct batadv_unicast_packet *unicast_packet;
 777        struct ethhdr *ethhdr = eth_hdr(skb);
 778        int res, hdr_len, ret = NET_RX_DROP;
 779        struct sk_buff *new_skb;
 780
 781        unicast_packet = (struct batadv_unicast_packet *)skb->data;
 782
 783        /* TTL exceeded */
 784        if (unicast_packet->header.ttl < 2) {
 785                pr_debug("Warning - can't forward unicast packet from %pM to %pM: ttl exceeded\n",
 786                         ethhdr->h_source, unicast_packet->dest);
 787                goto out;
 788        }
 789
 790        /* get routing information */
 791        orig_node = batadv_orig_hash_find(bat_priv, unicast_packet->dest);
 792
 793        if (!orig_node)
 794                goto out;
 795
 796        /* find_router() increases neigh_nodes refcount if found. */
 797        neigh_node = batadv_find_router(bat_priv, orig_node, recv_if);
 798
 799        if (!neigh_node)
 800                goto out;
 801
 802        /* create a copy of the skb, if needed, to modify it. */
 803        if (skb_cow(skb, ETH_HLEN) < 0)
 804                goto out;
 805
 806        unicast_packet = (struct batadv_unicast_packet *)skb->data;
 807
 808        if (unicast_packet->header.packet_type == BATADV_UNICAST &&
 809            atomic_read(&bat_priv->fragmentation) &&
 810            skb->len > neigh_node->if_incoming->net_dev->mtu) {
 811                ret = batadv_frag_send_skb(skb, bat_priv,
 812                                           neigh_node->if_incoming,
 813                                           neigh_node->addr);
 814                goto out;
 815        }
 816
 817        if (unicast_packet->header.packet_type == BATADV_UNICAST_FRAG &&
 818            batadv_frag_can_reassemble(skb,
 819                                       neigh_node->if_incoming->net_dev->mtu)) {
 820                ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
 821
 822                if (ret == NET_RX_DROP)
 823                        goto out;
 824
 825                /* packet was buffered for late merge */
 826                if (!new_skb) {
 827                        ret = NET_RX_SUCCESS;
 828                        goto out;
 829                }
 830
 831                skb = new_skb;
 832                unicast_packet = (struct batadv_unicast_packet *)skb->data;
 833        }
 834
 835        /* decrement ttl */
 836        unicast_packet->header.ttl--;
 837
 838        switch (unicast_packet->header.packet_type) {
 839        case BATADV_UNICAST_4ADDR:
 840                hdr_len = sizeof(struct batadv_unicast_4addr_packet);
 841                break;
 842        case BATADV_UNICAST:
 843                hdr_len = sizeof(struct batadv_unicast_packet);
 844                break;
 845        default:
 846                /* other packet types not supported - yet */
 847                hdr_len = -1;
 848                break;
 849        }
 850
 851        if (hdr_len > 0)
 852                batadv_skb_set_priority(skb, hdr_len);
 853
 854        res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
 855
 856        /* translate transmit result into receive result */
 857        if (res == NET_XMIT_SUCCESS) {
 858                /* skb was transmitted and consumed */
 859                batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
 860                batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
 861                                   skb->len + ETH_HLEN);
 862
 863                ret = NET_RX_SUCCESS;
 864        } else if (res == NET_XMIT_POLICED) {
 865                /* skb was buffered and consumed */
 866                ret = NET_RX_SUCCESS;
 867        }
 868
 869out:
 870        if (neigh_node)
 871                batadv_neigh_node_free_ref(neigh_node);
 872        if (orig_node)
 873                batadv_orig_node_free_ref(orig_node);
 874        return ret;
 875}
 876
 877/**
 878 * batadv_reroute_unicast_packet - update the unicast header for re-routing
 879 * @bat_priv: the bat priv with all the soft interface information
 880 * @unicast_packet: the unicast header to be updated
 881 * @dst_addr: the payload destination
 882 *
 883 * Search the translation table for dst_addr and update the unicast header with
 884 * the new corresponding information (originator address where the destination
 885 * client currently is and its known TTVN)
 886 *
 887 * Returns true if the packet header has been updated, false otherwise
 888 */
 889static bool
 890batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
 891                              struct batadv_unicast_packet *unicast_packet,
 892                              uint8_t *dst_addr)
 893{
 894        struct batadv_orig_node *orig_node = NULL;
 895        struct batadv_hard_iface *primary_if = NULL;
 896        bool ret = false;
 897        uint8_t *orig_addr, orig_ttvn;
 898
 899        if (batadv_is_my_client(bat_priv, dst_addr)) {
 900                primary_if = batadv_primary_if_get_selected(bat_priv);
 901                if (!primary_if)
 902                        goto out;
 903                orig_addr = primary_if->net_dev->dev_addr;
 904                orig_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
 905        } else {
 906                orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr);
 907                if (!orig_node)
 908                        goto out;
 909
 910                if (batadv_compare_eth(orig_node->orig, unicast_packet->dest))
 911                        goto out;
 912
 913                orig_addr = orig_node->orig;
 914                orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
 915        }
 916
 917        /* update the packet header */
 918        memcpy(unicast_packet->dest, orig_addr, ETH_ALEN);
 919        unicast_packet->ttvn = orig_ttvn;
 920
 921        ret = true;
 922out:
 923        if (primary_if)
 924                batadv_hardif_free_ref(primary_if);
 925        if (orig_node)
 926                batadv_orig_node_free_ref(orig_node);
 927
 928        return ret;
 929}
 930
 931static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
 932                                     struct sk_buff *skb, int hdr_len) {
 933        uint8_t curr_ttvn, old_ttvn;
 934        struct batadv_orig_node *orig_node;
 935        struct ethhdr *ethhdr;
 936        struct batadv_hard_iface *primary_if;
 937        struct batadv_unicast_packet *unicast_packet;
 938        int is_old_ttvn;
 939
 940        /* check if there is enough data before accessing it */
 941        if (pskb_may_pull(skb, hdr_len + ETH_HLEN) < 0)
 942                return 0;
 943
 944        /* create a copy of the skb (in case of for re-routing) to modify it. */
 945        if (skb_cow(skb, sizeof(*unicast_packet)) < 0)
 946                return 0;
 947
 948        unicast_packet = (struct batadv_unicast_packet *)skb->data;
 949        ethhdr = (struct ethhdr *)(skb->data + hdr_len);
 950
 951        /* check if the destination client was served by this node and it is now
 952         * roaming. In this case, it means that the node has got a ROAM_ADV
 953         * message and that it knows the new destination in the mesh to re-route
 954         * the packet to
 955         */
 956        if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest)) {
 957                if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
 958                                                  ethhdr->h_dest))
 959                        net_ratelimited_function(batadv_dbg, BATADV_DBG_TT,
 960                                                 bat_priv,
 961                                                 "Rerouting unicast packet to %pM (dst=%pM): Local Roaming\n",
 962                                                 unicast_packet->dest,
 963                                                 ethhdr->h_dest);
 964                /* at this point the mesh destination should have been
 965                 * substituted with the originator address found in the global
 966                 * table. If not, let the packet go untouched anyway because
 967                 * there is nothing the node can do
 968                 */
 969                return 1;
 970        }
 971
 972        /* retrieve the TTVN known by this node for the packet destination. This
 973         * value is used later to check if the node which sent (or re-routed
 974         * last time) the packet had an updated information or not
 975         */
 976        curr_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
 977        if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
 978                orig_node = batadv_orig_hash_find(bat_priv,
 979                                                  unicast_packet->dest);
 980                /* if it is not possible to find the orig_node representing the
 981                 * destination, the packet can immediately be dropped as it will
 982                 * not be possible to deliver it
 983                 */
 984                if (!orig_node)
 985                        return 0;
 986
 987                curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
 988                batadv_orig_node_free_ref(orig_node);
 989        }
 990
 991        /* check if the TTVN contained in the packet is fresher than what the
 992         * node knows
 993         */
 994        is_old_ttvn = batadv_seq_before(unicast_packet->ttvn, curr_ttvn);
 995        if (!is_old_ttvn)
 996                return 1;
 997
 998        old_ttvn = unicast_packet->ttvn;
 999        /* the packet was forged based on outdated network information. Its
1000         * destination can possibly be updated and forwarded towards the new
1001         * target host
1002         */
1003        if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
1004                                          ethhdr->h_dest)) {
1005                net_ratelimited_function(batadv_dbg, BATADV_DBG_TT, bat_priv,
1006                                         "Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n",
1007                                         unicast_packet->dest, ethhdr->h_dest,
1008                                         old_ttvn, curr_ttvn);
1009                return 1;
1010        }
1011
1012        /* the packet has not been re-routed: either the destination is
1013         * currently served by this node or there is no destination at all and
1014         * it is possible to drop the packet
1015         */
1016        if (!batadv_is_my_client(bat_priv, ethhdr->h_dest))
1017                return 0;
1018
1019        /* update the header in order to let the packet be delivered to this
1020         * node's soft interface
1021         */
1022        primary_if = batadv_primary_if_get_selected(bat_priv);
1023        if (!primary_if)
1024                return 0;
1025
1026        memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);
1027
1028        batadv_hardif_free_ref(primary_if);
1029
1030        unicast_packet->ttvn = curr_ttvn;
1031
1032        return 1;
1033}
1034
1035int batadv_recv_unicast_packet(struct sk_buff *skb,
1036                               struct batadv_hard_iface *recv_if)
1037{
1038        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1039        struct batadv_unicast_packet *unicast_packet;
1040        struct batadv_unicast_4addr_packet *unicast_4addr_packet;
1041        uint8_t *orig_addr;
1042        struct batadv_orig_node *orig_node = NULL;
1043        int check, hdr_size = sizeof(*unicast_packet);
1044        bool is4addr;
1045
1046        unicast_packet = (struct batadv_unicast_packet *)skb->data;
1047        unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
1048
1049        is4addr = unicast_packet->header.packet_type == BATADV_UNICAST_4ADDR;
1050        /* the caller function should have already pulled 2 bytes */
1051        if (is4addr)
1052                hdr_size = sizeof(*unicast_4addr_packet);
1053
1054        /* function returns -EREMOTE for promiscuous packets */
1055        check = batadv_check_unicast_packet(bat_priv, skb, hdr_size);
1056
1057        /* Even though the packet is not for us, we might save it to use for
1058         * decoding a later received coded packet
1059         */
1060        if (check == -EREMOTE)
1061                batadv_nc_skb_store_sniffed_unicast(bat_priv, skb);
1062
1063        if (check < 0)
1064                return NET_RX_DROP;
1065        if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
1066                return NET_RX_DROP;
1067
1068        /* packet for me */
1069        if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
1070                if (is4addr) {
1071                        batadv_dat_inc_counter(bat_priv,
1072                                               unicast_4addr_packet->subtype);
1073                        orig_addr = unicast_4addr_packet->src;
1074                        orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
1075                }
1076
1077                if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
1078                                                          hdr_size))
1079                        goto rx_success;
1080                if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb,
1081                                                        hdr_size))
1082                        goto rx_success;
1083
1084                batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
1085                                    orig_node);
1086
1087rx_success:
1088                if (orig_node)
1089                        batadv_orig_node_free_ref(orig_node);
1090
1091                return NET_RX_SUCCESS;
1092        }
1093
1094        return batadv_route_unicast_packet(skb, recv_if);
1095}
1096
1097int batadv_recv_ucast_frag_packet(struct sk_buff *skb,
1098                                  struct batadv_hard_iface *recv_if)
1099{
1100        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1101        struct batadv_unicast_frag_packet *unicast_packet;
1102        int hdr_size = sizeof(*unicast_packet);
1103        struct sk_buff *new_skb = NULL;
1104        int ret;
1105
1106        if (batadv_check_unicast_packet(bat_priv, skb, hdr_size) < 0)
1107                return NET_RX_DROP;
1108
1109        if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
1110                return NET_RX_DROP;
1111
1112        unicast_packet = (struct batadv_unicast_frag_packet *)skb->data;
1113
1114        /* packet for me */
1115        if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
1116                ret = batadv_frag_reassemble_skb(skb, bat_priv, &new_skb);
1117
1118                if (ret == NET_RX_DROP)
1119                        return NET_RX_DROP;
1120
1121                /* packet was buffered for late merge */
1122                if (!new_skb)
1123                        return NET_RX_SUCCESS;
1124
1125                if (batadv_dat_snoop_incoming_arp_request(bat_priv, new_skb,
1126                                                          hdr_size))
1127                        goto rx_success;
1128                if (batadv_dat_snoop_incoming_arp_reply(bat_priv, new_skb,
1129                                                        hdr_size))
1130                        goto rx_success;
1131
1132                batadv_interface_rx(recv_if->soft_iface, new_skb, recv_if,
1133                                    sizeof(struct batadv_unicast_packet), NULL);
1134
1135rx_success:
1136                return NET_RX_SUCCESS;
1137        }
1138
1139        return batadv_route_unicast_packet(skb, recv_if);
1140}
1141
1142
1143int batadv_recv_bcast_packet(struct sk_buff *skb,
1144                             struct batadv_hard_iface *recv_if)
1145{
1146        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1147        struct batadv_orig_node *orig_node = NULL;
1148        struct batadv_bcast_packet *bcast_packet;
1149        struct ethhdr *ethhdr;
1150        int hdr_size = sizeof(*bcast_packet);
1151        int ret = NET_RX_DROP;
1152        int32_t seq_diff;
1153
1154        /* drop packet if it has not necessary minimum size */
1155        if (unlikely(!pskb_may_pull(skb, hdr_size)))
1156                goto out;
1157
1158        ethhdr = eth_hdr(skb);
1159
1160        /* packet with broadcast indication but unicast recipient */
1161        if (!is_broadcast_ether_addr(ethhdr->h_dest))
1162                goto out;
1163
1164        /* packet with broadcast sender address */
1165        if (is_broadcast_ether_addr(ethhdr->h_source))
1166                goto out;
1167
1168        /* ignore broadcasts sent by myself */
1169        if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
1170                goto out;
1171
1172        bcast_packet = (struct batadv_bcast_packet *)skb->data;
1173
1174        /* ignore broadcasts originated by myself */
1175        if (batadv_is_my_mac(bat_priv, bcast_packet->orig))
1176                goto out;
1177
1178        if (bcast_packet->header.ttl < 2)
1179                goto out;
1180
1181        orig_node = batadv_orig_hash_find(bat_priv, bcast_packet->orig);
1182
1183        if (!orig_node)
1184                goto out;
1185
1186        spin_lock_bh(&orig_node->bcast_seqno_lock);
1187
1188        /* check whether the packet is a duplicate */
1189        if (batadv_test_bit(orig_node->bcast_bits, orig_node->last_bcast_seqno,
1190                            ntohl(bcast_packet->seqno)))
1191                goto spin_unlock;
1192
1193        seq_diff = ntohl(bcast_packet->seqno) - orig_node->last_bcast_seqno;
1194
1195        /* check whether the packet is old and the host just restarted. */
1196        if (batadv_window_protected(bat_priv, seq_diff,
1197                                    &orig_node->bcast_seqno_reset))
1198                goto spin_unlock;
1199
1200        /* mark broadcast in flood history, update window position
1201         * if required.
1202         */
1203        if (batadv_bit_get_packet(bat_priv, orig_node->bcast_bits, seq_diff, 1))
1204                orig_node->last_bcast_seqno = ntohl(bcast_packet->seqno);
1205
1206        spin_unlock_bh(&orig_node->bcast_seqno_lock);
1207
1208        /* check whether this has been sent by another originator before */
1209        if (batadv_bla_check_bcast_duplist(bat_priv, skb))
1210                goto out;
1211
1212        batadv_skb_set_priority(skb, sizeof(struct batadv_bcast_packet));
1213
1214        /* rebroadcast packet */
1215        batadv_add_bcast_packet_to_list(bat_priv, skb, 1);
1216
1217        /* don't hand the broadcast up if it is from an originator
1218         * from the same backbone.
1219         */
1220        if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size))
1221                goto out;
1222
1223        if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb, hdr_size))
1224                goto rx_success;
1225        if (batadv_dat_snoop_incoming_arp_reply(bat_priv, skb, hdr_size))
1226                goto rx_success;
1227
1228        /* broadcast for me */
1229        batadv_interface_rx(recv_if->soft_iface, skb, recv_if, hdr_size,
1230                            orig_node);
1231
1232rx_success:
1233        ret = NET_RX_SUCCESS;
1234        goto out;
1235
1236spin_unlock:
1237        spin_unlock_bh(&orig_node->bcast_seqno_lock);
1238out:
1239        if (orig_node)
1240                batadv_orig_node_free_ref(orig_node);
1241        return ret;
1242}
1243
1244int batadv_recv_vis_packet(struct sk_buff *skb,
1245                           struct batadv_hard_iface *recv_if)
1246{
1247        struct batadv_vis_packet *vis_packet;
1248        struct ethhdr *ethhdr;
1249        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
1250        int hdr_size = sizeof(*vis_packet);
1251
1252        /* keep skb linear */
1253        if (skb_linearize(skb) < 0)
1254                return NET_RX_DROP;
1255
1256        if (unlikely(!pskb_may_pull(skb, hdr_size)))
1257                return NET_RX_DROP;
1258
1259        vis_packet = (struct batadv_vis_packet *)skb->data;
1260        ethhdr = eth_hdr(skb);
1261
1262        /* not for me */
1263        if (!batadv_is_my_mac(bat_priv, ethhdr->h_dest))
1264                return NET_RX_DROP;
1265
1266        /* ignore own packets */
1267        if (batadv_is_my_mac(bat_priv, vis_packet->vis_orig))
1268                return NET_RX_DROP;
1269
1270        if (batadv_is_my_mac(bat_priv, vis_packet->sender_orig))
1271                return NET_RX_DROP;
1272
1273        switch (vis_packet->vis_type) {
1274        case BATADV_VIS_TYPE_SERVER_SYNC:
1275                batadv_receive_server_sync_packet(bat_priv, vis_packet,
1276                                                  skb_headlen(skb));
1277                break;
1278
1279        case BATADV_VIS_TYPE_CLIENT_UPDATE:
1280                batadv_receive_client_update_packet(bat_priv, vis_packet,
1281                                                    skb_headlen(skb));
1282                break;
1283
1284        default:        /* ignore unknown packet */
1285                break;
1286        }
1287
1288        /* We take a copy of the data in the packet, so we should
1289         * always free the skbuf.
1290         */
1291        return NET_RX_DROP;
1292}
1293