summaryrefslogtreecommitdiff
path: root/net/ieee80211/softmac/ieee80211softmac_priv.h
blob: 44a8ba45355c8112ba5605450d9563c845858e90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
#ifndef IEEE80211SOFTMAC_PRIV_H_
#define IEEE80211SOFTMAC_PRIV_H_

#include <net/ieee80211softmac.h>
#include <net/ieee80211softmac_wx.h>
#include <linux/kernel.h>
#include <linux/stringify.h>


#define PFX				"SoftMAC: "

#ifdef assert
# undef assert
#endif
#ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG
#define assert(expr) \
	do {										\
		if (unlikely(!(expr))) {						\
		printkl(KERN_ERR PFX "ASSERTION FAILED (%s) at: %s:%d:%s()\n", #expr,	\
			__FILE__, __LINE__, __FUNCTION__);				\
		}									\
	} while (0)
#else
#define assert(expr) do {} while (0)
#endif

/* rate limited printk(). */
#ifdef printkl
# undef printkl
#endif
#define printkl(f, x...)  do { if (printk_ratelimit()) printk(f ,##x); } while (0)
/* rate limited printk() for debugging */
#ifdef dprintkl
# undef dprintkl
#endif
#ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG
# define dprintkl		printkl
#else
# define dprintkl(f, x...)	do { /* nothing */ } while (0)
#endif

/* debugging printk() */
#ifdef dprintk
# undef dprintk
#endif
#ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG
# define dprintk(f, x...)  do { printk(f ,##x); } while (0)
#else
# define dprintk(f, x...)  do { /* nothing */ } while (0)
#endif

#ifdef function_enter
# undef function_enter
#endif
#ifdef CONFIG_IEEE80211_SOFTMAC_DEBUG
# define function_enter() do { printk(KERN_DEBUG PFX "%s:%d:%s()\n", __FILE__, __LINE__, __FUNCTION__); } while (0)
#else
# define function_enter() do { /* nothing */ } while (0)
#endif

/* private definitions and prototypes */

/*** prototypes from _scan.c */
void ieee80211softmac_scan(void *sm);
/* for internal use if scanning is needed */
int ieee80211softmac_start_scan(struct ieee80211softmac_device *mac);
void ieee80211softmac_stop_scan(struct ieee80211softmac_device *mac);
void ieee80211softmac_wait_for_scan(struct ieee80211softmac_device *mac);

/* for use by _module.c to assign to the callbacks */
int ieee80211softmac_start_scan_implementation(struct net_device *dev);
void ieee80211softmac_stop_scan_implementation(struct net_device *dev);
void ieee80211softmac_wait_for_scan_implementation(struct net_device *dev);

/*** Network prototypes from _module.c */
struct ieee80211softmac_network * ieee80211softmac_create_network(
	struct ieee80211softmac_device *mac, struct ieee80211_network *net);
void ieee80211softmac_add_network_locked(struct ieee80211softmac_device *mac,
	struct ieee80211softmac_network *net);
void ieee80211softmac_add_network(struct ieee80211softmac_device *mac,
	struct ieee80211softmac_network *net);
void ieee80211softmac_del_network_locked(struct ieee80211softmac_device *mac,
	struct ieee80211softmac_network *net);
void ieee80211softmac_del_network(struct ieee80211softmac_device *mac,
	struct ieee80211softmac_network *net);
struct ieee80211softmac_network * ieee80211softmac_get_network_by_bssid_locked(
	struct ieee80211softmac_device *mac, u8 *ea);
struct ieee80211softmac_network * ieee80211softmac_get_network_by_bssid(
	struct ieee80211softmac_device *mac, u8 *ea);
struct ieee80211softmac_network * ieee80211softmac_get_network_by_ssid_locked(
	struct ieee80211softmac_device *mac, u8 *ssid, u8 ssid_len);
struct ieee80211softmac_network * ieee80211softmac_get_network_by_ssid(
	struct ieee80211softmac_device *mac, u8 *ssid, u8 ssid_len);
struct ieee80211softmac_network *
ieee80211softmac_get_network_by_essid_locked(struct ieee80211softmac_device *mac,
	struct ieee80211softmac_essid *essid);
struct ieee80211softmac_network *
ieee80211softmac_get_network_by_essid(struct ieee80211softmac_device *mac,
	struct ieee80211softmac_essid *essid);

/* Rates related */
u8 ieee80211softmac_lower_rate_delta(struct ieee80211softmac_device *mac, u8 rate, int delta);
static inline u8 lower_rate(struct ieee80211softmac_device *mac, u8 rate) {
	return ieee80211softmac_lower_rate_delta(mac, rate, 1);
}

static inline u8 get_fallback_rate(struct ieee80211softmac_device *mac, u8 rate)
{
	return ieee80211softmac_lower_rate_delta(mac, rate, 2);
}
                

/*** prototypes from _io.c */
int ieee80211softmac_send_mgt_frame(struct ieee80211softmac_device *mac,
	void* ptrarg, u32 type, u32 arg);

/*** prototypes from _auth.c */
/* do these have to go into the public header? */
int ieee80211softmac_auth_req(struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net);
int ieee80211softmac_deauth_req(struct ieee80211softmac_device *mac, struct ieee80211softmac_network *net, int reason);

/* for use by _module.c to assign to the callbacks */
int ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth);
int ieee80211softmac_deauth_resp(struct net_device *dev, struct ieee80211_auth *auth);

/*** prototypes from _assoc.c */
void ieee80211softmac_assoc_work(void *d);
int ieee80211softmac_handle_assoc_response(struct net_device * dev,
					   struct ieee80211_assoc_response * resp,
					   struct ieee80211_network * network);
int ieee80211softmac_handle_disassoc(struct net_device * dev,
				     struct ieee80211_disassoc * disassoc);
void ieee80211softmac_assoc_timeout(void *d);

/* some helper functions */
static inline int ieee80211softmac_scan_handlers_check_self(struct ieee80211softmac_device *sm)
{
	return (sm->start_scan == ieee80211softmac_start_scan_implementation) && 
		(sm->stop_scan == ieee80211softmac_stop_scan_implementation) && 
		(sm->wait_for_scan == ieee80211softmac_wait_for_scan_implementation);
}

static inline int ieee80211softmac_scan_sanity_check(struct ieee80211softmac_device *sm)
{
	return ((sm->start_scan != ieee80211softmac_start_scan_implementation) && 
		(sm->stop_scan != ieee80211softmac_stop_scan_implementation) && 
		(sm->wait_for_scan != ieee80211softmac_wait_for_scan_implementation)
		) || ieee80211softmac_scan_handlers_check_self(sm);
}

#define IEEE80211SOFTMAC_PROBE_DELAY		HZ/2
#define IEEE80211SOFTMAC_WORKQUEUE_NAME_LEN	(17 + IFNAMSIZ)

struct ieee80211softmac_network {
	struct list_head		list;	/* List */
	/* Network information copied from ieee80211_network */
	u8 bssid[ETH_ALEN];
	u8 channel;
	struct ieee80211softmac_essid essid;

	struct ieee80211softmac_ratesinfo supported_rates;

	/* SoftMAC specific */
	u16 authenticating:1,			/* Status Flags */
	    authenticated:1,
	    auth_desynced_once:1;

	u16 capabilities;			/* Capabilities bitfield */
	u8 challenge_len;			/* Auth Challenge length */
	char *challenge;			/* Challenge Text */
};

/* structure used to keep track of networks we're auth'ing to */
struct ieee80211softmac_auth_queue_item {
	struct list_head		list;	/* List head */
	struct ieee80211softmac_network	*net;	/* Network to auth */
	struct ieee80211softmac_device	*mac;	/* SoftMAC device */
	u8 retry;				/* Retry limit */
	u8 state;				/* Auth State */
	struct work_struct		work;	/* Work queue */
};

/* scanning information */
struct ieee80211softmac_scaninfo {
	u8 current_channel_idx,
	   number_channels;
	struct ieee80211_channel *channels;
	u8 started:1,
	   stop:1;
	u8 skip_flags;
	struct completion finished;
	struct work_struct softmac_scan;
};

/* private event struct */
struct ieee80211softmac_event {
	struct list_head list;
	int event_type;
	void *event_context;
	struct work_struct work;
	notify_function_ptr fun;
	void *context;
	struct ieee80211softmac_device *mac;
};

void ieee80211softmac_call_events(struct ieee80211softmac_device *mac, int event, void *event_context);
void ieee80211softmac_call_events_locked(struct ieee80211softmac_device *mac, int event, void *event_context);
int ieee80211softmac_notify_internal(struct ieee80211softmac_device *mac,
	int event, void *event_context, notify_function_ptr fun, void *context, gfp_t gfp_mask);

#endif /* IEEE80211SOFTMAC_PRIV_H_ */