1 | /* SPDX-License-Identifier: (GPL-2.0 OR MPL-1.1) */ |
2 | /* |
3 | * |
4 | * WLAN net device structure and functions |
5 | * |
6 | * Copyright (C) 1999 AbsoluteValue Systems, Inc. All Rights Reserved. |
7 | * -------------------------------------------------------------------- |
8 | * |
9 | * linux-wlan |
10 | * |
11 | * -------------------------------------------------------------------- |
12 | * |
13 | * Inquiries regarding the linux-wlan Open Source project can be |
14 | * made directly to: |
15 | * |
16 | * AbsoluteValue Systems Inc. |
17 | * info@linux-wlan.com |
18 | * http://www.linux-wlan.com |
19 | * |
20 | * -------------------------------------------------------------------- |
21 | * |
22 | * Portions of the development of this software were funded by |
23 | * Intersil Corporation as part of PRISM(R) chipset product development. |
24 | * |
25 | * -------------------------------------------------------------------- |
26 | * |
27 | * This file declares the structure type that represents each wlan |
28 | * interface. |
29 | * |
30 | * -------------------------------------------------------------------- |
31 | */ |
32 | |
33 | #ifndef _LINUX_P80211NETDEV_H |
34 | #define _LINUX_P80211NETDEV_H |
35 | |
36 | #include <linux/interrupt.h> |
37 | #include <linux/wireless.h> |
38 | #include <linux/netdevice.h> |
39 | |
40 | #define WLAN_RELEASE "0.3.0-staging" |
41 | |
42 | #define WLAN_DEVICE_CLOSED 0 |
43 | #define WLAN_DEVICE_OPEN 1 |
44 | |
45 | #define WLAN_MACMODE_NONE 0 |
46 | #define WLAN_MACMODE_IBSS_STA 1 |
47 | #define WLAN_MACMODE_ESS_STA 2 |
48 | #define WLAN_MACMODE_ESS_AP 3 |
49 | |
50 | /* MSD States */ |
51 | #define WLAN_MSD_HWPRESENT_PENDING 1 |
52 | #define WLAN_MSD_HWFAIL 2 |
53 | #define WLAN_MSD_HWPRESENT 3 |
54 | #define WLAN_MSD_FWLOAD_PENDING 4 |
55 | #define WLAN_MSD_FWLOAD 5 |
56 | #define WLAN_MSD_RUNNING_PENDING 6 |
57 | #define WLAN_MSD_RUNNING 7 |
58 | |
59 | #ifndef ETH_P_ECONET |
60 | #define ETH_P_ECONET 0x0018 /* needed for 2.2.x kernels */ |
61 | #endif |
62 | |
63 | #define ETH_P_80211_RAW (ETH_P_ECONET + 1) |
64 | |
65 | #ifndef ARPHRD_IEEE80211 |
66 | #define ARPHRD_IEEE80211 801 /* kernel 2.4.6 */ |
67 | #endif |
68 | |
69 | #ifndef ARPHRD_IEEE80211_PRISM /* kernel 2.4.18 */ |
70 | #define ARPHRD_IEEE80211_PRISM 802 |
71 | #endif |
72 | |
73 | /*--- NSD Capabilities Flags ------------------------------*/ |
74 | #define P80211_NSDCAP_HARDWAREWEP 0x01 /* hardware wep engine */ |
75 | #define P80211_NSDCAP_SHORT_PREAMBLE 0x10 /* hardware supports */ |
76 | #define P80211_NSDCAP_HWFRAGMENT 0x80 /* nsd handles frag/defrag */ |
77 | #define P80211_NSDCAP_AUTOJOIN 0x100 /* nsd does autojoin */ |
78 | #define P80211_NSDCAP_NOSCAN 0x200 /* nsd can scan */ |
79 | |
80 | /* Received frame statistics */ |
81 | struct p80211_frmrx { |
82 | u32 mgmt; |
83 | u32 assocreq; |
84 | u32 assocresp; |
85 | u32 reassocreq; |
86 | u32 reassocresp; |
87 | u32 probereq; |
88 | u32 proberesp; |
89 | u32 beacon; |
90 | u32 atim; |
91 | u32 disassoc; |
92 | u32 authen; |
93 | u32 deauthen; |
94 | u32 mgmt_unknown; |
95 | u32 ctl; |
96 | u32 pspoll; |
97 | u32 rts; |
98 | u32 cts; |
99 | u32 ack; |
100 | u32 cfend; |
101 | u32 cfendcfack; |
102 | u32 ctl_unknown; |
103 | u32 data; |
104 | u32 dataonly; |
105 | u32 data_cfack; |
106 | u32 data_cfpoll; |
107 | u32 data__cfack_cfpoll; |
108 | u32 null; |
109 | u32 cfack; |
110 | u32 cfpoll; |
111 | u32 cfack_cfpoll; |
112 | u32 data_unknown; |
113 | u32 decrypt; |
114 | u32 decrypt_err; |
115 | }; |
116 | |
117 | /* WEP stuff */ |
118 | #define NUM_WEPKEYS 4 |
119 | #define MAX_KEYLEN 32 |
120 | |
121 | #define HOSTWEP_DEFAULTKEY_MASK GENMASK(1, 0) |
122 | #define HOSTWEP_SHAREDKEY BIT(3) |
123 | #define HOSTWEP_DECRYPT BIT(4) |
124 | #define HOSTWEP_ENCRYPT BIT(5) |
125 | #define HOSTWEP_PRIVACYINVOKED BIT(6) |
126 | #define HOSTWEP_EXCLUDEUNENCRYPTED BIT(7) |
127 | |
128 | extern int wlan_watchdog; |
129 | extern int wlan_wext_write; |
130 | |
131 | /* WLAN device type */ |
132 | struct wlandevice { |
133 | void *priv; /* private data for MSD */ |
134 | |
135 | /* Subsystem State */ |
136 | char name[WLAN_DEVNAMELEN_MAX]; /* Dev name, from register_wlandev() */ |
137 | char *nsdname; |
138 | |
139 | u32 state; /* Device I/F state (open/closed) */ |
140 | u32 msdstate; /* state of underlying driver */ |
141 | u32 hwremoved; /* Has the hw been yanked out? */ |
142 | |
143 | /* Hardware config */ |
144 | unsigned int irq; |
145 | unsigned int iobase; |
146 | unsigned int membase; |
147 | u32 nsdcaps; /* NSD Capabilities flags */ |
148 | |
149 | /* Config vars */ |
150 | unsigned int ethconv; |
151 | |
152 | /* device methods (init by MSD, used by p80211 */ |
153 | int (*open)(struct wlandevice *wlandev); |
154 | int (*close)(struct wlandevice *wlandev); |
155 | void (*reset)(struct wlandevice *wlandev); |
156 | int (*txframe)(struct wlandevice *wlandev, struct sk_buff *skb, |
157 | struct p80211_hdr *p80211_hdr, |
158 | struct p80211_metawep *p80211_wep); |
159 | int (*mlmerequest)(struct wlandevice *wlandev, struct p80211msg *msg); |
160 | int (*set_multicast_list)(struct wlandevice *wlandev, |
161 | struct net_device *dev); |
162 | void (*tx_timeout)(struct wlandevice *wlandev); |
163 | |
164 | /* 802.11 State */ |
165 | u8 bssid[WLAN_BSSID_LEN]; |
166 | struct p80211pstr32 ssid; |
167 | u32 macmode; |
168 | int linkstatus; |
169 | |
170 | /* WEP State */ |
171 | u8 wep_keys[NUM_WEPKEYS][MAX_KEYLEN]; |
172 | u8 wep_keylens[NUM_WEPKEYS]; |
173 | int hostwep; |
174 | |
175 | /* Request/Confirm i/f state (used by p80211) */ |
176 | unsigned long request_pending; /* flag, access atomically */ |
177 | |
178 | /* netlink socket */ |
179 | /* queue for indications waiting for cmd completion */ |
180 | /* Linux netdevice and support */ |
181 | struct net_device *netdev; /* ptr to linux netdevice */ |
182 | |
183 | /* Rx bottom half */ |
184 | struct tasklet_struct rx_bh; |
185 | |
186 | struct sk_buff_head nsd_rxq; |
187 | |
188 | /* 802.11 device statistics */ |
189 | struct p80211_frmrx rx; |
190 | |
191 | struct iw_statistics wstats; |
192 | |
193 | /* jkriegl: iwspy fields */ |
194 | u8 spy_number; |
195 | char spy_address[IW_MAX_SPY][ETH_ALEN]; |
196 | struct iw_quality spy_stat[IW_MAX_SPY]; |
197 | }; |
198 | |
199 | /* WEP stuff */ |
200 | int wep_change_key(struct wlandevice *wlandev, int keynum, u8 *key, int keylen); |
201 | int wep_decrypt(struct wlandevice *wlandev, u8 *buf, u32 len, int key_override, |
202 | u8 *iv, u8 *icv); |
203 | int wep_encrypt(struct wlandevice *wlandev, u8 *buf, u8 *dst, u32 len, |
204 | int keynum, u8 *iv, u8 *icv); |
205 | |
206 | int wlan_setup(struct wlandevice *wlandev, struct device *physdev); |
207 | void wlan_unsetup(struct wlandevice *wlandev); |
208 | int register_wlandev(struct wlandevice *wlandev); |
209 | int unregister_wlandev(struct wlandevice *wlandev); |
210 | void p80211netdev_rx(struct wlandevice *wlandev, struct sk_buff *skb); |
211 | void p80211netdev_hwremoved(struct wlandevice *wlandev); |
212 | #endif |
213 | |