| Johannes Berg | 4855d25 | 2006-01-12 21:12:59 +0100 | [diff] [blame] | 1 | /* | 
|  | 2 | * ieee80211softmac.h - public interface to the softmac | 
|  | 3 | * | 
|  | 4 | * Copyright (c) 2005 Johannes Berg <johannes@sipsolutions.net> | 
|  | 5 | *                    Joseph Jezak <josejx@gentoo.org> | 
|  | 6 | *                    Larry Finger <Larry.Finger@lwfinger.net> | 
|  | 7 | *                    Danny van Dyk <kugelfang@gentoo.org> | 
|  | 8 | *                    Michael Buesch <mbuesch@freenet.de> | 
|  | 9 | * | 
|  | 10 | * This program is free software; you can redistribute it and/or modify it | 
|  | 11 | * under the terms of version 2 of the GNU General Public License as | 
|  | 12 | * published by the Free Software Foundation. | 
|  | 13 | * | 
|  | 14 | * This program is distributed in the hope that it will be useful, but WITHOUT | 
|  | 15 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|  | 16 | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for | 
|  | 17 | * more details. | 
|  | 18 | * | 
|  | 19 | * You should have received a copy of the GNU General Public License | 
|  | 20 | * along with this program; if not, write to the Free Software | 
|  | 21 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA | 
|  | 22 | * | 
|  | 23 | * The full GNU General Public License is included in this distribution in the | 
|  | 24 | * file called COPYING. | 
|  | 25 | */ | 
|  | 26 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 27 | #ifndef IEEE80211SOFTMAC_H_ | 
|  | 28 | #define IEEE80211SOFTMAC_H_ | 
|  | 29 |  | 
|  | 30 | #include <linux/kernel.h> | 
|  | 31 | #include <linux/spinlock.h> | 
|  | 32 | #include <linux/workqueue.h> | 
|  | 33 | #include <linux/list.h> | 
|  | 34 | #include <net/ieee80211.h> | 
|  | 35 |  | 
|  | 36 | /* Once the API is considered more or less stable, | 
|  | 37 | * this should be incremented on API incompatible changes. | 
|  | 38 | */ | 
|  | 39 | #define IEEE80211SOFTMAC_API	0 | 
|  | 40 |  | 
|  | 41 | #define IEEE80211SOFTMAC_MAX_RATES_LEN		8 | 
|  | 42 | #define IEEE80211SOFTMAC_MAX_EX_RATES_LEN	255 | 
|  | 43 |  | 
|  | 44 | struct ieee80211softmac_ratesinfo { | 
|  | 45 | u8 count; | 
|  | 46 | u8 rates[IEEE80211SOFTMAC_MAX_RATES_LEN + IEEE80211SOFTMAC_MAX_EX_RATES_LEN]; | 
|  | 47 | }; | 
|  | 48 |  | 
|  | 49 | /* internal structures */ | 
|  | 50 | struct ieee80211softmac_network; | 
|  | 51 | struct ieee80211softmac_scaninfo; | 
|  | 52 |  | 
|  | 53 | struct ieee80211softmac_essid { | 
|  | 54 | u8 len; | 
|  | 55 | char data[IW_ESSID_MAX_SIZE+1]; | 
|  | 56 | }; | 
|  | 57 |  | 
|  | 58 | struct ieee80211softmac_wpa { | 
|  | 59 | char *IE; | 
|  | 60 | int IElen; | 
|  | 61 | int IEbuflen; | 
|  | 62 | }; | 
|  | 63 |  | 
|  | 64 | /* | 
|  | 65 | * Information about association | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 66 | */ | 
|  | 67 | struct ieee80211softmac_assoc_info { | 
| Michael Buesch | 7c28ad2 | 2006-09-27 15:26:33 +0300 | [diff] [blame] | 68 |  | 
|  | 69 | struct mutex mutex; | 
|  | 70 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 71 | /* | 
|  | 72 | * This is the requested ESSID. It is written | 
|  | 73 | * only by the WX handlers. | 
|  | 74 | * | 
|  | 75 | */ | 
|  | 76 | struct ieee80211softmac_essid req_essid; | 
|  | 77 | /* | 
|  | 78 | * the ESSID of the network we're currently | 
|  | 79 | * associated (or trying) to. This is | 
|  | 80 | * updated to the network's actual ESSID | 
|  | 81 | * even if the requested ESSID was 'ANY' | 
|  | 82 | */ | 
|  | 83 | struct ieee80211softmac_essid associate_essid; | 
|  | 84 |  | 
|  | 85 | /* BSSID we're trying to associate to */ | 
|  | 86 | char bssid[ETH_ALEN]; | 
|  | 87 |  | 
|  | 88 | /* some flags. | 
|  | 89 | * static_essid is valid if the essid is constant, | 
|  | 90 | * this is for use by the wx handlers only. | 
|  | 91 | * | 
|  | 92 | * associating is true, if the network has been | 
|  | 93 | * auth'ed on and we are in the process of associating. | 
|  | 94 | * | 
|  | 95 | * bssvalid is true if we found a matching network | 
|  | 96 | * and saved it's BSSID into the bssid above. | 
| Johannes Berg | 818667f | 2006-04-20 20:02:03 +0200 | [diff] [blame] | 97 | * | 
|  | 98 | * bssfixed is used for SIOCSIWAP. | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 99 | */ | 
| Michael Buesch | 7c28ad2 | 2006-09-27 15:26:33 +0300 | [diff] [blame] | 100 | u8 static_essid; | 
|  | 101 | u8 short_preamble_available; | 
|  | 102 | u8 associating; | 
|  | 103 | u8 associated; | 
|  | 104 | u8 assoc_wait; | 
|  | 105 | u8 bssvalid; | 
|  | 106 | u8 bssfixed; | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 107 |  | 
|  | 108 | /* Scan retries remaining */ | 
|  | 109 | int scan_retry; | 
|  | 110 |  | 
| David Howells | c402895 | 2006-11-22 14:57:56 +0000 | [diff] [blame] | 111 | struct delayed_work work; | 
|  | 112 | struct delayed_work timeout; | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 113 | }; | 
|  | 114 |  | 
| Daniel Drake | 5acd0c4 | 2006-07-18 21:33:27 +0100 | [diff] [blame] | 115 | struct ieee80211softmac_bss_info { | 
|  | 116 | /* Rates supported by the network */ | 
|  | 117 | struct ieee80211softmac_ratesinfo supported_rates; | 
|  | 118 |  | 
|  | 119 | /* This indicates whether frames can currently be transmitted with | 
|  | 120 | * short preamble (only use this variable during TX at CCK rates) */ | 
|  | 121 | u8 short_preamble:1; | 
|  | 122 |  | 
|  | 123 | /* This indicates whether protection (e.g. self-CTS) should be used | 
|  | 124 | * when transmitting with OFDM modulation */ | 
|  | 125 | u8 use_protection:1; | 
|  | 126 | }; | 
|  | 127 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 128 | enum { | 
|  | 129 | IEEE80211SOFTMAC_AUTH_OPEN_REQUEST	= 1, | 
|  | 130 | IEEE80211SOFTMAC_AUTH_OPEN_RESPONSE	= 2, | 
|  | 131 | }; | 
|  | 132 |  | 
|  | 133 | enum { | 
|  | 134 | IEEE80211SOFTMAC_AUTH_SHARED_REQUEST	= 1, | 
|  | 135 | IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE = 2, | 
|  | 136 | IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE	= 3, | 
|  | 137 | IEEE80211SOFTMAC_AUTH_SHARED_PASS	= 4, | 
|  | 138 | }; | 
|  | 139 |  | 
|  | 140 | /* We should make these tunable | 
|  | 141 | * AUTH_TIMEOUT seems really long, but that's what it is in BSD */ | 
|  | 142 | #define IEEE80211SOFTMAC_AUTH_TIMEOUT		(12 * HZ) | 
|  | 143 | #define IEEE80211SOFTMAC_AUTH_RETRY_LIMIT	5 | 
|  | 144 | #define IEEE80211SOFTMAC_ASSOC_SCAN_RETRY_LIMIT	3 | 
|  | 145 |  | 
|  | 146 | struct ieee80211softmac_txrates { | 
|  | 147 | /* The Bit-Rate to be used for multicast frames. */ | 
|  | 148 | u8 mcast_rate; | 
| Daniel Drake | 8462fe3 | 2006-05-01 22:45:50 +0100 | [diff] [blame] | 149 |  | 
|  | 150 | /* The Bit-Rate to be used for multicast management frames. */ | 
|  | 151 | u8 mgt_mcast_rate; | 
|  | 152 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 153 | /* The Bit-Rate to be used for any other (normal) data packet. */ | 
|  | 154 | u8 default_rate; | 
|  | 155 | /* The Bit-Rate to be used for default fallback | 
|  | 156 | * (If the device supports fallback and hardware-retry) | 
|  | 157 | */ | 
|  | 158 | u8 default_fallback; | 
| Daniel Drake | 8462fe3 | 2006-05-01 22:45:50 +0100 | [diff] [blame] | 159 |  | 
|  | 160 | /* This is the rate that the user asked for */ | 
|  | 161 | u8 user_rate; | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 162 | }; | 
|  | 163 |  | 
|  | 164 | /* Bits for txrates_change callback. */ | 
|  | 165 | #define IEEE80211SOFTMAC_TXRATECHG_DEFAULT		(1 << 0) /* default_rate */ | 
|  | 166 | #define IEEE80211SOFTMAC_TXRATECHG_DEFAULT_FBACK	(1 << 1) /* default_fallback */ | 
|  | 167 | #define IEEE80211SOFTMAC_TXRATECHG_MCAST		(1 << 2) /* mcast_rate */ | 
| Daniel Drake | 8462fe3 | 2006-05-01 22:45:50 +0100 | [diff] [blame] | 168 | #define IEEE80211SOFTMAC_TXRATECHG_MGT_MCAST		(1 << 3) /* mgt_mcast_rate */ | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 169 |  | 
| Daniel Drake | 5acd0c4 | 2006-07-18 21:33:27 +0100 | [diff] [blame] | 170 | #define IEEE80211SOFTMAC_BSSINFOCHG_RATES		(1 << 0) /* supported_rates */ | 
|  | 171 | #define IEEE80211SOFTMAC_BSSINFOCHG_SHORT_PREAMBLE	(1 << 1) /* short_preamble */ | 
|  | 172 | #define IEEE80211SOFTMAC_BSSINFOCHG_PROTECTION		(1 << 2) /* use_protection */ | 
|  | 173 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 174 | struct ieee80211softmac_device { | 
|  | 175 | /* 802.11 structure for data stuff */ | 
|  | 176 | struct ieee80211_device *ieee; | 
|  | 177 | struct net_device *dev; | 
|  | 178 |  | 
|  | 179 | /* only valid if associated, then holds the Association ID */ | 
|  | 180 | u16 association_id; | 
|  | 181 |  | 
|  | 182 | /* the following methods are callbacks that the driver | 
|  | 183 | * using this framework has to assign | 
|  | 184 | */ | 
|  | 185 |  | 
|  | 186 | /* always assign these */ | 
|  | 187 | void (*set_bssid_filter)(struct net_device *dev, const u8 *bssid); | 
|  | 188 | void (*set_channel)(struct net_device *dev, u8 channel); | 
|  | 189 |  | 
|  | 190 | /* assign if you need it, informational only */ | 
|  | 191 | void (*link_change)(struct net_device *dev); | 
|  | 192 |  | 
|  | 193 | /* If the hardware can do scanning, assign _all_ three of these callbacks. | 
|  | 194 | * When the scan finishes, call ieee80211softmac_scan_finished(). | 
|  | 195 | */ | 
|  | 196 |  | 
|  | 197 | /* when called, start_scan is guaranteed to not be called again | 
|  | 198 | * until you call ieee80211softmac_scan_finished. | 
|  | 199 | * Return 0 if scanning could start, error otherwise. | 
|  | 200 | * SOFTMAC AUTHORS: don't call this, use ieee80211softmac_start_scan */ | 
|  | 201 | int (*start_scan)(struct net_device *dev); | 
|  | 202 | /* this should block until after ieee80211softmac_scan_finished was called | 
|  | 203 | * SOFTMAC AUTHORS: don't call this, use ieee80211softmac_wait_for_scan */ | 
|  | 204 | void (*wait_for_scan)(struct net_device *dev); | 
|  | 205 | /* stop_scan aborts a scan, but is asynchronous. | 
|  | 206 | * if you want to wait for it too, use wait_for_scan | 
|  | 207 | * SOFTMAC AUTHORS: don't call this, use ieee80211softmac_stop_scan */ | 
|  | 208 | void (*stop_scan)(struct net_device *dev); | 
|  | 209 |  | 
|  | 210 | /* we'll need something about beacons here too, for AP or ad-hoc modes */ | 
|  | 211 |  | 
|  | 212 | /* Transmission rates to be used by the driver. | 
|  | 213 | * The SoftMAC figures out the best possible rates. | 
|  | 214 | * The driver just needs to read them. | 
|  | 215 | */ | 
|  | 216 | struct ieee80211softmac_txrates txrates; | 
| Daniel Drake | 5acd0c4 | 2006-07-18 21:33:27 +0100 | [diff] [blame] | 217 |  | 
|  | 218 | /* If the driver needs to do stuff on TX rate changes, assign this | 
|  | 219 | * callback. See IEEE80211SOFTMAC_TXRATECHG for change flags. */ | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 220 | void (*txrates_change)(struct net_device *dev, | 
| Daniel Drake | 5acd0c4 | 2006-07-18 21:33:27 +0100 | [diff] [blame] | 221 | u32 changes); | 
|  | 222 |  | 
|  | 223 | /* If the driver needs to do stuff when BSS properties change, assign | 
|  | 224 | * this callback. see IEEE80211SOFTMAC_BSSINFOCHG for change flags. */ | 
|  | 225 | void (*bssinfo_change)(struct net_device *dev, | 
|  | 226 | u32 changes); | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 227 |  | 
|  | 228 | /* private stuff follows */ | 
|  | 229 | /* this lock protects this structure */ | 
|  | 230 | spinlock_t lock; | 
| Michael Buesch | 7c28ad2 | 2006-09-27 15:26:33 +0300 | [diff] [blame] | 231 |  | 
| Johannes Berg | 501d857 | 2007-10-03 18:14:23 -0700 | [diff] [blame] | 232 | struct workqueue_struct *wq; | 
|  | 233 |  | 
| Michael Buesch | 7c28ad2 | 2006-09-27 15:26:33 +0300 | [diff] [blame] | 234 | u8 running; /* SoftMAC started? */ | 
|  | 235 | u8 scanning; | 
|  | 236 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 237 | struct ieee80211softmac_scaninfo *scaninfo; | 
|  | 238 | struct ieee80211softmac_assoc_info associnfo; | 
| Daniel Drake | 5acd0c4 | 2006-07-18 21:33:27 +0100 | [diff] [blame] | 239 | struct ieee80211softmac_bss_info bssinfo; | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 240 |  | 
|  | 241 | struct list_head auth_queue; | 
|  | 242 | struct list_head events; | 
|  | 243 |  | 
|  | 244 | struct ieee80211softmac_ratesinfo ratesinfo; | 
|  | 245 | int txrate_badness; | 
|  | 246 |  | 
|  | 247 | /* WPA stuff */ | 
|  | 248 | struct ieee80211softmac_wpa wpa; | 
|  | 249 |  | 
|  | 250 | /* we need to keep a list of network structs we copied */ | 
|  | 251 | struct list_head network_list; | 
| Michael Buesch | 7c28ad2 | 2006-09-27 15:26:33 +0300 | [diff] [blame] | 252 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 253 | /* This must be the last item so that it points to the data | 
|  | 254 | * allocated beyond this structure by alloc_ieee80211 */ | 
|  | 255 | u8 priv[0]; | 
|  | 256 | }; | 
|  | 257 |  | 
|  | 258 | extern void ieee80211softmac_scan_finished(struct ieee80211softmac_device *sm); | 
|  | 259 |  | 
|  | 260 | static inline void * ieee80211softmac_priv(struct net_device *dev) | 
|  | 261 | { | 
|  | 262 | return ((struct ieee80211softmac_device *)ieee80211_priv(dev))->priv; | 
|  | 263 | } | 
|  | 264 |  | 
|  | 265 | extern struct net_device * alloc_ieee80211softmac(int sizeof_priv); | 
|  | 266 | extern void free_ieee80211softmac(struct net_device *dev); | 
|  | 267 |  | 
|  | 268 | /* Call this function if you detect a lost TX fragment. | 
|  | 269 | * (If the device indicates failure of ACK RX, for example.) | 
|  | 270 | * It is wise to call this function if you are able to detect lost packets, | 
|  | 271 | * because it contributes to the TX Rates auto adjustment. | 
|  | 272 | */ | 
|  | 273 | extern void ieee80211softmac_fragment_lost(struct net_device *dev, | 
|  | 274 | u16 wireless_sequence_number); | 
|  | 275 | /* Call this function before _start to tell the softmac what rates | 
|  | 276 | * the hw supports. The rates parameter is copied, so you can | 
|  | 277 | * free it right after calling this function. | 
|  | 278 | * Note that the rates need to be sorted. */ | 
|  | 279 | extern void ieee80211softmac_set_rates(struct net_device *dev, u8 count, u8 *rates); | 
|  | 280 |  | 
| Daniel Drake | d7712ac | 2006-07-18 21:34:56 +0100 | [diff] [blame] | 281 | /* Finds the highest rate which is: | 
|  | 282 | *  1. Present in ri (optionally a basic rate) | 
|  | 283 | *  2. Supported by the device | 
|  | 284 | *  3. Less than or equal to the user-defined rate | 
|  | 285 | */ | 
|  | 286 | extern u8 ieee80211softmac_highest_supported_rate(struct ieee80211softmac_device *mac, | 
|  | 287 | struct ieee80211softmac_ratesinfo *ri, int basic_only); | 
|  | 288 |  | 
| Daniel Drake | 8462fe3 | 2006-05-01 22:45:50 +0100 | [diff] [blame] | 289 | /* Helper function which advises you the rate at which a frame should be | 
|  | 290 | * transmitted at. */ | 
|  | 291 | static inline u8 ieee80211softmac_suggest_txrate(struct ieee80211softmac_device *mac, | 
|  | 292 | int is_multicast, | 
|  | 293 | int is_mgt) | 
|  | 294 | { | 
|  | 295 | struct ieee80211softmac_txrates *txrates = &mac->txrates; | 
|  | 296 |  | 
| Michael Buesch | 7c28ad2 | 2006-09-27 15:26:33 +0300 | [diff] [blame] | 297 | if (!mac->associnfo.associated) | 
| Daniel Drake | 8462fe3 | 2006-05-01 22:45:50 +0100 | [diff] [blame] | 298 | return txrates->mgt_mcast_rate; | 
|  | 299 |  | 
|  | 300 | /* We are associated, sending unicast frame */ | 
|  | 301 | if (!is_multicast) | 
|  | 302 | return txrates->default_rate; | 
|  | 303 |  | 
|  | 304 | /* We are associated, sending multicast frame */ | 
|  | 305 | if (is_mgt) | 
|  | 306 | return txrates->mgt_mcast_rate; | 
|  | 307 | else | 
|  | 308 | return txrates->mcast_rate; | 
|  | 309 | } | 
|  | 310 |  | 
| Daniel Drake | 5acd0c4 | 2006-07-18 21:33:27 +0100 | [diff] [blame] | 311 | /* Helper function which advises you when it is safe to transmit with short | 
|  | 312 | * preamble. | 
|  | 313 | * You should only call this function when transmitting at CCK rates. */ | 
|  | 314 | static inline int ieee80211softmac_short_preamble_ok(struct ieee80211softmac_device *mac, | 
|  | 315 | int is_multicast, | 
|  | 316 | int is_mgt) | 
|  | 317 | { | 
|  | 318 | return (is_multicast && is_mgt) ? 0 : mac->bssinfo.short_preamble; | 
|  | 319 | } | 
|  | 320 |  | 
|  | 321 | /* Helper function which advises you whether protection (e.g. self-CTS) is | 
|  | 322 | * needed. 1 = protection needed, 0 = no protection needed | 
|  | 323 | * Only use this function when transmitting with OFDM modulation. */ | 
|  | 324 | static inline int ieee80211softmac_protection_needed(struct ieee80211softmac_device *mac) | 
|  | 325 | { | 
|  | 326 | return mac->bssinfo.use_protection; | 
|  | 327 | } | 
|  | 328 |  | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 329 | /* Start the SoftMAC. Call this after you initialized the device | 
|  | 330 | * and it is ready to run. | 
|  | 331 | */ | 
|  | 332 | extern void ieee80211softmac_start(struct net_device *dev); | 
|  | 333 | /* Stop the SoftMAC. Call this before you shutdown the device. */ | 
|  | 334 | extern void ieee80211softmac_stop(struct net_device *dev); | 
|  | 335 |  | 
|  | 336 | /* | 
|  | 337 | * Event system | 
|  | 338 | */ | 
|  | 339 |  | 
|  | 340 | /* valid event types */ | 
|  | 341 | #define IEEE80211SOFTMAC_EVENT_ANY			-1 /*private use only*/ | 
|  | 342 | #define IEEE80211SOFTMAC_EVENT_SCAN_FINISHED		0 | 
|  | 343 | #define IEEE80211SOFTMAC_EVENT_ASSOCIATED		1 | 
|  | 344 | #define IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED		2 | 
|  | 345 | #define IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT	3 | 
|  | 346 | #define IEEE80211SOFTMAC_EVENT_AUTHENTICATED		4 | 
|  | 347 | #define IEEE80211SOFTMAC_EVENT_AUTH_FAILED		5 | 
|  | 348 | #define IEEE80211SOFTMAC_EVENT_AUTH_TIMEOUT		6 | 
|  | 349 | #define IEEE80211SOFTMAC_EVENT_ASSOCIATE_NET_NOT_FOUND	7 | 
| Johannes Berg | feeeaa8 | 2006-04-13 02:42:42 +0200 | [diff] [blame] | 350 | #define IEEE80211SOFTMAC_EVENT_DISASSOCIATED		8 | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 351 | /* keep this updated! */ | 
| Johannes Berg | feeeaa8 | 2006-04-13 02:42:42 +0200 | [diff] [blame] | 352 | #define IEEE80211SOFTMAC_EVENT_LAST			8 | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 353 | /* | 
|  | 354 | * If you want to be notified of certain events, you can call | 
|  | 355 | * ieee80211softmac_notify[_atomic] with | 
|  | 356 | * 	- event set to one of the constants below | 
|  | 357 | * 	- fun set to a function pointer of the appropriate type | 
|  | 358 | *	- context set to the context data you want passed | 
|  | 359 | * The return value is 0, or an error. | 
|  | 360 | */ | 
| Daniel Drake | 6ae15df | 2006-06-01 15:37:22 +0100 | [diff] [blame] | 361 | typedef void (*notify_function_ptr)(struct net_device *dev, int event_type, void *context); | 
| Johannes Berg | 370121e | 2006-01-04 16:32:16 +0100 | [diff] [blame] | 362 |  | 
|  | 363 | #define ieee80211softmac_notify(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_KERNEL); | 
|  | 364 | #define ieee80211softmac_notify_atomic(dev, event, fun, context) ieee80211softmac_notify_gfp(dev, event, fun, context, GFP_ATOMIC); | 
|  | 365 |  | 
|  | 366 | extern int ieee80211softmac_notify_gfp(struct net_device *dev, | 
|  | 367 | int event, notify_function_ptr fun, void *context, gfp_t gfp_mask); | 
|  | 368 |  | 
|  | 369 | /* To clear pending work (for ifconfig down, etc.) */ | 
|  | 370 | extern void | 
|  | 371 | ieee80211softmac_clear_pending_work(struct ieee80211softmac_device *sm); | 
|  | 372 |  | 
|  | 373 | #endif /* IEEE80211SOFTMAC_H_ */ |