Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2d9ba43 authored by Linus Lüssing's avatar Linus Lüssing Committed by Simon Wunderlich
Browse files

batman-adv: restructure rebroadcast counter into forw_packet API



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: default avatarLinus Lüssing <linus.luessing@c0d3.blue>
[sven@narfation.org: Change num_bcasts to unsigned]
Signed-off-by: default avatarSven Eckelmann <sven@narfation.org>
Signed-off-by: default avatarSimon Wunderlich <sw@simonwunderlich.de>
parent 99ba18ef
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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
	/* 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
	 * 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;
		goto out;


	vid = batadv_dat_get_vid(forw_packet->skb, &hdr_size);
	vid = batadv_dat_get_vid(forw_packet->skb, &hdr_size);
+3 −0
Original line number Original line Diff line number Diff line
@@ -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_tt_change) != 12);
	BUILD_BUG_ON(sizeof(struct batadv_tvlv_roam_adv) != 8);
	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 */
	/* broadcast packet */
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;
	batadv_rx_handler[BATADV_BCAST] = batadv_recv_bcast_packet;


+52 −3
Original line number Original line Diff line number Diff line
@@ -789,6 +789,55 @@ int batadv_add_bcast_packet_to_list(struct batadv_priv *bat_priv,
	return NETDEV_TX_BUSY;
	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)
static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
{
{
	struct batadv_hard_iface *hard_iface;
	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)
		if (hard_iface->soft_iface != soft_iface)
			continue;
			continue;


		if (forw_packet->num_packets >= hard_iface->num_bcasts)
		if (!batadv_forw_packet_bcasts_left(forw_packet, hard_iface))
			continue;
			continue;


		if (forw_packet->own) {
		if (forw_packet->own) {
@@ -887,10 +936,10 @@ static void batadv_send_outstanding_bcast_packet(struct work_struct *work)
	}
	}
	rcu_read_unlock();
	rcu_read_unlock();


	forw_packet->num_packets++;
	batadv_forw_packet_bcasts_inc(forw_packet);


	/* if we still have some more bcasts to send */
	/* 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,
		batadv_forw_packet_bcast_queue(bat_priv, forw_packet,
					       send_time);
					       send_time);
		return;
		return;
+1 −0
Original line number Original line Diff line number Diff line
@@ -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,
void batadv_forw_packet_ogmv1_queue(struct batadv_priv *bat_priv,
				    struct batadv_forw_packet *forw_packet,
				    struct batadv_forw_packet *forw_packet,
				    unsigned long send_time);
				    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,
int batadv_send_skb_to_orig(struct sk_buff *skb,
			    struct batadv_orig_node *orig_node,
			    struct batadv_orig_node *orig_node,
+3 −0
Original line number Original line Diff line number Diff line
@@ -230,6 +230,9 @@ static int batadv_interface_tx(struct sk_buff *skb,
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
	if (atomic_read(&bat_priv->mesh_state) != BATADV_MESH_ACTIVE)
		goto dropped;
		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);
	netif_trans_update(soft_iface);
	vid = batadv_get_vid(skb, 0);
	vid = batadv_get_vid(skb, 0);
	ethhdr = eth_hdr(skb);
	ethhdr = eth_hdr(skb);
Loading