summaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches/441-fix_ibss_node_handling.patch
diff options
context:
space:
mode:
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2009-09-09 00:17:13 +0000
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>2009-09-09 00:17:13 +0000
commitd7b870eaa3e8ef4245023415766fd607abd3f44a (patch)
treef456046b27348eb766f4ebd9a6c8aea5fb7c2733 /package/madwifi/patches/441-fix_ibss_node_handling.patch
parent7f2d4d8bb1019977059c6df31300c3d48d9dc782 (diff)
madwifi: fix several noderef and ibss merge issues that led to memory leaks and high system load
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17545 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/madwifi/patches/441-fix_ibss_node_handling.patch')
-rw-r--r--package/madwifi/patches/441-fix_ibss_node_handling.patch20
1 files changed, 16 insertions, 4 deletions
diff --git a/package/madwifi/patches/441-fix_ibss_node_handling.patch b/package/madwifi/patches/441-fix_ibss_node_handling.patch
index a98fe42d2..e4ef20a20 100644
--- a/package/madwifi/patches/441-fix_ibss_node_handling.patch
+++ b/package/madwifi/patches/441-fix_ibss_node_handling.patch
@@ -44,7 +44,7 @@
if (dir != IEEE80211_FC1_DIR_NODS) {
IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY,
wh, "data", "invalid dir 0x%x", dir);
-@@ -3552,6 +3557,11 @@ ieee80211_recv_mgmt(struct ieee80211vap
+@@ -3555,6 +3560,11 @@ ieee80211_recv_mgmt(struct ieee80211vap
} else if (vap->iv_opmode == IEEE80211_M_WDS) {
found = 1;
ni = ni_or_null = vap->iv_wdsnode;
@@ -56,7 +56,7 @@
}
IEEE80211_UNLOCK_IRQ(vap->iv_ic);
-@@ -3676,19 +3686,8 @@ ieee80211_recv_mgmt(struct ieee80211vap
+@@ -3683,19 +3693,8 @@ ieee80211_recv_mgmt(struct ieee80211vap
vap->iv_stats.is_rx_ssidmismatch++; /*XXX*/
return;
}
@@ -80,11 +80,23 @@
allocbs = 1;
--- a/net80211/ieee80211_node.c
+++ b/net80211/ieee80211_node.c
-@@ -601,6 +601,7 @@ ieee80211_ibss_merge(struct ieee80211_no
+@@ -601,6 +601,8 @@ ieee80211_ibss_merge(struct ieee80211_no
ic->ic_flags & IEEE80211_F_SHPREAMBLE ? "short" : "long",
ic->ic_flags & IEEE80211_F_SHSLOT ? "short" : "long",
ic->ic_flags & IEEE80211_F_USEPROT ? ", protection" : "");
-+ ieee80211_node_table_reset(&vap->iv_ic->ic_sta, vap);
++ if (!IEEE80211_ADDR_EQ(ni->ni_bssid, vap->iv_bssid))
++ ieee80211_node_table_reset(&vap->iv_ic->ic_sta, vap);
return ieee80211_sta_join1(ieee80211_ref_node(ni));
}
EXPORT_SYMBOL(ieee80211_ibss_merge);
+@@ -1378,9 +1380,7 @@ ieee80211_add_neighbor(struct ieee80211v
+ if (sp->ath != NULL)
+ ieee80211_saveath(ni, sp->ath);
+
+- /* NB: must be after ni_chan is setup */
+- ieee80211_setup_rates(ni, sp->rates, sp->xrates, IEEE80211_F_DOSORT);
+-
++ ni->ni_rates = vap->iv_bss->ni_rates;
+ if (ic->ic_newassoc != NULL)
+ ic->ic_newassoc(ni, 1);
+ /* XXX not right for 802.1x/WPA */