source: mainline/uspace/drv/nic/ar9271/htc.h@ 09044cb

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 09044cb was 1dcc0b9, checked in by Jan Kolarik <kolarik@…>, 10 years ago

Scanning whole 2.4GHz spectrum, created supplicant for managing connection between device STA and AP, finished association process between STA and AP, handling 4way handshake protocol used for key management, written needed cryptographic algorithms (AES, SHA1, HMAC, PBKDF2) for CCMP protocol, data communication on OPEN/CCMP networks.

  • Property mode set to 100644
File size: 7.9 KB
Line 
1/*
2 * Copyright (c) 2014 Jan Kolarik
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @file htc.h
30 *
31 * Definitions of the Atheros HTC (Host Target Communication) technology
32 * for communication between host (PC) and target (device firmware).
33 *
34 */
35
36#ifndef ATHEROS_HTC_H
37#define ATHEROS_HTC_H
38
39#include <ieee80211.h>
40#include <usb/dev/driver.h>
41#include <sys/types.h>
42#include <nic.h>
43
44#include "ath.h"
45
46#define HTC_RTS_THRESHOLD 2304
47#define HTC_RATES_MAX_LENGTH 30
48
49/**
50 * HTC message IDs.
51 */
52typedef enum {
53 HTC_MESSAGE_READY = 1,
54 HTC_MESSAGE_CONNECT_SERVICE,
55 HTC_MESSAGE_CONNECT_SERVICE_RESPONSE,
56 HTC_MESSAGE_SETUP_COMPLETE,
57 HTC_MESSAGE_CONFIG
58} htc_message_id_t;
59
60/**
61 * HTC response message status codes.
62 */
63typedef enum {
64 HTC_SERVICE_SUCCESS = 0,
65 HTC_SERVICE_NOT_FOUND,
66 HTC_SERVICE_FAILED,
67 HTC_SERVICE_NO_RESOURCES,
68 HTC_SERVICE_NO_MORE_EP
69} htc_response_status_code_t;
70
71/**
72 * HTC operating mode definition.
73 */
74typedef enum {
75 HTC_OPMODE_ADHOC = 0,
76 HTC_OPMODE_STATION = 1,
77 HTC_OPMODE_MESH = 2,
78 HTC_OPMODE_AP = 6
79} htc_operating_mode_t;
80
81/**
82 * HTC data type indicator.
83 */
84typedef enum {
85 HTC_DATA_AMPDU = 1,
86 HTC_DATA_NORMAL = 2,
87 HTC_DATA_BEACON = 3,
88 HTC_DATA_MGMT = 4
89} htc_data_type_t;
90
91/**
92 * HTC endpoint numbers.
93 */
94typedef struct {
95 int ctrl_endpoint;
96 int wmi_endpoint;
97 int beacon_endpoint;
98 int cab_endpoint;
99 int uapsd_endpoint;
100 int mgmt_endpoint;
101 int data_be_endpoint;
102 int data_bk_endpoint;
103 int data_video_endpoint;
104 int data_voice_endpoint;
105} htc_pipes_t;
106
107/**
108 * HTC device data.
109 */
110typedef struct {
111 /** WMI message sequence number */
112 uint16_t sequence_number;
113
114 /** HTC endpoints numbers */
115 htc_pipes_t endpoints;
116
117 /** Lock for receiver */
118 fibril_mutex_t rx_lock;
119
120 /** Lock for transmitter */
121 fibril_mutex_t tx_lock;
122
123 /** Pointer to related IEEE 802.11 device */
124 ieee80211_dev_t *ieee80211_dev;
125
126 /** Pointer to Atheros WiFi device structure */
127 ath_t *ath_device;
128} htc_device_t;
129
130/**
131 * HTC frame header structure.
132 */
133typedef struct {
134 uint8_t endpoint_id;
135 uint8_t flags;
136 uint16_t payload_length; /**< Big Endian value! */
137 uint8_t control_bytes[4];
138} __attribute__((packed)) htc_frame_header_t;
139
140/**
141 * HTC management TX frame header structure.
142 */
143typedef struct {
144 uint8_t node_idx;
145 uint8_t vif_idx;
146 uint8_t tidno;
147 uint8_t flags;
148 uint8_t key_type;
149 uint8_t keyix;
150 uint8_t cookie;
151 uint8_t pad;
152} __attribute__((packed)) htc_tx_management_header_t;
153
154/**
155 * HTC data TX frame header structure.
156 */
157typedef struct {
158 uint8_t data_type;
159 uint8_t node_idx;
160 uint8_t vif_idx;
161 uint8_t tidno;
162 uint32_t flags; /**< Big Endian value! */
163 uint8_t key_type;
164 uint8_t keyix;
165 uint8_t cookie;
166 uint8_t pad;
167} __attribute__((packed)) htc_tx_data_header_t;
168
169/**
170 * HTC ready message structure.
171 */
172typedef struct {
173 uint16_t message_id; /**< Big Endian value! */
174 uint16_t credits; /**< Big Endian value! */
175 uint16_t credit_size; /**< Big Endian value! */
176
177 uint8_t max_endpoints;
178 uint8_t pad;
179} __attribute__((packed)) htc_ready_msg_t;
180
181/**
182 * HTC service message structure.
183 */
184typedef struct {
185 uint16_t message_id; /**< Big Endian value! */
186 uint16_t service_id; /**< Big Endian value! */
187 uint16_t connection_flags; /**< Big Endian value! */
188
189 uint8_t download_pipe_id;
190 uint8_t upload_pipe_id;
191 uint8_t service_meta_length;
192 uint8_t pad;
193} __attribute__((packed)) htc_service_msg_t;
194
195/**
196 * HTC service response message structure.
197 */
198typedef struct {
199 uint16_t message_id; /**< Big Endian value! */
200 uint16_t service_id; /**< Big Endian value! */
201 uint8_t status;
202 uint8_t endpoint_id;
203 uint16_t max_message_length; /**< Big Endian value! */
204 uint8_t service_meta_length;
205 uint8_t pad;
206} __attribute__((packed)) htc_service_resp_msg_t;
207
208/**
209 * HTC credits config message structure.
210 */
211typedef struct {
212 uint16_t message_id; /**< Big Endian value! */
213 uint8_t pipe_id;
214 uint8_t credits;
215} __attribute__((packed)) htc_config_msg_t;
216
217/**
218 * HTC new virtual interface message.
219 */
220typedef struct {
221 uint8_t index;
222 uint8_t op_mode;
223 uint8_t addr[ETH_ADDR];
224 uint8_t ath_cap;
225 uint16_t rts_thres; /**< Big Endian value! */
226 uint8_t pad;
227} __attribute__((packed)) htc_vif_msg_t;
228
229/**
230 * HTC new station message.
231 */
232typedef struct {
233 uint8_t addr[ETH_ADDR];
234 uint8_t bssid[ETH_ADDR];
235 uint8_t sta_index;
236 uint8_t vif_index;
237 uint8_t is_vif_sta;
238
239 uint16_t flags; /**< Big Endian value! */
240 uint16_t ht_cap; /**< Big Endian value! */
241 uint16_t max_ampdu; /**< Big Endian value! */
242
243 uint8_t pad;
244} __attribute__((packed)) htc_sta_msg_t;
245
246/**
247 * HTC message to inform target about available capabilities.
248 */
249typedef struct {
250 uint32_t ampdu_limit; /**< Big Endian value! */
251 uint8_t ampdu_subframes;
252 uint8_t enable_coex;
253 uint8_t tx_chainmask;
254 uint8_t pad;
255} __attribute__((packed)) htc_cap_msg_t;
256
257typedef struct {
258 uint8_t sta_index;
259 uint8_t is_new;
260 uint32_t cap_flags; /**< Big Endian value! */
261 uint8_t legacy_rates_count;
262 uint8_t legacy_rates[HTC_RATES_MAX_LENGTH];
263 uint16_t pad;
264} htc_rate_msg_t;
265
266/**
267 * HTC RX status structure used in incoming HTC data messages.
268 */
269typedef struct {
270 uint64_t timestamp; /**< Big Endian value! */
271 uint16_t data_length; /**< Big Endian value! */
272 uint8_t status;
273 uint8_t phy_err;
274 int8_t rssi;
275 int8_t rssi_ctl[3];
276 int8_t rssi_ext[3];
277 uint8_t keyix;
278 uint8_t rate;
279 uint8_t antenna;
280 uint8_t more;
281 uint8_t is_aggr;
282 uint8_t more_aggr;
283 uint8_t num_delims;
284 uint8_t flags;
285 uint8_t dummy;
286 uint32_t evm0; /**< Big Endian value! */
287 uint32_t evm1; /**< Big Endian value! */
288 uint32_t evm2; /**< Big Endian value! */
289} htc_rx_status_t;
290
291/**
292 * HTC setup complete message structure
293 */
294typedef struct {
295 uint16_t message_id; /**< Big Endian value! */
296} __attribute__((packed)) htc_setup_complete_msg_t;
297
298extern int htc_device_init(ath_t *ath_device, ieee80211_dev_t *ieee80211_dev,
299 htc_device_t *htc_device);
300extern int htc_init(htc_device_t *htc_device);
301extern int htc_init_new_vif(htc_device_t *htc_device);
302extern int htc_read_control_message(htc_device_t *htc_device, void *buffer,
303 size_t buffer_size, size_t *transferred_size);
304extern int htc_read_data_message(htc_device_t *htc_device, void *buffer,
305 size_t buffer_size, size_t *transferred_size);
306extern int htc_send_control_message(htc_device_t *htc_device, void *buffer,
307 size_t buffer_size, uint8_t endpoint_id);
308extern int htc_send_data_message(htc_device_t *htc_device, void *buffer,
309 size_t buffer_size, uint8_t endpoint_id);
310
311#endif /* ATHEROS_HTC_H */
312
Note: See TracBrowser for help on using the repository browser.