batman-adv: restructure rebroadcast counter into forw_packet API
authorLinus Lüssing <linus.luessing@c0d3.blue>
Fri, 17 Feb 2017 10:17:07 +0000 (11:17 +0100)
committerSimon Wunderlich <sw@simonwunderlich.de>
Sun, 26 Mar 2017 10:46:44 +0000 (12:46 +0200)
This patch refactors the num_packets counter of a forw_packet in the
following three ways:

1) Removed dual-use of forw_packet::num_packets:
   -> now for aggregation purposes only
2) Using forw_packet::skb::cb::num_bcasts instead:
   -> for easier access in aggregation code later
3) make access to num_bcasts private to batadv_forw_packet_*()

Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
[sven@narfation.org: Change num_bcasts to unsigned]
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
net/batman-adv/distributed-arp-table.c
net/batman-adv/main.c
net/batman-adv/send.c
net/batman-adv/send.h
net/batman-adv/soft-interface.c
net/batman-adv/types.h

index 77ede40..0608fcf 100644 (file)
@@ -1303,7 +1303,7 @@ bool batadv_dat_drop_broadcast_packet(struct batadv_priv *bat_priv,
        /* If this packet is an ARP_REQUEST and the node already has the
         * information that it is going to ask, then the packet can be dropped
         */
-       if (forw_packet->num_packets)
+       if (batadv_forw_packet_is_rebroadcast(forw_packet))
                goto out;
 
        vid = batadv_dat_get_vid(forw_packet->skb, &hdr_size);
index 5000c54..fb381fb 100644 (file)
@@ -516,6 +516,9 @@ static void batadv_recv_handler_init(void)
        BUILD_BUG_ON(sizeof(struct batadv_tvlv_tt_change) != 12);
        BUILD_BUG_ON(sizeof(struct batadv_tvlv_roam_adv) != 8);
 
+       i = FIELD_SIZEOF(struct sk_buff, cb);
+       BUILD_BUG_ON(sizeof(struct batadv_skb_cb) > i);
+
        /* broadcast packet */
        batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
 
index 7bf4702..403df59 100644 (file)
@@ -789,6 +789,55 @@ err:
        return NETDEV_TX_BUSY;
 }
 
+/**
+ * batadv_forw_packet_bcasts_left - check if a retransmission is necessary
+ * @forw_packet: the forwarding packet to check
+ * @hard_iface: the interface to check on
+ *
+ * Checks whether a given packet has any (re)transmissions left on the provided
+ * interface.
+ *
+ * hard_iface may be NULL: In that case the number of transmissions this skb had
+ * so far is compared with the maximum amount of retransmissions independent of
+ * any interface instead.
+ *
+ * Return: True if (re)transmissions are left, false otherwise.
+ */
+static bool
+batadv_forw_packet_bcasts_left(struct batadv_forw_packet *forw_packet,
+                              struct batadv_hard_iface *hard_iface)
+{
+       unsigned int max;
+
+       if (hard_iface)
+               max = hard_iface->num_bcasts;
+       else
+               max = BATADV_NUM_BCASTS_MAX;
+
+       return BATADV_SKB_CB(forw_packet->skb)->num_bcasts < max;
+}
+
+/**
+ * batadv_forw_packet_bcasts_inc - increment retransmission counter of a packet
+ * @forw_packet: the packet to increase the counter for
+ */
+static void
+batadv_forw_packet_bcasts_inc(struct batadv_forw_packet *forw_packet)
+{
+       BATADV_SKB_CB(forw_packet->skb)->num_bcasts++;
+}
+
+/**
+ * batadv_forw_packet_is_rebroadcast - check packet for previous transmissions
+ * @forw_packet: the packet to check
+ *
+ * Return: True if this packet was transmitted before, false otherwise.
+ */
+bool batadv_forw_packet_is_rebroadcast(struct batadv_forw_packet *forw_packet)
+{
+       return BATADV_SKB_CB(forw_packet->skb)->num_bcasts > 0;
+}
+
 static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
 {
        struct batadv_hard_iface *hard_iface;
@@ -829,7 +878,7 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
                if (hard_iface->soft_iface != soft_iface)
                        continue;
 
-               if (forw_packet->num_packets >= hard_iface->num_bcasts)
+               if (!batadv_forw_packet_bcasts_left(forw_packet, hard_iface))
                        continue;
 
                if (forw_packet->own) {
@@ -887,10 +936,10 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
        }
        rcu_read_unlock();
 
-       forw_packet->num_packets++;
+       batadv_forw_packet_bcasts_inc(forw_packet);
 
        /* if we still have some more bcasts to send */
-       if (forw_packet->num_packets < BATADV_NUM_BCASTS_MAX) {
+       if (batadv_forw_packet_bcasts_left(forw_packet, NULL)) {
                batadv_forw_packet_bcast_queue(bat_priv, forw_packet,
                                               send_time);
                return;
index 8e75890..a16b34f 100644 (file)
@@ -40,6 +40,7 @@ bool batadv_forw_packet_steal(struct batadv_forw_packet *packet, spinlock_t *l);
 void batadv_forw_packet_ogmv1_queue(struct batadv_priv *bat_priv,
                                    struct batadv_forw_packet *forw_packet,
                                    unsigned long send_time);
+bool batadv_forw_packet_is_rebroadcast(struct batadv_forw_packet *forw_packet);
 
 int batadv_send_skb_to_orig(struct sk_buff *skb,
                            struct batadv_orig_node *orig_node,
index 8226495..a9dbcc1 100644 (file)
@@ -230,6 +230,9 @@ static int batadv_interface_tx(struct sk_buff *skb,
        if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
                goto dropped;
 
+       /* reset control block to avoid left overs from previous users */
+       memset(skb->cb, 0, sizeof(struct batadv_skb_cb));
+
        netif_trans_update(soft_iface);
        vid = batadv_get_vid(skb, 0);
        ethhdr = eth_hdr(skb);
index 66b25e4..74b5af7 100644 (file)
@@ -1377,9 +1377,11 @@ struct batadv_nc_packet {
  *  relevant to batman-adv in the skb->cb buffer in skbs.
  * @decoded: Marks a skb as decoded, which is checked when searching for coding
  *  opportunities in network-coding.c
+ * @num_bcasts: Counter for broadcast packet retransmissions
  */
 struct batadv_skb_cb {
        bool decoded;
+       unsigned int num_bcasts;
 };
 
 /**
@@ -1392,7 +1394,7 @@ struct batadv_skb_cb {
  * @skb: bcast packet's skb buffer
  * @packet_len: size of aggregated OGM packet inside the skb buffer
  * @direct_link_flags: direct link flags for aggregated OGM packets
- * @num_packets: counter for bcast packet retransmission
+ * @num_packets: counter for aggregated OGMv1 packets
  * @delayed_work: work queue callback item for packet sending
  * @if_incoming: pointer to incoming hard-iface or primary iface if
  *  locally generated packet