Commit | Line | Data |
---|---|---|
4855d25b JB |
1 | /* |
2 | * Internal softmac API definitions. | |
3 | * | |
79859051 JB |
4 | * Copyright (c) 2005, 2006 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> | |
4855d25b JB |
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 | ||
370121e5 JB |
27 | #ifndef IEEE80211SOFTMAC_PRIV_H_ |
28 | #define IEEE80211SOFTMAC_PRIV_H_ | |
29 | ||
30 | #include <net/ieee80211softmac.h> | |
31 | #include <net/ieee80211softmac_wx.h> | |
32 | #include <linux/kernel.h> | |
33 | #include <linux/stringify.h> | |
34 | ||
35 | ||
36 | #define PFX "SoftMAC: " | |
37 | ||
38 | #ifdef assert | |
39 | # undef assert | |
40 | #endif | |
41 | #ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG | |
42 | #define assert(expr) \ | |
43 | do { \ | |
44 | if (unlikely(!(expr))) { \ | |
45 | printkl(KERN_ERR PFX "ASSERTION FAILED (%s) at: %s:%d:%s()\n", #expr, \ | |
46 | __FILE__, __LINE__, __FUNCTION__); \ | |
47 | } \ | |
48 | } while (0) | |
49 | #else | |
50 | #define assert(expr) do {} while (0) | |
51 | #endif | |
52 | ||
53 | /* rate limited printk(). */ | |
54 | #ifdef printkl | |
55 | # undef printkl | |
56 | #endif | |
57 | #define printkl(f, x...) do { if (printk_ratelimit()) printk(f ,##x); } while (0) | |
58 | /* rate limited printk() for debugging */ | |
59 | #ifdef dprintkl | |
60 | # undef dprintkl | |
61 | #endif | |
62 | #ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG | |
63 | # define dprintkl printkl | |
64 | #else | |
65 | # define dprintkl(f, x...) do { /* nothing */ } while (0) | |
66 | #endif | |
67 | ||
68 | /* debugging printk() */ | |
69 | #ifdef dprintk | |
70 | # undef dprintk | |
71 | #endif | |
72 | #ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG | |
73 | # define dprintk(f, x...) do { printk(f ,##x); } while (0) | |
74 | #else | |
75 | # define dprintk(f, x...) do { /* nothing */ } while (0) | |
76 | #endif | |
77 | ||
370121e5 JB |
78 | /* private definitions and prototypes */ |
79 | ||
80 | /*** prototypes from _scan.c */ | |
81 | void ieee80211softmac_scan(void *sm); | |
82 | /* for internal use if scanning is needed */ | |
83 | int ieee80211softmac_start_scan(struct ieee80211softmac_device *mac); | |
84 | void ieee80211softmac_stop_scan(struct ieee80211softmac_device *mac); | |
85 | void ieee80211softmac_wait_for_scan(struct ieee80211softmac_device *mac); | |
86 | ||
87 | /* for use by _module.c to assign to the callbacks */ | |
88 | int ieee80211softmac_start_scan_implementation(struct net_device *dev); | |
89 | void ieee80211softmac_stop_scan_implementation(struct net_device *dev); | |
90 | void ieee80211softmac_wait_for_scan_implementation(struct net_device *dev); | |
91 | ||
92 | /*** Network prototypes from _module.c */ | |
93 | struct ieee80211softmac_network * ieee80211softmac_create_network( | |
94 | struct ieee80211softmac_device *mac, struct ieee80211_network *net); | |
95 | void ieee80211softmac_add_network_locked(struct ieee80211softmac_device *mac, | |
96 | struct ieee80211softmac_network *net); | |
97 | void ieee80211softmac_add_network(struct ieee80211softmac_device *mac, | |
98 | struct ieee80211softmac_network *net); | |
99 | void ieee80211softmac_del_network_locked(struct ieee80211softmac_device *mac, | |
100 | struct ieee80211softmac_network *net); | |
101 | void ieee80211softmac_del_network(struct ieee80211softmac_device *mac, | |
102 | struct ieee80211softmac_network *net); | |
103 | struct ieee80211softmac_network * ieee80211softmac_get_network_by_bssid_locked( | |
104 | struct ieee80211softmac_device *mac, u8 *ea); | |
105 | struct ieee80211softmac_network * ieee80211softmac_get_network_by_bssid( | |
106 | struct ieee80211softmac_device *mac, u8 *ea); | |
107 | struct ieee80211softmac_network * ieee80211softmac_get_network_by_ssid_locked( | |
108 | struct ieee80211softmac_device *mac, u8 *ssid, u8 ssid_len); | |
109 | struct ieee80211softmac_network * ieee80211softmac_get_network_by_ssid( | |
110 | struct ieee80211softmac_device *mac, u8 *ssid, u8 ssid_len); | |
714e1a51 JB |
111 | struct ieee80211softmac_network * |
112 | ieee80211softmac_get_network_by_essid_locked(struct ieee80211softmac_device *mac, | |
113 | struct ieee80211softmac_essid *essid); | |
114 | struct ieee80211softmac_network * | |
115 | ieee80211softmac_get_network_by_essid(struct ieee80211softmac_device *mac, | |
116 | struct ieee80211softmac_essid *essid); | |
370121e5 JB |
117 | |
118 | /* Rates related */ | |
119 | u8 ieee80211softmac_lower_rate_delta(struct ieee80211softmac_device *mac, u8 rate, int delta); | |
120 | static inline u8 lower_rate(struct ieee80211softmac_device *mac, u8 rate) { | |
121 | return ieee80211softmac_lower_rate_delta(mac, rate, 1); | |
122 | } | |
123 | ||
124 | static inline u8 get_fallback_rate(struct ieee80211softmac_device *mac, u8 rate) | |
125 | { | |
126 | return ieee80211softmac_lower_rate_delta(mac, rate, 2); | |
127 | } | |
128 | ||
129 | ||
130 | /*** prototypes from _io.c */ | |
131 | int ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac, | |
132 | void* ptrarg, u32 type, u32 arg); | |
133 | ||
134 | /*** prototypes from _auth.c */ | |
135 | /* do these have to go into the public header? */ | |
136 | int ieee80211softmac_auth_req(struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net); | |
137 | int ieee80211softmac_deauth_req(struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net, int reason); | |
138 | ||
139 | /* for use by _module.c to assign to the callbacks */ | |
140 | int ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth); | |
b10c991f | 141 | int ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_deauth *deauth); |
370121e5 JB |
142 | |
143 | /*** prototypes from _assoc.c */ | |
144 | void ieee80211softmac_assoc_work(void *d); | |
145 | int ieee80211softmac_handle_assoc_response(struct net_device * dev, | |
146 | struct ieee80211_assoc_response * resp, | |
147 | struct ieee80211_network * network); | |
148 | int ieee80211softmac_handle_disassoc(struct net_device * dev, | |
149 | struct ieee80211_disassoc * disassoc); | |
b6c7658e JB |
150 | int ieee80211softmac_handle_reassoc_req(struct net_device * dev, |
151 | struct ieee80211_reassoc_request * reassoc); | |
370121e5 | 152 | void ieee80211softmac_assoc_timeout(void *d); |
9a1771e8 | 153 | void ieee80211softmac_disassoc(struct ieee80211softmac_device *mac, u16 reason); |
370121e5 JB |
154 | |
155 | /* some helper functions */ | |
156 | static inline int ieee80211softmac_scan_handlers_check_self(struct ieee80211softmac_device *sm) | |
157 | { | |
158 | return (sm->start_scan == ieee80211softmac_start_scan_implementation) && | |
159 | (sm->stop_scan == ieee80211softmac_stop_scan_implementation) && | |
160 | (sm->wait_for_scan == ieee80211softmac_wait_for_scan_implementation); | |
161 | } | |
162 | ||
163 | static inline int ieee80211softmac_scan_sanity_check(struct ieee80211softmac_device *sm) | |
164 | { | |
165 | return ((sm->start_scan != ieee80211softmac_start_scan_implementation) && | |
166 | (sm->stop_scan != ieee80211softmac_stop_scan_implementation) && | |
167 | (sm->wait_for_scan != ieee80211softmac_wait_for_scan_implementation) | |
168 | ) || ieee80211softmac_scan_handlers_check_self(sm); | |
169 | } | |
170 | ||
16f43527 | 171 | #define IEEE80211SOFTMAC_PROBE_DELAY HZ/50 |
370121e5 JB |
172 | #define IEEE80211SOFTMAC_WORKQUEUE_NAME_LEN (17 + IFNAMSIZ) |
173 | ||
174 | struct ieee80211softmac_network { | |
175 | struct list_head list; /* List */ | |
176 | /* Network information copied from ieee80211_network */ | |
177 | u8 bssid[ETH_ALEN]; | |
178 | u8 channel; | |
179 | struct ieee80211softmac_essid essid; | |
180 | ||
181 | struct ieee80211softmac_ratesinfo supported_rates; | |
182 | ||
183 | /* SoftMAC specific */ | |
184 | u16 authenticating:1, /* Status Flags */ | |
185 | authenticated:1, | |
186 | auth_desynced_once:1; | |
187 | ||
188 | u16 capabilities; /* Capabilities bitfield */ | |
189 | u8 challenge_len; /* Auth Challenge length */ | |
190 | char *challenge; /* Challenge Text */ | |
191 | }; | |
192 | ||
193 | /* structure used to keep track of networks we're auth'ing to */ | |
194 | struct ieee80211softmac_auth_queue_item { | |
195 | struct list_head list; /* List head */ | |
196 | struct ieee80211softmac_network *net; /* Network to auth */ | |
197 | struct ieee80211softmac_device *mac; /* SoftMAC device */ | |
198 | u8 retry; /* Retry limit */ | |
199 | u8 state; /* Auth State */ | |
200 | struct work_struct work; /* Work queue */ | |
201 | }; | |
202 | ||
203 | /* scanning information */ | |
204 | struct ieee80211softmac_scaninfo { | |
205 | u8 current_channel_idx, | |
206 | number_channels; | |
207 | struct ieee80211_channel *channels; | |
208 | u8 started:1, | |
209 | stop:1; | |
210 | u8 skip_flags; | |
211 | struct completion finished; | |
212 | struct work_struct softmac_scan; | |
213 | }; | |
214 | ||
215 | /* private event struct */ | |
216 | struct ieee80211softmac_event { | |
217 | struct list_head list; | |
218 | int event_type; | |
219 | void *event_context; | |
220 | struct work_struct work; | |
221 | notify_function_ptr fun; | |
222 | void *context; | |
223 | struct ieee80211softmac_device *mac; | |
224 | }; | |
225 | ||
226 | void ieee80211softmac_call_events(struct ieee80211softmac_device *mac, int event, void *event_context); | |
227 | void ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int event, void *event_context); | |
228 | int ieee80211softmac_notify_internal(struct ieee80211softmac_device *mac, | |
229 | int event, void *event_context, notify_function_ptr fun, void *context, gfp_t gfp_mask); | |
230 | ||
231 | #endif /* IEEE80211SOFTMAC_PRIV_H_ */ |