Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[cascardo/linux.git] / net / batman-adv / routing.c
index bfac086..7602c00 100644 (file)
 #include "fragmentation.h"
 #include "hard-interface.h"
 #include "icmp_socket.h"
+#include "log.h"
 #include "network-coding.h"
 #include "originator.h"
 #include "packet.h"
 #include "send.h"
 #include "soft-interface.h"
+#include "tp_meter.h"
 #include "translation-table.h"
+#include "tvlv.h"
 
 static int batadv_route_unicast_packet(struct sk_buff *skb,
                                       struct batadv_hard_iface *recv_if);
@@ -268,10 +271,19 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
                icmph->ttl = BATADV_TTL;
 
                res = batadv_send_skb_to_orig(skb, orig_node, NULL);
-               if (res != NET_XMIT_DROP)
-                       ret = NET_RX_SUCCESS;
+               if (res == -1)
+                       goto out;
+
+               ret = NET_RX_SUCCESS;
 
                break;
+       case BATADV_TP:
+               if (!pskb_may_pull(skb, sizeof(struct batadv_icmp_tp_packet)))
+                       goto out;
+
+               batadv_tp_meter_recv(bat_priv, skb);
+               ret = NET_RX_SUCCESS;
+               goto out;
        default:
                /* drop unknown type */
                goto out;
@@ -290,7 +302,7 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
        struct batadv_hard_iface *primary_if = NULL;
        struct batadv_orig_node *orig_node = NULL;
        struct batadv_icmp_packet *icmp_packet;
-       int ret = NET_RX_DROP;
+       int res, ret = NET_RX_DROP;
 
        icmp_packet = (struct batadv_icmp_packet *)skb->data;
 
@@ -321,7 +333,8 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
        icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
        icmp_packet->ttl = BATADV_TTL;
 
-       if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
+       res = batadv_send_skb_to_orig(skb, orig_node, NULL);
+       if (res != -1)
                ret = NET_RX_SUCCESS;
 
 out:
@@ -341,7 +354,7 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
        struct ethhdr *ethhdr;
        struct batadv_orig_node *orig_node = NULL;
        int hdr_size = sizeof(struct batadv_icmp_header);
-       int ret = NET_RX_DROP;
+       int res, ret = NET_RX_DROP;
 
        /* drop packet if it has not necessary minimum size */
        if (unlikely(!pskb_may_pull(skb, hdr_size)))
@@ -408,7 +421,8 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
        icmph->ttl--;
 
        /* route it */
-       if (batadv_send_skb_to_orig(skb, orig_node, recv_if) != NET_XMIT_DROP)
+       res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
+       if (res != -1)
                ret = NET_RX_SUCCESS;
 
 out:
@@ -492,7 +506,7 @@ batadv_find_router(struct batadv_priv *bat_priv,
                   struct batadv_orig_node *orig_node,
                   struct batadv_hard_iface *recv_if)
 {
-       struct batadv_algo_ops *bao = bat_priv->bat_algo_ops;
+       struct batadv_algo_ops *bao = bat_priv->algo_ops;
        struct batadv_neigh_node *first_candidate_router = NULL;
        struct batadv_neigh_node *next_candidate_router = NULL;
        struct batadv_neigh_node *router, *cand_router = NULL;
@@ -546,9 +560,9 @@ batadv_find_router(struct batadv_priv *bat_priv,
                /* alternative candidate should be good enough to be
                 * considered
                 */
-               if (!bao->bat_neigh_is_similar_or_better(cand_router,
-                                                        cand->if_outgoing,
-                                                        router, recv_if))
+               if (!bao->neigh.is_similar_or_better(cand_router,
+                                                    cand->if_outgoing, router,
+                                                    recv_if))
                        goto next;
 
                /* don't use the same router twice */
@@ -671,6 +685,8 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
 
        len = skb->len;
        res = batadv_send_skb_to_orig(skb, orig_node, recv_if);
+       if (res == -1)
+               goto out;
 
        /* translate transmit result into receive result */
        if (res == NET_XMIT_SUCCESS) {
@@ -678,13 +694,10 @@ static int batadv_route_unicast_packet(struct sk_buff *skb,
                batadv_inc_counter(bat_priv, BATADV_CNT_FORWARD);
                batadv_add_counter(bat_priv, BATADV_CNT_FORWARD_BYTES,
                                   len + ETH_HLEN);
-
-               ret = NET_RX_SUCCESS;
-       } else if (res == NET_XMIT_POLICED) {
-               /* skb was buffered and consumed */
-               ret = NET_RX_SUCCESS;
        }
 
+       ret = NET_RX_SUCCESS;
+
 out:
        if (orig_node)
                batadv_orig_node_put(orig_node);
@@ -1033,6 +1046,8 @@ int batadv_recv_frag_packet(struct sk_buff *skb,
        if (!orig_node_src)
                goto out;
 
+       skb->priority = frag_packet->priority + 256;
+
        /* Route the fragment if it is not for us and too big to be merged. */
        if (!batadv_is_my_mac(bat_priv, frag_packet->dest) &&
            batadv_frag_skb_fwd(skb, recv_if, orig_node_src)) {