These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / net / batman-adv / routing.c
index da83982..3207667 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 "routing.h"
-#include "send.h"
-#include "soft-interface.h"
-#include "hard-interface.h"
-#include "icmp_socket.h"
-#include "translation-table.h"
-#include "originator.h"
+#include "main.h"
+
+#include <linux/atomic.h>
+#include <linux/byteorder/generic.h>
+#include <linux/compiler.h>
+#include <linux/errno.h>
+#include <linux/etherdevice.h>
+#include <linux/if_ether.h>
+#include <linux/jiffies.h>
+#include <linux/netdevice.h>
+#include <linux/printk.h>
+#include <linux/rculist.h>
+#include <linux/rcupdate.h>
+#include <linux/skbuff.h>
+#include <linux/spinlock.h>
+#include <linux/stddef.h>
+
+#include "bitarray.h"
 #include "bridge_loop_avoidance.h"
 #include "distributed-arp-table.h"
-#include "network-coding.h"
 #include "fragmentation.h"
-
-#include <linux/if_vlan.h>
+#include "hard-interface.h"
+#include "icmp_socket.h"
+#include "network-coding.h"
+#include "originator.h"
+#include "packet.h"
+#include "send.h"
+#include "soft-interface.h"
+#include "translation-table.h"
 
 static int batadv_route_unicast_packet(struct sk_buff *skb,
                                       struct batadv_hard_iface *recv_if);
@@ -129,7 +145,7 @@ out:
  *  0 if the packet is to be accepted
  *  1 if the packet is to be ignored.
  */
-int batadv_window_protected(struct batadv_priv *bat_priv, int32_t seq_num_diff,
+int batadv_window_protected(struct batadv_priv *bat_priv, s32 seq_num_diff,
                            unsigned long *last_reset)
 {
        if (seq_num_diff <= -BATADV_TQ_LOCAL_WINDOW_SIZE ||
@@ -637,19 +653,19 @@ out:
 static bool
 batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
                              struct batadv_unicast_packet *unicast_packet,
-                             uint8_t *dst_addr, unsigned short vid)
+                             u8 *dst_addr, unsigned short vid)
 {
        struct batadv_orig_node *orig_node = NULL;
        struct batadv_hard_iface *primary_if = NULL;
        bool ret = false;
-       uint8_t *orig_addr, orig_ttvn;
+       u8 *orig_addr, orig_ttvn;
 
        if (batadv_is_my_client(bat_priv, dst_addr, vid)) {
                primary_if = batadv_primary_if_get_selected(bat_priv);
                if (!primary_if)
                        goto out;
                orig_addr = primary_if->net_dev->dev_addr;
-               orig_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
+               orig_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
        } else {
                orig_node = batadv_transtable_search(bat_priv, NULL, dst_addr,
                                                     vid);
@@ -660,7 +676,7 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
                        goto out;
 
                orig_addr = orig_node->orig;
-               orig_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
+               orig_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
        }
 
        /* update the packet header */
@@ -682,7 +698,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
        struct batadv_unicast_packet *unicast_packet;
        struct batadv_hard_iface *primary_if;
        struct batadv_orig_node *orig_node;
-       uint8_t curr_ttvn, old_ttvn;
+       u8 curr_ttvn, old_ttvn;
        struct ethhdr *ethhdr;
        unsigned short vid;
        int is_old_ttvn;
@@ -724,7 +740,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
         * value is used later to check if the node which sent (or re-routed
         * last time) the packet had an updated information or not
         */
-       curr_ttvn = (uint8_t)atomic_read(&bat_priv->tt.vn);
+       curr_ttvn = (u8)atomic_read(&bat_priv->tt.vn);
        if (!batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
                orig_node = batadv_orig_hash_find(bat_priv,
                                                  unicast_packet->dest);
@@ -735,7 +751,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
                if (!orig_node)
                        return 0;
 
-               curr_ttvn = (uint8_t)atomic_read(&orig_node->last_ttvn);
+               curr_ttvn = (u8)atomic_read(&orig_node->last_ttvn);
                batadv_orig_node_free_ref(orig_node);
        }
 
@@ -817,9 +833,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
        struct batadv_unicast_packet *unicast_packet;
        struct batadv_unicast_4addr_packet *unicast_4addr_packet;
-       uint8_t *orig_addr;
+       u8 *orig_addr;
        struct batadv_orig_node *orig_node = NULL;
        int check, hdr_size = sizeof(*unicast_packet);
+       enum batadv_subtype subtype;
        bool is4addr;
 
        unicast_packet = (struct batadv_unicast_packet *)skb->data;
@@ -847,10 +864,20 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
        /* packet for me */
        if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
                if (is4addr) {
-                       batadv_dat_inc_counter(bat_priv,
-                                              unicast_4addr_packet->subtype);
-                       orig_addr = unicast_4addr_packet->src;
-                       orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
+                       subtype = unicast_4addr_packet->subtype;
+                       batadv_dat_inc_counter(bat_priv, subtype);
+
+                       /* Only payload data should be considered for speedy
+                        * join. For example, DAT also uses unicast 4addr
+                        * types, but those packets should not be considered
+                        * for speedy join, since the clients do not actually
+                        * reside at the sending originator.
+                        */
+                       if (subtype == BATADV_P_DATA) {
+                               orig_addr = unicast_4addr_packet->src;
+                               orig_node = batadv_orig_hash_find(bat_priv,
+                                                                 orig_addr);
+                       }
                }
 
                if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
@@ -888,7 +915,7 @@ int batadv_recv_unicast_tvlv(struct sk_buff *skb,
        struct batadv_priv *bat_priv = netdev_priv(recv_if->soft_iface);
        struct batadv_unicast_tvlv_packet *unicast_tvlv_packet;
        unsigned char *tvlv_buff;
-       uint16_t tvlv_buff_len;
+       u16 tvlv_buff_len;
        int hdr_size = sizeof(*unicast_tvlv_packet);
        int ret = NET_RX_DROP;
 
@@ -991,8 +1018,8 @@ int batadv_recv_bcast_packet(struct sk_buff *skb,
        struct ethhdr *ethhdr;
        int hdr_size = sizeof(*bcast_packet);
        int ret = NET_RX_DROP;
-       int32_t seq_diff;
-       uint32_t seqno;
+       s32 seq_diff;
+       u32 seqno;
 
        /* drop packet if it has not necessary minimum size */
        if (unlikely(!pskb_may_pull(skb, hdr_size)))