These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / batman-adv / soft-interface.c
index 5ec31d7..ac4d08d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2014 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-2015 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
  * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "main.h"
 #include "soft-interface.h"
-#include "hard-interface.h"
-#include "distributed-arp-table.h"
-#include "routing.h"
-#include "send.h"
-#include "debugfs.h"
-#include "translation-table.h"
-#include "hash.h"
-#include "gateway_common.h"
-#include "gateway_client.h"
-#include "sysfs.h"
-#include "originator.h"
-#include <linux/slab.h>
-#include <linux/ethtool.h>
+#include "main.h"
+
+#include <linux/atomic.h>
+#include <linux/byteorder/generic.h>
+#include <linux/cache.h>
+#include <linux/compiler.h>
+#include <linux/errno.h>
 #include <linux/etherdevice.h>
+#include <linux/ethtool.h>
+#include <linux/fs.h>
+#include <linux/if_ether.h>
 #include <linux/if_vlan.h>
-#include "multicast.h"
+#include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include <linux/lockdep.h>
+#include <linux/netdevice.h>
+#include <linux/percpu.h>
+#include <linux/printk.h>
+#include <linux/random.h>
+#include <linux/rculist.h>
+#include <linux/rcupdate.h>
+#include <linux/skbuff.h>
+#include <linux/slab.h>
+#include <linux/socket.h>
+#include <linux/spinlock.h>
+#include <linux/stddef.h>
+#include <linux/string.h>
+#include <linux/types.h>
+#include <linux/workqueue.h>
+
 #include "bridge_loop_avoidance.h"
+#include "debugfs.h"
+#include "distributed-arp-table.h"
+#include "gateway_client.h"
+#include "gateway_common.h"
+#include "hard-interface.h"
+#include "multicast.h"
 #include "network-coding.h"
+#include "packet.h"
+#include "send.h"
+#include "sysfs.h"
+#include "translation-table.h"
 
 static int batadv_get_settings(struct net_device *dev, struct ethtool_cmd *cmd);
 static void batadv_get_drvinfo(struct net_device *dev,
@@ -105,8 +129,9 @@ static struct net_device_stats *batadv_interface_stats(struct net_device *dev)
 static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
 {
        struct batadv_priv *bat_priv = netdev_priv(dev);
+       struct batadv_softif_vlan *vlan;
        struct sockaddr *addr = p;
-       uint8_t old_addr[ETH_ALEN];
+       u8 old_addr[ETH_ALEN];
 
        if (!is_valid_ether_addr(addr->sa_data))
                return -EADDRNOTAVAIL;
@@ -115,12 +140,17 @@ static int batadv_interface_set_mac_addr(struct net_device *dev, void *p)
        ether_addr_copy(dev->dev_addr, addr->sa_data);
 
        /* only modify transtable if it has been initialized before */
-       if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_ACTIVE) {
-               batadv_tt_local_remove(bat_priv, old_addr, BATADV_NO_FLAGS,
+       if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
+               return 0;
+
+       rcu_read_lock();
+       hlist_for_each_entry_rcu(vlan, &bat_priv->softif_vlan_list, list) {
+               batadv_tt_local_remove(bat_priv, old_addr, vlan->vid,
                                       "mac address changed", false);
-               batadv_tt_local_add(dev, addr->sa_data, BATADV_NO_FLAGS,
+               batadv_tt_local_add(dev, addr->sa_data, vlan->vid,
                                    BATADV_NULL_IFINDEX, BATADV_NO_MARK);
        }
+       rcu_read_unlock();
 
        return 0;
 }
@@ -156,22 +186,23 @@ static int batadv_interface_tx(struct sk_buff *skb,
        struct batadv_hard_iface *primary_if = NULL;
        struct batadv_bcast_packet *bcast_packet;
        __be16 ethertype = htons(ETH_P_BATMAN);
-       static const uint8_t stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00,
-                                                  0x00, 0x00};
-       static const uint8_t ectp_addr[ETH_ALEN] = {0xCF, 0x00, 0x00, 0x00,
-                                                   0x00, 0x00};
+       static const u8 stp_addr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00,
+                                             0x00, 0x00};
+       static const u8 ectp_addr[ETH_ALEN] = {0xCF, 0x00, 0x00, 0x00,
+                                              0x00, 0x00};
        enum batadv_dhcp_recipient dhcp_rcp = BATADV_DHCP_NO;
-       uint8_t *dst_hint = NULL, chaddr[ETH_ALEN];
+       u8 *dst_hint = NULL, chaddr[ETH_ALEN];
        struct vlan_ethhdr *vhdr;
        unsigned int header_len = 0;
        int data_len = skb->len, ret;
        unsigned long brd_delay = 1;
        bool do_bcast = false, client_added;
        unsigned short vid;
-       uint32_t seqno;
+       u32 seqno;
        int gw_mode;
        enum batadv_forw_mode forw_mode;
        struct batadv_orig_node *mcast_single_orig = NULL;
+       int network_offset = ETH_HLEN;
 
        if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto dropped;
@@ -184,14 +215,18 @@ static int batadv_interface_tx(struct sk_buff *skb,
        case ETH_P_8021Q:
                vhdr = vlan_eth_hdr(skb);
 
-               if (vhdr->h_vlan_encapsulated_proto != ethertype)
+               if (vhdr->h_vlan_encapsulated_proto != ethertype) {
+                       network_offset += VLAN_HLEN;
                        break;
+               }
 
                /* fall through */
        case ETH_P_BATMAN:
                goto dropped;
        }
 
+       skb_set_network_header(skb, network_offset);
+
        if (batadv_bla_tx(bat_priv, skb, vid))
                goto dropped;
 
@@ -449,6 +484,9 @@ out:
  */
 void batadv_softif_vlan_free_ref(struct batadv_softif_vlan *vlan)
 {
+       if (!vlan)
+               return;
+
        if (atomic_dec_and_test(&vlan->refcount)) {
                spin_lock_bh(&vlan->bat_priv->softif_vlan_list_lock);
                hlist_del_rcu(&vlan->list);
@@ -712,9 +750,9 @@ static void batadv_softif_destroy_finish(struct work_struct *work)
 static int batadv_softif_init_late(struct net_device *dev)
 {
        struct batadv_priv *bat_priv;
-       uint32_t random_seqno;
+       u32 random_seqno;
        int ret;
-       size_t cnt_len = sizeof(uint64_t) * BATADV_CNT_NUM;
+       size_t cnt_len = sizeof(u64) * BATADV_CNT_NUM;
 
        batadv_set_lockdep_class(dev);
 
@@ -725,14 +763,14 @@ static int batadv_softif_init_late(struct net_device *dev)
        /* batadv_interface_stats() needs to be available as soon as
         * register_netdevice() has been called
         */
-       bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(uint64_t));
+       bat_priv->bat_counters = __alloc_percpu(cnt_len, __alignof__(u64));
        if (!bat_priv->bat_counters)
                return -ENOMEM;
 
        atomic_set(&bat_priv->aggregated_ogms, 1);
        atomic_set(&bat_priv->bonding, 0);
 #ifdef CONFIG_BATMAN_ADV_BLA
-       atomic_set(&bat_priv->bridge_loop_avoidance, 0);
+       atomic_set(&bat_priv->bridge_loop_avoidance, 1);
 #endif
 #ifdef CONFIG_BATMAN_ADV_DAT
        atomic_set(&bat_priv->distributed_arp_table, 1);
@@ -818,7 +856,7 @@ static int batadv_softif_slave_add(struct net_device *dev,
        int ret = -EINVAL;
 
        hard_iface = batadv_hardif_get_by_netdev(slave_dev);
-       if (!hard_iface || hard_iface->soft_iface != NULL)
+       if (!hard_iface || hard_iface->soft_iface)
                goto out;
 
        ret = batadv_hardif_enable_interface(hard_iface, dev->name);
@@ -903,14 +941,12 @@ static void batadv_softif_init_early(struct net_device *dev)
        dev->netdev_ops = &batadv_netdev_ops;
        dev->destructor = batadv_softif_free;
        dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
-       dev->tx_queue_len = 0;
+       dev->priv_flags |= IFF_NO_QUEUE;
 
        /* can't call min_mtu, because the needed variables
         * have not been initialized yet
         */
        dev->mtu = ETH_DATA_LEN;
-       /* reserve more space in the skbuff for our header */
-       dev->hard_header_len = batadv_max_header_len();
 
        /* generate random address */
        eth_hw_addr_random(dev);
@@ -1079,8 +1115,7 @@ static const struct {
 #endif
 };
 
-static void batadv_get_strings(struct net_device *dev, uint32_t stringset,
-                              uint8_t *data)
+static void batadv_get_strings(struct net_device *dev, u32 stringset, u8 *data)
 {
        if (stringset == ETH_SS_STATS)
                memcpy(data, batadv_counters_strings,
@@ -1088,8 +1123,7 @@ static void batadv_get_strings(struct net_device *dev, uint32_t stringset,
 }
 
 static void batadv_get_ethtool_stats(struct net_device *dev,
-                                    struct ethtool_stats *stats,
-                                    uint64_t *data)
+                                    struct ethtool_stats *stats, u64 *data)
 {
        struct batadv_priv *bat_priv = netdev_priv(dev);
        int i;