linux/net/batman-adv/soft-interface.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 "soft-interface.h"
  22#include "hard-interface.h"
  23#include "distributed-arp-table.h"
  24#include "routing.h"
  25#include "send.h"
  26#include "debugfs.h"
  27#include "translation-table.h"
  28#include "hash.h"
  29#include "gateway_common.h"
  30#include "gateway_client.h"
  31#include "sysfs.h"
  32#include "originator.h"
  33#include <linux/slab.h>
  34#include <linux/ethtool.h>
  35#include <linux/etherdevice.h>
  36#include <linux/if_vlan.h>
  37#include <linux/if_ether.h>
  38#include "unicast.h"
  39#include "bridge_loop_avoidance.h"
  40#include "network-coding.h"
  41
  42
  43static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd);
  44static void batadv_get_drvinfo(struct net_device *dev,
  45                               struct ethtool_drvinfo *info);
  46static u32 batadv_get_msglevel(struct net_device *dev);
  47static void batadv_set_msglevel(struct net_device *dev, u32 value);
  48static u32 batadv_get_link(struct net_device *dev);
  49static void batadv_get_strings(struct net_device *dev, u32 stringset, u8 *data);
  50static void batadv_get_ethtool_stats(struct net_device *dev,
  51                                     struct ethtool_stats *stats, u64 *data);
  52static int batadv_get_sset_count(struct net_device *dev, int stringset);
  53
  54static const struct ethtool_ops batadv_ethtool_ops = {
  55        .get_settings = batadv_get_settings,
  56        .get_drvinfo = batadv_get_drvinfo,
  57        .get_msglevel = batadv_get_msglevel,
  58        .set_msglevel = batadv_set_msglevel,
  59        .get_link = batadv_get_link,
  60        .get_strings = batadv_get_strings,
  61        .get_ethtool_stats = batadv_get_ethtool_stats,
  62        .get_sset_count = batadv_get_sset_count,
  63};
  64
  65int batadv_skb_head_push(struct sk_buff *skb, unsigned int len)
  66{
  67        int result;
  68
  69        /* TODO: We must check if we can release all references to non-payload
  70         * data using skb_header_release in our skbs to allow skb_cow_header to
  71         * work optimally. This means that those skbs are not allowed to read
  72         * or write any data which is before the current position of skb->data
  73         * after that call and thus allow other skbs with the same data buffer
  74         * to write freely in that area.
  75         */
  76        result = skb_cow_head(skb, len);
  77        if (result < 0)
  78                return result;
  79
  80        skb_push(skb, len);
  81        return 0;
  82}
  83
  84static int batadv_interface_open(struct net_device *dev)
  85{
  86        netif_start_queue(dev);
  87        return 0;
  88}
  89
  90static int batadv_interface_release(struct net_device *dev)
  91{
  92        netif_stop_queue(dev);
  93        return 0;
  94}
  95
  96static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
  97{
  98        struct batadv_priv *bat_priv = netdev_priv(dev);
  99        struct net_device_stats *stats = &bat_priv->stats;
 100
 101        stats->tx_packets = batadv_sum_counter(bat_priv, BATADV_CNT_TX);
 102        stats->tx_bytes = batadv_sum_counter(bat_priv, BATADV_CNT_TX_BYTES);
 103        stats->tx_dropped = batadv_sum_counter(bat_priv, BATADV_CNT_TX_DROPPED);
 104        stats->rx_packets = batadv_sum_counter(bat_priv, BATADV_CNT_RX);
 105        stats->rx_bytes = batadv_sum_counter(bat_priv, BATADV_CNT_RX_BYTES);
 106        return stats;
 107}
 108
 109static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
 110{
 111        struct batadv_priv *bat_priv = netdev_priv(dev);
 112        struct sockaddr *addr = p;
 113        uint8_t old_addr[ETH_ALEN];
 114
 115        if (!is_valid_ether_addr(addr->sa_data))
 116                return -EADDRNOTAVAIL;
 117
 118        memcpy(old_addr, dev->dev_addr, ETH_ALEN);
 119        memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
 120
 121        /* only modify transtable if it has been initialized before */
 122        if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE) {
 123                batadv_tt_local_remove(bat_priv, old_addr,
 124                                       "mac address changed", false);
 125                batadv_tt_local_add(dev, addr->sa_data, BATADV_NULL_IFINDEX);
 126        }
 127
 128        return 0;
 129}
 130
 131static int batadv_interface_change_mtu(struct net_device *dev, int new_mtu)
 132{
 133        /* check ranges */
 134        if ((new_mtu < 68) || (new_mtu > batadv_hardif_min_mtu(dev)))
 135                return -EINVAL;
 136
 137        dev->mtu = new_mtu;
 138
 139        return 0;
 140}
 141
 142static int batadv_interface_tx(struct sk_buff *skb,
 143                               struct net_device *soft_iface)
 144{
 145        struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
 146        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
 147        struct batadv_hard_iface *primary_if = NULL;
 148        struct batadv_bcast_packet *bcast_packet;
 149        struct vlan_ethhdr *vhdr;
 150        __be16 ethertype = __constant_htons(ETH_P_BATMAN);
 151        static const uint8_t stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00,
 152                                                   0x00, 0x00};
 153        static const uint8_t ectp_addr[ETH_ALEN] = {0xCF, 0x00, 0x00, 0x00,
 154                                                    0x00, 0x00};
 155        unsigned int header_len = 0;
 156        int data_len = skb->len, ret;
 157        short vid __maybe_unused = -1;
 158        bool do_bcast = false;
 159        uint32_t seqno;
 160        unsigned long brd_delay = 1;
 161
 162        if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
 163                goto dropped;
 164
 165        soft_iface->trans_start = jiffies;
 166
 167        switch (ntohs(ethhdr->h_proto)) {
 168        case ETH_P_8021Q:
 169                vhdr = (struct vlan_ethhdr *)skb->data;
 170                vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
 171
 172                if (vhdr->h_vlan_encapsulated_proto != ethertype)
 173                        break;
 174
 175                /* fall through */
 176        case ETH_P_BATMAN:
 177                goto dropped;
 178        }
 179
 180        if (batadv_bla_tx(bat_priv, skb, vid))
 181                goto dropped;
 182
 183        /* Register the client MAC in the transtable */
 184        if (!is_multicast_ether_addr(ethhdr->h_source))
 185                batadv_tt_local_add(soft_iface, ethhdr->h_source, skb->skb_iif);
 186
 187        /* don't accept stp packets. STP does not help in meshes.
 188         * better use the bridge loop avoidance ...
 189         *
 190         * The same goes for ECTP sent at least by some Cisco Switches,
 191         * it might confuse the mesh when used with bridge loop avoidance.
 192         */
 193        if (batadv_compare_eth(ethhdr->h_dest, stp_addr))
 194                goto dropped;
 195
 196        if (batadv_compare_eth(ethhdr->h_dest, ectp_addr))
 197                goto dropped;
 198
 199        if (is_multicast_ether_addr(ethhdr->h_dest)) {
 200                do_bcast = true;
 201
 202                switch (atomic_read(&bat_priv->gw_mode)) {
 203                case BATADV_GW_MODE_SERVER:
 204                        /* gateway servers should not send dhcp
 205                         * requests into the mesh
 206                         */
 207                        ret = batadv_gw_is_dhcp_target(skb, &header_len);
 208                        if (ret)
 209                                goto dropped;
 210                        break;
 211                case BATADV_GW_MODE_CLIENT:
 212                        /* gateway clients should send dhcp requests
 213                         * via unicast to their gateway
 214                         */
 215                        ret = batadv_gw_is_dhcp_target(skb, &header_len);
 216                        if (ret)
 217                                do_bcast = false;
 218                        break;
 219                case BATADV_GW_MODE_OFF:
 220                default:
 221                        break;
 222                }
 223        }
 224
 225        /* ethernet packet should be broadcasted */
 226        if (do_bcast) {
 227                primary_if = batadv_primary_if_get_selected(bat_priv);
 228                if (!primary_if)
 229                        goto dropped;
 230
 231                /* in case of ARP request, we do not immediately broadcasti the
 232                 * packet, instead we first wait for DAT to try to retrieve the
 233                 * correct ARP entry
 234                 */
 235                if (batadv_dat_snoop_outgoing_arp_request(bat_priv, skb))
 236                        brd_delay = msecs_to_jiffies(ARP_REQ_DELAY);
 237
 238                if (batadv_skb_head_push(skb, sizeof(*bcast_packet)) < 0)
 239                        goto dropped;
 240
 241                bcast_packet = (struct batadv_bcast_packet *)skb->data;
 242                bcast_packet->header.version = BATADV_COMPAT_VERSION;
 243                bcast_packet->header.ttl = BATADV_TTL;
 244
 245                /* batman packet type: broadcast */
 246                bcast_packet->header.packet_type = BATADV_BCAST;
 247                bcast_packet->reserved = 0;
 248
 249                /* hw address of first interface is the orig mac because only
 250                 * this mac is known throughout the mesh
 251                 */
 252                memcpy(bcast_packet->orig,
 253                       primary_if->net_dev->dev_addr, ETH_ALEN);
 254
 255                /* set broadcast sequence number */
 256                seqno = atomic_inc_return(&bat_priv->bcast_seqno);
 257                bcast_packet->seqno = htonl(seqno);
 258
 259                batadv_add_bcast_packet_to_list(bat_priv, skb, brd_delay);
 260
 261                /* a copy is stored in the bcast list, therefore removing
 262                 * the original skb.
 263                 */
 264                kfree_skb(skb);
 265
 266        /* unicast packet */
 267        } else {
 268                if (atomic_read(&bat_priv->gw_mode) != BATADV_GW_MODE_OFF) {
 269                        ret = batadv_gw_out_of_range(bat_priv, skb, ethhdr);
 270                        if (ret)
 271                                goto dropped;
 272                }
 273
 274                if (batadv_dat_snoop_outgoing_arp_request(bat_priv, skb))
 275                        goto dropped;
 276
 277                batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);
 278
 279                ret = batadv_unicast_send_skb(bat_priv, skb);
 280                if (ret != 0)
 281                        goto dropped_freed;
 282        }
 283
 284        batadv_inc_counter(bat_priv, BATADV_CNT_TX);
 285        batadv_add_counter(bat_priv, BATADV_CNT_TX_BYTES, data_len);
 286        goto end;
 287
 288dropped:
 289        kfree_skb(skb);
 290dropped_freed:
 291        batadv_inc_counter(bat_priv, BATADV_CNT_TX_DROPPED);
 292end:
 293        if (primary_if)
 294                batadv_hardif_free_ref(primary_if);
 295        return NETDEV_TX_OK;
 296}
 297
 298void batadv_interface_rx(struct net_device *soft_iface,
 299                         struct sk_buff *skb, struct batadv_hard_iface *recv_if,
 300                         int hdr_size, struct batadv_orig_node *orig_node)
 301{
 302        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
 303        struct ethhdr *ethhdr;
 304        struct vlan_ethhdr *vhdr;
 305        struct batadv_header *batadv_header = (struct batadv_header *)skb->data;
 306        short vid __maybe_unused = -1;
 307        __be16 ethertype = __constant_htons(ETH_P_BATMAN);
 308        bool is_bcast;
 309
 310        is_bcast = (batadv_header->packet_type == BATADV_BCAST);
 311
 312        /* check if enough space is available for pulling, and pull */
 313        if (!pskb_may_pull(skb, hdr_size))
 314                goto dropped;
 315
 316        skb_pull_rcsum(skb, hdr_size);
 317        skb_reset_mac_header(skb);
 318
 319        ethhdr = (struct ethhdr *)skb_mac_header(skb);
 320
 321        switch (ntohs(ethhdr->h_proto)) {
 322        case ETH_P_8021Q:
 323                vhdr = (struct vlan_ethhdr *)skb->data;
 324                vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
 325
 326                if (vhdr->h_vlan_encapsulated_proto != ethertype)
 327                        break;
 328
 329                /* fall through */
 330        case ETH_P_BATMAN:
 331                goto dropped;
 332        }
 333
 334        /* skb->dev & skb->pkt_type are set here */
 335        if (unlikely(!pskb_may_pull(skb, ETH_HLEN)))
 336                goto dropped;
 337        skb->protocol = eth_type_trans(skb, soft_iface);
 338
 339        /* should not be necessary anymore as we use skb_pull_rcsum()
 340         * TODO: please verify this and remove this TODO
 341         * -- Dec 21st 2009, Simon Wunderlich
 342         */
 343
 344        /* skb->ip_summed = CHECKSUM_UNNECESSARY; */
 345
 346        batadv_inc_counter(bat_priv, BATADV_CNT_RX);
 347        batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
 348                           skb->len + ETH_HLEN);
 349
 350        soft_iface->last_rx = jiffies;
 351
 352        /* Let the bridge loop avoidance check the packet. If will
 353         * not handle it, we can safely push it up.
 354         */
 355        if (batadv_bla_rx(bat_priv, skb, vid, is_bcast))
 356                goto out;
 357
 358        if (orig_node)
 359                batadv_tt_add_temporary_global_entry(bat_priv, orig_node,
 360                                                     ethhdr->h_source);
 361
 362        if (batadv_is_ap_isolated(bat_priv, ethhdr->h_source, ethhdr->h_dest))
 363                goto dropped;
 364
 365        netif_rx(skb);
 366        goto out;
 367
 368dropped:
 369        kfree_skb(skb);
 370out:
 371        return;
 372}
 373
 374/* batman-adv network devices have devices nesting below it and are a special
 375 * "super class" of normal network devices; split their locks off into a
 376 * separate class since they always nest.
 377 */
 378static struct lock_class_key batadv_netdev_xmit_lock_key;
 379static struct lock_class_key batadv_netdev_addr_lock_key;
 380
 381/**
 382 * batadv_set_lockdep_class_one - Set lockdep class for a single tx queue
 383 * @dev: device which owns the tx queue
 384 * @txq: tx queue to modify
 385 * @_unused: always NULL
 386 */
 387static void batadv_set_lockdep_class_one(struct net_device *dev,
 388                                         struct netdev_queue *txq,
 389                                         void *_unused)
 390{
 391        lockdep_set_class(&txq->_xmit_lock, &batadv_netdev_xmit_lock_key);
 392}
 393
 394/**
 395 * batadv_set_lockdep_class - Set txq and addr_list lockdep class
 396 * @dev: network device to modify
 397 */
 398static void batadv_set_lockdep_class(struct net_device *dev)
 399{
 400        lockdep_set_class(&dev->addr_list_lock, &batadv_netdev_addr_lock_key);
 401        netdev_for_each_tx_queue(dev, batadv_set_lockdep_class_one, NULL);
 402}
 403
 404/**
 405 * batadv_softif_destroy_finish - cleans up the remains of a softif
 406 * @work: work queue item
 407 *
 408 * Free the parts of the soft interface which can not be removed under
 409 * rtnl lock (to prevent deadlock situations).
 410 */
 411static void batadv_softif_destroy_finish(struct work_struct *work)
 412{
 413        struct batadv_priv *bat_priv;
 414        struct net_device *soft_iface;
 415
 416        bat_priv = container_of(work, struct batadv_priv,
 417                                cleanup_work);
 418        soft_iface = bat_priv->soft_iface;
 419
 420        batadv_sysfs_del_meshif(soft_iface);
 421
 422        rtnl_lock();
 423        unregister_netdevice(soft_iface);
 424        rtnl_unlock();
 425}
 426
 427/**
 428 * batadv_softif_init_late - late stage initialization of soft interface
 429 * @dev: registered network device to modify
 430 *
 431 * Returns error code on failures
 432 */
 433static int batadv_softif_init_late(struct net_device *dev)
 434{
 435        struct batadv_priv *bat_priv;
 436        int ret;
 437        size_t cnt_len = sizeof(uint64_t) * BATADV_CNT_NUM;
 438
 439        batadv_set_lockdep_class(dev);
 440
 441        bat_priv = netdev_priv(dev);
 442        bat_priv->soft_iface = dev;
 443        INIT_WORK(&bat_priv->cleanup_work, batadv_softif_destroy_finish);
 444
 445        /* batadv_interface_stats() needs to be available as soon as
 446         * register_netdevice() has been called
 447         */
 448        bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(uint64_t));
 449        if (!bat_priv->bat_counters)
 450                return -ENOMEM;
 451
 452        atomic_set(&bat_priv->aggregated_ogms, 1);
 453        atomic_set(&bat_priv->bonding, 0);
 454#ifdef CONFIG_BATMAN_ADV_BLA
 455        atomic_set(&bat_priv->bridge_loop_avoidance, 0);
 456#endif
 457#ifdef CONFIG_BATMAN_ADV_DAT
 458        atomic_set(&bat_priv->distributed_arp_table, 1);
 459#endif
 460        atomic_set(&bat_priv->ap_isolation, 0);
 461        atomic_set(&bat_priv->vis_mode, BATADV_VIS_TYPE_CLIENT_UPDATE);
 462        atomic_set(&bat_priv->gw_mode, BATADV_GW_MODE_OFF);
 463        atomic_set(&bat_priv->gw_sel_class, 20);
 464        atomic_set(&bat_priv->gw_bandwidth, 41);
 465        atomic_set(&bat_priv->orig_interval, 1000);
 466        atomic_set(&bat_priv->hop_penalty, 30);
 467#ifdef CONFIG_BATMAN_ADV_DEBUG
 468        atomic_set(&bat_priv->log_level, 0);
 469#endif
 470        atomic_set(&bat_priv->fragmentation, 1);
 471        atomic_set(&bat_priv->bcast_queue_left, BATADV_BCAST_QUEUE_LEN);
 472        atomic_set(&bat_priv->batman_queue_left, BATADV_BATMAN_QUEUE_LEN);
 473
 474        atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
 475        atomic_set(&bat_priv->bcast_seqno, 1);
 476        atomic_set(&bat_priv->tt.vn, 0);
 477        atomic_set(&bat_priv->tt.local_changes, 0);
 478        atomic_set(&bat_priv->tt.ogm_append_cnt, 0);
 479#ifdef CONFIG_BATMAN_ADV_BLA
 480        atomic_set(&bat_priv->bla.num_requests, 0);
 481#endif
 482        bat_priv->tt.last_changeset = NULL;
 483        bat_priv->tt.last_changeset_len = 0;
 484
 485        bat_priv->primary_if = NULL;
 486        bat_priv->num_ifaces = 0;
 487
 488        batadv_nc_init_bat_priv(bat_priv);
 489
 490        ret = batadv_algo_select(bat_priv, batadv_routing_algo);
 491        if (ret < 0)
 492                goto free_bat_counters;
 493
 494        ret = batadv_debugfs_add_meshif(dev);
 495        if (ret < 0)
 496                goto free_bat_counters;
 497
 498        ret = batadv_mesh_init(dev);
 499        if (ret < 0)
 500                goto unreg_debugfs;
 501
 502        return 0;
 503
 504unreg_debugfs:
 505        batadv_debugfs_del_meshif(dev);
 506free_bat_counters:
 507        free_percpu(bat_priv->bat_counters);
 508        bat_priv->bat_counters = NULL;
 509
 510        return ret;
 511}
 512
 513/**
 514 * batadv_softif_slave_add - Add a slave interface to a batadv_soft_interface
 515 * @dev: batadv_soft_interface used as master interface
 516 * @slave_dev: net_device which should become the slave interface
 517 *
 518 * Return 0 if successful or error otherwise.
 519 */
 520static int batadv_softif_slave_add(struct net_device *dev,
 521                                   struct net_device *slave_dev)
 522{
 523        struct batadv_hard_iface *hard_iface;
 524        int ret = -EINVAL;
 525
 526        hard_iface = batadv_hardif_get_by_netdev(slave_dev);
 527        if (!hard_iface || hard_iface->soft_iface != NULL)
 528                goto out;
 529
 530        ret = batadv_hardif_enable_interface(hard_iface, dev->name);
 531
 532out:
 533        if (hard_iface)
 534                batadv_hardif_free_ref(hard_iface);
 535        return ret;
 536}
 537
 538/**
 539 * batadv_softif_slave_del - Delete a slave iface from a batadv_soft_interface
 540 * @dev: batadv_soft_interface used as master interface
 541 * @slave_dev: net_device which should be removed from the master interface
 542 *
 543 * Return 0 if successful or error otherwise.
 544 */
 545static int batadv_softif_slave_del(struct net_device *dev,
 546                                   struct net_device *slave_dev)
 547{
 548        struct batadv_hard_iface *hard_iface;
 549        int ret = -EINVAL;
 550
 551        hard_iface = batadv_hardif_get_by_netdev(slave_dev);
 552
 553        if (!hard_iface || hard_iface->soft_iface != dev)
 554                goto out;
 555
 556        batadv_hardif_disable_interface(hard_iface, BATADV_IF_CLEANUP_KEEP);
 557        ret = 0;
 558
 559out:
 560        if (hard_iface)
 561                batadv_hardif_free_ref(hard_iface);
 562        return ret;
 563}
 564
 565static const struct net_device_ops batadv_netdev_ops = {
 566        .ndo_init = batadv_softif_init_late,
 567        .ndo_open = batadv_interface_open,
 568        .ndo_stop = batadv_interface_release,
 569        .ndo_get_stats = batadv_interface_stats,
 570        .ndo_set_mac_address = batadv_interface_set_mac_addr,
 571        .ndo_change_mtu = batadv_interface_change_mtu,
 572        .ndo_start_xmit = batadv_interface_tx,
 573        .ndo_validate_addr = eth_validate_addr,
 574        .ndo_add_slave = batadv_softif_slave_add,
 575        .ndo_del_slave = batadv_softif_slave_del,
 576};
 577
 578/**
 579 * batadv_softif_free - Deconstructor of batadv_soft_interface
 580 * @dev: Device to cleanup and remove
 581 */
 582static void batadv_softif_free(struct net_device *dev)
 583{
 584        batadv_debugfs_del_meshif(dev);
 585        batadv_mesh_free(dev);
 586
 587        /* some scheduled RCU callbacks need the bat_priv struct to accomplish
 588         * their tasks. Wait for them all to be finished before freeing the
 589         * netdev and its private data (bat_priv)
 590         */
 591        rcu_barrier();
 592
 593        free_netdev(dev);
 594}
 595
 596/**
 597 * batadv_softif_init_early - early stage initialization of soft interface
 598 * @dev: registered network device to modify
 599 */
 600static void batadv_softif_init_early(struct net_device *dev)
 601{
 602        struct batadv_priv *priv = netdev_priv(dev);
 603
 604        ether_setup(dev);
 605
 606        dev->netdev_ops = &batadv_netdev_ops;
 607        dev->destructor = batadv_softif_free;
 608        dev->tx_queue_len = 0;
 609
 610        /* can't call min_mtu, because the needed variables
 611         * have not been initialized yet
 612         */
 613        dev->mtu = ETH_DATA_LEN;
 614        /* reserve more space in the skbuff for our header */
 615        dev->hard_header_len = BATADV_HEADER_LEN;
 616
 617        /* generate random address */
 618        eth_hw_addr_random(dev);
 619
 620        SET_ETHTOOL_OPS(dev, &batadv_ethtool_ops);
 621
 622        memset(priv, 0, sizeof(*priv));
 623}
 624
 625struct net_device *batadv_softif_create(const char *name)
 626{
 627        struct net_device *soft_iface;
 628        int ret;
 629
 630        soft_iface = alloc_netdev(sizeof(struct batadv_priv), name,
 631                                  batadv_softif_init_early);
 632        if (!soft_iface)
 633                return NULL;
 634
 635        soft_iface->rtnl_link_ops = &batadv_link_ops;
 636
 637        ret = register_netdevice(soft_iface);
 638        if (ret < 0) {
 639                pr_err("Unable to register the batman interface '%s': %i\n",
 640                       name, ret);
 641                free_netdev(soft_iface);
 642                return NULL;
 643        }
 644
 645        return soft_iface;
 646}
 647
 648/**
 649 * batadv_softif_destroy_sysfs - deletion of batadv_soft_interface via sysfs
 650 * @soft_iface: the to-be-removed batman-adv interface
 651 */
 652void batadv_softif_destroy_sysfs(struct net_device *soft_iface)
 653{
 654        struct batadv_priv *bat_priv = netdev_priv(soft_iface);
 655
 656        queue_work(batadv_event_workqueue, &bat_priv->cleanup_work);
 657}
 658
 659/**
 660 * batadv_softif_destroy_netlink - deletion of batadv_soft_interface via netlink
 661 * @soft_iface: the to-be-removed batman-adv interface
 662 * @head: list pointer
 663 */
 664static void batadv_softif_destroy_netlink(struct net_device *soft_iface,
 665                                          struct list_head *head)
 666{
 667        struct batadv_hard_iface *hard_iface;
 668
 669        list_for_each_entry(hard_iface, &batadv_hardif_list, list) {
 670                if (hard_iface->soft_iface == soft_iface)
 671                        batadv_hardif_disable_interface(hard_iface,
 672                                                        BATADV_IF_CLEANUP_KEEP);
 673        }
 674
 675        batadv_sysfs_del_meshif(soft_iface);
 676        unregister_netdevice_queue(soft_iface, head);
 677}
 678
 679int batadv_softif_is_valid(const struct net_device *net_dev)
 680{
 681        if (net_dev->netdev_ops->ndo_start_xmit == batadv_interface_tx)
 682                return 1;
 683
 684        return 0;
 685}
 686
 687struct rtnl_link_ops batadv_link_ops __read_mostly = {
 688        .kind           = "batadv",
 689        .priv_size      = sizeof(struct batadv_priv),
 690        .setup          = batadv_softif_init_early,
 691        .dellink        = batadv_softif_destroy_netlink,
 692};
 693
 694/* ethtool */
 695static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 696{
 697        cmd->supported = 0;
 698        cmd->advertising = 0;
 699        ethtool_cmd_speed_set(cmd, SPEED_10);
 700        cmd->duplex = DUPLEX_FULL;
 701        cmd->port = PORT_TP;
 702        cmd->phy_address = 0;
 703        cmd->transceiver = XCVR_INTERNAL;
 704        cmd->autoneg = AUTONEG_DISABLE;
 705        cmd->maxtxpkt = 0;
 706        cmd->maxrxpkt = 0;
 707
 708        return 0;
 709}
 710
 711static void batadv_get_drvinfo(struct net_device *dev,
 712                               struct ethtool_drvinfo *info)
 713{
 714        strlcpy(info->driver, "B.A.T.M.A.N. advanced", sizeof(info->driver));
 715        strlcpy(info->version, BATADV_SOURCE_VERSION, sizeof(info->version));
 716        strlcpy(info->fw_version, "N/A", sizeof(info->fw_version));
 717        strlcpy(info->bus_info, "batman", sizeof(info->bus_info));
 718}
 719
 720static u32 batadv_get_msglevel(struct net_device *dev)
 721{
 722        return -EOPNOTSUPP;
 723}
 724
 725static void batadv_set_msglevel(struct net_device *dev, u32 value)
 726{
 727}
 728
 729static u32 batadv_get_link(struct net_device *dev)
 730{
 731        return 1;
 732}
 733
 734/* Inspired by drivers/net/ethernet/dlink/sundance.c:1702
 735 * Declare each description string in struct.name[] to get fixed sized buffer
 736 * and compile time checking for strings longer than ETH_GSTRING_LEN.
 737 */
 738static const struct {
 739        const char name[ETH_GSTRING_LEN];
 740} batadv_counters_strings[] = {
 741        { "tx" },
 742        { "tx_bytes" },
 743        { "tx_dropped" },
 744        { "rx" },
 745        { "rx_bytes" },
 746        { "forward" },
 747        { "forward_bytes" },
 748        { "mgmt_tx" },
 749        { "mgmt_tx_bytes" },
 750        { "mgmt_rx" },
 751        { "mgmt_rx_bytes" },
 752        { "tt_request_tx" },
 753        { "tt_request_rx" },
 754        { "tt_response_tx" },
 755        { "tt_response_rx" },
 756        { "tt_roam_adv_tx" },
 757        { "tt_roam_adv_rx" },
 758#ifdef CONFIG_BATMAN_ADV_DAT
 759        { "dat_get_tx" },
 760        { "dat_get_rx" },
 761        { "dat_put_tx" },
 762        { "dat_put_rx" },
 763        { "dat_cached_reply_tx" },
 764#endif
 765#ifdef CONFIG_BATMAN_ADV_NC
 766        { "nc_code" },
 767        { "nc_code_bytes" },
 768        { "nc_recode" },
 769        { "nc_recode_bytes" },
 770        { "nc_buffer" },
 771        { "nc_decode" },
 772        { "nc_decode_bytes" },
 773        { "nc_decode_failed" },
 774        { "nc_sniffed" },
 775#endif
 776};
 777
 778static void batadv_get_strings(struct net_device *dev, uint32_t stringset,
 779                               uint8_t *data)
 780{
 781        if (stringset == ETH_SS_STATS)
 782                memcpy(data, batadv_counters_strings,
 783                       sizeof(batadv_counters_strings));
 784}
 785
 786static void batadv_get_ethtool_stats(struct net_device *dev,
 787                                     struct ethtool_stats *stats,
 788                                     uint64_t *data)
 789{
 790        struct batadv_priv *bat_priv = netdev_priv(dev);
 791        int i;
 792
 793        for (i = 0; i < BATADV_CNT_NUM; i++)
 794                data[i] = batadv_sum_counter(bat_priv, i);
 795}
 796
 797static int batadv_get_sset_count(struct net_device *dev, int stringset)
 798{
 799        if (stringset == ETH_SS_STATS)
 800                return BATADV_CNT_NUM;
 801
 802        return -EOPNOTSUPP;
 803}
 804