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