| 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 *); |
| 389 | |