K2.6 patches and update.
[tomato.git] / release / src-rt / wl / nas / nas.h
blobc1d0d07f7f832c87c5c9e8077b24d0a057c5193a
1 /*
2 * NAS definitions
4 * Copyright (C) 2010, Broadcom Corporation
5 * All Rights Reserved.
6 *
7 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
8 * the contents of this file may not be disclosed to third parties, copied
9 * or duplicated in any form, in whole or in part, without the prior
10 * written permission of Broadcom Corporation.
12 * $Id: nas.h 248179 2011-03-23 06:13:44Z simonk $
15 #ifndef _nas_h_
16 #define _nas_h_
18 #include <stdio.h>
19 #include <string.h>
21 #include <sys/types.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
24 #include <net/if.h>
26 #include <typedefs.h>
27 #include <proto/ethernet.h>
28 #include <proto/802.11.h>
29 #include <proto/eapol.h>
30 #include <proto/wpa.h>
31 #include <bcmtimer.h>
32 #include <wlioctl.h>
33 #include <bcmwpa.h>
34 #include <shutils.h>
35 #include <wlif_utils.h>
37 #include <radius.h>
41 /* Debug macros */
42 #ifdef BCMDBG
43 #if defined(dbg)
44 #undef dbg
45 #endif
46 #define dbg(nas, fmt, args...) (\
47 { \
48 if (nas) { \
49 nas_t *tmp = nas; \
50 if (tmp->debug) {\
51 printf("%s: %s: " fmt "\n", __FUNCTION__, tmp->interface , ## args); \
52 } \
53 } \
54 else {\
55 printf("%s: " fmt "\n", __FUNCTION__ , ## args); \
57 } \
59 #define dump(nas, mem, size) (\
60 { \
61 if (nas) { \
62 nas_t *tmp = nas; \
63 if (tmp->debug) \
64 prhex("", mem, size); \
65 } \
66 } \
68 #else
69 #if defined(dbg)
70 #undef dbg
71 #endif
72 #define dbg(nas, fmt, args...)
73 #define dump(nas, mem, size)
74 #endif /* BCMDBG */
75 #define err(nas, fmt, args...) (\
76 { \
77 if (nas) { \
78 nas_t *tmp = nas; \
79 printf("%s: %s: " fmt "\n", __FUNCTION__, tmp->interface , ## args); \
80 } \
81 else { \
82 printf("%s: " fmt "\n", __FUNCTION__ , ## args); \
83 } \
84 } \
87 /* Maximum number of supplicants */
88 #define MAX_SUPPLICANTS 64
91 typedef struct binstring {
92 unsigned int length;
93 unsigned char *data;
94 } binstring_t;
96 /* PAE states */
97 typedef enum {
98 INITIALIZE,
99 DISCONNECTED,
100 CONNECTING,
101 AUTHENTICATING,
102 ABORTING,
103 HELD,
104 AUTHENTICATED
105 } pae_state_t;
107 /* 802.1x Port Access Entity */
108 typedef struct pae {
109 pae_state_t state; /* PAE state */
110 int id; /* EAP current request ID */
111 struct {
112 binstring_t username; /* RADIUS User Name */
113 binstring_t state; /* RADIUS State */
114 radius_header_t *request; /* Last request */
115 } radius;
116 struct pae *next; /* Linked list */
117 uint32 flags;
118 uint32 ssnto; /* session timeout */
119 } pae_t;
121 #define PAE_FLAG_EAP_SUCCESS 0x00000001
122 #define PAE_FLAG_RADIUS_ACCESS_REJECT 0x00000002
124 #define MAX_NAS_ID_LEN 32
126 #include "wpa.h"
128 /* Modes */
129 typedef enum
131 WPA = WPA_AUTH_UNSPECIFIED,
132 WPA_PSK = WPA_AUTH_PSK,
133 #ifdef BCMWPA2
134 WPA2 = WPA2_AUTH_UNSPECIFIED,
135 WPA2_PSK = WPA2_AUTH_PSK,
136 #endif
137 RADIUS = 0x20
138 } nas_mode_t;
140 /* RADIUS Network Access Server (NAS) */
141 typedef struct nas {
142 char interface[IFNAMSIZ+1]; /* LAN interface name */
143 char ssid[DOT11_MAX_SSID_LEN+1]; /* SSID */
144 nas_mode_t mode; /* 0:Radius, 1:WPA, 2:WPA-PSK */
145 uint32 wsec; /* crypto algorithm config, same as wl driver */
146 struct ether_addr ea; /* LAN Ethernet address */
147 wpa_t *wpa; /* WPA struct (NULL if wpa not in use) */
148 int wan; /* RADIUS interface handle */
149 struct sockaddr_in client; /* RADIUS interface IP address */
150 struct sockaddr_in server; /* RADIUS server IP address */
151 binstring_t key; /* PSK shared secret */
152 unsigned int type; /* RADIUS NAS Port Type */
153 nas_sta_t sta[MAX_SUPPLICANTS]; /* STAs */
154 nas_sta_t *sta_hashed[MAX_SUPPLICANTS]; /* STA cache */
155 bcm_timer_module_id timer; /* timer module ID */
156 /* MIC error stuff needs to be per-interface */
157 uint32 MIC_failures; /* how many detected */
158 bool MIC_countermeasures; /* flags lock-out period */
159 time_t prev_MIC_error; /* seconds since last one */
160 /* various flags see below */
161 uint32 flags;
162 /* wds remote address */
163 uint8 remote[ETHER_ADDR_LEN];
164 /* application data */
165 void *appl;
166 #ifdef BCMDBG
167 /* debug flag */
168 bool debug;
169 #endif
171 /* session timeout - global */
172 uint32 ssn_to;
173 bcm_timer_id watchdog_td;
174 /* RADIUS shared secret */
175 binstring_t secret;
176 #ifdef BCMWPA2
177 uint32 disable_preauth; /* Internal Flags to disable the WPA2 preauth */
178 #endif
179 uint32 auth_blockout_time; /* seconds to block out client after auth. fail */
180 char nas_id[MAX_NAS_ID_LEN+1]; /* nas mac address */
181 } nas_t;
183 #define NAS_FLAG_SUPPLICANT WLIFU_WSEC_SUPPL /* nas is supplicant, exclusive */
184 #define NAS_FLAG_AUTHENTICATOR WLIFU_WSEC_AUTH /* nas is authenticator, exclusive */
185 #define NAS_FLAG_WDS WLIFU_WSEC_WDS /* nas in WDS mode */
186 #define NAS_FLAG_GTK_PLUMBED 0x40000000 /* GTK has been plumbed */
187 #define NAS_FLAG_IGTK_PLUMBED 0x80000000 /* GTK has been plumbed */
190 /* Supplicant cache */
191 #define pae_hash(ea) \
192 ((((unsigned char *) ea)[3] ^ ((unsigned char *) ea)[4] ^ ((unsigned char *) ea)[5]) & \
193 (MAX_SUPPLICANTS - 1))
196 /* Always clear the descriptor when deleting a timer! */
197 #define TIMER_DELETE(td) {(void) bcm_timer_delete(td); td = 0;}
199 /* Driver specific */
200 extern int nas_authorize(nas_t *nas, struct ether_addr *ea);
201 extern int nas_deauthorize(nas_t *nas, struct ether_addr *ea);
202 extern int nas_deauthenticate(nas_t *nas, struct ether_addr *ea, int reason);
203 extern int nas_disassoc(nas_t *nas);
204 extern int nas_set_key(nas_t *nas, struct ether_addr *ea, unsigned char *key, int len, int index,
205 int tx_flag, uint32 hi, uint16 lo);
206 extern int nas_set_mode(nas_t *nas, int mode);
207 extern int nas_get_group_rsc(nas_t *nas, uint8 *buf, int index);
208 extern void nas_wl_init(nas_t *nas);
209 extern int nas_wl_tkip_countermeasures(nas_t *nas, int enable);
210 extern void nas_wl_cleanup(nas_t *nas);
211 extern int nas_set_ssid(nas_t *nas, char *ssid);
212 extern int nas_join_bss(nas_t *nas, char *ssid);
213 extern int nas_get_wpacap(nas_t *nas, uint8 *cap);
214 extern int nas_get_wpa_ie(nas_t *nas, char *ret_buf, int ret_buf_len, uint32 sta_mode);
216 extern int nas_set_eventmsgs(nas_t *nas, uchar *msgs, int size);
217 extern int nas_get_eventmsgs(nas_t *nas, uchar *msgs, int size);
218 /* OS specific */
219 extern void nas_rand128(uint8 *rand128);
220 extern int nas_eapol_send_packet(nas_t *nas, struct iovec *frags, int nfrags);
222 /* Main dispatch functions */
223 extern void eapol_dispatch(nas_t *nas, eapol_header_t *eapol);
224 #ifdef BCMSUPPL
225 extern void eapol_sup_dispatch(nas_t *nas, eapol_header_t *eapol);
226 #endif
228 #ifdef BCMWPA2
229 extern int nas_preauth_send_packet(nas_t *nas, struct iovec *frags, int nfrags);
230 extern void preauth_dispatch(nas_t *nas, eapol_header_t *eapol);
231 #endif /* BCMWPA2 */
233 extern void driver_message_dispatch(nas_t *nas, bcm_event_t *dpkt);
234 extern void driver_message_sup_dispatch(nas_t *nas, bcm_event_t *dpkt);
235 extern void cleanup_sta(nas_t *nas, nas_sta_t *sta, int reason, int driver_signal);
237 typedef enum { SEARCH_ONLY, SEARCH_ENTER } sta_lookup_mode_t;
239 extern nas_sta_t *lookup_sta(nas_t *nas, struct ether_addr *sta,
240 sta_lookup_mode_t mode);
242 extern void nas_start(nas_t *nas);
243 extern void nas_sleep_ms(uint ms);
245 extern void send_identity_req(nas_t *nas, nas_sta_t *sta);
247 extern void nas_reset_board(void);
248 extern int nas_handle_error(nas_t *nas, int error);
250 extern void pae_state(nas_t *nas, nas_sta_t *sta, int state);
251 extern void eapol_key(nas_t *nas, nas_sta_t *sta,
252 unsigned char *send_key, int send_key_len,
253 unsigned char *recv_key, int recv_key_len,
254 unsigned char *key, int key_len, int index, int unicast);
255 extern void fix_wpa(nas_t *nas, nas_sta_t *sta, char *key, int len);
257 /* bcmcrypto/hmac.c */
258 extern void hmac_md5(unsigned char* text, int text_len, unsigned char *key,
259 int key_len, unsigned char*digest);
260 extern void hmac_sha1(unsigned char *text, int text_len, unsigned char *key,
261 int key_len, unsigned char *digest);
263 #define MIC_RATE_LIMIT 60 /* seconds */
265 #define STA_DEAUTH_DELAY 1 /* delay in second before call wl ioctl deauth */
266 #define STA_REAUTH_MAX 2 /* reAuthMax */
267 #define STA_TXPERIOD_MAX 30 /* max txPeriod in second */
268 #define STA_AUTHWHILE_MAX 60 /* max authWhile in second */
269 #define STA_QUIETWHILE_MAX 60 /* max quietWhile in second */
272 #ifdef BCMWPA2
273 #define CHECK_NAS(mode) ((mode) & (WPA | WPA_PSK | WPA2 | WPA2_PSK))
274 #define CHECK_PSK(mode) ((mode) & (WPA_PSK | WPA2_PSK))
275 #define CHECK_WPA(mode) ((mode) & (WPA | WPA2))
276 #define CHECK_RADIUS(mode) ((mode) & (WPA | RADIUS | WPA2))
277 #define CHECK_AUTH(mode) ((mode) & (RADIUS | WPA | WPA_PSK | WPA2 | WPA2_PSK))
278 #else
279 #define CHECK_NAS(mode) ((mode) & (WPA | WPA_PSK))
280 #define CHECK_PSK(mode) ((mode) & WPA_PSK)
281 #define CHECK_RADIUS(mode) ((mode) & (WPA | RADIUS))
282 #define CHECK_WPA(mode) ((mode) & WPA)
283 #define CHECK_AUTH(mode) ((mode) & (RADIUS | WPA | WPA_PSK))
284 #endif /* BCMWPA2 */
286 #endif /* _nas_h_ */