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 <linux/if_vlan.h>
  23#include <net/ip.h>
  24#include <net/ipv6.h>
  25#include <net/dsfield.h>
  26#include "main.h"
  27#include "sysfs.h"
  28#include "debugfs.h"
  29#include "routing.h"
  30#include "send.h"
  31#include "originator.h"
  32#include "soft-interface.h"
  33#include "icmp_socket.h"
  34#include "translation-table.h"
  35#include "hard-interface.h"
  36#include "gateway_client.h"
  37#include "bridge_loop_avoidance.h"
  38#include "distributed-arp-table.h"
  39#include "gateway_common.h"
  40#include "hash.h"
  41#include "bat_algo.h"
  42#include "network-coding.h"
  43#include "fragmentation.h"
  44
  45
  46/* List manipulations on hardif_list have to be rtnl_lock()'ed,
  47 * list traversals just rcu-locked
  48 */
  49struct list_head batadv_hardif_list;
  50static int (*batadv_rx_handler[256])(struct sk_buff *,
  51                                     struct batadv_hard_iface *);
  52char batadv_routing_algo[20] = "BATMAN_IV";
  53static struct hlist_head batadv_algo_list;
  54
  55unsigned char batadv_broadcast_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  56
  57struct workqueue_struct *batadv_event_workqueue;
  58
  59static void batadv_recv_handler_init(void);
  60
  61static int __init batadv_init(void)
  62{
  63        INIT_LIST_HEAD(&batadv_hardif_list);
  64        INIT_HLIST_HEAD(&batadv_algo_list);
  65
  66        batadv_recv_handler_init();
  67
  68        batadv_iv_init();
  69        batadv_nc_init();
  70
  71        batadv_event_workqueue = create_singlethread_workqueue("bat_events");
  72
  73        if (!batadv_event_workqueue)
  74                return -ENOMEM;
  75
  76        batadv_socket_init();
  77        batadv_debugfs_init();
  78
  79        register_netdevice_notifier(&batadv_hard_if_notifier);
  80        rtnl_link_register(&batadv_link_ops);
  81
  82        pr_info("B.A.T.M.A.N. advanced %s (compatibility version %i) loaded\n",
  83                BATADV_SOURCE_VERSION, BATADV_COMPAT_VERSION);
  84
  85        return 0;
  86}
  87
  88static void __exit batadv_exit(void)
  89{
  90        batadv_debugfs_destroy();
  91        rtnl_link_unregister(&batadv_link_ops);
  92        unregister_netdevice_notifier(&batadv_hard_if_notifier);
  93        batadv_hardif_remove_interfaces();
  94
  95        flush_workqueue(batadv_event_workqueue);
  96        destroy_workqueue(batadv_event_workqueue);
  97        batadv_event_workqueue = NULL;
  98
  99        rcu_barrier();
 100}
 101
 102int batadv_mesh_init(struct net_device *soft_iface)
 103{
 104        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
 105        int ret;
 106
 107        spin_lock_init(&bat_priv->forw_bat_list_lock);
 108        spin_lock_init(&bat_priv->forw_bcast_list_lock);
 109        spin_lock_init(&bat_priv->tt.changes_list_lock);
 110        spin_lock_init(&bat_priv->tt.req_list_lock);
 111        spin_lock_init(&bat_priv->tt.roam_list_lock);
 112        spin_lock_init(&bat_priv->tt.last_changeset_lock);
 113        spin_lock_init(&bat_priv->tt.commit_lock);
 114        spin_lock_init(&bat_priv->gw.list_lock);
 115        spin_lock_init(&bat_priv->tvlv.container_list_lock);
 116        spin_lock_init(&bat_priv->tvlv.handler_list_lock);
 117        spin_lock_init(&bat_priv->softif_vlan_list_lock);
 118
 119        INIT_HLIST_HEAD(&bat_priv->forw_bat_list);
 120        INIT_HLIST_HEAD(&bat_priv->forw_bcast_list);
 121        INIT_HLIST_HEAD(&bat_priv->gw.list);
 122        INIT_LIST_HEAD(&bat_priv->tt.changes_list);
 123        INIT_LIST_HEAD(&bat_priv->tt.req_list);
 124        INIT_LIST_HEAD(&bat_priv->tt.roam_list);
 125        INIT_HLIST_HEAD(&bat_priv->tvlv.container_list);
 126        INIT_HLIST_HEAD(&bat_priv->tvlv.handler_list);
 127        INIT_HLIST_HEAD(&bat_priv->softif_vlan_list);
 128
 129        ret = batadv_originator_init(bat_priv);
 130        if (ret < 0)
 131                goto err;
 132
 133        ret = batadv_tt_init(bat_priv);
 134        if (ret < 0)
 135                goto err;
 136
 137        ret = batadv_bla_init(bat_priv);
 138        if (ret < 0)
 139                goto err;
 140
 141        ret = batadv_dat_init(bat_priv);
 142        if (ret < 0)
 143                goto err;
 144
 145        ret = batadv_nc_mesh_init(bat_priv);
 146        if (ret < 0)
 147                goto err;
 148
 149        batadv_gw_init(bat_priv);
 150
 151        atomic_set(&bat_priv->gw.reselect, 0);
 152        atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE);
 153
 154        return 0;
 155
 156err:
 157        batadv_mesh_free(soft_iface);
 158        return ret;
 159}
 160
 161void batadv_mesh_free(struct net_device *soft_iface)
 162{
 163        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
 164
 165        atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
 166
 167        batadv_purge_outstanding_packets(bat_priv, NULL);
 168
 169        batadv_gw_node_purge(bat_priv);
 170        batadv_nc_mesh_free(bat_priv);
 171        batadv_dat_free(bat_priv);
 172        batadv_bla_free(bat_priv);
 173
 174        /* Free the TT and the originator tables only after having terminated
 175         * all the other depending components which may use these structures for
 176         * their purposes.
 177         */
 178        batadv_tt_free(bat_priv);
 179
 180        /* Since the originator table clean up routine is accessing the TT
 181         * tables as well, it has to be invoked after the TT tables have been
 182         * freed and marked as empty. This ensures that no cleanup RCU callbacks
 183         * accessing the TT data are scheduled for later execution.
 184         */
 185        batadv_originator_free(bat_priv);
 186
 187        batadv_gw_free(bat_priv);
 188
 189        free_percpu(bat_priv->bat_counters);
 190        bat_priv->bat_counters = NULL;
 191
 192        atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
 193}
 194
 195/**
 196 * batadv_is_my_mac - check if the given mac address belongs to any of the real
 197 * interfaces in the current mesh
 198 * @bat_priv: the bat priv with all the soft interface information
 199 * @addr: the address to check
 200 */
 201int batadv_is_my_mac(struct batadv_priv *bat_priv, const uint8_t *addr)
 202{
 203        const struct batadv_hard_iface *hard_iface;
 204
 205        rcu_read_lock();
 206        list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
 207                if (hard_iface->if_status != BATADV_IF_ACTIVE)
 208                        continue;
 209
 210                if (hard_iface->soft_iface != bat_priv->soft_iface)
 211                        continue;
 212
 213                if (batadv_compare_eth(hard_iface->net_dev->dev_addr, addr)) {
 214                        rcu_read_unlock();
 215                        return 1;
 216                }
 217        }
 218        rcu_read_unlock();
 219        return 0;
 220}
 221
 222/**
 223 * batadv_seq_print_text_primary_if_get - called from debugfs table printing
 224 *  function that requires the primary interface
 225 * @seq: debugfs table seq_file struct
 226 *
 227 * Returns primary interface if found or NULL otherwise.
 228 */
 229struct batadv_hard_iface *
 230batadv_seq_print_text_primary_if_get(struct seq_file *seq)
 231{
 232        struct net_device *net_dev = (struct net_device *)seq->private;
 233        struct batadv_priv *bat_priv = netdev_priv(net_dev);
 234        struct batadv_hard_iface *primary_if;
 235
 236        primary_if = batadv_primary_if_get_selected(bat_priv);
 237
 238        if (!primary_if) {
 239                seq_printf(seq,
 240                           "BATMAN mesh %s disabled - please specify interfaces to enable it\n",
 241                           net_dev->name);
 242                goto out;
 243        }
 244
 245        if (primary_if->if_status == BATADV_IF_ACTIVE)
 246                goto out;
 247
 248        seq_printf(seq,
 249                   "BATMAN mesh %s disabled - primary interface not active\n",
 250                   net_dev->name);
 251        batadv_hardif_free_ref(primary_if);
 252        primary_if = NULL;
 253
 254out:
 255        return primary_if;
 256}
 257
 258/**
 259 * batadv_max_header_len - calculate maximum encapsulation overhead for a
 260 *  payload packet
 261 *
 262 * Return the maximum encapsulation overhead in bytes.
 263 */
 264int batadv_max_header_len(void)
 265{
 266        int header_len = 0;
 267
 268        header_len = max_t(int, header_len,
 269                           sizeof(struct batadv_unicast_packet));
 270        header_len = max_t(int, header_len,
 271                           sizeof(struct batadv_unicast_4addr_packet));
 272        header_len = max_t(int, header_len,
 273                           sizeof(struct batadv_bcast_packet));
 274
 275#ifdef CONFIG_BATMAN_ADV_NC
 276        header_len = max_t(int, header_len,
 277                           sizeof(struct batadv_coded_packet));
 278#endif
 279
 280        return header_len + ETH_HLEN;
 281}
 282
 283/**
 284 * batadv_skb_set_priority - sets skb priority according to packet content
 285 * @skb: the packet to be sent
 286 * @offset: offset to the packet content
 287 *
 288 * This function sets a value between 256 and 263 (802.1d priority), which
 289 * can be interpreted by the cfg80211 or other drivers.
 290 */
 291void batadv_skb_set_priority(struct sk_buff *skb, int offset)
 292{
 293        struct iphdr ip_hdr_tmp, *ip_hdr;
 294        struct ipv6hdr ip6_hdr_tmp, *ip6_hdr;
 295        struct ethhdr ethhdr_tmp, *ethhdr;
 296        struct vlan_ethhdr *vhdr, vhdr_tmp;
 297        u32 prio;
 298
 299        /* already set, do nothing */
 300        if (skb->priority >= 256 && skb->priority <= 263)
 301                return;
 302
 303        ethhdr = skb_header_pointer(skb, offset, sizeof(*ethhdr), &ethhdr_tmp);
 304        if (!ethhdr)
 305                return;
 306
 307        switch (ethhdr->h_proto) {
 308        case htons(ETH_P_8021Q):
 309                vhdr = skb_header_pointer(skb, offset + sizeof(*vhdr),
 310                                          sizeof(*vhdr), &vhdr_tmp);
 311                if (!vhdr)
 312                        return;
 313                prio = ntohs(vhdr->h_vlan_TCI) & VLAN_PRIO_MASK;
 314                prio = prio >> VLAN_PRIO_SHIFT;
 315                break;
 316        case htons(ETH_P_IP):
 317                ip_hdr = skb_header_pointer(skb, offset + sizeof(*ethhdr),
 318                                            sizeof(*ip_hdr), &ip_hdr_tmp);
 319                if (!ip_hdr)
 320                        return;
 321                prio = (ipv4_get_dsfield(ip_hdr) & 0xfc) >> 5;
 322                break;
 323        case htons(ETH_P_IPV6):
 324                ip6_hdr = skb_header_pointer(skb, offset + sizeof(*ethhdr),
 325                                             sizeof(*ip6_hdr), &ip6_hdr_tmp);
 326                if (!ip6_hdr)
 327                        return;
 328                prio = (ipv6_get_dsfield(ip6_hdr) & 0xfc) >> 5;
 329                break;
 330        default:
 331                return;
 332        }
 333
 334        skb->priority = prio + 256;
 335}
 336
 337static int batadv_recv_unhandled_packet(struct sk_buff *skb,
 338                                        struct batadv_hard_iface *recv_if)
 339{
 340        return NET_RX_DROP;
 341}
 342
 343/* incoming packets with the batman ethertype received on any active hard
 344 * interface
 345 */
 346int batadv_batman_skb_recv(struct sk_buff *skb, struct net_device *dev,
 347                           struct packet_type *ptype,
 348                           struct net_device *orig_dev)
 349{
 350        struct batadv_priv *bat_priv;
 351        struct batadv_ogm_packet *batadv_ogm_packet;
 352        struct batadv_hard_iface *hard_iface;
 353        uint8_t idx;
 354        int ret;
 355
 356        hard_iface = container_of(ptype, struct batadv_hard_iface,
 357                                  batman_adv_ptype);
 358        skb = skb_share_check(skb, GFP_ATOMIC);
 359
 360        /* skb was released by skb_share_check() */
 361        if (!skb)
 362                goto err_out;
 363
 364        /* packet should hold at least type and version */
 365        if (unlikely(!pskb_may_pull(skb, 2)))
 366                goto err_free;
 367
 368        /* expect a valid ethernet header here. */
 369        if (unlikely(skb->mac_len != ETH_HLEN || !skb_mac_header(skb)))
 370                goto err_free;
 371
 372        if (!hard_iface->soft_iface)
 373                goto err_free;
 374
 375        bat_priv = netdev_priv(hard_iface->soft_iface);
 376
 377        if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
 378                goto err_free;
 379
 380        /* discard frames on not active interfaces */
 381        if (hard_iface->if_status != BATADV_IF_ACTIVE)
 382                goto err_free;
 383
 384        batadv_ogm_packet = (struct batadv_ogm_packet *)skb->data;
 385
 386        if (batadv_ogm_packet->version != BATADV_COMPAT_VERSION) {
 387                batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
 388                           "Drop packet: incompatible batman version (%i)\n",
 389                           batadv_ogm_packet->version);
 390                goto err_free;
 391        }
 392
 393        /* all receive handlers return whether they received or reused
 394         * the supplied skb. if not, we have to free the skb.
 395         */
 396        idx = batadv_ogm_packet->packet_type;
 397        ret = (*batadv_rx_handler[idx])(skb, hard_iface);
 398
 399        if (ret == NET_RX_DROP)
 400                kfree_skb(skb);
 401
 402        /* return NET_RX_SUCCESS in any case as we
 403         * most probably dropped the packet for
 404         * routing-logical reasons.
 405         */
 406        return NET_RX_SUCCESS;
 407
 408err_free:
 409        kfree_skb(skb);
 410err_out:
 411        return NET_RX_DROP;
 412}
 413
 414static void batadv_recv_handler_init(void)
 415{
 416        int i;
 417
 418        for (i = 0; i < ARRAY_SIZE(batadv_rx_handler); i++)
 419                batadv_rx_handler[i] = batadv_recv_unhandled_packet;
 420
 421        for (i = BATADV_UNICAST_MIN; i <= BATADV_UNICAST_MAX; i++)
 422                batadv_rx_handler[i] = batadv_recv_unhandled_unicast_packet;
 423
 424        /* compile time checks for struct member offsets */
 425        BUILD_BUG_ON(offsetof(struct batadv_unicast_4addr_packet, src) != 10);
 426        BUILD_BUG_ON(offsetof(struct batadv_unicast_packet, dest) != 4);
 427        BUILD_BUG_ON(offsetof(struct batadv_unicast_tvlv_packet, dst) != 4);
 428        BUILD_BUG_ON(offsetof(struct batadv_frag_packet, dest) != 4);
 429        BUILD_BUG_ON(offsetof(struct batadv_icmp_packet, dst) != 4);
 430        BUILD_BUG_ON(offsetof(struct batadv_icmp_packet_rr, dst) != 4);
 431
 432        /* broadcast packet */
 433        batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
 434
 435        /* unicast packets ... */
 436        /* unicast with 4 addresses packet */
 437        batadv_rx_handler[BATADV_UNICAST_4ADDR] = batadv_recv_unicast_packet;
 438        /* unicast packet */
 439        batadv_rx_handler[BATADV_UNICAST] = batadv_recv_unicast_packet;
 440        /* unicast tvlv packet */
 441        batadv_rx_handler[BATADV_UNICAST_TVLV] = batadv_recv_unicast_tvlv;
 442        /* batman icmp packet */
 443        batadv_rx_handler[BATADV_ICMP] = batadv_recv_icmp_packet;
 444        /* Fragmented packets */
 445        batadv_rx_handler[BATADV_UNICAST_FRAG] = batadv_recv_frag_packet;
 446}
 447
 448int
 449batadv_recv_handler_register(uint8_t packet_type,
 450                             int (*recv_handler)(struct sk_buff *,
 451                                                 struct batadv_hard_iface *))
 452{
 453        int (*curr)(struct sk_buff *,
 454                    struct batadv_hard_iface *);
 455        curr = batadv_rx_handler[packet_type];
 456
 457        if ((curr != batadv_recv_unhandled_packet) &&
 458            (curr != batadv_recv_unhandled_unicast_packet))
 459                return -EBUSY;
 460
 461        batadv_rx_handler[packet_type] = recv_handler;
 462        return 0;
 463}
 464
 465void batadv_recv_handler_unregister(uint8_t packet_type)
 466{
 467        batadv_rx_handler[packet_type] = batadv_recv_unhandled_packet;
 468}
 469
 470static struct batadv_algo_ops *batadv_algo_get(char *name)
 471{
 472        struct batadv_algo_ops *bat_algo_ops = NULL, *bat_algo_ops_tmp;
 473
 474        hlist_for_each_entry(bat_algo_ops_tmp, &batadv_algo_list, list) {
 475                if (strcmp(bat_algo_ops_tmp->name, name) != 0)
 476                        continue;
 477
 478                bat_algo_ops = bat_algo_ops_tmp;
 479                break;
 480        }
 481
 482        return bat_algo_ops;
 483}
 484
 485int batadv_algo_register(struct batadv_algo_ops *bat_algo_ops)
 486{
 487        struct batadv_algo_ops *bat_algo_ops_tmp;
 488        int ret;
 489
 490        bat_algo_ops_tmp = batadv_algo_get(bat_algo_ops->name);
 491        if (bat_algo_ops_tmp) {
 492                pr_info("Trying to register already registered routing algorithm: %s\n",
 493                        bat_algo_ops->name);
 494                ret = -EEXIST;
 495                goto out;
 496        }
 497
 498        /* all algorithms must implement all ops (for now) */
 499        if (!bat_algo_ops->bat_iface_enable ||
 500            !bat_algo_ops->bat_iface_disable ||
 501            !bat_algo_ops->bat_iface_update_mac ||
 502            !bat_algo_ops->bat_primary_iface_set ||
 503            !bat_algo_ops->bat_ogm_schedule ||
 504            !bat_algo_ops->bat_ogm_emit ||
 505            !bat_algo_ops->bat_neigh_cmp ||
 506            !bat_algo_ops->bat_neigh_is_equiv_or_better) {
 507                pr_info("Routing algo '%s' does not implement required ops\n",
 508                        bat_algo_ops->name);
 509                ret = -EINVAL;
 510                goto out;
 511        }
 512
 513        INIT_HLIST_NODE(&bat_algo_ops->list);
 514        hlist_add_head(&bat_algo_ops->list, &batadv_algo_list);
 515        ret = 0;
 516
 517out:
 518        return ret;
 519}
 520
 521int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
 522{
 523        struct batadv_algo_ops *bat_algo_ops;
 524        int ret = -EINVAL;
 525
 526        bat_algo_ops = batadv_algo_get(name);
 527        if (!bat_algo_ops)
 528                goto out;
 529
 530        bat_priv->bat_algo_ops = bat_algo_ops;
 531        ret = 0;
 532
 533out:
 534        return ret;
 535}
 536
 537int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
 538{
 539        struct batadv_algo_ops *bat_algo_ops;
 540
 541        seq_puts(seq, "Available routing algorithms:\n");
 542
 543        hlist_for_each_entry(bat_algo_ops, &batadv_algo_list, list) {
 544                seq_printf(seq, "%s\n", bat_algo_ops->name);
 545        }
 546
 547        return 0;
 548}
 549
 550/**
 551 * batadv_skb_crc32 - calculate CRC32 of the whole packet and skip bytes in
 552 *  the header
 553 * @skb: skb pointing to fragmented socket buffers
 554 * @payload_ptr: Pointer to position inside the head buffer of the skb
 555 *  marking the start of the data to be CRC'ed
 556 *
 557 * payload_ptr must always point to an address in the skb head buffer and not to
 558 * a fragment.
 559 */
 560__be32 batadv_skb_crc32(struct sk_buff *skb, u8 *payload_ptr)
 561{
 562        u32 crc = 0;
 563        unsigned int from;
 564        unsigned int to = skb->len;
 565        struct skb_seq_state st;
 566        const u8 *data;
 567        unsigned int len;
 568        unsigned int consumed = 0;
 569
 570        from = (unsigned int)(payload_ptr - skb->data);
 571
 572        skb_prepare_seq_read(skb, from, to, &st);
 573        while ((len = skb_seq_read(consumed, &data, &st)) != 0) {
 574                crc = crc32c(crc, data, len);
 575                consumed += len;
 576        }
 577
 578        return htonl(crc);
 579}
 580
 581/**
 582 * batadv_tvlv_handler_free_ref - decrement the tvlv handler refcounter and
 583 *  possibly free it
 584 * @tvlv_handler: the tvlv handler to free
 585 */
 586static void
 587batadv_tvlv_handler_free_ref(struct batadv_tvlv_handler *tvlv_handler)
 588{
 589        if (atomic_dec_and_test(&tvlv_handler->refcount))
 590                kfree_rcu(tvlv_handler, rcu);
 591}
 592
 593/**
 594 * batadv_tvlv_handler_get - retrieve tvlv handler from the tvlv handler list
 595 *  based on the provided type and version (both need to match)
 596 * @bat_priv: the bat priv with all the soft interface information
 597 * @type: tvlv handler type to look for
 598 * @version: tvlv handler version to look for
 599 *
 600 * Returns tvlv handler if found or NULL otherwise.
 601 */
 602static struct batadv_tvlv_handler
 603*batadv_tvlv_handler_get(struct batadv_priv *bat_priv,
 604                         uint8_t type, uint8_t version)
 605{
 606        struct batadv_tvlv_handler *tvlv_handler_tmp, *tvlv_handler = NULL;
 607
 608        rcu_read_lock();
 609        hlist_for_each_entry_rcu(tvlv_handler_tmp,
 610                                 &bat_priv->tvlv.handler_list, list) {
 611                if (tvlv_handler_tmp->type != type)
 612                        continue;
 613
 614                if (tvlv_handler_tmp->version != version)
 615                        continue;
 616
 617                if (!atomic_inc_not_zero(&tvlv_handler_tmp->refcount))
 618                        continue;
 619
 620                tvlv_handler = tvlv_handler_tmp;
 621                break;
 622        }
 623        rcu_read_unlock();
 624
 625        return tvlv_handler;
 626}
 627
 628/**
 629 * batadv_tvlv_container_free_ref - decrement the tvlv container refcounter and
 630 *  possibly free it
 631 * @tvlv_handler: the tvlv container to free
 632 */
 633static void batadv_tvlv_container_free_ref(struct batadv_tvlv_container *tvlv)
 634{
 635        if (atomic_dec_and_test(&tvlv->refcount))
 636                kfree(tvlv);
 637}
 638
 639/**
 640 * batadv_tvlv_container_get - retrieve tvlv container from the tvlv container
 641 *  list based on the provided type and version (both need to match)
 642 * @bat_priv: the bat priv with all the soft interface information
 643 * @type: tvlv container type to look for
 644 * @version: tvlv container version to look for
 645 *
 646 * Has to be called with the appropriate locks being acquired
 647 * (tvlv.container_list_lock).
 648 *
 649 * Returns tvlv container if found or NULL otherwise.
 650 */
 651static struct batadv_tvlv_container
 652*batadv_tvlv_container_get(struct batadv_priv *bat_priv,
 653                           uint8_t type, uint8_t version)
 654{
 655        struct batadv_tvlv_container *tvlv_tmp, *tvlv = NULL;
 656
 657        hlist_for_each_entry(tvlv_tmp, &bat_priv->tvlv.container_list, list) {
 658                if (tvlv_tmp->tvlv_hdr.type != type)
 659                        continue;
 660
 661                if (tvlv_tmp->tvlv_hdr.version != version)
 662                        continue;
 663
 664                if (!atomic_inc_not_zero(&tvlv_tmp->refcount))
 665                        continue;
 666
 667                tvlv = tvlv_tmp;
 668                break;
 669        }
 670
 671        return tvlv;
 672}
 673
 674/**
 675 * batadv_tvlv_container_list_size - calculate the size of the tvlv container
 676 *  list entries
 677 * @bat_priv: the bat priv with all the soft interface information
 678 *
 679 * Has to be called with the appropriate locks being acquired
 680 * (tvlv.container_list_lock).
 681 *
 682 * Returns size of all currently registered tvlv containers in bytes.
 683 */
 684static uint16_t batadv_tvlv_container_list_size(struct batadv_priv *bat_priv)
 685{
 686        struct batadv_tvlv_container *tvlv;
 687        uint16_t tvlv_len = 0;
 688
 689        hlist_for_each_entry(tvlv, &bat_priv->tvlv.container_list, list) {
 690                tvlv_len += sizeof(struct batadv_tvlv_hdr);
 691                tvlv_len += ntohs(tvlv->tvlv_hdr.len);
 692        }
 693
 694        return tvlv_len;
 695}
 696
 697/**
 698 * batadv_tvlv_container_remove - remove tvlv container from the tvlv container
 699 *  list
 700 * @tvlv: the to be removed tvlv container
 701 *
 702 * Has to be called with the appropriate locks being acquired
 703 * (tvlv.container_list_lock).
 704 */
 705static void batadv_tvlv_container_remove(struct batadv_tvlv_container *tvlv)
 706{
 707        if (!tvlv)
 708                return;
 709
 710        hlist_del(&tvlv->list);
 711
 712        /* first call to decrement the counter, second call to free */
 713        batadv_tvlv_container_free_ref(tvlv);
 714        batadv_tvlv_container_free_ref(tvlv);
 715}
 716
 717/**
 718 * batadv_tvlv_container_unregister - unregister tvlv container based on the
 719 *  provided type and version (both need to match)
 720 * @bat_priv: the bat priv with all the soft interface information
 721 * @type: tvlv container type to unregister
 722 * @version: tvlv container type to unregister
 723 */
 724void batadv_tvlv_container_unregister(struct batadv_priv *bat_priv,
 725                                      uint8_t type, uint8_t version)
 726{
 727        struct batadv_tvlv_container *tvlv;
 728
 729        spin_lock_bh(&bat_priv->tvlv.container_list_lock);
 730        tvlv = batadv_tvlv_container_get(bat_priv, type, version);
 731        batadv_tvlv_container_remove(tvlv);
 732        spin_unlock_bh(&bat_priv->tvlv.container_list_lock);
 733}
 734
 735/**
 736 * batadv_tvlv_container_register - register tvlv type, version and content
 737 *  to be propagated with each (primary interface) OGM
 738 * @bat_priv: the bat priv with all the soft interface information
 739 * @type: tvlv container type
 740 * @version: tvlv container version
 741 * @tvlv_value: tvlv container content
 742 * @tvlv_value_len: tvlv container content length
 743 *
 744 * If a container of the same type and version was already registered the new
 745 * content is going to replace the old one.
 746 */
 747void batadv_tvlv_container_register(struct batadv_priv *bat_priv,
 748                                    uint8_t type, uint8_t version,
 749                                    void *tvlv_value, uint16_t tvlv_value_len)
 750{
 751        struct batadv_tvlv_container *tvlv_old, *tvlv_new;
 752
 753        if (!tvlv_value)
 754                tvlv_value_len = 0;
 755
 756        tvlv_new = kzalloc(sizeof(*tvlv_new) + tvlv_value_len, GFP_ATOMIC);
 757        if (!tvlv_new)
 758                return;
 759
 760        tvlv_new->tvlv_hdr.version = version;
 761        tvlv_new->tvlv_hdr.type = type;
 762        tvlv_new->tvlv_hdr.len = htons(tvlv_value_len);
 763
 764        memcpy(tvlv_new + 1, tvlv_value, ntohs(tvlv_new->tvlv_hdr.len));
 765        INIT_HLIST_NODE(&tvlv_new->list);
 766        atomic_set(&tvlv_new->refcount, 1);
 767
 768        spin_lock_bh(&bat_priv->tvlv.container_list_lock);
 769        tvlv_old = batadv_tvlv_container_get(bat_priv, type, version);
 770        batadv_tvlv_container_remove(tvlv_old);
 771        hlist_add_head(&tvlv_new->list, &bat_priv->tvlv.container_list);
 772        spin_unlock_bh(&bat_priv->tvlv.container_list_lock);
 773}
 774
 775/**
 776 * batadv_tvlv_realloc_packet_buff - reallocate packet buffer to accomodate
 777 *  requested packet size
 778 * @packet_buff: packet buffer
 779 * @packet_buff_len: packet buffer size
 780 * @packet_min_len: requested packet minimum size
 781 * @additional_packet_len: requested additional packet size on top of minimum
 782 *  size
 783 *
 784 * Returns true of the packet buffer could be changed to the requested size,
 785 * false otherwise.
 786 */
 787static bool batadv_tvlv_realloc_packet_buff(unsigned char **packet_buff,
 788                                            int *packet_buff_len,
 789                                            int min_packet_len,
 790                                            int additional_packet_len)
 791{
 792        unsigned char *new_buff;
 793
 794        new_buff = kmalloc(min_packet_len + additional_packet_len, GFP_ATOMIC);
 795
 796        /* keep old buffer if kmalloc should fail */
 797        if (new_buff) {
 798                memcpy(new_buff, *packet_buff, min_packet_len);
 799                kfree(*packet_buff);
 800                *packet_buff = new_buff;
 801                *packet_buff_len = min_packet_len + additional_packet_len;
 802                return true;
 803        }
 804
 805        return false;
 806}
 807
 808/**
 809 * batadv_tvlv_container_ogm_append - append tvlv container content to given
 810 *  OGM packet buffer
 811 * @bat_priv: the bat priv with all the soft interface information
 812 * @packet_buff: ogm packet buffer
 813 * @packet_buff_len: ogm packet buffer size including ogm header and tvlv
 814 *  content
 815 * @packet_min_len: ogm header size to be preserved for the OGM itself
 816 *
 817 * The ogm packet might be enlarged or shrunk depending on the current size
 818 * and the size of the to-be-appended tvlv containers.
 819 *
 820 * Returns size of all appended tvlv containers in bytes.
 821 */
 822uint16_t batadv_tvlv_container_ogm_append(struct batadv_priv *bat_priv,
 823                                          unsigned char **packet_buff,
 824                                          int *packet_buff_len,
 825                                          int packet_min_len)
 826{
 827        struct batadv_tvlv_container *tvlv;
 828        struct batadv_tvlv_hdr *tvlv_hdr;
 829        uint16_t tvlv_value_len;
 830        void *tvlv_value;
 831        bool ret;
 832
 833        spin_lock_bh(&bat_priv->tvlv.container_list_lock);
 834        tvlv_value_len = batadv_tvlv_container_list_size(bat_priv);
 835
 836        ret = batadv_tvlv_realloc_packet_buff(packet_buff, packet_buff_len,
 837                                              packet_min_len, tvlv_value_len);
 838
 839        if (!ret)
 840                goto end;
 841
 842        if (!tvlv_value_len)
 843                goto end;
 844
 845        tvlv_value = (*packet_buff) + packet_min_len;
 846
 847        hlist_for_each_entry(tvlv, &bat_priv->tvlv.container_list, list) {
 848                tvlv_hdr = tvlv_value;
 849                tvlv_hdr->type = tvlv->tvlv_hdr.type;
 850                tvlv_hdr->version = tvlv->tvlv_hdr.version;
 851                tvlv_hdr->len = tvlv->tvlv_hdr.len;
 852                tvlv_value = tvlv_hdr + 1;
 853                memcpy(tvlv_value, tvlv + 1, ntohs(tvlv->tvlv_hdr.len));
 854                tvlv_value = (uint8_t *)tvlv_value + ntohs(tvlv->tvlv_hdr.len);
 855        }
 856
 857end:
 858        spin_unlock_bh(&bat_priv->tvlv.container_list_lock);
 859        return tvlv_value_len;
 860}
 861
 862/**
 863 * batadv_tvlv_call_handler - parse the given tvlv buffer to call the
 864 *  appropriate handlers
 865 * @bat_priv: the bat priv with all the soft interface information
 866 * @tvlv_handler: tvlv callback function handling the tvlv content
 867 * @ogm_source: flag indicating wether the tvlv is an ogm or a unicast packet
 868 * @orig_node: orig node emitting the ogm packet
 869 * @src: source mac address of the unicast packet
 870 * @dst: destination mac address of the unicast packet
 871 * @tvlv_value: tvlv content
 872 * @tvlv_value_len: tvlv content length
 873 *
 874 * Returns success if handler was not found or the return value of the handler
 875 * callback.
 876 */
 877static int batadv_tvlv_call_handler(struct batadv_priv *bat_priv,
 878                                    struct batadv_tvlv_handler *tvlv_handler,
 879                                    bool ogm_source,
 880                                    struct batadv_orig_node *orig_node,
 881                                    uint8_t *src, uint8_t *dst,
 882                                    void *tvlv_value, uint16_t tvlv_value_len)
 883{
 884        if (!tvlv_handler)
 885                return NET_RX_SUCCESS;
 886
 887        if (ogm_source) {
 888                if (!tvlv_handler->ogm_handler)
 889                        return NET_RX_SUCCESS;
 890
 891                if (!orig_node)
 892                        return NET_RX_SUCCESS;
 893
 894                tvlv_handler->ogm_handler(bat_priv, orig_node,
 895                                          BATADV_NO_FLAGS,
 896                                          tvlv_value, tvlv_value_len);
 897                tvlv_handler->flags |= BATADV_TVLV_HANDLER_OGM_CALLED;
 898        } else {
 899                if (!src)
 900                        return NET_RX_SUCCESS;
 901
 902                if (!dst)
 903                        return NET_RX_SUCCESS;
 904
 905                if (!tvlv_handler->unicast_handler)
 906                        return NET_RX_SUCCESS;
 907
 908                return tvlv_handler->unicast_handler(bat_priv, src,
 909                                                     dst, tvlv_value,
 910                                                     tvlv_value_len);
 911        }
 912
 913        return NET_RX_SUCCESS;
 914}
 915
 916/**
 917 * batadv_tvlv_containers_process - parse the given tvlv buffer to call the
 918 *  appropriate handlers
 919 * @bat_priv: the bat priv with all the soft interface information
 920 * @ogm_source: flag indicating wether the tvlv is an ogm or a unicast packet
 921 * @orig_node: orig node emitting the ogm packet
 922 * @src: source mac address of the unicast packet
 923 * @dst: destination mac address of the unicast packet
 924 * @tvlv_value: tvlv content
 925 * @tvlv_value_len: tvlv content length
 926 *
 927 * Returns success when processing an OGM or the return value of all called
 928 * handler callbacks.
 929 */
 930int batadv_tvlv_containers_process(struct batadv_priv *bat_priv,
 931                                   bool ogm_source,
 932                                   struct batadv_orig_node *orig_node,
 933                                   uint8_t *src, uint8_t *dst,
 934                                   void *tvlv_value, uint16_t tvlv_value_len)
 935{
 936        struct batadv_tvlv_handler *tvlv_handler;
 937        struct batadv_tvlv_hdr *tvlv_hdr;
 938        uint16_t tvlv_value_cont_len;
 939        uint8_t cifnotfound = BATADV_TVLV_HANDLER_OGM_CIFNOTFND;
 940        int ret = NET_RX_SUCCESS;
 941
 942        while (tvlv_value_len >= sizeof(*tvlv_hdr)) {
 943                tvlv_hdr = tvlv_value;
 944                tvlv_value_cont_len = ntohs(tvlv_hdr->len);
 945                tvlv_value = tvlv_hdr + 1;
 946                tvlv_value_len -= sizeof(*tvlv_hdr);
 947
 948                if (tvlv_value_cont_len > tvlv_value_len)
 949                        break;
 950
 951                tvlv_handler = batadv_tvlv_handler_get(bat_priv,
 952                                                       tvlv_hdr->type,
 953                                                       tvlv_hdr->version);
 954
 955                ret |= batadv_tvlv_call_handler(bat_priv, tvlv_handler,
 956                                                ogm_source, orig_node,
 957                                                src, dst, tvlv_value,
 958                                                tvlv_value_cont_len);
 959                if (tvlv_handler)
 960                        batadv_tvlv_handler_free_ref(tvlv_handler);
 961                tvlv_value = (uint8_t *)tvlv_value + tvlv_value_cont_len;
 962                tvlv_value_len -= tvlv_value_cont_len;
 963        }
 964
 965        if (!ogm_source)
 966                return ret;
 967
 968        rcu_read_lock();
 969        hlist_for_each_entry_rcu(tvlv_handler,
 970                                 &bat_priv->tvlv.handler_list, list) {
 971                if ((tvlv_handler->flags & BATADV_TVLV_HANDLER_OGM_CIFNOTFND) &&
 972                    !(tvlv_handler->flags & BATADV_TVLV_HANDLER_OGM_CALLED))
 973                        tvlv_handler->ogm_handler(bat_priv, orig_node,
 974                                                  cifnotfound, NULL, 0);
 975
 976                tvlv_handler->flags &= ~BATADV_TVLV_HANDLER_OGM_CALLED;
 977        }
 978        rcu_read_unlock();
 979
 980        return NET_RX_SUCCESS;
 981}
 982
 983/**
 984 * batadv_tvlv_ogm_receive - process an incoming ogm and call the appropriate
 985 *  handlers
 986 * @bat_priv: the bat priv with all the soft interface information
 987 * @batadv_ogm_packet: ogm packet containing the tvlv containers
 988 * @orig_node: orig node emitting the ogm packet
 989 */
 990void batadv_tvlv_ogm_receive(struct batadv_priv *bat_priv,
 991                             struct batadv_ogm_packet *batadv_ogm_packet,
 992                             struct batadv_orig_node *orig_node)
 993{
 994        void *tvlv_value;
 995        uint16_t tvlv_value_len;
 996
 997        if (!batadv_ogm_packet)
 998                return;
 999
1000        tvlv_value_len = ntohs(batadv_ogm_packet->tvlv_len);
1001        if (!tvlv_value_len)
1002                return;
1003
1004        tvlv_value = batadv_ogm_packet + 1;
1005
1006        batadv_tvlv_containers_process(bat_priv, true, orig_node, NULL, NULL,
1007                                       tvlv_value, tvlv_value_len);
1008}
1009
1010/**
1011 * batadv_tvlv_handler_register - register tvlv handler based on the provided
1012 *  type and version (both need to match) for ogm tvlv payload and/or unicast
1013 *  payload
1014 * @bat_priv: the bat priv with all the soft interface information
1015 * @optr: ogm tvlv handler callback function. This function receives the orig
1016 *  node, flags and the tvlv content as argument to process.
1017 * @uptr: unicast tvlv handler callback function. This function receives the
1018 *  source & destination of the unicast packet as well as the tvlv content
1019 *  to process.
1020 * @type: tvlv handler type to be registered
1021 * @version: tvlv handler version to be registered
1022 * @flags: flags to enable or disable TVLV API behavior
1023 */
1024void batadv_tvlv_handler_register(struct batadv_priv *bat_priv,
1025                                  void (*optr)(struct batadv_priv *bat_priv,
1026                                               struct batadv_orig_node *orig,
1027                                               uint8_t flags,
1028                                               void *tvlv_value,
1029                                               uint16_t tvlv_value_len),
1030                                  int (*uptr)(struct batadv_priv *bat_priv,
1031                                              uint8_t *src, uint8_t *dst,
1032                                              void *tvlv_value,
1033                                              uint16_t tvlv_value_len),
1034                                  uint8_t type, uint8_t version, uint8_t flags)
1035{
1036        struct batadv_tvlv_handler *tvlv_handler;
1037
1038        tvlv_handler = batadv_tvlv_handler_get(bat_priv, type, version);
1039        if (tvlv_handler) {
1040                batadv_tvlv_handler_free_ref(tvlv_handler);
1041                return;
1042        }
1043
1044        tvlv_handler = kzalloc(sizeof(*tvlv_handler), GFP_ATOMIC);
1045        if (!tvlv_handler)
1046                return;
1047
1048        tvlv_handler->ogm_handler = optr;
1049        tvlv_handler->unicast_handler = uptr;
1050        tvlv_handler->type = type;
1051        tvlv_handler->version = version;
1052        tvlv_handler->flags = flags;
1053        atomic_set(&tvlv_handler->refcount, 1);
1054        INIT_HLIST_NODE(&tvlv_handler->list);
1055
1056        spin_lock_bh(&bat_priv->tvlv.handler_list_lock);
1057        hlist_add_head_rcu(&tvlv_handler->list, &bat_priv->tvlv.handler_list);
1058        spin_unlock_bh(&bat_priv->tvlv.handler_list_lock);
1059}
1060
1061/**
1062 * batadv_tvlv_handler_unregister - unregister tvlv handler based on the
1063 *  provided type and version (both need to match)
1064 * @bat_priv: the bat priv with all the soft interface information
1065 * @type: tvlv handler type to be unregistered
1066 * @version: tvlv handler version to be unregistered
1067 */
1068void batadv_tvlv_handler_unregister(struct batadv_priv *bat_priv,
1069                                    uint8_t type, uint8_t version)
1070{
1071        struct batadv_tvlv_handler *tvlv_handler;
1072
1073        tvlv_handler = batadv_tvlv_handler_get(bat_priv, type, version);
1074        if (!tvlv_handler)
1075                return;
1076
1077        batadv_tvlv_handler_free_ref(tvlv_handler);
1078        spin_lock_bh(&bat_priv->tvlv.handler_list_lock);
1079        hlist_del_rcu(&tvlv_handler->list);
1080        spin_unlock_bh(&bat_priv->tvlv.handler_list_lock);
1081        batadv_tvlv_handler_free_ref(tvlv_handler);
1082}
1083
1084/**
1085 * batadv_tvlv_unicast_send - send a unicast packet with tvlv payload to the
1086 *  specified host
1087 * @bat_priv: the bat priv with all the soft interface information
1088 * @src: source mac address of the unicast packet
1089 * @dst: destination mac address of the unicast packet
1090 * @type: tvlv type
1091 * @version: tvlv version
1092 * @tvlv_value: tvlv content
1093 * @tvlv_value_len: tvlv content length
1094 */
1095void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, uint8_t *src,
1096                              uint8_t *dst, uint8_t type, uint8_t version,
1097                              void *tvlv_value, uint16_t tvlv_value_len)
1098{
1099        struct batadv_unicast_tvlv_packet *unicast_tvlv_packet;
1100        struct batadv_tvlv_hdr *tvlv_hdr;
1101        struct batadv_orig_node *orig_node;
1102        struct sk_buff *skb = NULL;
1103        unsigned char *tvlv_buff;
1104        unsigned int tvlv_len;
1105        ssize_t hdr_len = sizeof(*unicast_tvlv_packet);
1106        bool ret = false;
1107
1108        orig_node = batadv_orig_hash_find(bat_priv, dst);
1109        if (!orig_node)
1110                goto out;
1111
1112        tvlv_len = sizeof(*tvlv_hdr) + tvlv_value_len;
1113
1114        skb = netdev_alloc_skb_ip_align(NULL, ETH_HLEN + hdr_len + tvlv_len);
1115        if (!skb)
1116                goto out;
1117
1118        skb->priority = TC_PRIO_CONTROL;
1119        skb_reserve(skb, ETH_HLEN);
1120        tvlv_buff = skb_put(skb, sizeof(*unicast_tvlv_packet) + tvlv_len);
1121        unicast_tvlv_packet = (struct batadv_unicast_tvlv_packet *)tvlv_buff;
1122        unicast_tvlv_packet->packet_type = BATADV_UNICAST_TVLV;
1123        unicast_tvlv_packet->version = BATADV_COMPAT_VERSION;
1124        unicast_tvlv_packet->ttl = BATADV_TTL;
1125        unicast_tvlv_packet->reserved = 0;
1126        unicast_tvlv_packet->tvlv_len = htons(tvlv_len);
1127        unicast_tvlv_packet->align = 0;
1128        memcpy(unicast_tvlv_packet->src, src, ETH_ALEN);
1129        memcpy(unicast_tvlv_packet->dst, dst, ETH_ALEN);
1130
1131        tvlv_buff = (unsigned char *)(unicast_tvlv_packet + 1);
1132        tvlv_hdr = (struct batadv_tvlv_hdr *)tvlv_buff;
1133        tvlv_hdr->version = version;
1134        tvlv_hdr->type = type;
1135        tvlv_hdr->len = htons(tvlv_value_len);
1136        tvlv_buff += sizeof(*tvlv_hdr);
1137        memcpy(tvlv_buff, tvlv_value, tvlv_value_len);
1138
1139        if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
1140                ret = true;
1141
1142out:
1143        if (skb && !ret)
1144                kfree_skb(skb);
1145        if (orig_node)
1146                batadv_orig_node_free_ref(orig_node);
1147}
1148
1149/**
1150 * batadv_get_vid - extract the VLAN identifier from skb if any
1151 * @skb: the buffer containing the packet
1152 * @header_len: length of the batman header preceding the ethernet header
1153 *
1154 * If the packet embedded in the skb is vlan tagged this function returns the
1155 * VID with the BATADV_VLAN_HAS_TAG flag. Otherwise BATADV_NO_FLAGS is returned.
1156 */
1157unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len)
1158{
1159        struct ethhdr *ethhdr = (struct ethhdr *)(skb->data + header_len);
1160        struct vlan_ethhdr *vhdr;
1161        unsigned short vid;
1162
1163        if (ethhdr->h_proto != htons(ETH_P_8021Q))
1164                return BATADV_NO_FLAGS;
1165
1166        if (!pskb_may_pull(skb, header_len + VLAN_ETH_HLEN))
1167                return BATADV_NO_FLAGS;
1168
1169        vhdr = (struct vlan_ethhdr *)(skb->data + header_len);
1170        vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
1171        vid |= BATADV_VLAN_HAS_TAG;
1172
1173        return vid;
1174}
1175
1176static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
1177{
1178        struct batadv_algo_ops *bat_algo_ops;
1179        char *algo_name = (char *)val;
1180        size_t name_len = strlen(algo_name);
1181
1182        if (name_len > 0 && algo_name[name_len - 1] == '\n')
1183                algo_name[name_len - 1] = '\0';
1184
1185        bat_algo_ops = batadv_algo_get(algo_name);
1186        if (!bat_algo_ops) {
1187                pr_err("Routing algorithm '%s' is not supported\n", algo_name);
1188                return -EINVAL;
1189        }
1190
1191        return param_set_copystring(algo_name, kp);
1192}
1193
1194static const struct kernel_param_ops batadv_param_ops_ra = {
1195        .set = batadv_param_set_ra,
1196        .get = param_get_string,
1197};
1198
1199static struct kparam_string batadv_param_string_ra = {
1200        .maxlen = sizeof(batadv_routing_algo),
1201        .string = batadv_routing_algo,
1202};
1203
1204module_param_cb(routing_algo, &batadv_param_ops_ra, &batadv_param_string_ra,
1205                0644);
1206module_init(batadv_init);
1207module_exit(batadv_exit);
1208
1209MODULE_LICENSE("GPL");
1210
1211MODULE_AUTHOR(BATADV_DRIVER_AUTHOR);
1212MODULE_DESCRIPTION(BATADV_DRIVER_DESC);
1213MODULE_SUPPORTED_DEVICE(BATADV_DRIVER_DEVICE);
1214MODULE_VERSION(BATADV_SOURCE_VERSION);
1215