Commit 5694f962 authored by Kalle Valo's avatar Kalle Valo
Browse files

ath6kl: pass only unicast frames for aggregation



When pinging form ar6003 to the AP RTT was high even when power save was
disabled:

100 packets transmitted, 97 received, 3% packet loss, time 99125ms
rtt min/avg/max/mdev = 1.875/46.733/795.506/139.181 ms

After some investigation one reason for this was that received
multicast traffic confused the aggrecation logic and caused 400 ms
timeouts when receiving multicast frames from AP.

A simple way to fix is to pass only unicast frames for aggregation. This
improves RTT:

100 packets transmitted, 99 received, 1% packet loss, time 99144ms
rtt min/avg/max/mdev = 2.083/13.084/403.390/56.794 ms

Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 86512136
Loading
Loading
Loading
Loading
+9 −7
Original line number Diff line number Diff line
@@ -1230,8 +1230,14 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
			ath6kl_data_tx(skb1, ar->net_dev);
	}

	if (!aggr_process_recv_frm(ar->aggr_cntxt, tid, seq_no,
	datap = (struct ethhdr *) skb->data;

	if (is_unicast_ether_addr(datap->h_dest) &&
	    aggr_process_recv_frm(ar->aggr_cntxt, tid, seq_no,
				  is_amsdu, skb))
		/* aggregation code will handle the skb */
		return;

	ath6kl_deliver_frames_to_nw_stack(ar->net_dev, skb);
}

@@ -1249,10 +1255,6 @@ static void aggr_timeout(unsigned long arg)
		if (!rxtid->aggr || !rxtid->timer_mon || rxtid->progress)
			continue;

		/*
		 * FIXME: these timeouts happen quite fruently, something
		 * line once within 60 seconds. Investigate why.
		 */
		stats->num_timeouts++;
		ath6kl_dbg(ATH6KL_DBG_AGGR,
			   "aggr timeout (st %d end %d)\n",