summaryrefslogtreecommitdiff
path: root/package/madwifi/patches/386-acl_crashfix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/madwifi/patches/386-acl_crashfix.patch')
-rw-r--r--package/madwifi/patches/386-acl_crashfix.patch116
1 files changed, 0 insertions, 116 deletions
diff --git a/package/madwifi/patches/386-acl_crashfix.patch b/package/madwifi/patches/386-acl_crashfix.patch
deleted file mode 100644
index 04a1ec9..0000000
--- a/package/madwifi/patches/386-acl_crashfix.patch
+++ /dev/null
@@ -1,116 +0,0 @@
-fixes ACL race condition caused by acl list modifications at run time
-
-Signed-off-by: Sebastian Gottschall <brainslayer@dd-wrt.com>
-
---- a/net80211/ieee80211_acl.c
-+++ b/net80211/ieee80211_acl.c
-@@ -112,9 +112,9 @@ acl_detach(struct ieee80211vap *vap)
- {
- struct aclstate *as = vap->iv_as;
-
-- ACL_LOCK(as);
-+ ACL_LOCK_IRQ(as);
- acl_free_all_locked(as);
-- ACL_UNLOCK(as);
-+ ACL_UNLOCK_IRQ(as);
- vap->iv_as = NULL;
- ACL_LOCK_DESTROY(as);
- FREE(as, M_DEVBUF);
-@@ -128,11 +128,18 @@ _find_acl(struct aclstate *as, const u_i
- struct acl *acl;
- int hash;
-
-+ /* locking needed, as inserts are not atomic */
-+ ACL_LOCK_IRQ(as);
- hash = ACL_HASH(macaddr);
- LIST_FOREACH(acl, &as->as_hash[hash], acl_hash) {
-- if (IEEE80211_ADDR_EQ(acl->acl_macaddr, macaddr))
-- return acl;
-+ if (!IEEE80211_ADDR_EQ(acl->acl_macaddr, macaddr))
-+ continue;
-+
-+ ACL_UNLOCK_IRQ_EARLY(as);
-+ return acl;
- }
-+ ACL_UNLOCK_IRQ(as);
-+
- return NULL;
- }
-
-@@ -176,11 +183,11 @@ acl_add(struct ieee80211vap *vap, const
- return -ENOMEM;
- }
-
-- ACL_LOCK(as);
-+ ACL_LOCK_IRQ(as);
- hash = ACL_HASH(mac);
- LIST_FOREACH(acl, &as->as_hash[hash], acl_hash) {
- if (IEEE80211_ADDR_EQ(acl->acl_macaddr, mac)) {
-- ACL_UNLOCK_EARLY(as);
-+ ACL_UNLOCK_IRQ_EARLY(as);
- FREE(new, M_80211_ACL);
- IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACL,
- "ACL: add " MAC_FMT " failed, already present\n",
-@@ -191,7 +198,7 @@ acl_add(struct ieee80211vap *vap, const
- IEEE80211_ADDR_COPY(new->acl_macaddr, mac);
- TAILQ_INSERT_TAIL(&as->as_list, new, acl_list);
- LIST_INSERT_HEAD(&as->as_hash[hash], new, acl_hash);
-- ACL_UNLOCK(as);
-+ ACL_UNLOCK_IRQ(as);
-
- IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACL,
- "ACL: add " MAC_FMT "\n", MAC_ADDR(mac));
-@@ -204,11 +211,11 @@ acl_remove(struct ieee80211vap *vap, con
- struct aclstate *as = vap->iv_as;
- struct acl *acl;
-
-- ACL_LOCK(as);
-+ ACL_LOCK_IRQ(as);
- acl = _find_acl(as, mac);
- if (acl != NULL)
- _acl_free(as, acl);
-- ACL_UNLOCK(as);
-+ ACL_UNLOCK_IRQ(as);
-
- IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACL,
- "ACL: remove " MAC_FMT "%s\n", MAC_ADDR(mac),
-@@ -235,9 +242,9 @@ acl_free_all(struct ieee80211vap *vap)
-
- IEEE80211_DPRINTF(vap, IEEE80211_MSG_ACL, "ACL: %s\n", "free all");
-
-- ACL_LOCK(as);
-+ ACL_LOCK_IRQ(as);
- acl_free_all_locked(vap->iv_as);
-- ACL_UNLOCK(as);
-+ ACL_UNLOCK_IRQ(as);
-
- return 0;
- }
---- a/net80211/ieee80211_linux.h
-+++ b/net80211/ieee80211_linux.h
-@@ -319,16 +319,15 @@ typedef spinlock_t ieee80211_scan_lock_t
- typedef spinlock_t acl_lock_t;
- #define ACL_LOCK_INIT(_as, _name) spin_lock_init(&(_as)->as_lock)
- #define ACL_LOCK_DESTROY(_as)
--#define ACL_LOCK(_as) do { \
-- ACL_LOCK_CHECK(_as); \
-- spin_lock(&(_as)->as_lock);
--#define ACL_UNLOCK(_as) \
-- ACL_LOCK_ASSERT(_as); \
-- spin_unlock(&(_as)->as_lock); \
--} while(0)
--#define ACL_UNLOCK_EARLY(_as) \
-- ACL_LOCK_ASSERT(_as); \
-- spin_unlock(&(_as)->as_lock);
-+#define ACL_LOCK_IRQ(_as) do { \
-+ unsigned long __acl_lockflags; \
-+ spin_lock_irqsave(&(_as)->as_lock, __acl_lockflags);
-+#define ACL_UNLOCK_IRQ(_as) \
-+ spin_unlock_irqrestore(&(_as)->as_lock, __acl_lockflags); \
-+} while (0)
-+#define ACL_UNLOCK_IRQ_EARLY(_as) do { \
-+ spin_unlock_irqrestore(&(_as)->as_lock, __acl_lockflags); \
-+} while (0)
-
- #if (defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)) && defined(spin_is_locked)
- #define ACL_LOCK_ASSERT(_as) \