linux/net/batman-adv/main.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 <linux/crc32c.h>
  21#include <linux/highmem.h>
  22#include "main.h"
  23#include "sysfs.h"
  24#include "debugfs.h"
  25#include "routing.h"
  26#include "send.h"
  27#include "originator.h"
  28#include "soft-interface.h"
  29#include "icmp_socket.h"
  30#include "translation-table.h"
  31#include "hard-interface.h"
  32#include "gateway_client.h"
  33#include "bridge_loop_avoidance.h"
  34#include "distributed-arp-table.h"
  35#include "vis.h"
  36#include "hash.h"
  37#include "bat_algo.h"
  38#include "network-coding.h"
  39
  40
  41/* List manipulations on hardif_list have to be rtnl_lock()'ed,
  42 * list traversals just rcu-locked
  43 */
  44struct list_head batadv_hardif_list;
  45static int (*batadv_rx_handler[256])(struct sk_buff *,
  46                                     struct batadv_hard_iface *);
  47char batadv_routing_algo[20] = "BATMAN_IV";
  48static struct hlist_head batadv_algo_list;
  49
  50unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  51
  52struct workqueue_struct *batadv_event_workqueue;
  53
  54static void batadv_recv_handler_init(void);
  55
  56static int __init batadv_init(void)
  57{
  58        INIT_LIST_HEAD(&batadv_hardif_list);
  59        INIT_HLIST_HEAD(&batadv_algo_list);
  60
  61        batadv_recv_handler_init();
  62
  63        batadv_iv_init();
  64
  65        batadv_event_workqueue = create_singlethread_workqueue("bat_events");
  66
  67        if (!batadv_event_workqueue)
  68                return -ENOMEM;
  69
  70        batadv_socket_init();
  71        batadv_debugfs_init();
  72
  73        register_netdevice_notifier(&batadv_hard_if_notifier);
  74        rtnl_link_register(&batadv_link_ops);
  75
  76        pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n",
  77                BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
  78
  79        return 0;
  80}
  81
  82static void __exit batadv_exit(void)
  83{
  84        batadv_debugfs_destroy();
  85        rtnl_link_unregister(&batadv_link_ops);
  86        unregister_netdevice_notifier(&batadv_hard_if_notifier);
  87        batadv_hardif_remove_interfaces();
  88
  89        flush_workqueue(batadv_event_workqueue);
  90        destroy_workqueue(batadv_event_workqueue);
  91        batadv_event_workqueue = NULL;
  92
  93        rcu_barrier();
  94}
  95
  96int batadv_mesh_init(struct net_device *soft_iface)
  97{
  98        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
  99        int ret;
 100
 101        spin_lock_init(&bat_priv->forw_bat_list_lock);
 102        spin_lock_init(&bat_priv->forw_bcast_list_lock);
 103        spin_lock_init(&bat_priv->tt.changes_list_lock);
 104        spin_lock_init(&bat_priv->tt.req_list_lock);
 105        spin_lock_init(&bat_priv->tt.roam_list_lock);
 106        spin_lock_init(&bat_priv->tt.last_changeset_lock);
 107        spin_lock_init(&bat_priv->gw.list_lock);
 108        spin_lock_init(&bat_priv->vis.hash_lock);
 109        spin_lock_init(&bat_priv->vis.list_lock);
 110
 111        INIT_HLIST_HEAD(&bat_priv->forw_bat_list);
 112        INIT_HLIST_HEAD(&bat_priv->forw_bcast_list);
 113        INIT_HLIST_HEAD(&bat_priv->gw.list);
 114        INIT_LIST_HEAD(&bat_priv->tt.changes_list);
 115        INIT_LIST_HEAD(&bat_priv->tt.req_list);
 116        INIT_LIST_HEAD(&bat_priv->tt.roam_list);
 117
 118        ret = batadv_originator_init(bat_priv);
 119        if (ret < 0)
 120                goto err;
 121
 122        ret = batadv_tt_init(bat_priv);
 123        if (ret < 0)
 124                goto err;
 125
 126        batadv_tt_local_add(soft_iface, soft_iface->dev_addr,
 127                            BATADV_NULL_IFINDEX);
 128
 129        ret = batadv_vis_init(bat_priv);
 130        if (ret < 0)
 131                goto err;
 132
 133        ret = batadv_bla_init(bat_priv);
 134        if (ret < 0)
 135                goto err;
 136
 137        ret = batadv_dat_init(bat_priv);
 138        if (ret < 0)
 139                goto err;
 140
 141        ret = batadv_nc_init(bat_priv);
 142        if (ret < 0)
 143                goto err;
 144
 145        atomic_set(&bat_priv->gw.reselect, 0);
 146        atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE);
 147
 148        return 0;
 149
 150err:
 151        batadv_mesh_free(soft_iface);
 152        return ret;
 153}
 154
 155void batadv_mesh_free(struct net_device *soft_iface)
 156{
 157        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
 158
 159        atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
 160
 161        batadv_purge_outstanding_packets(bat_priv, NULL);
 162
 163        batadv_vis_quit(bat_priv);
 164
 165        batadv_gw_node_purge(bat_priv);
 166        batadv_nc_free(bat_priv);
 167        batadv_dat_free(bat_priv);
 168        batadv_bla_free(bat_priv);
 169
 170        /* Free the TT and the originator tables only after having terminated
 171         * all the other depending components which may use these structures for
 172         * their purposes.
 173         */
 174        batadv_tt_free(bat_priv);
 175
 176        /* Since the originator table clean up routine is accessing the TT
 177         * tables as well, it has to be invoked after the TT tables have been
 178         * freed and marked as empty. This ensures that no cleanup RCU callbacks
 179         * accessing the TT data are scheduled for later execution.
 180         */
 181        batadv_originator_free(bat_priv);
 182
 183        free_percpu(bat_priv->bat_counters);
 184        bat_priv->bat_counters = NULL;
 185
 186        atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
 187}
 188
 189/**
 190 * batadv_is_my_mac - check if the given mac address belongs to any of the real
 191 * interfaces in the current mesh
 192 * @bat_priv: the bat priv with all the soft interface information
 193 * @addr: the address to check
 194 */
 195int batadv_is_my_mac(struct batadv_priv *bat_priv, const uint8_t *addr)
 196{
 197        const struct batadv_hard_iface *hard_iface;
 198
 199        rcu_read_lock();
 200        list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
 201                if (hard_iface->if_status != BATADV_IF_ACTIVE)
 202                        continue;
 203
 204                if (hard_iface->soft_iface != bat_priv->soft_iface)
 205                        continue;
 206
 207                if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) {
 208                        rcu_read_unlock();
 209                        return 1;
 210                }
 211        }
 212        rcu_read_unlock();
 213        return 0;
 214}
 215
 216/**
 217 * batadv_seq_print_text_primary_if_get - called from debugfs table printing
 218 *  function that requires the primary interface
 219 * @seq: debugfs table seq_file struct
 220 *
 221 * Returns primary interface if found or NULL otherwise.
 222 */
 223struct batadv_hard_iface *
 224batadv_seq_print_text_primary_if_get(struct seq_file *seq)
 225{
 226        struct net_device *net_dev = (struct net_device *)seq->private;
 227        struct batadv_priv *bat_priv = netdev_priv(net_dev);
 228        struct batadv_hard_iface *primary_if;
 229
 230        primary_if = batadv_primary_if_get_selected(bat_priv);
 231
 232        if (!primary_if) {
 233                seq_printf(seq,
 234                           "BATMAN mesh %s disabled - please specify interfaces to enable it\n",
 235                           net_dev->name);
 236                goto out;
 237        }
 238
 239        if (primary_if->if_status == BATADV_IF_ACTIVE)
 240                goto out;
 241
 242        seq_printf(seq,
 243                   "BATMAN mesh %s disabled - primary interface not active\n",
 244                   net_dev->name);
 245        batadv_hardif_free_ref(primary_if);
 246        primary_if = NULL;
 247
 248out:
 249        return primary_if;
 250}
 251
 252static int batadv_recv_unhandled_packet(struct sk_buff *skb,
 253                                        struct batadv_hard_iface *recv_if)
 254{
 255        return NET_RX_DROP;
 256}
 257
 258/* incoming packets with the batman ethertype received on any active hard
 259 * interface
 260 */
 261int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 262                           struct packet_type *ptype,
 263                           struct net_device *orig_dev)
 264{
 265        struct batadv_priv *bat_priv;
 266        struct batadv_ogm_packet *batadv_ogm_packet;
 267        struct batadv_hard_iface *hard_iface;
 268        uint8_t idx;
 269        int ret;
 270
 271        hard_iface = container_of(ptype, struct batadv_hard_iface,
 272                                  batman_adv_ptype);
 273        skb = skb_share_check(skb, GFP_ATOMIC);
 274
 275        /* skb was released by skb_share_check() */
 276        if (!skb)
 277                goto err_out;
 278
 279        /* packet should hold at least type and version */
 280        if (unlikely(!pskb_may_pull(skb, 2)))
 281                goto err_free;
 282
 283        /* expect a valid ethernet header here. */
 284        if (unlikely(skb->mac_len != ETH_HLEN || !skb_mac_header(skb)))
 285                goto err_free;
 286
 287        if (!hard_iface->soft_iface)
 288                goto err_free;
 289
 290        bat_priv = netdev_priv(hard_iface->soft_iface);
 291
 292        if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
 293                goto err_free;
 294
 295        /* discard frames on not active interfaces */
 296        if (hard_iface->if_status != BATADV_IF_ACTIVE)
 297                goto err_free;
 298
 299        batadv_ogm_packet = (struct batadv_ogm_packet *)skb->data;
 300
 301        if (batadv_ogm_packet->header.version != BATADV_COMPAT_VERSION) {
 302                batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
 303                           "Drop packet: incompatible batman version (%i)\n",
 304                           batadv_ogm_packet->header.version);
 305                goto err_free;
 306        }
 307
 308        /* all receive handlers return whether they received or reused
 309         * the supplied skb. if not, we have to free the skb.
 310         */
 311        idx = batadv_ogm_packet->header.packet_type;
 312        ret = (*batadv_rx_handler[idx])(skb, hard_iface);
 313
 314        if (ret == NET_RX_DROP)
 315                kfree_skb(skb);
 316
 317        /* return NET_RX_SUCCESS in any case as we
 318         * most probably dropped the packet for
 319         * routing-logical reasons.
 320         */
 321        return NET_RX_SUCCESS;
 322
 323err_free:
 324        kfree_skb(skb);
 325err_out:
 326        return NET_RX_DROP;
 327}
 328
 329static void batadv_recv_handler_init(void)
 330{
 331        int i;
 332
 333        for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
 334                batadv_rx_handler[i] = batadv_recv_unhandled_packet;
 335
 336        /* batman icmp packet */
 337        batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet;
 338        /* unicast with 4 addresses packet */
 339        batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet;
 340        /* unicast packet */
 341        batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
 342        /* fragmented unicast packet */
 343        batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_ucast_frag_packet;
 344        /* broadcast packet */
 345        batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
 346        /* vis packet */
 347        batadv_rx_handler[BATADV_VIS] = batadv_recv_vis_packet;
 348        /* Translation table query (request or response) */
 349        batadv_rx_handler[BATADV_TT_QUERY] = batadv_recv_tt_query;
 350        /* Roaming advertisement */
 351        batadv_rx_handler[BATADV_ROAM_ADV] = batadv_recv_roam_adv;
 352}
 353
 354int
 355batadv_recv_handler_register(uint8_t packet_type,
 356                             int (*recv_handler)(struct sk_buff *,
 357                                                 struct batadv_hard_iface *))
 358{
 359        if (batadv_rx_handler[packet_type] != &batadv_recv_unhandled_packet)
 360                return -EBUSY;
 361
 362        batadv_rx_handler[packet_type] = recv_handler;
 363        return 0;
 364}
 365
 366void batadv_recv_handler_unregister(uint8_t packet_type)
 367{
 368        batadv_rx_handler[packet_type] = batadv_recv_unhandled_packet;
 369}
 370
 371static struct batadv_algo_ops *batadv_algo_get(char *name)
 372{
 373        struct batadv_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
 374
 375        hlist_for_each_entry(bat_algo_ops_tmp, &batadv_algo_list, list) {
 376                if (strcmp(bat_algo_ops_tmp->name, name) != 0)
 377                        continue;
 378
 379                bat_algo_ops = bat_algo_ops_tmp;
 380                break;
 381        }
 382
 383        return bat_algo_ops;
 384}
 385
 386int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
 387{
 388        struct batadv_algo_ops *bat_algo_ops_tmp;
 389        int ret;
 390
 391        bat_algo_ops_tmp = batadv_algo_get(bat_algo_ops->name);
 392        if (bat_algo_ops_tmp) {
 393                pr_info("Trying to register already registered routing algorithm: %s\n",
 394                        bat_algo_ops->name);
 395                ret = -EEXIST;
 396                goto out;
 397        }
 398
 399        /* all algorithms must implement all ops (for now) */
 400        if (!bat_algo_ops->bat_iface_enable ||
 401            !bat_algo_ops->bat_iface_disable ||
 402            !bat_algo_ops->bat_iface_update_mac ||
 403            !bat_algo_ops->bat_primary_iface_set ||
 404            !bat_algo_ops->bat_ogm_schedule ||
 405            !bat_algo_ops->bat_ogm_emit) {
 406                pr_info("Routing algo '%s' does not implement required ops\n",
 407                        bat_algo_ops->name);
 408                ret = -EINVAL;
 409                goto out;
 410        }
 411
 412        INIT_HLIST_NODE(&bat_algo_ops->list);
 413        hlist_add_head(&bat_algo_ops->list, &batadv_algo_list);
 414        ret = 0;
 415
 416out:
 417        return ret;
 418}
 419
 420int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
 421{
 422        struct batadv_algo_ops *bat_algo_ops;
 423        int ret = -EINVAL;
 424
 425        bat_algo_ops = batadv_algo_get(name);
 426        if (!bat_algo_ops)
 427                goto out;
 428
 429        bat_priv->bat_algo_ops = bat_algo_ops;
 430        ret = 0;
 431
 432out:
 433        return ret;
 434}
 435
 436int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
 437{
 438        struct batadv_algo_ops *bat_algo_ops;
 439
 440        seq_puts(seq, "Available routing algorithms:\n");
 441
 442        hlist_for_each_entry(bat_algo_ops, &batadv_algo_list, list) {
 443                seq_printf(seq, "%s\n", bat_algo_ops->name);
 444        }
 445
 446        return 0;
 447}
 448
 449/**
 450 * batadv_skb_crc32 - calculate CRC32 of the whole packet and skip bytes in
 451 *  the header
 452 * @skb: skb pointing to fragmented socket buffers
 453 * @payload_ptr: Pointer to position inside the head buffer of the skb
 454 *  marking the start of the data to be CRC'ed
 455 *
 456 * payload_ptr must always point to an address in the skb head buffer and not to
 457 * a fragment.
 458 */
 459__be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr)
 460{
 461        u32 crc = 0;
 462        unsigned int from;
 463        unsigned int to = skb->len;
 464        struct skb_seq_state st;
 465        const u8 *data;
 466        unsigned int len;
 467        unsigned int consumed = 0;
 468
 469        from = (unsigned int)(payload_ptr - skb->data);
 470
 471        skb_prepare_seq_read(skb, from, to, &st);
 472        while ((len = skb_seq_read(consumed, &data, &st)) != 0) {
 473                crc = crc32c(crc, data, len);
 474                consumed += len;
 475        }
 476
 477        return htonl(crc);
 478}
 479
 480static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
 481{
 482        struct batadv_algo_ops *bat_algo_ops;
 483        char *algo_name = (char *)val;
 484        size_t name_len = strlen(algo_name);
 485
 486        if (name_len > 0 && algo_name[name_len - 1] == '\n')
 487                algo_name[name_len - 1] = '\0';
 488
 489        bat_algo_ops = batadv_algo_get(algo_name);
 490        if (!bat_algo_ops) {
 491                pr_err("Routing algorithm '%s' is not supported\n", algo_name);
 492                return -EINVAL;
 493        }
 494
 495        return param_set_copystring(algo_name, kp);
 496}
 497
 498static const struct kernel_param_ops batadv_param_ops_ra = {
 499        .set = batadv_param_set_ra,
 500        .get = param_get_string,
 501};
 502
 503static struct kparam_string batadv_param_string_ra = {
 504        .maxlen = sizeof(batadv_routing_algo),
 505        .string = batadv_routing_algo,
 506};
 507
 508module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
 509                0644);
 510module_init(batadv_init);
 511module_exit(batadv_exit);
 512
 513MODULE_LICENSE("GPL");
 514
 515MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
 516MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
 517MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
 518MODULE_VERSION(BATADV_SOURCE_VERSION);
 519