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