madwifi: add support for translating country codes into internal country code numbers...
[openwrt/svn-archive/archive.git] / package / madwifi / patches / 392-remove_wds_nodetracking.patch
1 --- a/net80211/ieee80211_input.c
2 +++ b/net80211/ieee80211_input.c
3 @@ -568,36 +568,6 @@ ieee80211_input(struct ieee80211vap * va
4 }
5 }
6
7 - /* XXX: Useless node mgmt API; make better */
8 - if ((dir == IEEE80211_FC1_DIR_DSTODS) && !vap->iv_wdsnode &&
9 - !ni_wds && !ni->ni_subif) {
10 - struct ieee80211_node_table *nt = &ic->ic_sta;
11 - struct ieee80211_frame_addr4 *wh4;
12 -
13 - if (!(vap->iv_flags_ext & IEEE80211_FEXT_WDS)) {
14 - IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT,
15 - wh, "data", "%s", "4 addr not allowed");
16 - goto err;
17 - }
18 - wh4 = (struct ieee80211_frame_addr4 *)skb->data;
19 - ni_wds = ieee80211_find_wds_node(nt, wh4->i_addr4);
20 - /* Last call increments ref count if !NULL */
21 - if ((ni_wds != NULL) && (ni_wds != ni)) {
22 - /*
23 - * node with source address (addr4) moved
24 - * to another WDS capable station. remove the
25 - * reference to the previous station and add
26 - * reference to the new one
27 - */
28 - (void) ieee80211_remove_wds_addr(nt, wh4->i_addr4);
29 - ieee80211_add_wds_addr(nt, ni, wh4->i_addr4, 0);
30 - }
31 - if (ni_wds == NULL)
32 - ieee80211_add_wds_addr(nt, ni, wh4->i_addr4, 0);
33 - else
34 - ieee80211_unref_node(&ni_wds);
35 - }
36 -
37 /*
38 * Check for power save state change.
39 */
40 --- a/net80211/ieee80211_node.c
41 +++ b/net80211/ieee80211_node.c
42 @@ -122,7 +122,6 @@ static void ieee80211_node_table_init(st
43 static void ieee80211_node_table_cleanup(struct ieee80211_node_table *);
44 static void ieee80211_node_table_reset(struct ieee80211_node_table *,
45 struct ieee80211vap *);
46 -static void ieee80211_node_wds_ageout(unsigned long);
47
48 MALLOC_DEFINE(M_80211_NODE, "80211node", "802.11 node state");
49
50 @@ -785,10 +784,6 @@ ieee80211_node_table_init(struct ieee802
51 nt->nt_name = name;
52 nt->nt_scangen = 1;
53 nt->nt_inact_init = inact;
54 - init_timer(&nt->nt_wds_aging_timer);
55 - nt->nt_wds_aging_timer.function = ieee80211_node_wds_ageout;
56 - nt->nt_wds_aging_timer.data = (unsigned long) nt;
57 - mod_timer(&nt->nt_wds_aging_timer, jiffies + HZ * WDS_AGING_TIMER_VAL);
58 }
59
60 static __inline
61 @@ -1204,142 +1199,6 @@ void ieee80211_wds_addif(struct ieee8021
62 schedule_work(&ni->ni_create);
63 }
64
65 -/* Add wds address to the node table */
66 -int
67 -#ifdef IEEE80211_DEBUG_REFCNT
68 -ieee80211_add_wds_addr_debug(struct ieee80211_node_table *nt,
69 - struct ieee80211_node *ni, const u_int8_t *macaddr, u_int8_t wds_static,
70 - const char* func, int line)
71 -#else
72 -ieee80211_add_wds_addr(struct ieee80211_node_table *nt,
73 - struct ieee80211_node *ni, const u_int8_t *macaddr, u_int8_t wds_static)
74 -#endif
75 -{
76 - int hash;
77 - struct ieee80211_wds_addr *wds;
78 -
79 - MALLOC(wds, struct ieee80211_wds_addr *, sizeof(struct ieee80211_wds_addr),
80 - M_80211_WDS, M_NOWAIT | M_ZERO);
81 - if (wds == NULL) {
82 - /* XXX msg */
83 - return 1;
84 - }
85 - if (wds_static)
86 - wds->wds_agingcount = WDS_AGING_STATIC;
87 - else
88 - wds->wds_agingcount = WDS_AGING_COUNT;
89 - hash = IEEE80211_NODE_HASH(macaddr);
90 - IEEE80211_ADDR_COPY(wds->wds_macaddr, macaddr);
91 -
92 - IEEE80211_NODE_TABLE_LOCK_IRQ(nt);
93 -#ifdef IEEE80211_DEBUG_REFCNT
94 - wds->wds_ni = ieee80211_ref_node_debug(ni, func, line);
95 -#else
96 - wds->wds_ni = ieee80211_ref_node(ni);
97 -#endif
98 - LIST_INSERT_HEAD(&nt->nt_wds_hash[hash], wds, wds_hash);
99 - IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt);
100 - return 0;
101 -}
102 -#ifdef IEEE80211_DEBUG_REFCNT
103 -EXPORT_SYMBOL(ieee80211_add_wds_addr_debug);
104 -#else
105 -EXPORT_SYMBOL(ieee80211_add_wds_addr);
106 -#endif
107 -
108 -/* remove wds address from the wds hash table */
109 -void
110 -#ifdef IEEE80211_DEBUG_REFCNT
111 -ieee80211_remove_wds_addr_debug(struct ieee80211_node_table *nt, const u_int8_t *macaddr,
112 - const char* func, int line)
113 -#else
114 -ieee80211_remove_wds_addr(struct ieee80211_node_table *nt, const u_int8_t *macaddr)
115 -#endif
116 -{
117 - int hash;
118 - struct ieee80211_wds_addr *wds, *twds;
119 -
120 - hash = IEEE80211_NODE_HASH(macaddr);
121 - IEEE80211_NODE_TABLE_LOCK_IRQ(nt);
122 - LIST_FOREACH_SAFE(wds, &nt->nt_wds_hash[hash], wds_hash, twds) {
123 - if (IEEE80211_ADDR_EQ(wds->wds_macaddr, macaddr)) {
124 - LIST_REMOVE(wds, wds_hash);
125 -#ifdef IEEE80211_DEBUG_REFCNT
126 - ieee80211_unref_node_debug(&wds->wds_ni, func, line);
127 -#else
128 - ieee80211_unref_node(&wds->wds_ni);
129 -#endif
130 - FREE(wds, M_80211_WDS);
131 - break;
132 - }
133 - }
134 - IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt);
135 -}
136 -#ifdef IEEE80211_DEBUG_REFCNT
137 -EXPORT_SYMBOL(ieee80211_remove_wds_addr_debug);
138 -#else
139 -EXPORT_SYMBOL(ieee80211_remove_wds_addr);
140 -#endif
141 -
142 -/* Remove node references from wds table */
143 -void
144 -#ifdef IEEE80211_DEBUG_REFCNT
145 -ieee80211_del_wds_node_debug(struct ieee80211_node_table *nt, struct ieee80211_node *ni,
146 - const char* func, int line)
147 -#else
148 -ieee80211_del_wds_node(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
149 -#endif
150 -{
151 - int hash;
152 - struct ieee80211_wds_addr *wds, *twds;
153 -
154 - IEEE80211_NODE_TABLE_LOCK_IRQ(nt);
155 - for (hash = 0; hash < IEEE80211_NODE_HASHSIZE; hash++) {
156 - LIST_FOREACH_SAFE(wds, &nt->nt_wds_hash[hash], wds_hash, twds) {
157 - if (wds->wds_ni == ni) {
158 - LIST_REMOVE(wds, wds_hash);
159 -#ifdef IEEE80211_DEBUG_REFCNT
160 - ieee80211_unref_node_debug(&wds->wds_ni, func, line);
161 -#else
162 - ieee80211_unref_node(&wds->wds_ni);
163 -#endif
164 - FREE(wds, M_80211_WDS);
165 - }
166 - }
167 - }
168 - IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt);
169 -}
170 -#ifdef IEEE80211_DEBUG_REFCNT
171 -EXPORT_SYMBOL(ieee80211_del_wds_node_debug);
172 -#else
173 -EXPORT_SYMBOL(ieee80211_del_wds_node);
174 -#endif
175 -
176 -static void
177 -ieee80211_node_wds_ageout(unsigned long data)
178 -{
179 - struct ieee80211_node_table *nt = (struct ieee80211_node_table *)data;
180 - int hash;
181 - struct ieee80211_wds_addr *wds, *twds;
182 -
183 - IEEE80211_NODE_TABLE_LOCK_IRQ(nt);
184 - for (hash = 0; hash < IEEE80211_NODE_HASHSIZE; hash++) {
185 - LIST_FOREACH_SAFE(wds, &nt->nt_wds_hash[hash], wds_hash, twds) {
186 - if (wds->wds_agingcount != WDS_AGING_STATIC) {
187 - if (!wds->wds_agingcount) {
188 - LIST_REMOVE(wds, wds_hash);
189 - ieee80211_unref_node(&wds->wds_ni);
190 - FREE(wds, M_80211_WDS);
191 - } else
192 - wds->wds_agingcount--;
193 - }
194 - }
195 - }
196 - IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt);
197 - mod_timer(&nt->nt_wds_aging_timer, jiffies + HZ * WDS_AGING_TIMER_VAL);
198 -}
199 -
200 -
201 /* Add the specified station to the station table.
202 * Allocates a new ieee80211_node* that has a reference count of one
203 * If tmp is 0, it is added to the node table and the reference is used.
204 @@ -1385,34 +1244,6 @@ ieee80211_dup_bss(struct ieee80211vap *v
205 return ni;
206 }
207
208 -static struct ieee80211_node *
209 -#ifdef IEEE80211_DEBUG_REFCNT
210 -ieee80211_find_wds_node_locked_debug(struct ieee80211_node_table *nt,
211 - const u_int8_t *macaddr, const char* func, int line)
212 -#else
213 -ieee80211_find_wds_node_locked(struct ieee80211_node_table *nt,
214 - const u_int8_t *macaddr)
215 -#endif
216 -{
217 - struct ieee80211_wds_addr *wds;
218 - int hash;
219 - IEEE80211_NODE_TABLE_LOCK_ASSERT(nt);
220 -
221 - hash = IEEE80211_NODE_HASH(macaddr);
222 - LIST_FOREACH(wds, &nt->nt_wds_hash[hash], wds_hash) {
223 - if (IEEE80211_ADDR_EQ(wds->wds_macaddr, macaddr)) {
224 - if (wds->wds_agingcount != WDS_AGING_STATIC)
225 - wds->wds_agingcount = WDS_AGING_COUNT; /* reset the aging count */
226 -#ifdef IEEE80211_DEBUG_REFCNT
227 - return ieee80211_ref_node_debug(wds->wds_ni, func, line);
228 -#else
229 - return ieee80211_ref_node(wds->wds_ni);
230 -#endif
231 - }
232 - }
233 - return NULL;
234 -}
235 -
236 /* NB: A node reference is acquired here; the caller MUST release it. */
237 #ifdef IEEE80211_DEBUG_REFCNT
238 #define ieee80211_find_node_locked(nt, mac) \
239 @@ -1430,7 +1261,6 @@ ieee80211_find_node_locked(struct ieee80
240 {
241 struct ieee80211_node *ni;
242 int hash;
243 - struct ieee80211_wds_addr *wds;
244
245 IEEE80211_NODE_TABLE_LOCK_ASSERT(nt);
246
247 @@ -1445,48 +1275,11 @@ ieee80211_find_node_locked(struct ieee80
248 return ni;
249 }
250 }
251 -
252 - /* Now, we look for the desired mac address in the 4 address
253 - nodes. */
254 - LIST_FOREACH(wds, &nt->nt_wds_hash[hash], wds_hash) {
255 - if (IEEE80211_ADDR_EQ(wds->wds_macaddr, macaddr)) {
256 -#ifdef IEEE80211_DEBUG_REFCNT
257 - return ieee80211_ref_node_debug(wds->wds_ni, func, line);
258 -#else
259 - return ieee80211_ref_node(wds->wds_ni);
260 -#endif
261 - }
262 - }
263 return NULL;
264 }
265
266 struct ieee80211_node *
267 #ifdef IEEE80211_DEBUG_REFCNT
268 -ieee80211_find_wds_node_debug(struct ieee80211_node_table *nt, const u_int8_t *macaddr,
269 - const char* func, int line)
270 -#else
271 -ieee80211_find_wds_node(struct ieee80211_node_table *nt, const u_int8_t *macaddr)
272 -#endif
273 -{
274 - struct ieee80211_node *ni;
275 -
276 - IEEE80211_NODE_TABLE_LOCK_IRQ(nt);
277 -#ifdef IEEE80211_DEBUG_REFCNT
278 - ni = ieee80211_find_wds_node_locked_debug(nt, macaddr, func, line);
279 -#else
280 - ni = ieee80211_find_wds_node_locked(nt, macaddr);
281 -#endif
282 - IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt);
283 - return ni;
284 -}
285 -#ifdef IEEE80211_DEBUG_REFCNT
286 -EXPORT_SYMBOL(ieee80211_find_wds_node_debug);
287 -#else
288 -EXPORT_SYMBOL(ieee80211_find_wds_node);
289 -#endif
290 -
291 -struct ieee80211_node *
292 -#ifdef IEEE80211_DEBUG_REFCNT
293 ieee80211_find_node_debug(struct ieee80211_node_table *nt,
294 const u_int8_t *macaddr, const char *func, int line)
295 #else
296 @@ -1838,7 +1631,6 @@ ieee80211_node_table_cleanup(struct ieee
297 ic->ic_node_cleanup(ni);
298 #endif
299 }
300 - del_timer(&nt->nt_wds_aging_timer);
301 IEEE80211_SCAN_LOCK_DESTROY(nt);
302 IEEE80211_NODE_TABLE_LOCK_DESTROY(nt);
303 }
304 @@ -2404,8 +2196,6 @@ ieee80211_node_leave(struct ieee80211_no
305 * so no more references are generated
306 */
307 if (nt) {
308 - ieee80211_remove_wds_addr(nt, ni->ni_macaddr);
309 - ieee80211_del_wds_node(nt, ni);
310 IEEE80211_NODE_TABLE_LOCK_IRQ(nt);
311 node_table_leave_locked(nt, ni);
312 IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt);
313 --- a/net80211/ieee80211_node.h
314 +++ b/net80211/ieee80211_node.h
315 @@ -231,13 +231,6 @@ void ieee80211_sta_leave(struct ieee8021
316 #define WDS_AGING_STATIC 0xffff
317 #define WDS_AGING_TIMER_VAL (WDS_AGING_TIME / 2)
318
319 -struct ieee80211_wds_addr {
320 - LIST_ENTRY(ieee80211_wds_addr) wds_hash;
321 - u_int8_t wds_macaddr[IEEE80211_ADDR_LEN];
322 - struct ieee80211_node *wds_ni;
323 - u_int16_t wds_agingcount;
324 -};
325 -
326 /*
327 * Table of ieee80211_node instances. Each ieee80211com
328 * has at least one for holding the scan candidates.
329 @@ -250,11 +243,9 @@ struct ieee80211_node_table {
330 ieee80211_node_table_lock_t nt_nodelock; /* on node table */
331 TAILQ_HEAD(, ieee80211_node) nt_node; /* information of all nodes */
332 ATH_LIST_HEAD(, ieee80211_node) nt_hash[IEEE80211_NODE_HASHSIZE];
333 - ATH_LIST_HEAD(, ieee80211_wds_addr) nt_wds_hash[IEEE80211_NODE_HASHSIZE];
334 ieee80211_scan_lock_t nt_scanlock; /* on nt_scangen */
335 u_int nt_scangen; /* gen# for timeout scan */
336 int nt_inact_init; /* initial node inact setting */
337 - struct timer_list nt_wds_aging_timer; /* timer to age out wds entries */
338 };
339
340 /* Allocates a new ieee80211_node* that has a reference count of one, and
341 @@ -363,47 +354,6 @@ void
342 ieee80211_unref_node(struct ieee80211_node **pni);
343 #endif /* #ifdef IEEE80211_DEBUG_REFCNT */
344
345 -/* Increments reference count of ieee80211_node *ni */
346 -#ifdef IEEE80211_DEBUG_REFCNT
347 -#define ieee80211_add_wds_addr(_table, _node, _mac, _static) \
348 - ieee80211_add_wds_addr_debug(_table, _node, _mac, _static, __func__, __LINE__)
349 -int ieee80211_add_wds_addr_debug(struct ieee80211_node_table *, struct ieee80211_node *,
350 - const u_int8_t *, u_int8_t, const char* func, int line);
351 -#else
352 -int ieee80211_add_wds_addr(struct ieee80211_node_table *, struct ieee80211_node *,
353 - const u_int8_t *, u_int8_t);
354 -#endif /* #ifdef IEEE80211_DEBUG_REFCNT */
355 -
356 -/* Decrements reference count of ieee80211_node *ni */
357 -#ifdef IEEE80211_DEBUG_REFCNT
358 -#define ieee80211_remove_wds_addr(_table, _mac) \
359 - ieee80211_remove_wds_addr_debug(_table, _mac, __func__, __LINE__)
360 -void ieee80211_remove_wds_addr_debug(struct ieee80211_node_table *, const u_int8_t *,
361 - const char* func, int line);
362 -#else
363 -void ieee80211_remove_wds_addr(struct ieee80211_node_table *, const u_int8_t *);
364 -#endif /* #ifdef IEEE80211_DEBUG_REFCNT */
365 -
366 -/* Decrements reference count of node, if found */
367 -#ifdef IEEE80211_DEBUG_REFCNT
368 -#define ieee80211_del_wds_node(_table, _node) \
369 - ieee80211_del_wds_node_debug(_table, _node, __func__, __LINE__)
370 -void ieee80211_del_wds_node_debug(struct ieee80211_node_table *, struct ieee80211_node *,
371 - const char* func, int line);
372 -#else
373 -void ieee80211_del_wds_node(struct ieee80211_node_table *, struct ieee80211_node *);
374 -#endif /* #ifdef IEEE80211_DEBUG_REFCNT */
375 -
376 -/* Increments reference count of node, if found */
377 -#ifdef IEEE80211_DEBUG_REFCNT
378 -#define ieee80211_find_wds_node(_table, _mac) \
379 - ieee80211_find_wds_node_debug(_table, _mac, __func__, __LINE__)
380 -struct ieee80211_node *ieee80211_find_wds_node_debug(struct ieee80211_node_table *,
381 - const u_int8_t *, const char* func, int line);
382 -#else
383 -struct ieee80211_node *ieee80211_find_wds_node(struct ieee80211_node_table *,
384 - const u_int8_t *);
385 -#endif /* #ifdef IEEE80211_DEBUG_REFCNT */
386 typedef void ieee80211_iter_func(void *, struct ieee80211_node *);
387 void ieee80211_iterate_nodes(struct ieee80211_node_table *,
388 ieee80211_iter_func *, void *);