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