Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[deliverable/linux.git] / net / batman-adv / bat_iv_ogm.c
index df625de55ef2226fcc79a9dca11dc978ebe6d7df..cb2d1b9b034058c454fa0b7c5c14e6491ed41b1d 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2015 B.A.T.M.A.N. contributors:
+/* Copyright (C) 2007-201 B.A.T.M.A.N. contributors:
  *
  * Marek Lindner, Simon Wunderlich
  *
@@ -31,6 +31,7 @@
 #include <linux/init.h>
 #include <linux/jiffies.h>
 #include <linux/list.h>
+#include <linux/kref.h>
 #include <linux/netdevice.h>
 #include <linux/pkt_sched.h>
 #include <linux/printk.h>
@@ -88,7 +89,7 @@ static void batadv_ring_buffer_set(u8 lq_recv[], u8 *lq_index, u8 value)
  * in the given ring buffer
  * @lq_recv: pointer to the ring buffer
  *
- * Returns computed average value.
+ * Return: computed average value.
  */
 static u8 batadv_ring_buffer_avg(const u8 lq_recv[])
 {
@@ -132,7 +133,7 @@ static void batadv_iv_ogm_orig_free(struct batadv_orig_node *orig_node)
  * @orig_node: the orig_node that has to be changed
  * @max_if_num: the current amount of interfaces
  *
- * Returns 0 on success, a negative error code otherwise.
+ * Return: 0 on success, a negative error code otherwise.
  */
 static int batadv_iv_ogm_orig_add_if(struct batadv_orig_node *orig_node,
                                     int max_if_num)
@@ -180,7 +181,7 @@ unlock:
  * @max_if_num: the current amount of interfaces
  * @del_if_num: the index of the interface being removed
  *
- * Returns 0 on success, a negative error code otherwise.
+ * Return: 0 on success, a negative error code otherwise.
  */
 static int batadv_iv_ogm_orig_del_if(struct batadv_orig_node *orig_node,
                                     int max_if_num, int del_if_num)
@@ -246,7 +247,7 @@ unlock:
  * @bat_priv: the bat priv with all the soft interface information
  * @addr: mac address of the originator
  *
- * Returns the originator object corresponding to the passed mac address or NULL
+ * Return: the originator object corresponding to the passed mac address or NULL
  * on failure.
  * If the object does not exists it is created an initialised.
  */
@@ -286,8 +287,8 @@ batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
 
 free_orig_node:
        /* free twice, as batadv_orig_node_new sets refcount to 2 */
-       batadv_orig_node_free_ref(orig_node);
-       batadv_orig_node_free_ref(orig_node);
+       batadv_orig_node_put(orig_node);
+       batadv_orig_node_put(orig_node);
 
        return NULL;
 }
@@ -396,7 +397,14 @@ static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv)
        return new_tq;
 }
 
-/* is there another aggregated packet here? */
+/**
+ * batadv_iv_ogm_aggr_packet - checks if there is another OGM attached
+ * @buff_pos: current position in the skb
+ * @packet_len: total length of the skb
+ * @tvlv_len: tvlv length of the previously considered OGM
+ *
+ * Return: true if there is enough space for another OGM, false otherwise.
+ */
 static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len,
                                      __be16 tvlv_len)
 {
@@ -470,7 +478,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
                batadv_inc_counter(bat_priv, BATADV_CNT_MGMT_TX);
                batadv_add_counter(bat_priv, BATADV_CNT_MGMT_TX_BYTES,
                                   skb->len + ETH_HLEN);
-               batadv_send_skb_packet(skb, hard_iface, batadv_broadcast_addr);
+               batadv_send_broadcast_skb(skb, hard_iface);
        }
 }
 
@@ -507,7 +515,7 @@ static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
 
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
 }
 
 /**
@@ -522,7 +530,7 @@ out:
  * @if_outgoing: interface for which the retransmission should be considered
  * @forw_packet: the forwarded packet which should be checked
  *
- * Returns true if new_packet can be aggregated with forw_packet
+ * Return: true if new_packet can be aggregated with forw_packet
  */
 static bool
 batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
@@ -609,7 +617,7 @@ batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet,
 
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
        return res;
 }
 
@@ -636,10 +644,10 @@ static void batadv_iv_ogm_aggregate_new(const unsigned char *packet_buff,
        unsigned char *skb_buff;
        unsigned int skb_size;
 
-       if (!atomic_inc_not_zero(&if_incoming->refcount))
+       if (!kref_get_unless_zero(&if_incoming->refcount))
                return;
 
-       if (!atomic_inc_not_zero(&if_outgoing->refcount))
+       if (!kref_get_unless_zero(&if_outgoing->refcount))
                goto out_free_incoming;
 
        /* own packet should always be scheduled */
@@ -703,9 +711,9 @@ out_nomem:
        if (!own_packet)
                atomic_inc(&bat_priv->batman_queue_left);
 out_free_outgoing:
-       batadv_hardif_free_ref(if_outgoing);
+       batadv_hardif_put(if_outgoing);
 out_free_incoming:
-       batadv_hardif_free_ref(if_incoming);
+       batadv_hardif_put(if_incoming);
 }
 
 /* aggregate a new packet into the existing ogm packet */
@@ -950,7 +958,7 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
 
 out:
        if (primary_if)
-               batadv_hardif_free_ref(primary_if);
+               batadv_hardif_put(primary_if);
 }
 
 /**
@@ -995,9 +1003,9 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
                neigh_addr = tmp_neigh_node->addr;
                if (batadv_compare_eth(neigh_addr, ethhdr->h_source) &&
                    tmp_neigh_node->if_incoming == if_incoming &&
-                   atomic_inc_not_zero(&tmp_neigh_node->refcount)) {
+                   kref_get_unless_zero(&tmp_neigh_node->refcount)) {
                        if (WARN(neigh_node, "too many matching neigh_nodes"))
-                               batadv_neigh_node_free_ref(neigh_node);
+                               batadv_neigh_node_put(neigh_node);
                        neigh_node = tmp_neigh_node;
                        continue;
                }
@@ -1018,7 +1026,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
                neigh_ifinfo->bat_iv.tq_avg = tq_avg;
                spin_unlock_bh(&tmp_neigh_node->ifinfo_lock);
 
-               batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
+               batadv_neigh_ifinfo_put(neigh_ifinfo);
                neigh_ifinfo = NULL;
        }
 
@@ -1033,7 +1041,7 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
                                                     ethhdr->h_source,
                                                     orig_node, orig_tmp);
 
-               batadv_orig_node_free_ref(orig_tmp);
+               batadv_orig_node_put(orig_tmp);
                if (!neigh_node)
                        goto unlock;
        } else {
@@ -1108,13 +1116,13 @@ unlock:
        rcu_read_unlock();
 out:
        if (neigh_node)
-               batadv_neigh_node_free_ref(neigh_node);
+               batadv_neigh_node_put(neigh_node);
        if (router)
-               batadv_neigh_node_free_ref(router);
+               batadv_neigh_node_put(router);
        if (neigh_ifinfo)
-               batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
+               batadv_neigh_ifinfo_put(neigh_ifinfo);
        if (router_ifinfo)
-               batadv_neigh_ifinfo_free_ref(router_ifinfo);
+               batadv_neigh_ifinfo_put(router_ifinfo);
 }
 
 /**
@@ -1125,7 +1133,7 @@ out:
  * @if_incoming: interface where the packet was received
  * @if_outgoing: interface for which the retransmission should be considered
  *
- * Returns 1 if the link can be considered bidirectional, 0 otherwise
+ * Return: 1 if the link can be considered bidirectional, 0 otherwise
  */
 static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
                                 struct batadv_orig_node *orig_neigh_node,
@@ -1154,7 +1162,7 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
                if (tmp_neigh_node->if_incoming != if_incoming)
                        continue;
 
-               if (!atomic_inc_not_zero(&tmp_neigh_node->refcount))
+               if (!kref_get_unless_zero(&tmp_neigh_node->refcount))
                        continue;
 
                neigh_node = tmp_neigh_node;
@@ -1184,7 +1192,7 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
        neigh_ifinfo = batadv_neigh_ifinfo_new(neigh_node, if_outgoing);
        if (neigh_ifinfo) {
                neigh_rq_count = neigh_ifinfo->bat_iv.real_packet_count;
-               batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
+               batadv_neigh_ifinfo_put(neigh_ifinfo);
        } else {
                neigh_rq_count = 0;
        }
@@ -1257,7 +1265,7 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node,
 
 out:
        if (neigh_node)
-               batadv_neigh_node_free_ref(neigh_node);
+               batadv_neigh_node_put(neigh_node);
        return ret;
 }
 
@@ -1269,7 +1277,7 @@ out:
  * @if_incoming: interface on which the OGM packet was received
  * @if_outgoing: interface for which the retransmission should be considered
  *
- * Returns duplicate status as enum batadv_dup_status
+ * Return: duplicate status as enum batadv_dup_status
  */
 static enum batadv_dup_status
 batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
@@ -1298,7 +1306,7 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
 
        orig_ifinfo = batadv_orig_ifinfo_new(orig_node, if_outgoing);
        if (WARN_ON(!orig_ifinfo)) {
-               batadv_orig_node_free_ref(orig_node);
+               batadv_orig_node_put(orig_node);
                return 0;
        }
 
@@ -1308,7 +1316,8 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
        /* signalize caller that the packet is to be dropped. */
        if (!hlist_empty(&orig_node->neigh_list) &&
            batadv_window_protected(bat_priv, seq_diff,
-                                   &orig_ifinfo->batman_seqno_reset)) {
+                                   BATADV_TQ_LOCAL_WINDOW_SIZE,
+                                   &orig_ifinfo->batman_seqno_reset, NULL)) {
                ret = BATADV_PROTECTED;
                goto out;
        }
@@ -1344,7 +1353,7 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
                packet_count = bitmap_weight(bitmap,
                                             BATADV_TQ_LOCAL_WINDOW_SIZE);
                neigh_ifinfo->bat_iv.real_packet_count = packet_count;
-               batadv_neigh_ifinfo_free_ref(neigh_ifinfo);
+               batadv_neigh_ifinfo_put(neigh_ifinfo);
        }
        rcu_read_unlock();
 
@@ -1358,8 +1367,8 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr,
 
 out:
        spin_unlock_bh(&orig_node->bat_iv.ogm_cnt_lock);
-       batadv_orig_node_free_ref(orig_node);
-       batadv_orig_ifinfo_free_ref(orig_ifinfo);
+       batadv_orig_node_put(orig_node);
+       batadv_orig_ifinfo_put(orig_ifinfo);
        return ret;
 }
 
@@ -1505,7 +1514,7 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset,
                                          ogm_packet, if_incoming,
                                          if_outgoing, dup_status);
        }
-       batadv_orig_ifinfo_free_ref(orig_ifinfo);
+       batadv_orig_ifinfo_put(orig_ifinfo);
 
        /* only forward for specific interface, not for the default one. */
        if (if_outgoing == BATADV_IF_DEFAULT)
@@ -1554,18 +1563,18 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset,
 
 out_neigh:
        if ((orig_neigh_node) && (!is_single_hop_neigh))
-               batadv_orig_node_free_ref(orig_neigh_node);
+               batadv_orig_node_put(orig_neigh_node);
 out:
        if (router_ifinfo)
-               batadv_neigh_ifinfo_free_ref(router_ifinfo);
+               batadv_neigh_ifinfo_put(router_ifinfo);
        if (router)
-               batadv_neigh_node_free_ref(router);
+               batadv_neigh_node_put(router);
        if (router_router)
-               batadv_neigh_node_free_ref(router_router);
+               batadv_neigh_node_put(router_router);
        if (orig_neigh_router)
-               batadv_neigh_node_free_ref(orig_neigh_router);
+               batadv_neigh_node_put(orig_neigh_router);
        if (hardif_neigh)
-               batadv_hardif_neigh_free_ref(hardif_neigh);
+               batadv_hardif_neigh_put(hardif_neigh);
 
        kfree_skb(skb_priv);
 }
@@ -1688,7 +1697,7 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
 
                batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
                           "Drop packet: originator packet from myself (via neighbor)\n");
-               batadv_orig_node_free_ref(orig_neigh_node);
+               batadv_orig_node_put(orig_neigh_node);
                return;
        }
 
@@ -1726,7 +1735,7 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
        }
        rcu_read_unlock();
 
-       batadv_orig_node_free_ref(orig_node);
+       batadv_orig_node_put(orig_node);
 }
 
 static int batadv_iv_ogm_receive(struct sk_buff *skb,
@@ -1796,7 +1805,7 @@ batadv_iv_ogm_orig_print_neigh(struct batadv_orig_node *orig_node,
                           neigh_node->addr,
                           n_ifinfo->bat_iv.tq_avg);
 
-               batadv_neigh_ifinfo_free_ref(n_ifinfo);
+               batadv_neigh_ifinfo_put(n_ifinfo);
        }
 }
 
@@ -1859,9 +1868,9 @@ static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv,
                        batman_count++;
 
 next:
-                       batadv_neigh_node_free_ref(neigh_node);
+                       batadv_neigh_node_put(neigh_node);
                        if (n_ifinfo)
-                               batadv_neigh_ifinfo_free_ref(n_ifinfo);
+                               batadv_neigh_ifinfo_put(n_ifinfo);
                }
                rcu_read_unlock();
        }
@@ -1929,7 +1938,7 @@ static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
  * @neigh2: the second neighbor object of the comparison
  * @if_outgoing2: outgoing interface for the second neighbor
  *
- * Returns a value less, equal to or greater than 0 if the metric via neigh1 is
+ * Return: a value less, equal to or greater than 0 if the metric via neigh1 is
  * lower, the same as or higher than the metric via neigh2
  */
 static int batadv_iv_ogm_neigh_cmp(struct batadv_neigh_node *neigh1,
@@ -1955,9 +1964,9 @@ static int batadv_iv_ogm_neigh_cmp(struct batadv_neigh_node *neigh1,
 
 out:
        if (neigh1_ifinfo)
-               batadv_neigh_ifinfo_free_ref(neigh1_ifinfo);
+               batadv_neigh_ifinfo_put(neigh1_ifinfo);
        if (neigh2_ifinfo)
-               batadv_neigh_ifinfo_free_ref(neigh2_ifinfo);
+               batadv_neigh_ifinfo_put(neigh2_ifinfo);
 
        return diff;
 }
@@ -1970,7 +1979,7 @@ out:
  * @neigh2: the second neighbor object of the comparison
  * @if_outgoing2: outgoing interface for the second neighbor
  *
- * Returns true if the metric via neigh1 is equally good or better than
+ * Return: true if the metric via neigh1 is equally good or better than
  * the metric via neigh2, false otherwise.
  */
 static bool
@@ -1998,9 +2007,9 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
 
 out:
        if (neigh1_ifinfo)
-               batadv_neigh_ifinfo_free_ref(neigh1_ifinfo);
+               batadv_neigh_ifinfo_put(neigh1_ifinfo);
        if (neigh2_ifinfo)
-               batadv_neigh_ifinfo_free_ref(neigh2_ifinfo);
+               batadv_neigh_ifinfo_put(neigh2_ifinfo);
 
        return ret;
 }
This page took 0.036166 seconds and 5 git commands to generate.