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