xref: /wlan-dirver/qca-wifi-host-cmn/qdf/inc/qdf_net_types.h (revision 11f5a63a6cbdda84849a730de22f0a71e635d58c)
1 /*
2  * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /**
20  * DOC: qdf_net_types
21  * This file defines types used in the networking stack abstraction.
22  */
23 
24 #ifndef _QDF_NET_TYPES_H
25 #define _QDF_NET_TYPES_H
26 
27 #include <qdf_types.h>          /* uint8_t, etc. */
28 #include <i_qdf_net_types.h>
29 
30 /* Extended Traffic ID  passed to target if the TID is unknown */
31 #define QDF_NBUF_TX_EXT_TID_INVALID     0x1f
32 
33 /**
34  * qdf_nbuf_exemption_type - QDF net buf exemption types for encryption
35  * @QDF_NBUF_EXEMPT_NO_EXEMPTION: No exemption
36  * @QDF_NBUF_EXEMPT_ALWAYS: Exempt always
37  * @QDF_NBUF_EXEMPT_ON_KEY_MAPPING_KEY_UNAVAILABLE: Exempt on key mapping
38  */
39 enum qdf_nbuf_exemption_type {
40 	QDF_NBUF_EXEMPT_NO_EXEMPTION = 0,
41 	QDF_NBUF_EXEMPT_ALWAYS,
42 	QDF_NBUF_EXEMPT_ON_KEY_MAPPING_KEY_UNAVAILABLE
43 };
44 
45 typedef __wsum_t wsum_t;
46 typedef __in6_addr_t in6_addr_t;
47 
48 
49 #define QDF_NET_MAC_ADDR_MAX_LEN 6
50 #define QDF_NET_IF_NAME_SIZE     64
51 #define QDF_NET_ETH_LEN          QDF_NET_MAC_ADDR_MAX_LEN
52 #define QDF_NET_MAX_MCAST_ADDR   64
53 #define QDF_NET_IPV4_LEN         4
54 #define QDF_TID_VI 5
55 #define QDF_TID_VO 6
56 #define QDF_TID_BE 0
57 #define QDF_TID_BK 1
58 /* Extended Traffic ID  passed to target if the TID is unknown */
59 #define QDF_NBUF_TX_EXT_TID_INVALID    0x1f
60 
61 #define QDF_ETH_TYPE_IPV4              0x0800  /* IPV4 */
62 #define QDF_ETH_TYPE_IPV6              0x86dd  /* IPV6 */
63 #define QDF_ETH_TYPE_8021Q             0x8100  /* 802.1Q vlan protocol */
64 #define QDF_IEEE80211_4ADDR_HDR_LEN     30
65 #define QDF_IEEE80211_3ADDR_HDR_LEN     24
66 #define QDF_IEEE80211_FC0_SUBTYPE_QOS   0x80
67 #define QDF_IEEE80211_FC1_TODS          0x01
68 #define QDF_IEEE80211_FC1_FROMDS        0x02
69 
70 #define QDF_IEEE80211_FC0_TYPE_MASK     0x0c
71 #define QDF_IEEE80211_FC0_SUBTYPE_MASK  0xf0
72 
73 #define QDF_IEEE80211_FC0_TYPE_DATA     0x08
74 #define QDF_IEEE80211_FC0_SUBTYPE_DATA  0x00
75 #define QDF_IEEE80211_FC0_SUBTYPE_QOS   0x80
76 
77 #define QDF_IEEE80211_FC0_SUBTYPE_QOS_NULL   0xC0
78 #define QDF_IEEE80211_FC0_SUBTYPE_NODATA   0x40
79 
80 #define QDF_NET_IS_MAC_MULTICAST(_a)   (*(_a) & 0x01)
81 
82 /**
83  * In LLC header individual LSAP address 0x42 in
84  * DSAP and SSAP signifies IEEE 802.1 Bridge
85  * Spanning Tree Protocol
86  */
87 #define QDF_LLC_STP 0x4242
88 
89 typedef struct qdf_net_ethaddr {
90 	uint8_t addr[QDF_NET_ETH_LEN];
91 } qdf_net_ethaddr_t;
92 
93 /**
94  * typedef qdf_net_arphdr_t - ARP header info
95  * @ar_hrd: hardware type
96  * @ar_pro: protocol type
97  * @ar_hln: hardware address length
98  * @ar_pln: protocol length
99  * @ar_op: arp operation code
100  * @ar_sha: sender hardware address
101  * @ar_sip: sender IP address
102  * @ar_tha: target hardware address
103  * @ar_tip: target IP address
104  */
105 typedef struct qdf_net_arphdr {
106 	uint16_t ar_hrd;
107 	uint16_t ar_pro;
108 	uint8_t  ar_hln;
109 	uint8_t  ar_pln;
110 	uint16_t ar_op;
111 	uint8_t  ar_sha[QDF_NET_ETH_LEN];
112 	uint8_t  ar_sip[QDF_NET_IPV4_LEN];
113 	uint8_t  ar_tha[QDF_NET_ETH_LEN];
114 	uint8_t  ar_tip[QDF_NET_IPV4_LEN];
115 } qdf_net_arphdr_t;
116 
117 /**
118  * typedef qdf_net_icmp6_11addr_t - ICMP6 header info
119  * @type: hardware type
120  * @len: hardware address length
121  * @addr: hardware address
122  */
123 typedef struct qdf_net_icmp6_11addr {
124 	uint8_t type;
125 	uint8_t len;
126 	uint8_t addr[QDF_NET_ETH_LEN];
127 } qdf_net_icmp6_11addr_t;
128 
129 #define QDF_TCPHDR_FIN __QDF_TCPHDR_FIN
130 #define QDF_TCPHDR_SYN __QDF_TCPHDR_SYN
131 #define QDF_TCPHDR_RST __QDF_TCPHDR_RST
132 #define QDF_TCPHDR_PSH __QDF_TCPHDR_PSH
133 #define QDF_TCPHDR_ACK __QDF_TCPHDR_ACK
134 #define QDF_TCPHDR_URG __QDF_TCPHDR_URG
135 #define QDF_TCPHDR_ECE __QDF_TCPHDR_ECE
136 #define QDF_TCPHDR_CWR __QDF_TCPHDR_CWR
137 
138 typedef struct {
139 	uint16_t  source;
140 	uint16_t  dest;
141 	uint32_t  seq;
142 	uint32_t  ack_seq;
143 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
144 	uint16_t   res1:4,
145 		   doff:4,
146 		   fin:1,
147 		   syn:1,
148 		   rst:1,
149 		   psh:1,
150 		   ack:1,
151 		   urg:1,
152 		   ece:1,
153 		   cwr:1;
154 #elif defined(QDF_BIG_ENDIAN_MACHINE)
155 	uint16_t   doff:4,
156 		   res1:4,
157 		   cwr:1,
158 		   ece:1,
159 		   urg:1,
160 		   ack:1,
161 		   psh:1,
162 		   rst:1,
163 		   syn:1,
164 		   fin:1;
165 #else
166 #error  "Adjust your byte order"
167 #endif
168 	uint16_t  window;
169 	uint16_t  check;
170 	uint16_t  urg_ptr;
171 } qdf_net_tcphdr_t;
172 
173 typedef struct {
174 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
175 	uint8_t	ip_hl:4,
176 		ip_version:4;
177 #elif defined(QDF_BIG_ENDIAN_MACHINE)
178 	uint8_t	ip_version:4,
179 		ip_hl:4;
180 #else
181 #error  "Please fix"
182 #endif
183 	uint8_t       ip_tos;
184 	uint16_t      ip_len;
185 	uint16_t      ip_id;
186 	uint16_t      ip_frag_off;
187 	uint8_t       ip_ttl;
188 	uint8_t       ip_proto;
189 	uint16_t      ip_check;
190 	uint32_t      ip_saddr;
191 	uint32_t      ip_daddr;
192     /*The options start here. */
193 } qdf_net_iphdr_t;
194 
195 /* V3 group record types [grec_type] */
196 #define IGMPV3_MODE_IS_INCLUDE     1
197 #define IGMPV3_MODE_IS_EXCLUDE     2
198 #define IGMPV3_CHANGE_TO_INCLUDE   3
199 #define IGMPV3_CHANGE_TO_EXCLUDE   4
200 #define IGMPV3_ALLOW_NEW_SOURCES   5
201 #define IGMPV3_BLOCK_OLD_SOURCES   6
202 
203 /**
204  * qdf_net_cmd_vid_t - Command for set/unset vid
205  */
206 typedef uint16_t qdf_net_cmd_vid_t ;        /*get/set vlan id*/
207 
208 /**
209  * typedef qdf_nbuf_tx_cksum_t - transmit checksum offload types
210  * @QDF_NBUF_TX_CKSUM_NONE: No checksum offload
211  * @QDF_NBUF_TX_CKSUM_IP: IP header checksum offload
212  * @QDF_NBUF_TX_CKSUM_TCP_UDP: TCP/UDP checksum offload
213  * @QDF_NBUF_TX_CKSUM_TCP_UDP_IP: TCP/UDP and IP header checksum offload
214  */
215 
216 typedef enum {
217 	QDF_NBUF_TX_CKSUM_NONE,
218 	QDF_NBUF_TX_CKSUM_IP,
219 	QDF_NBUF_TX_CKSUM_TCP_UDP,
220 	QDF_NBUF_TX_CKSUM_TCP_UDP_IP,
221 
222 } qdf_nbuf_tx_cksum_t;
223 
224 /**
225  * typedef qdf_nbuf_l4_rx_cksum_type_t - receive checksum API types
226  * @QDF_NBUF_RX_CKSUM_ZERO: Rx checksum zero
227  * @QDF_NBUF_RX_CKSUM_TCP: Rx checksum TCP
228  * @QDF_NBUF_RX_CKSUM_UDP: Rx checksum UDP
229  * @QDF_NBUF_RX_CKSUM_TCPIPV6: Rx checksum TCP IPV6
230  * @QDF_NBUF_RX_CKSUM_UDPIPV6: Rx checksum UDP IPV6
231  * @QDF_NBUF_RX_CKSUM_TCP_NOPSEUDOHEADER: Rx checksum TCP no pseudo header
232  * @QDF_NBUF_RX_CKSUM_UDP_NOPSEUDOHEADER: Rx checksum UDP no pseudo header
233  * @QDF_NBUF_RX_CKSUM_TCPSUM16: Rx checksum TCP SUM16
234  */
235 typedef enum {
236 	QDF_NBUF_RX_CKSUM_ZERO = 0x0000,
237 	QDF_NBUF_RX_CKSUM_TCP = 0x0001,
238 	QDF_NBUF_RX_CKSUM_UDP = 0x0002,
239 	QDF_NBUF_RX_CKSUM_TCPIPV6 = 0x0010,
240 	QDF_NBUF_RX_CKSUM_UDPIPV6 = 0x0020,
241 	QDF_NBUF_RX_CKSUM_TCP_NOPSEUDOHEADER = 0x0100,
242 	QDF_NBUF_RX_CKSUM_UDP_NOPSEUDOHEADER = 0x0200,
243 	QDF_NBUF_RX_CKSUM_TCPSUM16 = 0x1000,
244 } qdf_nbuf_l4_rx_cksum_type_t;
245 
246 /**
247  * typedef qdf_nbuf_l4_rx_cksum_result_t - receive checksum status types
248  * @QDF_NBUF_RX_CKSUM_NONE: Device failed to checksum
249  * @QDF_NBUF_RX_CKSUM_TCP_UDP_HW: TCP/UDP cksum successful and value returned
250  * @QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY: TCP/UDP cksum successful, no value
251  */
252 typedef enum {
253 	QDF_NBUF_RX_CKSUM_NONE = 0x0000,
254 	QDF_NBUF_RX_CKSUM_TCP_UDP_HW = 0x0010,
255 	QDF_NBUF_RX_CKSUM_TCP_UDP_UNNECESSARY = 0x0020,
256 } qdf_nbuf_l4_rx_cksum_result_t;
257 
258 /**
259  * typedef qdf_nbuf_rx_cksum_t - receive checksum type
260  * @l4_type: L4 type
261  * @l4_result: L4 result
262  */
263 typedef struct {
264 	qdf_nbuf_l4_rx_cksum_type_t l4_type;
265 	qdf_nbuf_l4_rx_cksum_result_t l4_result;
266 	uint32_t val;
267 } qdf_nbuf_rx_cksum_t;
268 
269 #define QDF_ARP_REQ       1 /* ARP request */
270 #define QDF_ARP_RSP       2 /* ARP response */
271 #define QDF_ARP_RREQ      3 /* RARP request */
272 #define QDF_ARP_RRSP      4 /* RARP response */
273 
274 #define QDF_NEXTHDR_ICMP  58 /* ICMP for IPv6. */
275 
276 /* Neighbor Discovery */
277 #define QDF_ND_RSOL       133 /* Router Solicitation */
278 #define QDF_ND_RADVT      134 /* Router Advertisement */
279 #define QDF_ND_NSOL       135 /* Neighbor Solicitation */
280 #define QDF_ND_NADVT      136 /* Neighbor Advertisement */
281 
282 /**
283  * typedef qdf_net_udphdr_t - UDP header info
284  * @src_port: source port
285  * @dst_port: destination port
286  * @udp_len: length
287  * @udp_cksum: checksum
288  */
289 typedef struct {
290 	uint16_t src_port;
291 	uint16_t dst_port;
292 	uint16_t udp_len;
293 	uint16_t udp_cksum;
294 } qdf_net_udphdr_t;
295 
296 /**
297  * typedef qdf_net_dhcphdr_t - DHCP header info
298  * @dhcp_msg_type: message type
299  * @dhcp_hw_type: hardware type
300  * @dhcp_hw_addr_len: hardware address length
301  * @dhcp_num_hops: number of hops
302  * @dhcp_transc_id: transaction id
303  * @dhcp_secs_elapsed: time elapsed
304  * @dhcp_flags: flags
305  * @dhcp_ciaddr: client IP
306  * @dhcp_yiaddr: device IP
307  * @dhcp_siaddr_nip: Server IP
308  * @dhcp_gateway_nip: relay agent IP
309  * @dhcp_chaddr: LLC hardware address
310  * @dhcp_sname: server host name
311  * @dhcp_file: boot file name
312  * @dhcp_cookie: cookie
313  */
314 typedef struct {
315 	uint8_t  dhcp_msg_type;
316 	uint8_t  dhcp_hw_type;
317 	uint8_t  dhcp_hw_addr_len;
318 	uint8_t  dhcp_num_hops;
319 	uint32_t dhcp_transc_id;
320 	uint16_t dhcp_secs_elapsed;
321 	uint16_t dhcp_flags;
322 	uint32_t dhcp_ciaddr;
323 	uint32_t dhcp_yiaddr;
324 	uint32_t dhcp_siaddr_nip;
325 	uint32_t dhcp_gateway_nip;
326 	uint8_t  dhcp_chaddr[16];
327 	uint8_t  dhcp_sname[64];
328 	uint8_t  dhcp_file[128];
329 	uint8_t  dhcp_cookie[4];
330 } qdf_net_dhcphdr_t;
331 
332 
333 /**
334  * qdf_net_vlanhdr_t - Vlan header
335  */
336 typedef struct qdf_net_vlanhdr {
337 	uint16_t tpid;
338 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
339 	uint16_t vid:12; /* Vlan id*/
340 	uint8_t  cfi:1; /* reserved for CFI, don't use*/
341 	uint8_t  prio:3; /* Priority*/
342 #elif defined(QDF_BIG_ENDIAN_MACHINE)
343 	uint8_t  prio:3; /* Priority*/
344 	uint8_t  cfi:1; /* reserved for CFI, don't use*/
345 	uint16_t vid:12; /* Vlan id*/
346 #else
347 #error  "Please fix"
348 #endif
349 } qdf_net_vlanhdr_t;
350 
351 typedef struct qdf_net_vid {
352 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
353 	uint16_t val:12;
354 	uint8_t  res:4;
355 #elif defined(QDF_BIG_ENDIAN_MACHINE)
356 	uint8_t  res:4;
357 	uint16_t val:12;
358 #else
359 #error  "Please fix"
360 #endif
361 } qdf_net_vid_t;
362 
363 typedef enum {
364 	QDF_NET_TSO_NONE,
365 	QDF_NET_TSO_IPV4,     /**< for tsp ipv4 only*/
366 	QDF_NET_TSO_ALL,      /**< ip4 & ipv6*/
367 } qdf_net_tso_type_t;
368 
369 /**
370  * qdf_net_dev_info_t - Basic device info
371  */
372 typedef struct {
373 	uint8_t  if_name[QDF_NET_IF_NAME_SIZE];
374 	uint8_t  dev_addr[QDF_NET_MAC_ADDR_MAX_LEN];
375 	uint16_t header_len;
376 	uint16_t mtu_size;
377 	uint32_t unit;
378 } qdf_net_dev_info_t;
379 
380 /**
381  * qdf_nbuf_tso_t - For TCP large Segment Offload
382  */
383 typedef struct {
384 	qdf_net_tso_type_t  type;
385 	uint16_t mss;
386 	uint8_t  hdr_off;
387 } qdf_nbuf_tso_t;
388 
389 /**
390  * qdf_net_wireless_event_t - Wireless events
391  * QDF_IEEE80211_ASSOC = station associate (bss mode)
392  * QDF_IEEE80211_REASSOC = station re-associate (bss mode)
393  * QDF_IEEE80211_DISASSOC = station disassociate (bss mode)
394  * QDF_IEEE80211_JOIN = station join (ap mode)
395  * QDF_IEEE80211_LEAVE = station leave (ap mode)
396  * QDF_IEEE80211_SCAN = scan complete, results available
397  * QDF_IEEE80211_REPLAY = sequence counter replay detected
398  * QDF_IEEE80211_MICHAEL = Michael MIC failure detected
399  * QDF_IEEE80211_REJOIN = station re-associate (ap mode)
400  * QDF_CUSTOM_PUSH_BUTTON = WPS push button
401  */
402 typedef enum qdf_net_wireless_events {
403 	QDF_IEEE80211_ASSOC = __QDF_IEEE80211_ASSOC,
404 	QDF_IEEE80211_REASSOC = __QDF_IEEE80211_REASSOC,
405 	QDF_IEEE80211_DISASSOC = __QDF_IEEE80211_DISASSOC,
406 	QDF_IEEE80211_JOIN = __QDF_IEEE80211_JOIN,
407 	QDF_IEEE80211_LEAVE = __QDF_IEEE80211_LEAVE,
408 	QDF_IEEE80211_SCAN = __QDF_IEEE80211_SCAN,
409 	QDF_IEEE80211_REPLAY = __QDF_IEEE80211_REPLAY,
410 	QDF_IEEE80211_MICHAEL = __QDF_IEEE80211_MICHAEL,
411 	QDF_IEEE80211_REJOIN = __QDF_IEEE80211_REJOIN,
412 	QDF_CUSTOM_PUSH_BUTTON = __QDF_CUSTOM_PUSH_BUTTON
413 } qdf_net_wireless_event_t;
414 
415 /**
416  * qdf_net_ipv6_addr_t - IPv6 Address
417  */
418 typedef struct {
419 	union {
420 		uint8_t  u6_addr8[16];
421 		uint16_t u6_addr16[8];
422 		uint32_t u6_addr32[4];
423 	} in6_u;
424 #define s6_addr32   in6_u.u6_addr32
425 } qdf_net_ipv6_addr_t;
426 
427 /**
428  * qdf_net_ipv6hdr_t - IPv6 Header
429  */
430 typedef struct {
431 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
432 	uint8_t ipv6_priority:4,
433 		ipv6_version:4;
434 #elif defined(QDF_BIG_ENDIAN_MACHINE)
435 	uint8_t ipv6_version:4,
436 		ipv6_priority:4;
437 #else
438 #error  "Please fix"
439 #endif
440 	uint8_t ipv6_flow_lbl[3];
441 
442 	uint16_t ipv6_payload_len;
443 	uint8_t  ipv6_nexthdr,
444 		 ipv6_hop_limit;
445 
446 	qdf_net_ipv6_addr_t ipv6_saddr,
447 			    ipv6_daddr;
448 } qdf_net_ipv6hdr_t;
449 
450 /**
451  * qdf_net_icmpv6hdr_t - ICMPv6 Header
452  */
453 typedef struct {
454 	uint8_t	 icmp6_type;
455 	uint8_t	 icmp6_code;
456 	uint16_t icmp6_cksum;
457 
458 	union {
459 		uint32_t un_data32[1];
460 		uint16_t un_data16[2];
461 		uint8_t  un_data8[4];
462 
463 		struct {
464 			uint16_t identifier;
465 			uint16_t sequence;
466 		} u_echo;
467 
468 		struct {
469 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
470 			uint32_t reserved:5,
471 				 override:1,
472 				 solicited:1,
473 				 router:1,
474 				 reserved2:24;
475 #elif defined(QDF_BIG_ENDIAN_MACHINE)
476 			uint32_t router:1,
477 				 solicited:1,
478 				 override:1,
479 				 reserved:29;
480 #else
481 #error  "Please fix"
482 #endif
483 		} u_nd_advt;
484 
485 		struct {
486 			uint8_t	hop_limit;
487 #if defined(QDF_LITTLE_ENDIAN_MACHINE)
488 			uint8_t	reserved:6,
489 				other:1,
490 				managed:1;
491 
492 #elif defined(QDF_BIG_ENDIAN_MACHINE)
493 			uint8_t	managed:1,
494 				other:1,
495 				reserved:6;
496 #else
497 #error  "Please fix"
498 #endif
499 			uint16_t rt_lifetime;
500 		} u_nd_ra;
501 
502 	} icmp6_dataun;
503 
504 } qdf_net_icmpv6hdr_t;
505 
506 /**
507  * qdf_net_nd_msg_t - Neighbor Discovery Message
508  */
509 typedef struct {
510 	qdf_net_icmpv6hdr_t nd_icmph;
511 	qdf_net_ipv6_addr_t nd_target;
512 	uint8_t	nd_opt[0];
513 } qdf_net_nd_msg_t;
514 
515 
516 static inline int32_t qdf_csum_ipv6(const in6_addr_t *saddr,
517 				    const in6_addr_t *daddr,
518 				    __u32 len, unsigned short proto,
519 				    wsum_t sum)
520 {
521 	return (int32_t)__qdf_csum_ipv6(saddr, daddr, len, proto, sum);
522 }
523 
524 typedef struct {
525 	uint8_t i_fc[2];
526 	uint8_t i_dur[2];
527 	uint8_t i_addr1[QDF_NET_MAC_ADDR_MAX_LEN];
528 	uint8_t i_addr2[QDF_NET_MAC_ADDR_MAX_LEN];
529 	uint8_t i_addr3[QDF_NET_MAC_ADDR_MAX_LEN];
530 	uint8_t i_seq[2];
531 	uint8_t i_qos[2];
532 } qdf_dot3_qosframe_t;
533 
534 typedef struct {
535 	uint8_t ether_dhost[QDF_NET_MAC_ADDR_MAX_LEN];
536 	uint8_t ether_shost[QDF_NET_MAC_ADDR_MAX_LEN];
537 	uint16_t vlan_TCI;
538 	uint16_t vlan_encapsulated_proto;
539 	uint16_t ether_type;
540 } qdf_ethervlan_header_t;
541 
542 /**
543  * typedef qdf_ether_header_t - ethernet header info
544  * @ether_dhost: destination hardware address
545  * @ether_shost: source hardware address
546  * @ether_type: ethernet type
547  */
548 typedef struct {
549 	uint8_t  ether_dhost[QDF_NET_ETH_LEN];
550 	uint8_t  ether_shost[QDF_NET_ETH_LEN];
551 	uint16_t ether_type;
552 } qdf_ether_header_t;
553 
554 typedef struct {
555 	uint8_t llc_dsap;
556 	uint8_t llc_ssap;
557 	union {
558 		struct {
559 			uint8_t control;
560 			uint8_t format_id;
561 			uint8_t class;
562 			uint8_t window_x2;
563 		} __packed type_u;
564 		struct {
565 			uint8_t num_snd_x2;
566 			uint8_t num_rcv_x2;
567 		} __packed type_i;
568 		struct {
569 			uint8_t control;
570 			uint8_t num_rcv_x2;
571 		} __packed type_s;
572 		struct {
573 			uint8_t control;
574 			/*
575 			 * We cannot put the following fields in a structure
576 			 * because the structure rounding might cause padding.
577 			 */
578 			uint8_t frmr_rej_pdu0;
579 			uint8_t frmr_rej_pdu1;
580 			uint8_t frmr_control;
581 			uint8_t frmr_control_ext;
582 			uint8_t frmr_cause;
583 		} __packed type_frmr;
584 		struct {
585 			uint8_t  control;
586 			uint8_t  org_code[3];
587 			uint16_t ether_type;
588 		} __packed type_snap;
589 		struct {
590 			uint8_t control;
591 			uint8_t control_ext;
592 		} __packed type_raw;
593 	} llc_un /* XXX __packed ??? */;
594 } qdf_llc_t;
595 #endif /*_QDF_NET_TYPES_H*/
596