1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Merged with mainline rtllib.h in Aug 2004. Original ieee802_11 |
4 | * remains copyright by the original authors |
5 | * |
6 | * Portions of the merged code are based on Host AP (software wireless |
7 | * LAN access point) driver for Intersil Prism2/2.5/3. |
8 | * |
9 | * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen |
10 | * <jkmaline@cc.hut.fi> |
11 | * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi> |
12 | * |
13 | * Adaption to a generic IEEE 802.11 stack by James Ketrenos |
14 | * <jketreno@linux.intel.com> |
15 | * Copyright (c) 2004, Intel Corporation |
16 | * |
17 | * Modified for Realtek's wi-fi cards by Andrea Merello |
18 | * <andrea.merello@gmail.com> |
19 | */ |
20 | #ifndef RTLLIB_H |
21 | #define RTLLIB_H |
22 | #include <linux/if_ether.h> /* ETH_ALEN */ |
23 | #include <linux/kernel.h> /* ARRAY_SIZE */ |
24 | #include <linux/module.h> |
25 | #include <linux/interrupt.h> |
26 | #include <linux/jiffies.h> |
27 | #include <linux/timer.h> |
28 | #include <linux/sched.h> |
29 | #include <linux/mutex.h> |
30 | |
31 | #include <linux/delay.h> |
32 | #include <linux/wireless.h> |
33 | |
34 | #include "rtl819x_HT.h" |
35 | #include "rtl819x_BA.h" |
36 | #include "rtl819x_TS.h" |
37 | |
38 | #include <linux/netdevice.h> |
39 | #include <linux/if_arp.h> /* ARPHRD_ETHER */ |
40 | #include <net/cfg80211.h> |
41 | #include <net/lib80211.h> |
42 | |
43 | #define MAX_PRECMD_CNT 16 |
44 | #define MAX_RFDEPENDCMD_CNT 16 |
45 | #define MAX_POSTCMD_CNT 16 |
46 | |
47 | #ifndef WIRELESS_SPY |
48 | #define WIRELESS_SPY |
49 | #endif |
50 | #include <net/iw_handler.h> |
51 | |
52 | #ifndef IW_MODE_MONITOR |
53 | #define IW_MODE_MONITOR 6 |
54 | #endif |
55 | |
56 | #ifndef IWEVCUSTOM |
57 | #define IWEVCUSTOM 0x8c02 |
58 | #endif |
59 | |
60 | #ifndef IW_CUSTOM_MAX |
61 | /* Max number of char in custom event - use multiple of them if needed */ |
62 | #define IW_CUSTOM_MAX 256 /* In bytes */ |
63 | #endif |
64 | |
65 | #define container_of_dwork_rsl(x, y, z) \ |
66 | container_of(to_delayed_work(x), y, z) |
67 | |
68 | static inline void *netdev_priv_rsl(struct net_device *dev) |
69 | { |
70 | return netdev_priv(dev); |
71 | } |
72 | |
73 | #define KEY_TYPE_NA 0x0 |
74 | #define KEY_TYPE_WEP40 0x1 |
75 | #define KEY_TYPE_TKIP 0x2 |
76 | #define KEY_TYPE_CCMP 0x4 |
77 | #define KEY_TYPE_WEP104 0x5 |
78 | /* added for rtl819x tx procedure */ |
79 | #define MAX_QUEUE_SIZE 0x10 |
80 | |
81 | #define BK_QUEUE 0 |
82 | #define BE_QUEUE 1 |
83 | #define VI_QUEUE 2 |
84 | #define VO_QUEUE 3 |
85 | #define HCCA_QUEUE 4 |
86 | #define TXCMD_QUEUE 5 |
87 | #define MGNT_QUEUE 6 |
88 | #define HIGH_QUEUE 7 |
89 | #define BEACON_QUEUE 8 |
90 | |
91 | #define IE_CISCO_FLAG_POSITION 0x08 |
92 | #define SUPPORT_CKIP_MIC 0x08 |
93 | #define SUPPORT_CKIP_PK 0x10 |
94 | #define RT_RF_OFF_LEVL_HALT_NIC BIT(3) |
95 | #define RT_IN_PS_LEVEL(psc, _PS_FLAG) \ |
96 | ((psc->CurPsLevel & _PS_FLAG) ? true : false) |
97 | #define RT_CLEAR_PS_LEVEL(psc, _PS_FLAG) \ |
98 | (psc->CurPsLevel &= (~(_PS_FLAG))) |
99 | |
100 | /* defined for skb cb field */ |
101 | /* At most 28 byte */ |
102 | struct cb_desc { |
103 | /* Tx Desc Related flags (8-9) */ |
104 | u8 bLastIniPkt:1; |
105 | u8 bCmdOrInit:1; |
106 | u8 tx_dis_rate_fallback:1; |
107 | u8 tx_use_drv_assinged_rate:1; |
108 | u8 bHwSec:1; |
109 | |
110 | u8 nStuckCount; |
111 | |
112 | /* Tx Firmware Related flags (10-11)*/ |
113 | u8 bCTSEnable:1; |
114 | u8 bRTSEnable:1; |
115 | u8 bUseShortGI:1; |
116 | u8 bUseShortPreamble:1; |
117 | u8 tx_enable_fw_calc_dur:1; |
118 | u8 ampdu_enable:1; |
119 | u8 bRTSSTBC:1; |
120 | u8 RTSSC:1; |
121 | |
122 | u8 bRTSBW:1; |
123 | u8 bPacketBW:1; |
124 | u8 bRTSUseShortPreamble:1; |
125 | u8 bRTSUseShortGI:1; |
126 | u8 multicast:1; |
127 | u8 bBroadcast:1; |
128 | u8 drv_agg_enable:1; |
129 | u8 reserved2:1; |
130 | |
131 | /* Tx Desc related element(12-19) */ |
132 | u8 rata_index; |
133 | u8 queue_index; |
134 | u16 txbuf_size; |
135 | u8 ratr_index; |
136 | u8 bAMSDU:1; |
137 | u8 bFromAggrQ:1; |
138 | u8 reserved6:6; |
139 | u8 priority; |
140 | |
141 | /* Tx firmware related element(20-27) */ |
142 | u8 data_rate; |
143 | u8 rts_rate; |
144 | u8 ampdu_factor; |
145 | u8 ampdu_density; |
146 | u8 DrvAggrNum; |
147 | u8 bdhcp; |
148 | u16 pkt_size; |
149 | u8 bIsSpecialDataFrame; |
150 | |
151 | u8 bBTTxPacket; |
152 | u8 bIsBTProbRsp; |
153 | }; |
154 | |
155 | enum sw_chnl_cmd_id { |
156 | CmdID_End, |
157 | CmdID_SetTxPowerLevel, |
158 | CmdID_BBRegWrite10, |
159 | CmdID_WritePortUlong, |
160 | CmdID_WritePortUshort, |
161 | CmdID_WritePortUchar, |
162 | CmdID_RF_WriteReg, |
163 | }; |
164 | |
165 | struct sw_chnl_cmd { |
166 | enum sw_chnl_cmd_id CmdID; |
167 | u32 Para1; |
168 | u32 Para2; |
169 | u32 msDelay; |
170 | }; |
171 | |
172 | /*--------------------------Define -------------------------------------------*/ |
173 | #define MGN_1M 0x02 |
174 | #define MGN_2M 0x04 |
175 | #define MGN_5_5M 0x0b |
176 | #define MGN_11M 0x16 |
177 | |
178 | #define MGN_6M 0x0c |
179 | #define MGN_9M 0x12 |
180 | #define MGN_12M 0x18 |
181 | #define MGN_18M 0x24 |
182 | #define MGN_24M 0x30 |
183 | #define MGN_36M 0x48 |
184 | #define MGN_48M 0x60 |
185 | #define MGN_54M 0x6c |
186 | |
187 | #define MGN_MCS0 0x80 |
188 | #define MGN_MCS1 0x81 |
189 | #define MGN_MCS2 0x82 |
190 | #define MGN_MCS3 0x83 |
191 | #define MGN_MCS4 0x84 |
192 | #define MGN_MCS5 0x85 |
193 | #define MGN_MCS6 0x86 |
194 | #define MGN_MCS7 0x87 |
195 | #define MGN_MCS8 0x88 |
196 | #define MGN_MCS9 0x89 |
197 | #define MGN_MCS10 0x8a |
198 | #define MGN_MCS11 0x8b |
199 | #define MGN_MCS12 0x8c |
200 | #define MGN_MCS13 0x8d |
201 | #define MGN_MCS14 0x8e |
202 | #define MGN_MCS15 0x8f |
203 | |
204 | enum hw_variables { |
205 | HW_VAR_ETHER_ADDR, |
206 | HW_VAR_MULTICAST_REG, |
207 | HW_VAR_BASIC_RATE, |
208 | HW_VAR_BSSID, |
209 | HW_VAR_MEDIA_STATUS, |
210 | HW_VAR_SECURITY_CONF, |
211 | HW_VAR_BEACON_INTERVAL, |
212 | HW_VAR_ATIM_WINDOW, |
213 | HW_VAR_LISTEN_INTERVAL, |
214 | HW_VAR_CS_COUNTER, |
215 | HW_VAR_DEFAULTKEY0, |
216 | HW_VAR_DEFAULTKEY1, |
217 | HW_VAR_DEFAULTKEY2, |
218 | HW_VAR_DEFAULTKEY3, |
219 | HW_VAR_SIFS, |
220 | HW_VAR_DIFS, |
221 | HW_VAR_EIFS, |
222 | HW_VAR_SLOT_TIME, |
223 | HW_VAR_ACK_PREAMBLE, |
224 | HW_VAR_CW_CONFIG, |
225 | HW_VAR_CW_VALUES, |
226 | HW_VAR_RATE_FALLBACK_CONTROL, |
227 | HW_VAR_CONTENTION_WINDOW, |
228 | HW_VAR_RETRY_COUNT, |
229 | HW_VAR_TR_SWITCH, |
230 | HW_VAR_COMMAND, |
231 | HW_VAR_WPA_CONFIG, |
232 | HW_VAR_AMPDU_MIN_SPACE, |
233 | HW_VAR_SHORTGI_DENSITY, |
234 | HW_VAR_AMPDU_FACTOR, |
235 | HW_VAR_MCS_RATE_AVAILABLE, |
236 | HW_VAR_AC_PARAM, |
237 | HW_VAR_ACM_CTRL, |
238 | HW_VAR_DIS_Req_Qsize, |
239 | HW_VAR_CCX_CHNL_LOAD, |
240 | HW_VAR_CCX_NOISE_HISTOGRAM, |
241 | HW_VAR_CCX_CLM_NHM, |
242 | HW_VAR_TxOPLimit, |
243 | HW_VAR_TURBO_MODE, |
244 | HW_VAR_RF_STATE, |
245 | HW_VAR_RF_OFF_BY_HW, |
246 | HW_VAR_BUS_SPEED, |
247 | HW_VAR_SET_DEV_POWER, |
248 | |
249 | HW_VAR_RCR, |
250 | HW_VAR_RATR_0, |
251 | HW_VAR_RRSR, |
252 | HW_VAR_CPU_RST, |
253 | HW_VAR_CECHK_BSSID, |
254 | HW_VAR_LBK_MODE, |
255 | HW_VAR_AES_11N_FIX, |
256 | HW_VAR_USB_RX_AGGR, |
257 | HW_VAR_USER_CONTROL_TURBO_MODE, |
258 | HW_VAR_RETRY_LIMIT, |
259 | HW_VAR_INIT_TX_RATE, |
260 | HW_VAR_TX_RATE_REG, |
261 | HW_VAR_EFUSE_USAGE, |
262 | HW_VAR_EFUSE_BYTES, |
263 | HW_VAR_AUTOLOAD_STATUS, |
264 | HW_VAR_RF_2R_DISABLE, |
265 | HW_VAR_SET_RPWM, |
266 | HW_VAR_H2C_FW_PWRMODE, |
267 | HW_VAR_H2C_FW_JOINBSSRPT, |
268 | HW_VAR_1X1_RECV_COMBINE, |
269 | HW_VAR_STOP_SEND_BEACON, |
270 | HW_VAR_TSF_TIMER, |
271 | HW_VAR_IO_CMD, |
272 | |
273 | HW_VAR_RF_RECOVERY, |
274 | HW_VAR_H2C_FW_UPDATE_GTK, |
275 | HW_VAR_WF_MASK, |
276 | HW_VAR_WF_CRC, |
277 | HW_VAR_WF_IS_MAC_ADDR, |
278 | HW_VAR_H2C_FW_OFFLOAD, |
279 | HW_VAR_RESET_WFCRC, |
280 | |
281 | HW_VAR_HANDLE_FW_C2H, |
282 | HW_VAR_DL_FW_RSVD_PAGE, |
283 | HW_VAR_AID, |
284 | HW_VAR_HW_SEQ_ENABLE, |
285 | HW_VAR_CORRECT_TSF, |
286 | HW_VAR_BCN_VALID, |
287 | HW_VAR_FWLPS_RF_ON, |
288 | HW_VAR_DUAL_TSF_RST, |
289 | HW_VAR_SWITCH_EPHY_WoWLAN, |
290 | HW_VAR_INT_MIGRATION, |
291 | HW_VAR_INT_AC, |
292 | HW_VAR_RF_TIMING, |
293 | }; |
294 | |
295 | enum rt_op_mode { |
296 | RT_OP_MODE_AP, |
297 | RT_OP_MODE_INFRASTRUCTURE, |
298 | RT_OP_MODE_IBSS, |
299 | RT_OP_MODE_NO_LINK, |
300 | }; |
301 | |
302 | #define aSifsTime \ |
303 | ((priv->rtllib->current_network.mode == WIRELESS_MODE_N_24G) ? 16 : 10) |
304 | |
305 | #define MGMT_QUEUE_NUM 5 |
306 | |
307 | #define MAX_IE_LEN 0xff |
308 | |
309 | #define msleep_interruptible_rsl msleep_interruptible |
310 | |
311 | /* Maximum size for the MA-UNITDATA primitive, 802.11 standard section |
312 | * 6.2.1.1.2. |
313 | * |
314 | * The figure in section 7.1.2 suggests a body size of up to 2312 |
315 | * bytes is allowed, which is a bit confusing, I suspect this |
316 | * represents the 2304 bytes of real data, plus a possible 8 bytes of |
317 | * WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) |
318 | */ |
319 | #define RTLLIB_1ADDR_LEN 10 |
320 | #define RTLLIB_2ADDR_LEN 16 |
321 | #define RTLLIB_3ADDR_LEN 24 |
322 | #define RTLLIB_4ADDR_LEN 30 |
323 | #define RTLLIB_FCS_LEN 4 |
324 | |
325 | #define RTLLIB_SKBBUFFER_SIZE 2500 |
326 | |
327 | #define MIN_FRAG_THRESHOLD 256U |
328 | #define MAX_FRAG_THRESHOLD 2346U |
329 | |
330 | #define RTLLIB_FTYPE_MGMT 0x0000 |
331 | #define RTLLIB_FTYPE_CTL 0x0004 |
332 | #define RTLLIB_FTYPE_DATA 0x0008 |
333 | |
334 | #define RTLLIB_SCTL_FRAG 0x000F |
335 | #define RTLLIB_SCTL_SEQ 0xFFF0 |
336 | |
337 | /* QOS control */ |
338 | #define RTLLIB_QCTL_TID 0x000F |
339 | |
340 | #define FC_QOS_BIT BIT(7) |
341 | #define IsDataFrame(pdu) (((pdu[0] & 0x0C) == 0x08) ? true : false) |
342 | #define IsLegacyDataFrame(pdu) (IsDataFrame(pdu) && (!(pdu[0]&FC_QOS_BIT))) |
343 | #define IsQoSDataFrame(pframe) \ |
344 | ((*(u16 *)pframe&(IEEE80211_STYPE_QOS_DATA|RTLLIB_FTYPE_DATA)) == \ |
345 | (IEEE80211_STYPE_QOS_DATA|RTLLIB_FTYPE_DATA)) |
346 | #define Frame_Order(pframe) (*(u16 *)pframe&IEEE80211_FCTL_ORDER) |
347 | #define SN_LESS(a, b) (((a-b)&0x800) != 0) |
348 | #define SN_EQUAL(a, b) (a == b) |
349 | #define MAX_DEV_ADDR_SIZE 8 |
350 | |
351 | enum act_category { |
352 | ACT_CAT_QOS = 1, |
353 | ACT_CAT_DLS = 2, |
354 | ACT_CAT_BA = 3, |
355 | ACT_CAT_HT = 7, |
356 | ACT_CAT_WMM = 17, |
357 | }; |
358 | |
359 | enum ba_action { |
360 | ACT_ADDBAREQ = 0, |
361 | ACT_ADDBARSP = 1, |
362 | ACT_DELBA = 2, |
363 | }; |
364 | |
365 | enum init_gain_op_type { |
366 | IG_Backup = 0, |
367 | IG_Restore, |
368 | IG_Max |
369 | }; |
370 | |
371 | enum wireless_mode { |
372 | WIRELESS_MODE_UNKNOWN = 0x00, |
373 | WIRELESS_MODE_A = 0x01, |
374 | WIRELESS_MODE_B = 0x02, |
375 | WIRELESS_MODE_G = 0x04, |
376 | WIRELESS_MODE_AUTO = 0x08, |
377 | WIRELESS_MODE_N_24G = 0x10, |
378 | }; |
379 | |
380 | #ifndef ETH_P_PAE |
381 | #define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */ |
382 | #define ETH_P_IP 0x0800 /* Internet Protocol packet */ |
383 | #define ETH_P_ARP 0x0806 /* Address Resolution packet */ |
384 | #endif /* ETH_P_PAE */ |
385 | |
386 | #ifndef ETH_P_80211_RAW |
387 | #define ETH_P_80211_RAW (ETH_P_ECONET + 1) |
388 | #endif |
389 | |
390 | /* IEEE 802.11 defines */ |
391 | |
392 | #define P80211_OUI_LEN 3 |
393 | |
394 | struct rtllib_snap_hdr { |
395 | u8 dsap; /* always 0xAA */ |
396 | u8 ssap; /* always 0xAA */ |
397 | u8 ctrl; /* always 0x03 */ |
398 | u8 oui[P80211_OUI_LEN]; /* organizational universal id */ |
399 | |
400 | } __packed; |
401 | |
402 | enum _REG_PREAMBLE_MODE { |
403 | PREAMBLE_LONG = 1, |
404 | PREAMBLE_AUTO = 2, |
405 | PREAMBLE_SHORT = 3, |
406 | }; |
407 | |
408 | #define SNAP_SIZE sizeof(struct rtllib_snap_hdr) |
409 | |
410 | #define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE) |
411 | #define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE) |
412 | #define WLAN_FC_MORE_DATA(fc) ((fc) & IEEE80211_FCTL_MOREDATA) |
413 | |
414 | #define WLAN_GET_SEQ_FRAG(seq) ((seq) & RTLLIB_SCTL_FRAG) |
415 | #define WLAN_GET_SEQ_SEQ(seq) (((seq) & RTLLIB_SCTL_SEQ) >> 4) |
416 | |
417 | /* Authentication algorithms */ |
418 | #define WLAN_AUTH_OPEN 0 |
419 | #define WLAN_AUTH_SHARED_KEY 1 |
420 | #define WLAN_AUTH_LEAP 128 |
421 | |
422 | #define WLAN_CAPABILITY_ESS (1<<0) |
423 | #define WLAN_CAPABILITY_IBSS (1<<1) |
424 | #define WLAN_CAPABILITY_PRIVACY (1<<4) |
425 | #define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5) |
426 | #define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10) |
427 | |
428 | #define RTLLIB_STATMASK_SIGNAL (1<<0) |
429 | #define (1<<1) |
430 | #define RTLLIB_STATMASK_NOISE (1<<2) |
431 | #define RTLLIB_STATMASK_WEMASK 0x7 |
432 | |
433 | #define RTLLIB_CCK_MODULATION (1<<0) |
434 | #define RTLLIB_OFDM_MODULATION (1<<1) |
435 | |
436 | #define RTLLIB_CCK_RATE_LEN 4 |
437 | #define RTLLIB_CCK_RATE_1MB 0x02 |
438 | #define RTLLIB_CCK_RATE_2MB 0x04 |
439 | #define RTLLIB_CCK_RATE_5MB 0x0B |
440 | #define RTLLIB_CCK_RATE_11MB 0x16 |
441 | #define RTLLIB_OFDM_RATE_LEN 8 |
442 | #define RTLLIB_OFDM_RATE_6MB 0x0C |
443 | #define RTLLIB_OFDM_RATE_9MB 0x12 |
444 | #define RTLLIB_OFDM_RATE_12MB 0x18 |
445 | #define RTLLIB_OFDM_RATE_18MB 0x24 |
446 | #define RTLLIB_OFDM_RATE_24MB 0x30 |
447 | #define RTLLIB_OFDM_RATE_36MB 0x48 |
448 | #define RTLLIB_OFDM_RATE_48MB 0x60 |
449 | #define RTLLIB_OFDM_RATE_54MB 0x6C |
450 | #define RTLLIB_BASIC_RATE_MASK 0x80 |
451 | |
452 | /* this is stolen and modified from the madwifi driver*/ |
453 | #define RTLLIB_FC0_TYPE_MASK 0x0c |
454 | #define RTLLIB_FC0_TYPE_DATA 0x08 |
455 | #define RTLLIB_FC0_SUBTYPE_MASK 0xB0 |
456 | #define RTLLIB_FC0_SUBTYPE_QOS 0x80 |
457 | |
458 | #define RTLLIB_QOS_HAS_SEQ(fc) \ |
459 | (((fc) & (RTLLIB_FC0_TYPE_MASK | RTLLIB_FC0_SUBTYPE_MASK)) == \ |
460 | (RTLLIB_FC0_TYPE_DATA | RTLLIB_FC0_SUBTYPE_QOS)) |
461 | |
462 | /* this is stolen from ipw2200 driver */ |
463 | #define IEEE_IBSS_MAC_HASH_SIZE 31 |
464 | |
465 | /* NOTE: This data is for statistical purposes; not all hardware provides this |
466 | * information for frames received. Not setting these will not cause |
467 | * any adverse affects. |
468 | */ |
469 | struct rtllib_rx_stats { |
470 | s8 ; |
471 | u8 signal; |
472 | u8 noise; |
473 | u16 rate; /* in 100 kbps */ |
474 | u8 control; |
475 | u8 mask; |
476 | u16 len; |
477 | u16 Length; |
478 | u8 SignalQuality; |
479 | s32 RecvSignalPower; |
480 | u8 SignalStrength; |
481 | u16 bHwError:1; |
482 | u16 bCRC:1; |
483 | u16 bICV:1; |
484 | u16 Decrypted:1; |
485 | u32 TimeStampLow; |
486 | u32 TimeStampHigh; |
487 | |
488 | u8 RxDrvInfoSize; |
489 | u8 RxBufShift; |
490 | bool bIsAMPDU; |
491 | bool bFirstMPDU; |
492 | bool bContainHTC; |
493 | u32 RxPWDBAll; |
494 | u8 RxMIMOSignalStrength[4]; |
495 | s8 RxMIMOSignalQuality[2]; |
496 | bool bPacketMatchBSSID; |
497 | bool bIsCCK; |
498 | bool bPacketToSelf; |
499 | bool bPacketBeacon; |
500 | bool bToSelfBA; |
501 | }; |
502 | |
503 | /* IEEE 802.11 requires that STA supports concurrent reception of at least |
504 | * three fragmented frames. This define can be increased to support more |
505 | * concurrent frames, but it should be noted that each entry can consume about |
506 | * 2 kB of RAM and increasing cache size will slow down frame reassembly. |
507 | */ |
508 | #define RTLLIB_FRAG_CACHE_LEN 4 |
509 | |
510 | struct rtllib_frag_entry { |
511 | unsigned long first_frag_time; |
512 | unsigned int seq; |
513 | unsigned int last_frag; |
514 | struct sk_buff *skb; |
515 | u8 src_addr[ETH_ALEN]; |
516 | u8 dst_addr[ETH_ALEN]; |
517 | }; |
518 | |
519 | struct rtllib_device; |
520 | |
521 | #define SEC_ACTIVE_KEY (1<<4) |
522 | #define SEC_AUTH_MODE (1<<5) |
523 | #define SEC_UNICAST_GROUP (1<<6) |
524 | #define SEC_LEVEL (1<<7) |
525 | #define SEC_ENABLED (1<<8) |
526 | |
527 | #define SEC_LEVEL_0 0 /* None */ |
528 | #define SEC_LEVEL_1 1 /* WEP 40 and 104 bit */ |
529 | #define SEC_LEVEL_2 2 /* Level 1 + TKIP */ |
530 | #define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */ |
531 | #define SEC_LEVEL_3 4 /* Level 2 + CCMP */ |
532 | |
533 | #define SEC_ALG_NONE 0 |
534 | #define SEC_ALG_WEP 1 |
535 | #define SEC_ALG_TKIP 2 |
536 | #define SEC_ALG_CCMP 4 |
537 | |
538 | #define WEP_KEY_LEN 13 |
539 | #define SCM_KEY_LEN 32 |
540 | |
541 | struct rtllib_security { |
542 | u16 active_key:2, |
543 | enabled:1, |
544 | auth_mode:2, |
545 | auth_algo:4, |
546 | unicast_uses_group:1, |
547 | encrypt:1; |
548 | u8 key_sizes[NUM_WEP_KEYS]; |
549 | u8 keys[NUM_WEP_KEYS][SCM_KEY_LEN]; |
550 | u8 level; |
551 | u16 flags; |
552 | } __packed; |
553 | |
554 | /* 802.11 data frame from AP |
555 | * ,-------------------------------------------------------------------. |
556 | * Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 | |
557 | * |------|------|---------|---------|---------|------|---------|------| |
558 | * Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | frame | fcs | |
559 | * | | tion | (BSSID) | | | ence | data | | |
560 | * `-------------------------------------------------------------------' |
561 | * Total: 28-2340 bytes |
562 | */ |
563 | |
564 | /* Management Frame Information Element Types */ |
565 | enum rtllib_mfie { |
566 | MFIE_TYPE_SSID = 0, |
567 | MFIE_TYPE_RATES = 1, |
568 | MFIE_TYPE_FH_SET = 2, |
569 | MFIE_TYPE_DS_SET = 3, |
570 | MFIE_TYPE_CF_SET = 4, |
571 | MFIE_TYPE_TIM = 5, |
572 | MFIE_TYPE_IBSS_SET = 6, |
573 | MFIE_TYPE_COUNTRY = 7, |
574 | MFIE_TYPE_HOP_PARAMS = 8, |
575 | MFIE_TYPE_HOP_TABLE = 9, |
576 | MFIE_TYPE_REQUEST = 10, |
577 | MFIE_TYPE_CHALLENGE = 16, |
578 | MFIE_TYPE_POWER_CONSTRAINT = 32, |
579 | MFIE_TYPE_POWER_CAPABILITY = 33, |
580 | MFIE_TYPE_TPC_REQUEST = 34, |
581 | MFIE_TYPE_TPC_REPORT = 35, |
582 | MFIE_TYPE_SUPP_CHANNELS = 36, |
583 | MFIE_TYPE_CSA = 37, |
584 | MFIE_TYPE_MEASURE_REQUEST = 38, |
585 | MFIE_TYPE_MEASURE_REPORT = 39, |
586 | MFIE_TYPE_QUIET = 40, |
587 | MFIE_TYPE_IBSS_DFS = 41, |
588 | MFIE_TYPE_ERP = 42, |
589 | MFIE_TYPE_HT_CAP = 45, |
590 | MFIE_TYPE_RSN = 48, |
591 | MFIE_TYPE_RATES_EX = 50, |
592 | MFIE_TYPE_HT_INFO = 61, |
593 | MFIE_TYPE_AIRONET = 133, |
594 | MFIE_TYPE_GENERIC = 221, |
595 | MFIE_TYPE_QOS_PARAMETER = 222, |
596 | }; |
597 | |
598 | /* Minimal header; can be used for passing 802.11 frames with sufficient |
599 | * information to determine what type of underlying data type is actually |
600 | * stored in the data. |
601 | */ |
602 | struct rtllib_info_element { |
603 | u8 id; |
604 | u8 len; |
605 | u8 data[]; |
606 | } __packed; |
607 | |
608 | struct rtllib_authentication { |
609 | struct ieee80211_hdr_3addr ; |
610 | __le16 algorithm; |
611 | __le16 transaction; |
612 | __le16 status; |
613 | /*challenge*/ |
614 | struct rtllib_info_element info_element[]; |
615 | } __packed __aligned(2); |
616 | |
617 | struct rtllib_disauth { |
618 | struct ieee80211_hdr_3addr ; |
619 | __le16 reason; |
620 | } __packed __aligned(2); |
621 | |
622 | struct rtllib_disassoc { |
623 | struct ieee80211_hdr_3addr ; |
624 | __le16 reason; |
625 | } __packed __aligned(2); |
626 | |
627 | struct rtllib_probe_request { |
628 | struct ieee80211_hdr_3addr ; |
629 | /* SSID, supported rates */ |
630 | struct rtllib_info_element info_element[]; |
631 | } __packed __aligned(2); |
632 | |
633 | struct rtllib_probe_response { |
634 | struct ieee80211_hdr_3addr ; |
635 | u32 time_stamp[2]; |
636 | __le16 beacon_interval; |
637 | __le16 capability; |
638 | /* SSID, supported rates, FH params, DS params, |
639 | * CF params, IBSS params, TIM (if beacon), RSN |
640 | */ |
641 | struct rtllib_info_element info_element[]; |
642 | } __packed __aligned(2); |
643 | |
644 | /* Alias beacon for probe_response */ |
645 | #define rtllib_beacon rtllib_probe_response |
646 | |
647 | struct rtllib_assoc_request_frame { |
648 | struct ieee80211_hdr_3addr ; |
649 | __le16 capability; |
650 | __le16 listen_interval; |
651 | /* SSID, supported rates, RSN */ |
652 | struct rtllib_info_element info_element[]; |
653 | } __packed __aligned(2); |
654 | |
655 | struct rtllib_assoc_response_frame { |
656 | struct ieee80211_hdr_3addr ; |
657 | __le16 capability; |
658 | __le16 status; |
659 | __le16 aid; |
660 | struct rtllib_info_element info_element[]; /* supported rates */ |
661 | } __packed __aligned(2); |
662 | |
663 | struct rtllib_txb { |
664 | u8 nr_frags; |
665 | u8 encrypted; |
666 | u8 queue_index; |
667 | u8 rts_included; |
668 | u16 reserved; |
669 | __le16 frag_size; |
670 | __le16 payload_size; |
671 | struct sk_buff *fragments[] __counted_by(nr_frags); |
672 | }; |
673 | |
674 | #define MAX_SUBFRAME_COUNT 64 |
675 | struct rtllib_rxb { |
676 | u8 nr_subframes; |
677 | struct sk_buff *subframes[MAX_SUBFRAME_COUNT]; |
678 | u8 dst[ETH_ALEN]; |
679 | u8 src[ETH_ALEN]; |
680 | }; |
681 | |
682 | union frameqos { |
683 | u16 shortdata; |
684 | u8 chardata[2]; |
685 | struct { |
686 | u16 tid:4; |
687 | u16 eosp:1; |
688 | u16 ack_policy:2; |
689 | u16 reserved:1; |
690 | u16 txop:8; |
691 | } field; |
692 | }; |
693 | |
694 | /* MAX_RATES_LENGTH needs to be 12. The spec says 8, and many APs |
695 | * only use 8, and then use extended rates for the remaining supported |
696 | * rates. Other APs, however, stick all of their supported rates on the |
697 | * main rates information element... |
698 | */ |
699 | #define MAX_RATES_LENGTH ((u8)12) |
700 | #define MAX_RATES_EX_LENGTH ((u8)16) |
701 | #define MAX_NETWORK_COUNT 96 |
702 | |
703 | #define MAX_CHANNEL_NUMBER 161 |
704 | #define RTLLIB_SOFTMAC_SCAN_TIME 100 |
705 | #define RTLLIB_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2) |
706 | |
707 | #define MAX_WPA_IE_LEN 64 |
708 | #define MAX_WZC_IE_LEN 256 |
709 | |
710 | #define NETWORK_EMPTY_ESSID (1<<0) |
711 | #define NETWORK_HAS_OFDM (1<<1) |
712 | #define NETWORK_HAS_CCK (1<<2) |
713 | |
714 | /* QoS structure */ |
715 | #define NETWORK_HAS_QOS_PARAMETERS (1<<3) |
716 | #define NETWORK_HAS_QOS_INFORMATION (1<<4) |
717 | #define NETWORK_HAS_QOS_MASK (NETWORK_HAS_QOS_PARAMETERS | \ |
718 | NETWORK_HAS_QOS_INFORMATION) |
719 | /* 802.11h */ |
720 | #define NETWORK_HAS_ERP_VALUE (1<<10) |
721 | |
722 | #define QOS_QUEUE_NUM 4 |
723 | #define QOS_OUI_LEN 3 |
724 | #define QOS_OUI_TYPE 2 |
725 | #define QOS_ELEMENT_ID 221 |
726 | #define QOS_OUI_INFO_SUB_TYPE 0 |
727 | #define QOS_OUI_PARAM_SUB_TYPE 1 |
728 | #define QOS_VERSION_1 1 |
729 | |
730 | struct rtllib_qos_information_element { |
731 | u8 elementID; |
732 | u8 length; |
733 | u8 qui[QOS_OUI_LEN]; |
734 | u8 qui_type; |
735 | u8 qui_subtype; |
736 | u8 version; |
737 | u8 ac_info; |
738 | } __packed; |
739 | |
740 | struct rtllib_qos_ac_parameter { |
741 | u8 aci_aifsn; |
742 | u8 ecw_min_max; |
743 | __le16 tx_op_limit; |
744 | } __packed; |
745 | |
746 | struct rtllib_qos_parameter_info { |
747 | struct rtllib_qos_information_element info_element; |
748 | u8 reserved; |
749 | struct rtllib_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM]; |
750 | } __packed; |
751 | |
752 | struct rtllib_qos_parameters { |
753 | __le16 cw_min[QOS_QUEUE_NUM]; |
754 | __le16 cw_max[QOS_QUEUE_NUM]; |
755 | u8 aifs[QOS_QUEUE_NUM]; |
756 | u8 flag[QOS_QUEUE_NUM]; |
757 | __le16 tx_op_limit[QOS_QUEUE_NUM]; |
758 | } __packed; |
759 | |
760 | struct rtllib_qos_data { |
761 | struct rtllib_qos_parameters parameters; |
762 | unsigned int wmm_acm; |
763 | int active; |
764 | int supported; |
765 | u8 param_count; |
766 | u8 old_param_count; |
767 | }; |
768 | |
769 | struct rtllib_tim_parameters { |
770 | u8 tim_count; |
771 | u8 tim_period; |
772 | } __packed; |
773 | |
774 | struct rtllib_wmm_ac_param { |
775 | u8 ac_aci_acm_aifsn; |
776 | u8 ac_ecwmin_ecwmax; |
777 | u16 ac_txop_limit; |
778 | }; |
779 | |
780 | enum eap_type { |
781 | EAP_PACKET = 0, |
782 | EAPOL_START, |
783 | EAPOL_LOGOFF, |
784 | EAPOL_KEY, |
785 | EAPOL_ENCAP_ASF_ALERT |
786 | }; |
787 | |
788 | static const char * const eap_types[] = { |
789 | [EAP_PACKET] = "EAP-Packet" , |
790 | [EAPOL_START] = "EAPOL-Start" , |
791 | [EAPOL_LOGOFF] = "EAPOL-Logoff" , |
792 | [EAPOL_KEY] = "EAPOL-Key" , |
793 | [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert" |
794 | }; |
795 | |
796 | static inline const char *eap_get_type(int type) |
797 | { |
798 | return ((u32)type >= ARRAY_SIZE(eap_types)) ? "Unknown" : |
799 | eap_types[type]; |
800 | } |
801 | |
802 | static inline u8 Frame_QoSTID(u8 *buf) |
803 | { |
804 | struct ieee80211_hdr_3addr *hdr; |
805 | u16 fc; |
806 | |
807 | hdr = (struct ieee80211_hdr_3addr *)buf; |
808 | fc = le16_to_cpu(hdr->frame_control); |
809 | return (u8)((union frameqos *)(buf + (((fc & IEEE80211_FCTL_TODS) && |
810 | (fc & IEEE80211_FCTL_FROMDS)) ? 30 : 24)))->field.tid; |
811 | } |
812 | |
813 | struct eapol { |
814 | u8 snap[6]; |
815 | u16 ethertype; |
816 | u8 version; |
817 | u8 type; |
818 | u16 length; |
819 | } __packed; |
820 | |
821 | struct rtllib_softmac_stats { |
822 | unsigned int rx_ass_ok; |
823 | unsigned int rx_ass_err; |
824 | unsigned int rx_probe_rq; |
825 | unsigned int tx_probe_rs; |
826 | unsigned int tx_beacons; |
827 | unsigned int rx_auth_rq; |
828 | unsigned int rx_auth_rs_ok; |
829 | unsigned int rx_auth_rs_err; |
830 | unsigned int tx_auth_rq; |
831 | unsigned int no_auth_rs; |
832 | unsigned int no_ass_rs; |
833 | unsigned int tx_ass_rq; |
834 | unsigned int rx_ass_rq; |
835 | unsigned int tx_probe_rq; |
836 | unsigned int reassoc; |
837 | unsigned int swtxstop; |
838 | unsigned int swtxawake; |
839 | unsigned char CurrentShowTxate; |
840 | unsigned char last_packet_rate; |
841 | unsigned int txretrycount; |
842 | }; |
843 | |
844 | /* These are the data types that can make up management packets |
845 | * |
846 | * u16 auth_algorithm; |
847 | * u16 auth_sequence; |
848 | * u16 beacon_interval; |
849 | * u16 capability; |
850 | * u8 current_ap[ETH_ALEN]; |
851 | * u16 listen_interval; |
852 | * struct { |
853 | * u16 association_id:14, reserved:2; |
854 | * } __packed; |
855 | * u32 time_stamp[2]; |
856 | * u16 reason; |
857 | * u16 status; |
858 | */ |
859 | |
860 | #define RTLLIB_DEFAULT_TX_ESSID "Penguin" |
861 | #define RTLLIB_DEFAULT_BASIC_RATE 2 |
862 | |
863 | enum {WMM_all_frame, WMM_two_frame, WMM_four_frame, WMM_six_frame}; |
864 | #define MAX_SP_Len (WMM_all_frame << 4) |
865 | #define RTLLIB_QOS_TID 0x0f |
866 | #define QOS_CTL_NOTCONTAIN_ACK (0x01 << 5) |
867 | |
868 | #define RTLLIB_DTIM_MBCAST 4 |
869 | #define RTLLIB_DTIM_UCAST 2 |
870 | #define RTLLIB_DTIM_VALID 1 |
871 | #define RTLLIB_DTIM_INVALID 0 |
872 | |
873 | #define RTLLIB_PS_DISABLED 0 |
874 | #define RTLLIB_PS_UNICAST RTLLIB_DTIM_UCAST |
875 | #define RTLLIB_PS_MBCAST RTLLIB_DTIM_MBCAST |
876 | |
877 | #define WME_AC_BK 0x00 |
878 | #define WME_AC_BE 0x01 |
879 | #define WME_AC_VI 0x02 |
880 | #define WME_AC_VO 0x03 |
881 | #define WME_AC_PRAM_LEN 16 |
882 | |
883 | #define MAX_RECEIVE_BUFFER_SIZE 9100 |
884 | |
885 | #define UP2AC(up) ( \ |
886 | ((up) < 1) ? WME_AC_BE : \ |
887 | ((up) < 3) ? WME_AC_BK : \ |
888 | ((up) < 4) ? WME_AC_BE : \ |
889 | ((up) < 6) ? WME_AC_VI : \ |
890 | WME_AC_VO) |
891 | |
892 | #define 14 /* length of two Ethernet address |
893 | * plus ether type |
894 | */ |
895 | |
896 | enum erp_t { |
897 | ERP_NonERPpresent = 0x01, |
898 | ERP_UseProtection = 0x02, |
899 | ERP_BarkerPreambleMode = 0x04, |
900 | }; |
901 | |
902 | struct rtllib_network { |
903 | /* These entries are used to identify a unique network */ |
904 | u8 bssid[ETH_ALEN]; |
905 | u8 channel; |
906 | /* Ensure null-terminated for any debug msgs */ |
907 | u8 ssid[IW_ESSID_MAX_SIZE + 1]; |
908 | u8 ssid_len; |
909 | u8 hidden_ssid[IW_ESSID_MAX_SIZE + 1]; |
910 | u8 hidden_ssid_len; |
911 | struct rtllib_qos_data qos_data; |
912 | |
913 | bool bWithAironetIE; |
914 | bool ckip_supported; |
915 | bool ccx_rm_enable; |
916 | u8 CcxRmState[2]; |
917 | bool bMBssidValid; |
918 | u8 MBssidMask; |
919 | u8 MBssid[ETH_ALEN]; |
920 | bool bWithCcxVerNum; |
921 | u8 bss_ccx_ver_number; |
922 | /* These are network statistics */ |
923 | struct rtllib_rx_stats stats; |
924 | u16 capability; |
925 | u8 rates[MAX_RATES_LENGTH]; |
926 | u8 rates_len; |
927 | u8 rates_ex[MAX_RATES_EX_LENGTH]; |
928 | u8 rates_ex_len; |
929 | unsigned long last_scanned; |
930 | u8 mode; |
931 | u32 flags; |
932 | u32 time_stamp[2]; |
933 | u16 beacon_interval; |
934 | u16 listen_interval; |
935 | u16 atim_window; |
936 | u8 erp_value; |
937 | u8 wpa_ie[MAX_WPA_IE_LEN]; |
938 | size_t wpa_ie_len; |
939 | u8 rsn_ie[MAX_WPA_IE_LEN]; |
940 | size_t rsn_ie_len; |
941 | u8 wzc_ie[MAX_WZC_IE_LEN]; |
942 | size_t wzc_ie_len; |
943 | |
944 | struct rtllib_tim_parameters tim; |
945 | u8 dtim_period; |
946 | u8 dtim_data; |
947 | u64 last_dtim_sta_time; |
948 | |
949 | u8 wmm_info; |
950 | struct rtllib_wmm_ac_param wmm_param[4]; |
951 | u8 turbo_enable; |
952 | u16 CountryIeLen; |
953 | u8 CountryIeBuf[MAX_IE_LEN]; |
954 | struct bss_ht bssht; |
955 | bool broadcom_cap_exist; |
956 | bool realtek_cap_exit; |
957 | bool marvell_cap_exist; |
958 | bool ralink_cap_exist; |
959 | bool atheros_cap_exist; |
960 | bool cisco_cap_exist; |
961 | bool airgo_cap_exist; |
962 | bool unknown_cap_exist; |
963 | bool berp_info_valid; |
964 | bool buseprotection; |
965 | u8 SignalStrength; |
966 | u8 ; |
967 | struct list_head list; |
968 | }; |
969 | |
970 | enum rtl_link_state { |
971 | /* the card is not linked at all */ |
972 | MAC80211_NOLINK = 0, |
973 | |
974 | /* RTLLIB_ASSOCIATING* are for BSS client mode |
975 | * the driver shall not perform RX filtering unless |
976 | * the state is LINKED. |
977 | * The driver shall just check for the state LINKED and |
978 | * defaults to NOLINK for ALL the other states (including |
979 | * LINKED_SCANNING) |
980 | */ |
981 | |
982 | /* the association procedure will start (wq scheduling)*/ |
983 | RTLLIB_ASSOCIATING, |
984 | RTLLIB_ASSOCIATING_RETRY, |
985 | |
986 | /* the association procedure is sending AUTH request*/ |
987 | RTLLIB_ASSOCIATING_AUTHENTICATING, |
988 | |
989 | /* the association procedure has successfully authenticated |
990 | * and is sending association request |
991 | */ |
992 | RTLLIB_ASSOCIATING_AUTHENTICATED, |
993 | |
994 | /* the link is ok. the card associated to a BSS or linked |
995 | * to a ibss cell or acting as an AP and creating the bss |
996 | */ |
997 | MAC80211_LINKED, |
998 | |
999 | /* same as LINKED, but the driver shall apply RX filter |
1000 | * rules as we are in NO_LINK mode. As the card is still |
1001 | * logically linked, but it is doing a syncro site survey |
1002 | * then it will be back to LINKED state. |
1003 | */ |
1004 | MAC80211_LINKED_SCANNING, |
1005 | }; |
1006 | |
1007 | #define DEFAULT_MAX_SCAN_AGE (15 * HZ) |
1008 | #define DEFAULT_FTS 2346 |
1009 | |
1010 | #define CFG_RTLLIB_RESERVE_FCS (1<<0) |
1011 | #define CFG_RTLLIB_COMPUTE_FCS (1<<1) |
1012 | |
1013 | struct tx_pending { |
1014 | int frag; |
1015 | struct rtllib_txb *txb; |
1016 | }; |
1017 | |
1018 | struct bandwidth_autoswitch { |
1019 | long threshold_20Mhzto40Mhz; |
1020 | long threshold_40Mhzto20Mhz; |
1021 | bool bforced_tx20Mhz; |
1022 | bool bautoswitch_enable; |
1023 | }; |
1024 | |
1025 | #define REORDER_WIN_SIZE 128 |
1026 | #define REORDER_ENTRY_NUM 128 |
1027 | struct rx_reorder_entry { |
1028 | struct list_head list; |
1029 | u16 SeqNum; |
1030 | struct rtllib_rxb *prxb; |
1031 | }; |
1032 | |
1033 | enum fsync_state { |
1034 | DEFAULT_FSYNC, |
1035 | HW_FSYNC, |
1036 | SW_FSYNC |
1037 | }; |
1038 | |
1039 | enum ips_callback_function { |
1040 | IPS_CALLBACK_NONE = 0, |
1041 | IPS_CALLBACK_MGNT_LINK_REQUEST = 1, |
1042 | IPS_CALLBACK_JOIN_REQUEST = 2, |
1043 | }; |
1044 | |
1045 | enum rt_rf_power_state { |
1046 | rf_on, |
1047 | rf_sleep, |
1048 | rf_off |
1049 | }; |
1050 | |
1051 | struct rt_pwr_save_ctrl { |
1052 | bool bSwRfProcessing; |
1053 | enum rt_rf_power_state eInactivePowerState; |
1054 | enum ips_callback_function ReturnPoint; |
1055 | |
1056 | bool bLeisurePs; |
1057 | u8 lps_idle_count; |
1058 | u8 lps_awake_intvl; |
1059 | |
1060 | u32 CurPsLevel; |
1061 | }; |
1062 | |
1063 | #define RT_RF_CHANGE_SOURCE u32 |
1064 | |
1065 | #define RF_CHANGE_BY_SW BIT(31) |
1066 | #define RF_CHANGE_BY_HW BIT(30) |
1067 | #define RF_CHANGE_BY_PS BIT(29) |
1068 | #define RF_CHANGE_BY_IPS BIT(28) |
1069 | #define RF_CHANGE_BY_INIT 0 |
1070 | |
1071 | enum country_code_type { |
1072 | COUNTRY_CODE_FCC = 0, |
1073 | COUNTRY_CODE_IC = 1, |
1074 | COUNTRY_CODE_ETSI = 2, |
1075 | COUNTRY_CODE_SPAIN = 3, |
1076 | COUNTRY_CODE_FRANCE = 4, |
1077 | COUNTRY_CODE_MKK = 5, |
1078 | COUNTRY_CODE_MKK1 = 6, |
1079 | COUNTRY_CODE_ISRAEL = 7, |
1080 | COUNTRY_CODE_TELEC = 8, |
1081 | COUNTRY_CODE_MIC = 9, |
1082 | COUNTRY_CODE_GLOBAL_DOMAIN = 10, |
1083 | COUNTRY_CODE_WORLD_WIDE_13 = 11, |
1084 | COUNTRY_CODE_TELEC_NETGEAR = 12, |
1085 | COUNTRY_CODE_MAX |
1086 | }; |
1087 | |
1088 | enum scan_op_backup_opt { |
1089 | SCAN_OPT_BACKUP = 0, |
1090 | SCAN_OPT_RESTORE, |
1091 | SCAN_OPT_MAX |
1092 | }; |
1093 | |
1094 | #define RT_MAX_LD_SLOT_NUM 10 |
1095 | struct rt_link_detect { |
1096 | u32 num_recv_bcn_in_period; |
1097 | u32 num_recv_data_in_period; |
1098 | |
1099 | u32 RxBcnNum[RT_MAX_LD_SLOT_NUM]; |
1100 | u32 RxDataNum[RT_MAX_LD_SLOT_NUM]; |
1101 | u16 slot_num; |
1102 | u16 slot_index; |
1103 | |
1104 | u32 num_tx_ok_in_period; |
1105 | u32 num_rx_ok_in_period; |
1106 | u32 num_rx_unicast_ok_in_period; |
1107 | bool busy_traffic; |
1108 | bool bHigherBusyTraffic; |
1109 | bool bHigherBusyRxTraffic; |
1110 | }; |
1111 | |
1112 | struct sw_cam_table { |
1113 | u8 macaddr[ETH_ALEN]; |
1114 | bool bused; |
1115 | u8 key_buf[16]; |
1116 | u16 key_type; |
1117 | u8 useDK; |
1118 | u8 key_index; |
1119 | |
1120 | }; |
1121 | |
1122 | #define TOTAL_CAM_ENTRY 32 |
1123 | struct rate_adaptive { |
1124 | u8 ratr_state; |
1125 | u16 reserve; |
1126 | |
1127 | u32 ; |
1128 | u32 ; |
1129 | u8 ; |
1130 | u32 ; |
1131 | u8 ; |
1132 | u32 ; |
1133 | u32 ; |
1134 | u32 ; |
1135 | u32 ; |
1136 | u32 ; |
1137 | u32 ; |
1138 | u8 ; |
1139 | u32 ; |
1140 | u32 ; |
1141 | u8 PreRATRState; |
1142 | |
1143 | }; |
1144 | |
1145 | #define NUM_PMKID_CACHE 16 |
1146 | struct rt_pmkid_list { |
1147 | u8 bssid[ETH_ALEN]; |
1148 | u8 PMKID[16]; |
1149 | u8 SsidBuf[33]; |
1150 | u8 used; |
1151 | }; |
1152 | |
1153 | /*************** DRIVER STATUS *****/ |
1154 | #define STATUS_SCANNING 0 |
1155 | /*************** DRIVER STATUS *****/ |
1156 | |
1157 | enum { |
1158 | LPS_IS_WAKE = 0, |
1159 | LPS_IS_SLEEP = 1, |
1160 | LPS_WAIT_NULL_DATA_SEND = 2, |
1161 | }; |
1162 | |
1163 | struct rtllib_device { |
1164 | struct pci_dev *pdev; |
1165 | struct net_device *dev; |
1166 | struct rtllib_security sec; |
1167 | |
1168 | bool disable_mgnt_queue; |
1169 | |
1170 | unsigned long status; |
1171 | u8 CntAfterLink; |
1172 | |
1173 | enum rt_op_mode op_mode; |
1174 | |
1175 | /* The last AssocReq/Resp IEs */ |
1176 | u8 *assocreq_ies, *assocresp_ies; |
1177 | size_t assocreq_ies_len, assocresp_ies_len; |
1178 | |
1179 | bool forced_bg_mode; |
1180 | |
1181 | u8 hwsec_active; |
1182 | bool is_roaming; |
1183 | bool ieee_up; |
1184 | bool cannot_notify; |
1185 | bool bSupportRemoteWakeUp; |
1186 | bool actscanning; |
1187 | bool first_ie_in_scan; |
1188 | bool be_scan_inprogress; |
1189 | bool beinretry; |
1190 | enum rt_rf_power_state rf_power_state; |
1191 | RT_RF_CHANGE_SOURCE rf_off_reason; |
1192 | bool is_set_key; |
1193 | bool wx_set_enc; |
1194 | struct rt_hi_throughput *ht_info; |
1195 | |
1196 | spinlock_t reorder_spinlock; |
1197 | u8 reg_dot11ht_oper_rate_set[16]; |
1198 | u8 reg_dot11tx_ht_oper_rate_set[16]; |
1199 | u8 dot11ht_oper_rate_set[16]; |
1200 | u8 reg_ht_supp_rate_set[16]; |
1201 | u8 HTCurrentOperaRate; |
1202 | u8 HTHighestOperaRate; |
1203 | u8 tx_dis_rate_fallback; |
1204 | u8 tx_use_drv_assinged_rate; |
1205 | u8 tx_enable_fw_calc_dur; |
1206 | atomic_t atm_swbw; |
1207 | |
1208 | struct list_head Tx_TS_Admit_List; |
1209 | struct list_head Tx_TS_Pending_List; |
1210 | struct list_head Tx_TS_Unused_List; |
1211 | struct tx_ts_record tx_ts_records[TOTAL_TS_NUM]; |
1212 | struct list_head Rx_TS_Admit_List; |
1213 | struct list_head Rx_TS_Pending_List; |
1214 | struct list_head Rx_TS_Unused_List; |
1215 | struct rx_ts_record rx_ts_records[TOTAL_TS_NUM]; |
1216 | struct rx_reorder_entry RxReorderEntry[128]; |
1217 | struct list_head RxReorder_Unused_List; |
1218 | |
1219 | /* Bookkeeping structures */ |
1220 | struct net_device_stats stats; |
1221 | struct rtllib_softmac_stats softmac_stats; |
1222 | |
1223 | /* Probe / Beacon management */ |
1224 | struct list_head network_free_list; |
1225 | struct list_head network_list; |
1226 | struct rtllib_network *networks; |
1227 | int scans; |
1228 | int scan_age; |
1229 | |
1230 | int iw_mode; /* operating mode (IW_MODE_*) */ |
1231 | |
1232 | spinlock_t lock; |
1233 | spinlock_t wpax_suitlist_lock; |
1234 | |
1235 | int tx_headroom; /* Set to size of any additional room needed at front |
1236 | * of allocated Tx SKBs |
1237 | */ |
1238 | u32 config; |
1239 | |
1240 | /* WEP and other encryption related settings at the device level */ |
1241 | int open_wep; /* Set to 1 to allow unencrypted frames */ |
1242 | int auth_mode; |
1243 | int reset_on_keychange; /* Set to 1 if the HW needs to be reset on |
1244 | * WEP key changes |
1245 | */ |
1246 | |
1247 | int ieee802_1x; /* is IEEE 802.1X used */ |
1248 | |
1249 | /* WPA data */ |
1250 | bool half_wireless_n24g_mode; |
1251 | int wpa_enabled; |
1252 | int drop_unencrypted; |
1253 | int tkip_countermeasures; |
1254 | int privacy_invoked; |
1255 | size_t wpa_ie_len; |
1256 | u8 *wpa_ie; |
1257 | size_t wps_ie_len; |
1258 | u8 *wps_ie; |
1259 | u8 ap_mac_addr[ETH_ALEN]; |
1260 | u16 pairwise_key_type; |
1261 | u16 group_key_type; |
1262 | |
1263 | struct lib80211_crypt_info crypt_info; |
1264 | |
1265 | struct sw_cam_table swcamtable[TOTAL_CAM_ENTRY]; |
1266 | |
1267 | struct rt_pmkid_list pmkid_list[NUM_PMKID_CACHE]; |
1268 | |
1269 | /* Fragmentation structures */ |
1270 | struct rtllib_frag_entry frag_cache[17][RTLLIB_FRAG_CACHE_LEN]; |
1271 | unsigned int frag_next_idx[17]; |
1272 | u16 fts; /* Fragmentation Threshold */ |
1273 | #define DEFAULT_RTS_THRESHOLD 2346U |
1274 | #define MIN_RTS_THRESHOLD 1 |
1275 | #define MAX_RTS_THRESHOLD 2346U |
1276 | u16 rts; /* RTS threshold */ |
1277 | |
1278 | /* Association info */ |
1279 | u8 bssid[ETH_ALEN]; |
1280 | |
1281 | /* This stores infos for the current network. |
1282 | * Either the network we are associated in INFRASTRUCTURE |
1283 | * or the network that we are creating in MASTER mode. |
1284 | * ad-hoc is a mixture ;-). |
1285 | * Note that in infrastructure mode, even when not associated, |
1286 | * fields bssid and essid may be valid (if wpa_set and essid_set |
1287 | * are true) as thy carry the value set by the user via iwconfig |
1288 | */ |
1289 | struct rtllib_network current_network; |
1290 | |
1291 | enum rtl_link_state link_state; |
1292 | |
1293 | int mode; /* A, B, G */ |
1294 | |
1295 | /* used for forcing the ibss workqueue to terminate |
1296 | * without wait for the syncro scan to terminate |
1297 | */ |
1298 | short sync_scan_hurryup; |
1299 | u16 scan_watch_dog; |
1300 | |
1301 | /* map of allowed channels. 0 is dummy */ |
1302 | u8 active_channel_map[MAX_CHANNEL_NUMBER+1]; |
1303 | |
1304 | int rate; /* current rate */ |
1305 | int basic_rate; |
1306 | |
1307 | /* this contains flags for selectively enable softmac support */ |
1308 | u16 softmac_features; |
1309 | |
1310 | /* if the sequence control field is not filled by HW */ |
1311 | u16 seq_ctrl[5]; |
1312 | |
1313 | /* association procedure transaction sequence number */ |
1314 | u16 associate_seq; |
1315 | |
1316 | /* AID for RTXed association responses */ |
1317 | u16 assoc_id; |
1318 | |
1319 | /* power save mode related*/ |
1320 | u8 ack_tx_to_ieee; |
1321 | short ps; |
1322 | short sta_sleep; |
1323 | int ps_timeout; |
1324 | int ps_period; |
1325 | struct work_struct ps_task; |
1326 | u64 ps_time; |
1327 | bool polling; |
1328 | |
1329 | /* used if IEEE_SOFTMAC_TX_QUEUE is set */ |
1330 | short queue_stop; |
1331 | short scanning_continue; |
1332 | short proto_started; |
1333 | short proto_stoppping; |
1334 | |
1335 | struct mutex wx_mutex; |
1336 | struct mutex scan_mutex; |
1337 | struct mutex ips_mutex; |
1338 | |
1339 | spinlock_t mgmt_tx_lock; |
1340 | spinlock_t beacon_lock; |
1341 | |
1342 | short beacon_txing; |
1343 | |
1344 | short wap_set; |
1345 | short ssid_set; |
1346 | |
1347 | /* set on initialization */ |
1348 | unsigned int wmm_acm; |
1349 | |
1350 | /* for discarding duplicated packets in IBSS */ |
1351 | struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE]; |
1352 | |
1353 | /* for discarding duplicated packets in BSS */ |
1354 | u16 last_rxseq_num[17]; /* rx seq previous per-tid */ |
1355 | u16 last_rxfrag_num[17];/* tx frag previous per-tid */ |
1356 | unsigned long last_packet_time[17]; |
1357 | |
1358 | /* for PS mode */ |
1359 | unsigned long last_rx_ps_time; |
1360 | bool awake_pkt_sent; |
1361 | u8 lps_delay_cnt; |
1362 | |
1363 | /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */ |
1364 | struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM]; |
1365 | int mgmt_queue_head; |
1366 | int mgmt_queue_tail; |
1367 | u8 asoc_retry_count; |
1368 | struct sk_buff_head skb_waitq[MAX_QUEUE_SIZE]; |
1369 | |
1370 | bool bdynamic_txpower_enable; |
1371 | |
1372 | bool bCTSToSelfEnable; |
1373 | |
1374 | u32 fsync_time_interval; |
1375 | u32 fsync_rate_bitmap; |
1376 | u8 ; |
1377 | bool bfsync_enable; |
1378 | |
1379 | u8 fsync_multiple_timeinterval; |
1380 | u32 fsync_firstdiff_ratethreshold; |
1381 | u32 fsync_seconddiff_ratethreshold; |
1382 | enum fsync_state fsync_state; |
1383 | bool bis_any_nonbepkts; |
1384 | struct bandwidth_autoswitch bandwidth_auto_switch; |
1385 | bool FwRWRF; |
1386 | |
1387 | struct rt_link_detect link_detect_info; |
1388 | bool is_aggregate_frame; |
1389 | struct rt_pwr_save_ctrl pwr_save_ctrl; |
1390 | |
1391 | /* used if IEEE_SOFTMAC_TX_QUEUE is set */ |
1392 | struct tx_pending tx_pending; |
1393 | |
1394 | /* used if IEEE_SOFTMAC_ASSOCIATE is set */ |
1395 | struct timer_list associate_timer; |
1396 | |
1397 | /* used if IEEE_SOFTMAC_BEACONS is set */ |
1398 | u8 need_sw_enc; |
1399 | struct work_struct associate_complete_wq; |
1400 | struct work_struct ips_leave_wq; |
1401 | struct delayed_work associate_procedure_wq; |
1402 | struct delayed_work softmac_scan_wq; |
1403 | struct delayed_work associate_retry_wq; |
1404 | struct delayed_work hw_wakeup_wq; |
1405 | struct delayed_work hw_sleep_wq; |
1406 | struct delayed_work link_change_wq; |
1407 | struct work_struct wx_sync_scan_wq; |
1408 | |
1409 | union { |
1410 | struct rtllib_rxb *RfdArray[REORDER_WIN_SIZE]; |
1411 | struct rtllib_rxb *stats_IndicateArray[REORDER_WIN_SIZE]; |
1412 | struct rtllib_rxb *prxbIndicateArray[REORDER_WIN_SIZE]; |
1413 | struct { |
1414 | struct sw_chnl_cmd PreCommonCmd[MAX_PRECMD_CNT]; |
1415 | struct sw_chnl_cmd PostCommonCmd[MAX_POSTCMD_CNT]; |
1416 | struct sw_chnl_cmd RfDependCmd[MAX_RFDEPENDCMD_CNT]; |
1417 | }; |
1418 | }; |
1419 | |
1420 | /* Callback functions */ |
1421 | |
1422 | /* Softmac-generated frames (management) are TXed via this |
1423 | * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is |
1424 | * not set. As some cards may have different HW queues that |
1425 | * one might want to use for data and management frames |
1426 | * the option to have two callbacks might be useful. |
1427 | * This function can't sleep. |
1428 | */ |
1429 | int (*softmac_hard_start_xmit)(struct sk_buff *skb, |
1430 | struct net_device *dev); |
1431 | |
1432 | /* used instead of hard_start_xmit (not softmac_hard_start_xmit) |
1433 | * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data |
1434 | * frames. If the option IEEE_SOFTMAC_SINGLE_QUEUE is also set |
1435 | * then also management frames are sent via this callback. |
1436 | * This function can't sleep. |
1437 | */ |
1438 | void (*softmac_data_hard_start_xmit)(struct sk_buff *skb, |
1439 | struct net_device *dev, int rate); |
1440 | |
1441 | /* ask to the driver to retune the radio. |
1442 | * This function can sleep. the driver should ensure |
1443 | * the radio has been switched before return. |
1444 | */ |
1445 | void (*set_chan)(struct net_device *dev, u8 ch); |
1446 | |
1447 | /* indicate the driver that the link state is changed |
1448 | * for example it may indicate the card is associated now. |
1449 | * Driver might be interested in this to apply RX filter |
1450 | * rules or simply light the LINK led |
1451 | */ |
1452 | void (*link_change)(struct net_device *dev); |
1453 | |
1454 | /* power save mode related */ |
1455 | void (*sta_wake_up)(struct net_device *dev); |
1456 | void (*enter_sleep_state)(struct net_device *dev, u64 time); |
1457 | short (*ps_is_queue_empty)(struct net_device *dev); |
1458 | int (*handle_beacon)(struct net_device *dev, |
1459 | struct rtllib_beacon *beacon, |
1460 | struct rtllib_network *network); |
1461 | int (*handle_assoc_response)(struct net_device *dev, |
1462 | struct rtllib_assoc_response_frame *resp, |
1463 | struct rtllib_network *network); |
1464 | |
1465 | /* check whether Tx hw resource available */ |
1466 | short (*check_nic_enough_desc)(struct net_device *dev, int queue_index); |
1467 | void (*set_bw_mode_handler)(struct net_device *dev, |
1468 | enum ht_channel_width bandwidth, |
1469 | enum ht_extchnl_offset Offset); |
1470 | bool (*get_nmode_support_by_sec_cfg)(struct net_device *dev); |
1471 | void (*set_wireless_mode)(struct net_device *dev, u8 wireless_mode); |
1472 | bool (*get_half_nmode_support_by_aps_handler)(struct net_device *dev); |
1473 | u8 (*rtllib_ap_sec_type)(struct rtllib_device *ieee); |
1474 | void (*init_gain_handler)(struct net_device *dev, u8 Operation); |
1475 | void (*ScanOperationBackupHandler)(struct net_device *dev, |
1476 | u8 Operation); |
1477 | void (*set_hw_reg_handler)(struct net_device *dev, u8 variable, u8 *val); |
1478 | |
1479 | void (*allow_all_dest_addr_handler)(struct net_device *dev, |
1480 | bool bAllowAllDA, |
1481 | bool WriteIntoReg); |
1482 | |
1483 | void (*rtllib_ips_leave_wq)(struct net_device *dev); |
1484 | void (*rtllib_ips_leave)(struct net_device *dev); |
1485 | void (*leisure_ps_leave)(struct net_device *dev); |
1486 | |
1487 | /* This must be the last item so that it points to the data |
1488 | * allocated beyond this structure by alloc_rtllib |
1489 | */ |
1490 | u8 priv[]; |
1491 | }; |
1492 | |
1493 | #define IEEE_MODE_MASK (WIRELESS_MODE_B | WIRELESS_MODE_G) |
1494 | |
1495 | /* Generate a 802.11 header */ |
1496 | |
1497 | /* Uses the channel change callback directly |
1498 | * instead of [start/stop] scan callbacks |
1499 | */ |
1500 | #define IEEE_SOFTMAC_SCAN (1<<2) |
1501 | |
1502 | /* Perform authentication and association handshake */ |
1503 | #define IEEE_SOFTMAC_ASSOCIATE (1<<3) |
1504 | |
1505 | /* Generate probe requests */ |
1506 | #define IEEE_SOFTMAC_PROBERQ (1<<4) |
1507 | |
1508 | /* Generate response to probe requests */ |
1509 | #define IEEE_SOFTMAC_PROBERS (1<<5) |
1510 | |
1511 | /* The ieee802.11 stack will manage the netif queue |
1512 | * wake/stop for the driver, taking care of 802.11 |
1513 | * fragmentation. See softmac.c for details. |
1514 | */ |
1515 | #define IEEE_SOFTMAC_TX_QUEUE (1<<7) |
1516 | |
1517 | /* Uses only the softmac_data_hard_start_xmit |
1518 | * even for TX management frames. |
1519 | */ |
1520 | #define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8) |
1521 | |
1522 | /* Generate beacons. The stack will enqueue beacons |
1523 | * to the card |
1524 | */ |
1525 | #define IEEE_SOFTMAC_BEACONS (1<<6) |
1526 | |
1527 | static inline void *rtllib_priv(struct net_device *dev) |
1528 | { |
1529 | return ((struct rtllib_device *)netdev_priv(dev))->priv; |
1530 | } |
1531 | |
1532 | static inline int rtllib_is_empty_essid(const char *essid, int essid_len) |
1533 | { |
1534 | /* Single white space is for Linksys APs */ |
1535 | if (essid_len == 1 && essid[0] == ' ') |
1536 | return 1; |
1537 | |
1538 | /* Otherwise, if the entire essid is 0, we assume it is hidden */ |
1539 | while (essid_len) { |
1540 | essid_len--; |
1541 | if (essid[essid_len] != '\0') |
1542 | return 0; |
1543 | } |
1544 | |
1545 | return 1; |
1546 | } |
1547 | |
1548 | static inline int rtllib_get_hdrlen(u16 fc) |
1549 | { |
1550 | int hdrlen = RTLLIB_3ADDR_LEN; |
1551 | |
1552 | switch (WLAN_FC_GET_TYPE(fc)) { |
1553 | case RTLLIB_FTYPE_DATA: |
1554 | if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS)) |
1555 | hdrlen = RTLLIB_4ADDR_LEN; /* Addr4 */ |
1556 | if (RTLLIB_QOS_HAS_SEQ(fc)) |
1557 | hdrlen += 2; /* QOS ctrl*/ |
1558 | break; |
1559 | case RTLLIB_FTYPE_CTL: |
1560 | switch (WLAN_FC_GET_STYPE(fc)) { |
1561 | case IEEE80211_STYPE_CTS: |
1562 | case IEEE80211_STYPE_ACK: |
1563 | hdrlen = RTLLIB_1ADDR_LEN; |
1564 | break; |
1565 | default: |
1566 | hdrlen = RTLLIB_2ADDR_LEN; |
1567 | break; |
1568 | } |
1569 | break; |
1570 | } |
1571 | |
1572 | return hdrlen; |
1573 | } |
1574 | |
1575 | static inline int rtllib_is_ofdm_rate(u8 rate) |
1576 | { |
1577 | switch (rate & ~RTLLIB_BASIC_RATE_MASK) { |
1578 | case RTLLIB_OFDM_RATE_6MB: |
1579 | case RTLLIB_OFDM_RATE_9MB: |
1580 | case RTLLIB_OFDM_RATE_12MB: |
1581 | case RTLLIB_OFDM_RATE_18MB: |
1582 | case RTLLIB_OFDM_RATE_24MB: |
1583 | case RTLLIB_OFDM_RATE_36MB: |
1584 | case RTLLIB_OFDM_RATE_48MB: |
1585 | case RTLLIB_OFDM_RATE_54MB: |
1586 | return 1; |
1587 | } |
1588 | return 0; |
1589 | } |
1590 | |
1591 | static inline int rtllib_is_cck_rate(u8 rate) |
1592 | { |
1593 | switch (rate & ~RTLLIB_BASIC_RATE_MASK) { |
1594 | case RTLLIB_CCK_RATE_1MB: |
1595 | case RTLLIB_CCK_RATE_2MB: |
1596 | case RTLLIB_CCK_RATE_5MB: |
1597 | case RTLLIB_CCK_RATE_11MB: |
1598 | return 1; |
1599 | } |
1600 | return 0; |
1601 | } |
1602 | |
1603 | /* rtllib.c */ |
1604 | void free_rtllib(struct net_device *dev); |
1605 | struct net_device *alloc_rtllib(int sizeof_priv); |
1606 | |
1607 | /* rtllib_tx.c */ |
1608 | |
1609 | int rtllib_encrypt_fragment(struct rtllib_device *ieee, |
1610 | struct sk_buff *frag, |
1611 | int hdr_len); |
1612 | |
1613 | netdev_tx_t rtllib_xmit(struct sk_buff *skb, struct net_device *dev); |
1614 | void rtllib_txb_free(struct rtllib_txb *txb); |
1615 | |
1616 | /* rtllib_rx.c */ |
1617 | int rtllib_rx(struct rtllib_device *ieee, struct sk_buff *skb, |
1618 | struct rtllib_rx_stats *rx_stats); |
1619 | int rtllib_legal_channel(struct rtllib_device *rtllib, u8 channel); |
1620 | |
1621 | /* rtllib_wx.c */ |
1622 | int rtllib_wx_get_scan(struct rtllib_device *ieee, |
1623 | struct iw_request_info *info, |
1624 | union iwreq_data *wrqu, char *key); |
1625 | int rtllib_wx_set_encode(struct rtllib_device *ieee, |
1626 | struct iw_request_info *info, |
1627 | union iwreq_data *wrqu, char *key); |
1628 | int rtllib_wx_get_encode(struct rtllib_device *ieee, |
1629 | struct iw_request_info *info, |
1630 | union iwreq_data *wrqu, char *key); |
1631 | int rtllib_wx_set_encode_ext(struct rtllib_device *ieee, |
1632 | struct iw_request_info *info, |
1633 | union iwreq_data *wrqu, char *); |
1634 | int rtllib_wx_set_auth(struct rtllib_device *ieee, |
1635 | struct iw_request_info *info, |
1636 | struct iw_param *data, char *); |
1637 | int rtllib_wx_set_mlme(struct rtllib_device *ieee, |
1638 | struct iw_request_info *info, |
1639 | union iwreq_data *wrqu, char *); |
1640 | int rtllib_wx_set_gen_ie(struct rtllib_device *ieee, u8 *ie, size_t len); |
1641 | |
1642 | /* rtllib_softmac.c */ |
1643 | int rtllib_rx_frame_softmac(struct rtllib_device *ieee, struct sk_buff *skb, |
1644 | struct rtllib_rx_stats *rx_stats, u16 type, |
1645 | u16 stype); |
1646 | void rtllib_softmac_new_net(struct rtllib_device *ieee, |
1647 | struct rtllib_network *net); |
1648 | |
1649 | void send_disassociation(struct rtllib_device *ieee, bool deauth, u16 rsn); |
1650 | void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee); |
1651 | |
1652 | int rtllib_softmac_init(struct rtllib_device *ieee); |
1653 | void rtllib_softmac_free(struct rtllib_device *ieee); |
1654 | void rtllib_disassociate(struct rtllib_device *ieee); |
1655 | void rtllib_stop_scan(struct rtllib_device *ieee); |
1656 | bool rtllib_act_scanning(struct rtllib_device *ieee, bool sync_scan); |
1657 | void rtllib_stop_scan_syncro(struct rtllib_device *ieee); |
1658 | void rtllib_start_scan_syncro(struct rtllib_device *ieee); |
1659 | void rtllib_sta_ps_send_null_frame(struct rtllib_device *ieee, short pwr); |
1660 | void rtllib_sta_ps_send_pspoll_frame(struct rtllib_device *ieee); |
1661 | void rtllib_start_protocol(struct rtllib_device *ieee); |
1662 | void rtllib_stop_protocol(struct rtllib_device *ieee); |
1663 | |
1664 | void rtllib_enable_net_monitor_mode(struct net_device *dev, bool init_state); |
1665 | void rtllib_disable_net_monitor_mode(struct net_device *dev, bool init_state); |
1666 | |
1667 | void rtllib_softmac_stop_protocol(struct rtllib_device *ieee); |
1668 | void rtllib_softmac_start_protocol(struct rtllib_device *ieee); |
1669 | |
1670 | void rtllib_reset_queue(struct rtllib_device *ieee); |
1671 | void rtllib_wake_all_queues(struct rtllib_device *ieee); |
1672 | void rtllib_stop_all_queues(struct rtllib_device *ieee); |
1673 | |
1674 | void notify_wx_assoc_event(struct rtllib_device *ieee); |
1675 | void rtllib_ps_tx_ack(struct rtllib_device *ieee, short success); |
1676 | |
1677 | void softmac_mgmt_xmit(struct sk_buff *skb, struct rtllib_device *ieee); |
1678 | u8 rtllib_ap_sec_type(struct rtllib_device *ieee); |
1679 | |
1680 | /* rtllib_softmac_wx.c */ |
1681 | |
1682 | int rtllib_wx_get_wap(struct rtllib_device *ieee, struct iw_request_info *info, |
1683 | union iwreq_data *wrqu, char *ext); |
1684 | |
1685 | int rtllib_wx_set_wap(struct rtllib_device *ieee, struct iw_request_info *info, |
1686 | union iwreq_data *awrq, char *); |
1687 | |
1688 | int rtllib_wx_get_essid(struct rtllib_device *ieee, struct iw_request_info *a, |
1689 | union iwreq_data *wrqu, char *b); |
1690 | |
1691 | int rtllib_wx_set_rate(struct rtllib_device *ieee, struct iw_request_info *info, |
1692 | union iwreq_data *wrqu, char *); |
1693 | |
1694 | int rtllib_wx_get_rate(struct rtllib_device *ieee, struct iw_request_info *info, |
1695 | union iwreq_data *wrqu, char *); |
1696 | |
1697 | int rtllib_wx_set_mode(struct rtllib_device *ieee, struct iw_request_info *a, |
1698 | union iwreq_data *wrqu, char *b); |
1699 | |
1700 | int rtllib_wx_set_scan(struct rtllib_device *ieee, struct iw_request_info *a, |
1701 | union iwreq_data *wrqu, char *b); |
1702 | |
1703 | int rtllib_wx_set_essid(struct rtllib_device *ieee, struct iw_request_info *a, |
1704 | union iwreq_data *wrqu, char *); |
1705 | |
1706 | int rtllib_wx_get_mode(struct rtllib_device *ieee, struct iw_request_info *a, |
1707 | union iwreq_data *wrqu, char *b); |
1708 | |
1709 | int rtllib_wx_set_freq(struct rtllib_device *ieee, struct iw_request_info *a, |
1710 | union iwreq_data *wrqu, char *b); |
1711 | |
1712 | int rtllib_wx_get_freq(struct rtllib_device *ieee, struct iw_request_info *a, |
1713 | union iwreq_data *wrqu, char *b); |
1714 | void rtllib_wx_sync_scan_wq(void *data); |
1715 | |
1716 | int rtllib_wx_get_name(struct rtllib_device *ieee, struct iw_request_info *info, |
1717 | union iwreq_data *wrqu, char *); |
1718 | |
1719 | int rtllib_wx_set_power(struct rtllib_device *ieee, |
1720 | struct iw_request_info *info, |
1721 | union iwreq_data *wrqu, char *); |
1722 | |
1723 | int rtllib_wx_get_power(struct rtllib_device *ieee, |
1724 | struct iw_request_info *info, |
1725 | union iwreq_data *wrqu, char *); |
1726 | |
1727 | int rtllib_wx_set_rts(struct rtllib_device *ieee, struct iw_request_info *info, |
1728 | union iwreq_data *wrqu, char *); |
1729 | |
1730 | int rtllib_wx_get_rts(struct rtllib_device *ieee, struct iw_request_info *info, |
1731 | union iwreq_data *wrqu, char *); |
1732 | #define MAX_RECEIVE_BUFFER_SIZE 9100 |
1733 | |
1734 | void ht_set_connect_bw_mode(struct rtllib_device *ieee, |
1735 | enum ht_channel_width bandwidth, |
1736 | enum ht_extchnl_offset Offset); |
1737 | void ht_update_default_setting(struct rtllib_device *ieee); |
1738 | void ht_construct_capability_element(struct rtllib_device *ieee, |
1739 | u8 *posHTCap, u8 *len, |
1740 | u8 isEncrypt, bool bAssoc); |
1741 | void ht_construct_rt2rt_agg_element(struct rtllib_device *ieee, |
1742 | u8 *posRT2RTAgg, u8 *len); |
1743 | void ht_on_assoc_rsp(struct rtllib_device *ieee); |
1744 | void ht_initialize_ht_info(struct rtllib_device *ieee); |
1745 | void ht_initialize_bss_desc(struct bss_ht *pBssHT); |
1746 | void ht_reset_self_and_save_peer_setting(struct rtllib_device *ieee, |
1747 | struct rtllib_network *pNetwork); |
1748 | void HT_update_self_and_peer_setting(struct rtllib_device *ieee, |
1749 | struct rtllib_network *pNetwork); |
1750 | u8 ht_get_highest_mcs_rate(struct rtllib_device *ieee, u8 *pMCSRateSet, |
1751 | u8 *pMCSFilter); |
1752 | extern u8 MCS_FILTER_ALL[]; |
1753 | extern u16 MCS_DATA_RATE[2][2][77]; |
1754 | u8 ht_c_check(struct rtllib_device *ieee, u8 *pFrame); |
1755 | void ht_reset_iot_setting(struct rt_hi_throughput *ht_info); |
1756 | bool is_ht_half_nmode_aps(struct rtllib_device *ieee); |
1757 | u16 tx_count_to_data_rate(struct rtllib_device *ieee, u8 nDataRate); |
1758 | int rtllib_rx_add_ba_req(struct rtllib_device *ieee, struct sk_buff *skb); |
1759 | int rtllib_rx_add_ba_rsp(struct rtllib_device *ieee, struct sk_buff *skb); |
1760 | int rtllib_rx_DELBA(struct rtllib_device *ieee, struct sk_buff *skb); |
1761 | void rtllib_ts_init_add_ba(struct rtllib_device *ieee, struct tx_ts_record *ts, |
1762 | u8 policy, u8 overwrite_pending); |
1763 | void rtllib_ts_init_del_ba(struct rtllib_device *ieee, |
1764 | struct ts_common_info *ts_common_info, |
1765 | enum tr_select tx_rx_select); |
1766 | void rtllib_ba_setup_timeout(struct timer_list *t); |
1767 | void rtllib_tx_ba_inact_timeout(struct timer_list *t); |
1768 | void rtllib_rx_ba_inact_timeout(struct timer_list *t); |
1769 | void rtllib_reset_ba_entry(struct ba_record *ba); |
1770 | bool rtllib_get_ts(struct rtllib_device *ieee, struct ts_common_info **ppTS, u8 *addr, |
1771 | u8 TID, enum tr_select tx_rx_select, bool bAddNewTs); |
1772 | void rtllib_ts_init(struct rtllib_device *ieee); |
1773 | void TsStartAddBaProcess(struct rtllib_device *ieee, |
1774 | struct tx_ts_record *pTxTS); |
1775 | void remove_peer_ts(struct rtllib_device *ieee, u8 *addr); |
1776 | void remove_all_ts(struct rtllib_device *ieee); |
1777 | |
1778 | static inline const char *escape_essid(const char *essid, u8 essid_len) |
1779 | { |
1780 | static char escaped[IW_ESSID_MAX_SIZE * 2 + 1]; |
1781 | |
1782 | if (rtllib_is_empty_essid(essid, essid_len)) { |
1783 | memcpy(escaped, "<hidden>" , sizeof("<hidden>" )); |
1784 | return escaped; |
1785 | } |
1786 | |
1787 | snprintf(buf: escaped, size: sizeof(escaped), fmt: "%*pE" , essid_len, essid); |
1788 | return escaped; |
1789 | } |
1790 | |
1791 | /* fun with the built-in rtllib stack... */ |
1792 | bool rtllib_mgnt_disconnect(struct rtllib_device *rtllib, u8 rsn); |
1793 | |
1794 | /* For the function is more related to hardware setting, it's better to use the |
1795 | * ieee handler to refer to it. |
1796 | */ |
1797 | void rtllib_flush_rx_ts_pending_pkts(struct rtllib_device *ieee, |
1798 | struct rx_ts_record *ts); |
1799 | int rtllib_parse_info_param(struct rtllib_device *ieee, |
1800 | struct rtllib_info_element *info_element, |
1801 | u16 length, |
1802 | struct rtllib_network *network, |
1803 | struct rtllib_rx_stats *stats); |
1804 | |
1805 | void rtllib_indicate_packets(struct rtllib_device *ieee, |
1806 | struct rtllib_rxb **prxbIndicateArray, u8 index); |
1807 | #define RT_ASOC_RETRY_LIMIT 5 |
1808 | u8 mgnt_query_tx_rate_exclude_cck_rates(struct rtllib_device *ieee); |
1809 | |
1810 | #endif /* RTLLIB_H */ |
1811 | |