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