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