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