summaryrefslogtreecommitdiffstats
path: root/package
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-03-11 15:30:37 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2010-03-11 15:30:37 +0000
commita44b9961dcecd5e426e2294f194f9e31ae01b26d (patch)
tree8270f35c03cd9eba7743f7cf46db563d57a1271d /package
parent472d19b31d371eb4d6081332e2324f858a195e8b (diff)
mac80211: improve performance a bit
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20145 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package')
-rw-r--r--package/mac80211/patches/580-tx_status_optimization.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/package/mac80211/patches/580-tx_status_optimization.patch b/package/mac80211/patches/580-tx_status_optimization.patch
new file mode 100644
index 000000000..34eeff2f1
--- /dev/null
+++ b/package/mac80211/patches/580-tx_status_optimization.patch
@@ -0,0 +1,48 @@
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -171,7 +171,7 @@ void ieee80211_tx_status(struct ieee8021
+ struct net_device *prev_dev = NULL;
+ struct sta_info *sta, *tmp;
+ int retry_count = -1, i;
+- bool injected;
++ bool send_to_cooked;
+
+ for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
+ /* the HW cannot have attempted that rate */
+@@ -296,11 +296,15 @@ void ieee80211_tx_status(struct ieee8021
+ /* this was a transmitted frame, but now we want to reuse it */
+ skb_orphan(skb);
+
++ /* Need to make a copy before skb->cb gets cleared */
++ send_to_cooked = !!(info->flags & IEEE80211_TX_CTL_INJECTED) ||
++ (type != IEEE80211_FTYPE_DATA);
++
+ /*
+ * This is a bit racy but we can avoid a lot of work
+ * with this test...
+ */
+- if (!local->monitors && !local->cooked_mntrs) {
++ if (!local->monitors && (!send_to_cooked || !local->cooked_mntrs)) {
+ dev_kfree_skb(skb);
+ return;
+ }
+@@ -345,9 +349,6 @@ void ieee80211_tx_status(struct ieee8021
+ /* for now report the total retry_count */
+ rthdr->data_retries = retry_count;
+
+- /* Need to make a copy before skb->cb gets cleared */
+- injected = !!(info->flags & IEEE80211_TX_CTL_INJECTED);
+-
+ /* XXX: is this sufficient for BPF? */
+ skb_set_mac_header(skb, 0);
+ skb->ip_summed = CHECKSUM_UNNECESSARY;
+@@ -362,8 +363,7 @@ void ieee80211_tx_status(struct ieee8021
+ continue;
+
+ if ((sdata->u.mntr_flags & MONITOR_FLAG_COOK_FRAMES) &&
+- !injected &&
+- (type == IEEE80211_FTYPE_DATA))
++ !send_to_cooked)
+ continue;
+
+ if (prev_dev) {