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