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