AnyConnect Secure Mobility Client  4.8.02045
GenDefs.h
1 /**************************************************************************
2 * Copyright (c) 2000, Cisco Systems, All Rights Reserved
3 ***************************************************************************
4 *
5 * File: GenDefs.h
6 * Date: 8/23/00
7 *
8 ***************************************************************************
9 * NOTE* This file is for PORTABILITY related defines ONLY.
10 ***************************************************************************
11 * defines base types to be used by all CVC client components
12 ***************************************************************************/
13 #ifndef __GENDEFS_H
14 #define __GENDEFS_H
15 
16 #ifndef _WIN32
17 
18 #ifndef USES_CONVERSION
19 #define USES_CONVERSION
20 #endif
21 
22 #define PRELIM_UNIX_PORT
23 
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27 
28 #ifdef HAVE_STDINT_H
29 #ifndef CNI_LINUX_INTERFACE
30 #include <stdint.h>
31 #endif
32 #elif HAVE_INTTYPES_H
33 #include <inttypes.h>
34 #endif
35 
36 #ifdef HAVE_SYS_TYPES_H
37 #ifndef CNI_LINUX_INTERFACE
38 #include <sys/types.h>
39 #else
40 #include <linux/types.h>
41 #undef _UINTPTR_T_DEFINED
42 #undef _INTPTR_T_DEFINED
43 #endif
44 #endif
45 
46 #undef FAR
47 #define FAR
48 #undef PASCAL
49 #define PASCAL
50 
51 #else //_WIN32
52 #define HAVE_STDINT_H
53 #include <stdint.h>
54 #undef HAVE_CONFIG_H
55 #undef HAVE_SYS_TYPES_H
56 #define WORDS_BIGENDIAN 0
57 #if !defined(DWORD)
58 typedef unsigned long DWORD;
59 #endif // !defined(DWORD)
60 
61 #endif //_WIN32
62 
63 
64 #undef TRUE
65 #define TRUE 1
66 
67 #undef FALSE
68 #define FALSE 0
69 
70 #ifdef DDKBUILD //building with the DDK as the source.
71 #include <crtdefs.h>
72 #endif
73 
74 #if !defined(PLATFORM_WIN_APP)
75 // it'd be nice if we could switch to the C99 standard types at some point...
76 #if defined(HAVE_STDINT_H) || defined(HAVE_INTTYPES_H)
77 typedef uint8_t bool8;
78 typedef uint16_t bool16;
79 typedef uint32_t bool32;
80 
81 typedef int8_t int8;
82 typedef int16_t int16;
83 
84 #if (!defined(CNI_LINUX_INTERFACE) || !defined(CONFIG_ISDN_PPP) || !defined(CONFIG_ISDN_PPP_VJ) || !defined(_SLHC_H)) && !defined(PROTYPES_H)
85 typedef int32_t int32;
86 #endif
87 
88 typedef uint8_t uint8;
89 typedef uint16_t uint16;
90 
91 #if !defined(CSSMAPI) && !defined(PROTYPES_H)
92 #ifdef _WIN32
93 typedef unsigned long uint32;
94 #else
95 typedef uint32_t uint32;
96 #endif
97 #endif
98 
99 typedef uint64_t uint64;
100 #else
101 
102 typedef unsigned char uint8;
103 typedef unsigned short uint16;
104 #ifndef CSSMAPI
105 typedef unsigned long uint32;
106 #endif
107 typedef unsigned char uint8_t;
108 typedef unsigned short uint16_t;
109 #if defined(_WIN32) && !defined (HS_TYPES_H_)
110 typedef unsigned long uint32_t;
111 #endif
112 
113 #ifdef _WIN32
114 typedef __int64 int64;
115 typedef unsigned __int64 uint64;
116 typedef __int64 int64_t;
117 typedef unsigned __int64 uint64_t;
118 #else
119 typedef long long int64;
120 typedef unsigned long long int uint64;
121 typedef long long int64_t;
122 typedef unsigned long long int uint64_t;
123 #endif
124 #endif
125 
126 // Definitions for Windows not available in <stdint.h>
127 #ifdef _WIN32
128 typedef unsigned long bool32_t;
129 typedef unsigned char bool8_t;
130 #endif
131 
132 // integer types for doing pointer arithmetic, they should be the
133 // same size as a pointer. Part of the C99 standard, but they aren't
134 // available everywhere yet.
135 // These defs should work with IA32 (x86), ILP32 (sparcv8) and LP64 (sparcv9).
136 // These types are protected with the WIN32 macros (_INTPTR_T_DEFINED), since
137 // some, but not all of the WIN32 SDK's define these types.
138 #ifdef _WIN32
139 #ifndef _INTPTR_T_DEFINED
140 #if defined(_LP64)
141 #warning 64 bit
142 typedef int64 intptr_t;
143 #else
144 typedef int32 intptr_t;
145 #endif
146 #define _INTPTR_T_DEFINED
147 #endif
148 
149 #ifndef _UINTPTR_T_DEFINED
150 #if defined(_LP64)
151 #warning 64 bit
152 typedef uint64 uintptr_t;
153 #else
154 typedef uint32 uintptr_t;
155 #endif
156 #define _UINTPTR_T_DEFINED
157 #endif
158 #endif
159 
160 #ifndef __OBJC__ /* Mac OS X defines this in ObjectiveC land... */
161 typedef int BOOL;
162 #endif
163 
164 #ifndef _WIN32
165 typedef int BOOLEAN;
166 #endif
167 
168 #ifdef _WIN32
169 typedef int mode_t;
170 #endif
171 
172 typedef unsigned char uchar;
173 #ifndef HAVE_SYS_TYPES_H
174 typedef unsigned int uint;
175 typedef unsigned short ushort;
176 typedef unsigned long ulong;
177 #endif
178 
179 #ifndef PLATFORM_ANDROID
180 typedef ulong ULONG;
181 typedef ulong* PULONG;
182 #endif
183 
184 #if defined(PLATFORM_ANDROID)
185 typedef unsigned long ulong;
186 typedef unsigned short ushort;
187 #endif
188 
189 typedef uint32 DWORD;
190 typedef uint32* PDWORD;
191 typedef long LONG;
192 typedef long* PLONG;
193 typedef int INT;
194 typedef int* PINT;
195 typedef uint UINT;
196 typedef uint* PUINT;
197 typedef uint16 USHORT;
198 typedef uint16* PUSHORT;
199 typedef int16 SHORT;
200 typedef int16* PSHORT;
201 typedef uint16 WORD;
202 typedef uint16* PWORD;
203 typedef char CHAR;
204 typedef uchar UCHAR;
205 typedef char* PCHAR;
206 typedef uint8 BYTE;
207 typedef uint8* PBYTE;
208 #define VOID void
209 typedef void* PVOID;
210 #ifdef _WIN32
211 typedef void* HANDLE;
212 #else
213 typedef int HANDLE;
214 typedef int SOCKET;
215 typedef const char* LPCTSTR;
216 typedef const char* LPCSTR;
217 typedef const char* PCTSTR;
218 typedef char* LPTSTR;
219 typedef void* LPVOID;
220 typedef char* LPSTR;
221 typedef long* LPLONG;
222 typedef DWORD* LPDWORD;
223 typedef signed int INT32;
224 
225 
226 typedef struct __WSABUF
227 {
228  unsigned long len;
229  char *buf;
230 } WSABUF, *LPWSABUF;
231 
232 typedef struct OVERLAPPED
233 {
234  void *data;
235  int fd;
236 } OVERLAPPED,*LPOVERLAPPED;
237 
238 typedef struct sockaddr_in SOCKADDR_IN;
239 typedef struct sockaddr_in6 SOCKADDR_IN6;
240 
241 #endif //!_WIN32
242 
243 typedef HANDLE* PHANDLE;
244 typedef uint8 KIRQL;
245 #else // PLATFORM_WIN_APP
246 typedef unsigned long bool32;
247 typedef unsigned long bool32_t;
248 typedef unsigned long ulong;
249 typedef unsigned char BYTE;
250 typedef unsigned long uint32;
251 typedef long int32;
252 #endif // !defined(PLATFORM_WIN_APP)
253 
254 typedef long STATUSCODE;
255 
256 /* function parameter context */
257 #undef IN
258 #define IN
259 
260 #undef OUT
261 #define OUT
262 
263 #undef INOUT
264 #define INOUT
265 
266 #undef packed
267 #define packed
268 
269 #ifndef CLEAR
270 #define CLEAR(a) memset(&a,0,sizeof(a))
271 #endif
272 
273 #ifndef POINT_BEYOND
274 #define POINT_BEYOND(a,t) (t) &((&a)[1])
275 #endif
276 
277 #ifndef MAX
278 #define MAX(a,b) ((a) > (b) ? (a) : (b))
279 #endif
280 #ifndef MIN
281 #define MIN(a,b) ((a) < (b) ? (a) : (b))
282 #endif
283 
284 #ifndef _WIN32
285 #define _ftime ftime
286 #define _timeb timeb
287 #define __cdecl
288 #define __stdcall
289 #ifndef __fastcall
290 #define __fastcall
291 #endif
292 #ifndef WINAPI
293 #define WINAPI
294 #endif
295 #ifndef CALLBACK
296 #define CALLBACK
297 #endif
298 #endif
299 
300 #ifndef _WIN32
301 #undef INVALID_SOCKET
302 #define INVALID_SOCKET -1
303 #undef INVALID_FD
304 #define INVALID_FD -1
305 #undef SOCKET_ERROR
306 #define SOCKET_ERROR -1
307 #undef SOCKADDR
308 #define SOCKADDR sockaddr
309 #undef SOCKADDR_IN
310 #define SOCKADDR_IN sockaddr_in
311 #undef SOCKADDR_IN6
312 #define SOCKADDR_IN6 sockaddr_in6
313 
314 #if defined(PLATFORM_DARWIN) || defined(PLATFORM_APPLE_SSLVPN) || defined(APPLE_IOS) || defined(PLATFORM_CHROMEBOOK)
315 #define s6_words __u6_addr.__u6_addr16
316 #elif defined(PLATFORM_LINUX)
317 #define s6_words s6_addr16
318 #endif
319 
320 #endif
321 
322 #ifndef _CRT_SECURE_NO_DEPRECATE
323 #define _CRT_SECURE_NO_DEPRECATE
324 #endif
325 
326 
327 #if !defined(_WIN32)
328 
329 #ifndef ZeroMemory
330 #define ZeroMemory ZEROMEM
331 #ifndef PLATFORM_ANDROID
332  #define ZEROMEM(ptr,cnt) \
333  if ( ptr ) { memset(ptr,0,cnt); }
334 #else
335  // Cius compiler will generate a compilation error for: if( &var )
336  #define ZEROMEM(ptr,cnt) \
337  { \
338  void *pZero = ptr; \
339  if ( NULL != pZero ) { memset(pZero,0,cnt); } \
340  }
341 #endif /* !PLATFORM_ANDROID */
342 #endif /* ZeroMemory */
343 
344 #ifndef SecureZeroMemory
345 #define SECUREZEROMEM(ptr, cnt) \
346  do { \
347  size_t size = (size_t)cnt; \
348  volatile char *vptr = (volatile char *)ptr; \
349  while (size) { \
350  *vptr = 0; \
351  vptr++; \
352  size--; \
353  } \
354  } while(0);
355 #define SecureZeroMemory SECUREZEROMEM
356 #endif /* SecureZeroMemory */
357 #endif /* Windows */
358 
359 
360 
361 #ifndef _WIN32
362 #define _strnicmp strncasecmp
363 #define _stricmp strcasecmp
364 #endif
365 
366 #if !defined(UINT16_MAX)
367 #define UINT16_MAX 0xffffu
368 #endif
369 
370 #ifndef ARRAY_SIZE
371 #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
372 #endif
373 
374 #if !defined(TO_STR) && !defined(TO_TSTR) && !defined(SYMBOL_TO_STR) && !defined(SYMBOL_TO_TSTR)
375 
376 // use TO_STR(x)/TO_TSTR(x) to stringize (put double quotes around) x
377 // example:
378 // std::string foo = TO_STR(15);
379 // tstring bar = TO_TSTR(15);
380 // becomes
381 // std::string foo = "15";
382 // tstring bar = _T("15");
383 #define TO_STR(x) #x
384 #define TO_TSTR(x) _T(#x)
385 
386 // use SYMBOL_TO_STR(x)/SYMBOL_TO_TSTR(x) to stringize
387 // the definition of symbol x
388 // example:
389 // #define MAX_LEN 15
390 // std::string foo = SYMBOL_TO_STR(MAX_LEN);
391 // tstring bar = SYMBOL_TO_TSTR(MAX_LEN);
392 // becomes
393 // std::string foo = "15";
394 // tstring bar = _T("15");
395 //
396 // Note that TO_STR(MAX_LEN) results in "MAX_LEN". The double macro is required in
397 // order to strinigize the *definition* of a symbol (as opposed to the symbol itself)
398 #define SYMBOL_TO_STR(x) TO_STR(x)
399 #define SYMBOL_TO_TSTR(x) TO_TSTR(x)
400 
401 #endif
402 
403 #ifdef _WIN32
404 #define systemtime_t __time64_t
405 #define getSystemTimeInSeconds() _time64(NULL)
406 #else
407 #define systemtime_t time_t
408 #define getSystemTimeInSeconds() time(NULL)
409 #endif
410 
411 #ifndef _WIN32
412 #ifndef INFINITE
413 #define INFINITE 0xFFFFFFFF
414 #endif
415 #endif
416 
417 #ifdef _WIN32
418 #define ANY_PATHNAME_DELIMITER "/\\"
419 #define PATHNAME_DELIMITER '\\'
420 #define PATHNAME_DELIMITER_STR "\\"
421 #else
422 #define ANY_PATHNAME_DELIMITER "/"
423 #define PATHNAME_DELIMITER '/'
424 #define PATHNAME_DELIMITER_STR "/"
425 #endif
426 #define URL_URI_DELIMITER '/'
427 #define URL_URI_DELIMITER_STR "/"
428 
429 #ifdef _WIN32
430 #define NEWLINE "\r\n"
431 #else
432 #define NEWLINE "\n"
433 #endif
434 
435 #if defined(_WIN32)
436 #define HOSTSFILE_LOCATION _T("drivers\\etc\\hosts")
437 #else
438 #define HOSTSFILE_LOCATION _T("/etc/hosts")
439 #endif
440 
441 #ifdef _WIN32
442 #define DebugWriteFile(_handle_,_buffer_,_length_,_refCharsWritten_) \
443  WriteFile((_handle_),(_buffer_),(_length_),(_refCharsWritten_),NULL)
444 #else
445 #ifndef INVALID_HANDLE_VALUE
446 #define INVALID_HANDLE_VALUE NULL
447 #endif
448 #define DebugWriteFile(_handle_,_buffer_,_length_,_refCharsWritten_) \
449  fprintf((_handle_), "%s", (_buffer_)); \
450  fflush((_handle_))
451 #endif
452 
453 typedef uint8_t MAC_ADDR[6];
454 
455 #if !defined(_WIN32) || defined(_WIN32_WCE)
456 #ifndef ADDRESS_FAMILY
457 typedef unsigned short ADDRESS_FAMILY;
458 #endif
459 #endif
460 
461 #if ((defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || defined(PLATFORM_LINUX)) && !defined(ANYCONNECT_USE_SNAK) && !defined(PRODUCT_TYPE_SSA)
462 /*
463  ** the FIREWALL_SUPPORTED define is used to track the platforms
464  ** where the firewall feature is supported. This is to avoid repeating the
465  ** platforms in #ifdef clauses in other files.
466  ** Also, when Firewall feature expands to other platforms, they only need to be added in
467  ** one place.
468  */
469 #define FIREWALL_SUPPORTED
470 #endif
471 
472 #if !defined(PRODUCT_TYPE_SSA) && ((defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(PLATFORM_CHROMEBOOK)))
473 /*
474 ** the TRUSTED_NETWORK_DETECTION define is used to track the platforms
475 ** where Trusted Network Detection is performed. This is to avoid repeating the
476 ** platforms in #ifdef clauses in other files.
477 ** Also, when TND support expands to other platforms, they only need to be added in
478 ** one place.
479 */
480 #define TRUSTED_NETWORK_DETECTION
481 
482 /*
483  * Android only uses TND to report state to NVM.
484  * Policy-based actions are not supported.
485  */
486 #if !defined(PLATFORM_ANDROID)
487 #define TND_ACTIONS_SUPPORTED
488 #endif
489 #endif
490 
491 #if (defined(_WIN32) || defined(PLATFORM_DARWIN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_LINUX) && !defined(ANYCONNECT_USE_SNAK) && !defined(PLATFORM_WIN_APP))
492 #define INTER_MODULE_STATE_NOTIFY
493 #endif
494 
495 #if ((defined(_WIN32) && !defined(_WIN32_WCE)) || defined(PLATFORM_DARWIN) || defined(TRUSTED_NETWORK_DETECTION)) && !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_ANDROID)
496 /*
497 ** the LOGIN_UTILITIES_SUPPORTED define is used to track the platforms
498 ** that support AnyConnect action triggered by user login. This is to avoid
499 ** repeating the platforms in #ifdef clauses in other files.
500 ** Also, when login support expands to other platforms, they only need to be added in
501 ** one place.
502 */
503 #define LOGIN_UTILITIES_SUPPORTED
504 #endif
505 
506 #if (defined(_WIN32) || defined(PLATFORM_DARWIN)) && !defined(PLATFORM_WIN_APP)
507 /*
508 ** The DNS_PLUGIN_SUPPORTED define is used to track the platforms where the DNS KDF plugin is
509 ** available. This is to avoid repeating the platforms in #ifdef clauses in other files.
510 ** Also, when support expands to other platforms, they only need to be added in one place.
511 */
512 #define DNS_PLUGIN_SUPPORTED
513 #if defined(_WIN32)
514 /*
515 ** The DNS_PLUGIN_DNS_REQ_HANDLING_SUPPORTED define is used to track the platforms where the DNS KDF plugin is
516 ** available and supports handling of DNS requests during the VPN tunnel (e.g. for split-DNS or tunnel-all-DNS enforcement).
517 **/
518 #define DNS_PLUGIN_DNS_REQ_HANDLING_SUPPORTED
519 #endif // _WIN32
520 #endif // (_WIN32 || PLATFORM_DARWIN) && !PLATFORM_WIN_APP && !PRODUCT_TYPE_SSA
521 
522 #if defined(DNS_PLUGIN_SUPPORTED)
523 /*
524 ** The DYNAMIC_SPLIT_TUNNELING_SUPPORTED define is used to track the platforms where dynamic split tunneling is supported.
525 **/
526 #define DYNAMIC_SPLIT_TUNNELING_SUPPORTED
527 #endif // DNS_PLUGIN_SUPPORTED
528 
529 #if !(defined(PLATFORM_APPLE_SSLVPN) && TARGET_CPU_ARMV6)
530 /*
531 ** A bug was discovered in iPhone testing wherein virtual inline functions do
532 ** not work correctly on ARMv6 processors. To work around this, virtual inline
533 ** function need to be made standard virtual functions on ARMv6. To prevent
534 ** differences in runtime behavior, the VIRTUAL_INLINES_SUPPORTED define is used
535 ** to define some virtual inlines in the header files, letting the functions be
536 ** defined without the inline type in the cpp file for non-supported platforms.
537 */
538 #define VIRTUAL_INLINES_SUPPORTED
539 #endif
540 
541 /*
542  * When changing the SCRIPTING_SUPPORTED definition, you MUST also update the
543  * ClientIfcBase.h! We duplicate this definition there due to the manner in
544  * which we distribute our code to partners; we cannot include this header from
545  * ClientIfcBase.h.
546  */
547 #if !defined(PLATFORM_APPLE_SSLVPN) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_WIN_APP)
548 /*
549 ** the SCRIPTING_SUPPORTED define is used to enable the script manager for launching
550 ** customer provided scripts on events like connection establishment, completion of
551 ** disconnect, and captive portal detection.
552 */
553 #define SCRIPTING_SUPPORTED
554 #endif
555 
556 #if defined(PLATFORM_ANDROID)
557 #define DYNAMIC_CHANGE_FIPS
558 #endif // PLATFORM_ANDROID
559 
560 #if !defined(PRODUCT_TYPE_SSA) && ((defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(ANYCONNECT_USE_SNAK)))
561 /*
562 ** the NETWORK_ENVIRONMENT_STATE define is used to track the platforms
563 ** where NETWORK_ENVIRONMENT_STATE check is performed. This is to avoid repeating the
564 ** platforms in #ifdef clauses in other files.
565 ** Also, when NES support expands to other platforms, they only need to be added in
566 ** one place.
567 */
568 #define NETWORK_ENVIRONMENT_STATE
569 #endif
570 
571 
572 #if (defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(ANYCONNECT_USE_SNAK))
573 /*
574 ** The AUTOMATIC_HEADEND_SELECTION define is used to track the platforms
575 ** where Automatic Headend Selection is performed. This is to avoid repeating the
576 ** platforms in #ifdef clauses in other files.
577 ** Also, when AHS support expands to other platforms, they only need to be added in
578 ** one place.
579 */
580 #define AUTOMATIC_HEADEND_SELECTION
581 #endif
582 
583 #if (defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN)
584 /*
585  ** the MUS_HOST_SERVICES define is used to track the platforms
586  ** where MUS Host Status check is performed. This is to avoid repeating the
587  ** platforms in #ifdef clauses in other files.
588  */
589 #define MUS_HOST_SERVICES
590 #endif
591 
592 // BUGBUG - initially only enable code signing for Windows
593 #if (defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(PLATFORM_LINUX_EMBEDDED_PPC) && !defined(PLATFORM_LINUX_EMBEDDED_ARM) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK))
594 /*
595  ** the CODE_SIGNING_SUPPORTED define is used to track the platforms
596  ** where code sign verification is support. This is to avoid repeating the
597  ** platforms in #ifdef clauses in other files.
598  **
599  */
600 #define CODE_SIGNING_SUPPORTED
601 #endif
602 
603 #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)
604 #define RSA_SECURID_SUPPORTED
605 #endif
606 
607 #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)
608 #define SAFEWORD_SOFTOKEN_SUPPORTED
609 #endif
610 
611 #if (defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || defined(PLATFORM_LINUX) || defined(PLATFORM_APPLE_SSLVPN) || ( defined(PRODUCT_TYPE_SSA) && defined(APPLE_IOS) )
612 /*
613  ** the IPSEC_SUPPORTED define is used to track the platforms
614  ** where the IPSec protocol is supported. This is to avoid repeating the
615  ** platforms in #ifdef clauses in other files.
616  */
617 #define IPSEC_SUPPORTED
618 #endif
619 
620 #if (defined(_WIN32) && !defined(_WIN32_WCE)) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(PLATFORM_CHROMEBOOK)) || defined(PLATFORM_APPLE_SSLVPN) || defined (PLATFORM_ANDROID)
621 /*
622  ** The IPV6_SUPPORTED define is used to track the platforms
623  ** where full IPv6 capability is supported. This is to avoid repeating the
624  ** platforms in #ifdef clauses in other files.
625  ** Note that this is further narrowed down by method CIPv6Util::IsIPv6FullCapabilitySupported.
626  */
627 #define IPV6_SUPPORTED
628 #endif
629 
630 #if (defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || defined(PLATFORM_LINUX) || defined(PLATFORM_APPLE_SSLVPN) || ( defined(PRODUCT_TYPE_SSA) && defined(APPLE_IOS) )
631 /*
632  ** the PLUGIN_PROTOCOL_SUPPORTED define is used to track the platforms
633  ** where modular protocol Plugins are supported. This is to avoid repeating the
634  ** platforms in #ifdef clauses in other files.
635  */
636 #define PLUGIN_PROTOCOL_SUPPORTED
637 #endif
638 
639 #if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP) && !defined(PRODUCT_TYPE_SSA)
640 /*
641 ** The IPSEC_OVER_SSL define is used to track the platforms
642 ** where the feature "IPsec tunneling over SSL for Oracle" (EDCS-852737) is supported.
643 ** This is to avoid repeating the platforms in #ifdef clauses in other files.
644 ** Also, when the support expands to other platforms, they only need to be added in
645 ** one place.
646 */
647 #define IPSEC_OVER_SSL
648 #endif
649 
650 #if (defined(_WIN32) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK)) || defined(APPLE_IOS)
651 /*
652  ** the DATA_OBFUSCATING_SUPPORTED define is used to track the platforms
653  ** where data obfuscation using key exchanges are supported. This is to
654  ** avoid repeating the platforms in #ifdef clauses in other files.
655  */
656 #define DATA_OBFUSCATING_SUPPORTED
657 #endif
658 
659 #if !defined(PLATFORM_APPLE_SSLVPN) && !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP) && !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK)
660 /*
661 ** the HOSTFILE_MODIFICATION_SUPPORTED define is used to track the platforms
662 ** where hosts file modification is performed. This is to avoid repeating the
663 ** platforms in #ifdef clauses in other files.
664 */
665 #define HOSTSFILE_MODIFICATION_SUPPORTED
666 #endif
667 
668 #if defined(_WIN32) || defined(_WIN32_WCE) || defined(PLATFORM_DARWIN) || defined(PLATFORM_LINUX) || defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN)|| defined(PLATFORM_WIN_APP)
669 /*
670 ** the SCEP_CERTIFICATE_ENROLLMENT_SUPPORTED define is used to track the platforms
671 ** where SCEP enrollment can be performed. This is to avoid repeating the
672 ** platforms in #ifdef clauses in other files.
673 */
674 #define SCEP_CERTIFICATE_ENROLLMENT_SUPPORTED
675 #endif
676 
677 #if (defined(_WIN32) && !defined(_WIN32_WCE))
678 /*
679 ** these XXX_PROFILE_SUPPORTED defines are used to track the platforms where
680 ** Service Profiles for optional modules are supported.
681 ** All platforms: VPN
682 ** Windows: NAM, Web Security, ISE Posture, FireAMP, NVM and OpenDNS
683  */
684 #define NAM_PROFILE_SUPPORTED
685 #define WEBSEC_PROFILE_SUPPORTED
686 #define ISEPOSTURE_PROFILE_SUPPORTED
687 #define FIREAMP_PROFILE_SUPPORTED
688 #define NVM_PROFILE_SUPPORTED
689 #define OPENDNS_PROFILE_SUPPORTED
690 #elif defined(PLATFORM_DARWIN)
691 /*
692 ** OS X: Web Security, ISE Posture, FireAMP, NVM and OpenDNS
693 */
694 #define WEBSEC_PROFILE_SUPPORTED
695 #define ISEPOSTURE_PROFILE_SUPPORTED
696 #define FIREAMP_PROFILE_SUPPORTED
697 #define NVM_PROFILE_SUPPORTED
698 #define OPENDNS_PROFILE_SUPPORTED
699 #elif defined(PLATFORM_LINUX)
700 #define NVM_PROFILE_SUPPORTED
701 #endif
702 
703 #if defined(_WIN32) || defined(PLATFORM_DARWIN)
704 /*
705 ** the CLOUD_UPDATE_SUPPORTED define is used to track the platforms
706 ** that support cloud updates (currently from OpenDNS). This is to avoid repeating the
707 ** platforms in #ifdef clauses in other files.
708 */
709 #define CLOUD_UPDATE_SUPPORTED
710 #endif
711 
712 /*
713 ** The PLATFORM_DESKTOP define is used to track AnyConnect desktop platforms.
714 */
715 #if (defined(_WIN32) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(ANYCONNECT_USE_SNAK) && !defined (PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK))) \
716  && !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_WIN_APP)
717 #define PLATFORM_DESKTOP
718 #endif
719 
720 #if defined(PLATFORM_DESKTOP)
721 /*
722 ** The exportStats call is only supported on the Desktop Platforms,
723 ** it should not be included or supported if it is not a Desktop Plat
724 */
725 #define EXPORT_STATS_SUPPORTED
726 #endif
727 
728 #if defined(_WIN32) || defined(PLATFORM_DARWIN) || defined(PLATFORM_LINUX) || defined(PLATFORM_APPLE_SSLVPN)
729 #define AC_CERTIFICATE_POLICY_SUPPORTED
730 #endif
731 
732 #ifndef _TRSTRING
733 #define _tr(String) String
734 #define _TRSTRING
735 #endif
736 
737 #ifndef _C_MYASSERT
738 #define C_MYASSERT(e) typedef char __C_MYASSERT__[(e)?1:-1]
739 #define _C_MYASSERT
740 #endif
741 
742 #if defined(PLATFORM_APPLE_SSLVPN) || defined(APPLE_IOS)
743 #define NETWORK_ORDER_LOOPBACK_INTF_ADDR htonl(0x7f000001) // 127.0.0.1
744 #endif
745 
746 #if !defined(BITS_PER_BYTE)
747 #define BITS_PER_BYTE 8
748 #endif
749 
750 #if defined(PLATFORM_DESKTOP) && defined(PLATFORM_LINUX)
751 #define STATIC_THREAD_LOCAL static __thread
752 #else
753 #define STATIC_THREAD_LOCAL thread_local
754 #endif
755 
756 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)|| defined(PRODUCT_TYPE_SSA) || defined(PLATFORM_WIN_APP)
757 /*
758  ** the MANUAL_PKCS12_IMPORT_SUPPORTED define is used to track the platforms
759  ** where the manual import of PKCS12 certificates is supported. This is to avoid repeating the
760  ** platforms in #ifdef clauses in other files.
761  */
762 #define MANUAL_PKCS12_IMPORT_SUPPORTED
763 #endif
764 
765 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_CHROMEBOOK)
766 // Zlib is statically linked.
767 #define STATIC_ZLIB
768 #endif
769 
770 #if (defined(PLATFORM_LINUX) && !defined(PLATFORM_ANDROID)) || defined(PLATFORM_DARWIN)
771 // Use zlib dynamic library on the system.
772 #define USE_SYSTEM_ZLIB
773 #endif
774 
775 
776 /*
777  * Platforms that support a single profile.
778  */
779 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
780 #define USE_SINGLE_PROFILE
781 #endif
782 
783 
784 /*
785  * Platforms that support ACIDEX.
786  */
787 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN) || defined(_WIN32) || defined(PLATFORM_DARWIN) || defined(PLATFORM_LINUX) || defined(PLATFORM_CHROMEBOOK)
788 #define ACIDEX_SUPPORTED
789 #endif
790 
791 /*
792  * Platforms that support PerApp.
793  */
794 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN)
795 #define PERAPP_SUPPORTED
796 #endif
797 
798 
799 /*
800  * Platforms that support HOSTDATA.
801  */
802 #if defined(PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_CHROMEBOOK)
803 #define HOST_DATA_SUPPORTED
804 #endif
805 
806 
807 /*
808  * Platforms that support scripting.
809  *
810  * When changing the SCRIPTING_SUPPORTED definition, you MUST also update the
811  * ClientIfcBase.h! We duplicate this definition there due to the manner in
812  * which we distribute our code to partners; we cannot include this header from
813  * ClientIfcBase.h.
814 
815  */
816 #if !defined(PLATFORM_APPLE_SSLVPN) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_WIN_APP)
817 #define SCRIPTING_SUPPORTED
818 #endif
819 
820 #if defined(PLATFORM_ANDROID)
821 // On Android, modifying the default route may break system network services.
822 #define DONT_TOUCH_IPV4_DEFAULT_ROUTE
823 #endif
824 
825 #if defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK)
826 #define SNAK_NO_ROUTE_TABLE_ACCESS
827 #endif
828 
829 #if defined(ANYCONNECT_USE_SNAK) || defined(PLATFORM_APPLE_SSLVPN)
830 #define GLOBAL_SNAK_PLUGIN_VER 2
831 #endif
832 
833 #if defined(PLATFORM_ANDROID)
834 #define MEMORY_LOGGING_SUPPORTED
835 #endif
836 
837 
838 
839 #if defined(PLATFORM_ANDROID)
840 // Supports API for integrating program data (e.g. localization and profile).
841 #define PROGRAM_DATA_IMPORT_SUPPORTED
842 #endif
843 
844 #if defined(PLATFORM_ANDROID)
845 // Credentials for a connection can be prefilled via uri handling or API calls
846 // if you add a new platform, you need to add it in ClientIfcBase.h and ConnectPromptInfoBase.h
847 #define CREDENTIAL_PREFILL_SUPPORTED
848 #endif
849 
850 #if !(defined(_WIN32_WCE) || defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK))
851 // support for automatic reconnects
852 #define AUTORECONNECT_SUPPORTED
853 #endif
854 
855 #if !defined(_WIN32_WCE) && !defined(PLATFORM_LINUX_EMBEDDED_PPC) && !defined(PLATFORM_WEBOS_ARM) && !defined(PLATFORM_WEBOS_X86) && !defined(APPLE_IOS) && !defined(PLATFORM_WIN_APP)
856 #define FIPS_SUPPORTED
857 #endif
858 
859 #if !defined(_WIN32_WCE) && !defined(PLATFORM_WIN_APP) && !defined(PLATFORM_APPLE_SSLVPN) && !defined(PLATFORM_LINUX_EMBEDDED_PPC) && !defined(PLATFORM_WEBOS_ARM) && !defined(PLATFORM_WEBOS_X86) && !defined(APPLE_IOS) && !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_CHROMEBOOK)
860 #define LEAF_SUPPORTED
861 #endif
862 
863 #if defined(PLATFORM_DESKTOP) && (defined(_WIN32) || defined(PLATFORM_LINUX))
864 /*
865 ** This define is used to track platforms where user logon
866 ** related preferences in client profile are supported.
867 */
868 #define ENFORCE_USER_LOGON_SETTINGS
869 #endif
870 
871 #if !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK) // More platforms need to be added
872 #define WIDE_CHAR_SUPPORTED
873 #endif
874 
875 #if defined(_WIN32) && !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_WIN_APP)
876 #define TUNNEL_PROXY_SETTINGS_SUPPORTED
877 #endif
878 
879 /*
880 ** Public Proxy support is only implemented on Windows, Linux and Mac desktop platforms
881 */
882 #if defined(PLATFORM_DESKTOP)
883 #define PUBLIC_PROXY_SUPPORTED
884 #endif
885 
886 /*
887 ** NTLM support is only implemented on Windows desktop platforms
888 */
889 #if defined(_WIN32) && defined(PUBLIC_PROXY_SUPPORTED)
890 #define PROXYAUTH_NTLM_SUPPORTED
891 #endif
892 
893 #if defined(PLATFORM_ANDROID) || defined(PRODUCT_TYPE_SSA) || defined(PLATFORM_APPLE_SSLVPN)
894 #define IMPORT_API_SUPPORTED
895 #endif
896 
897 #if defined(PLATFORM_APPLE_SSLVPN) || (defined(PRODUCT_TYPE_SSA) && !(defined(PLATFORM_ANDROID) || defined(APPLE_IOS))) || defined(PLATFORM_CHROMEBOOK)
898 /*
899 ** This serves to tell the IPsec plugin interface to explicitly
900 ** exclude it's global namespace entry points, leaving the only
901 ** plugin interface as a set of static class methods, which the
902 ** loading code will look for directly.
903 */
904 #define IPSEC_AS_INTERNAL_MODULE
905 #endif
906 
907 #if defined(PLATFORM_ANDROID) // More platforms need to be added
908 #define dynamic_cast reinterpret_cast
909 #endif
910 
911 #if defined(PRODUCT_TYPE_SSA) && defined(APPLE_IOS) && !defined(PLATFORM_APPLE_SSLVPN)
912 #define CONFIGURE_REMOTE_WAKEUP_SUPPORTED
913 #endif
914 
915 /*
916 ** The SMARTCARD_SUPPORTED define is used to track the platforms where smartcard
917 ** certificate authentication is supported. This is to avoid repeating the
918 ** platforms in #ifdef clauses in other files.
919 */
920 #if (defined(_WIN32) && !defined(PLATFORM_WIN_APP)) || defined(PLATFORM_DARWIN)
921 #define SMARTCARD_SUPPORTED
922 /*
923 ** The SMARTCARD_REMOVAL_SUPPORTED define is used to track the platforms where smartcard
924 ** removal monitoring is supported. This is to avoid repeating the
925 ** platforms in #ifdef clauses in other files.
926 */
927 #if defined(_WIN32)
928 #define SMARTCARD_REMOVAL_SUPPORTED
929 #endif
930 #endif // (_WIN32 && !PLATFORM_WIN_APP) || PLATFORM_DARWIN
931 
932 #if (defined(PLATFORM_LINUX) || defined(PLATFORM_DARWIN)) && !defined(ANYCONNECT_USE_SNAK) && !defined(PRODUCT_TYPE_SSA)
933 /*
934  ** The CIRCUMVENT_HOST_FILTERING_SUPPORTED define is used to track the platforms
935  ** where AnyConnect can control whether or not pre-existing host filtering is
936  ** circumvented upon applying AnyConnect filtering (only applicable to split-tunneling).
937  */
938 #define CIRCUMVENT_HOST_FILTERING_SUPPORTED
939 #endif
940 
941 #if defined(_WIN32) && !defined(ANYCONNECT_USE_SNAK) && !defined(PRODUCT_TYPE_SSA)
942 /*
943  ** The SKIP_DHCP_SERVER_ROUTE_SUPPORTED define is used to track the platforms
944  ** where the admin can control whether or not the public DHCP server route is created
945  ** upon establishing the VPN tunnel.
946  */
947 #define SKIP_DHCP_SERVER_ROUTE_SUPPORTED
948 #endif
949 
950 #if defined(PLUGIN_PROTOCOL_SUPPORTED) && !defined(PRODUCT_TYPE_SSA)
951 #if (defined(_WIN32) && !defined(_WIN32_WCE))
952 // support Service Control Plugins if defined
953 #define SERVICE_PLUGIN
954 // support PhoneHome Plugin if defined
955 #define PHONEHOME_PLUGIN
956 #elif defined(PLATFORM_DARWIN)
957 // support Service Control Plugins if defined
958 #define SERVICE_PLUGIN
959 // support PhoneHome Plugin if defined
960 #define PHONEHOME_PLUGIN
961 #elif defined(PLATFORM_LINUX) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK)
962 #define PHONEHOME_PLUGIN
963 #define SERVICE_PLUGIN
964 #endif
965 #endif
966 
967 #if (defined (PLATFORM_DARWIN) || defined (PLATFORM_ANDROID) || defined(PLATFORM_APPLE_SSLVPN) || defined(PLATFORM_CHROMEBOOK) || (defined (PLATFORM_LINUX) && !defined (ANYCONNECT_USE_SNAK)))
968 #define FILE_STORE_SUPPORTED
969 #endif
970 
971 #if !defined(PLATFORM_WIN_APP)
972 /*
973 ** the INTERPROCESS_COMMUNICATION_SUPPORTED define is used to track the platforms where the
974 ** communication between processes is supported. This is to avoid repeating the
975 ** platforms in #ifdef clauses in other files.
976 */
977 #define INTERPROCESS_COMMUNICATION_SUPPORTED
978 #endif
979 #if !defined(PLATFORM_WIN_APP)
980 /*
981 ** the THREADS_SUPPORTED define is used to track the platforms where
982 ** threads are supported. This is to avoid repeating the
983 ** platforms in #ifdef clauses in other files.
984 */
985 #define THREADS_SUPPORTED
986 #endif
987 
988 #if !defined(PLATFORM_WIN_APP)
989 /*
990 ** the CAPTIVE_PORTAL_DETECTION_SUPPORTED define is used to track the platforms where
991 ** captive portal detection is supported. This is to avoid repeating the
992 ** platforms in #ifdef clauses in other files.
993 */
994 #define CAPTIVE_PORTAL_DETECTION_SUPPORTED
995 #endif
996 
997 #if defined(_WIN32) && defined(CAPTIVE_PORTAL_DETECTION_SUPPORTED) && defined(PLATFORM_DESKTOP)
998 /*
999 ** the SECURE_CAPTIVE_PORTAL_REMEDIATION_SUPPORTED define is used to track the platforms where
1000 ** secure captive portal remediation is supported.
1001 */
1002 #define SECURE_CAPTIVE_PORTAL_REMEDIATION_SUPPORTED
1003 #endif
1004 
1005 #if !defined(PLATFORM_WIN_APP)
1006 /*
1007 ** the EVENTS_SUPPORTED define is used to track the platforms where
1008 ** events are supported. This is to avoid repeating the
1009 ** platforms in #ifdef clauses in other files.
1010 */
1011 #define EVENTS_SUPPORTED
1012 #endif
1013 
1014 #if defined(IPV6_SUPPORTED) && !defined(PLATFORM_WIN_APP) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK) && !defined(PLATFORM_APPLE_SSLVPN)
1015 /*
1016 ** the MODIFY_HOSTSFILE_SUPPORTED define is used to track the platforms where
1017 ** modification of the system's hosts file is supported. This is to avoid repeating the
1018 ** platforms in #ifdef clauses in other files.
1019 */
1020 #define MODIFY_HOSTSFILE_SUPPORTED
1021 #endif
1022 
1023 #if !defined(PLATFORM_WIN_APP)
1024 /*
1025 ** the HOST_CONFIG_MANAGER_SUPPORTED define is used to track the platforms where
1026 ** broad control of the host OS is supported. This is to avoid repeating the
1027 ** platforms in #ifdef clauses in other files.
1028 */
1029 #define HOST_CONFIG_MANAGER_SUPPORTED
1030 #endif
1031 
1032 #if defined(PRODUCT_TYPE_SSA) || defined(PLATFORM_WIN_APP) || defined(PLATFORM_ANDROID) || defined(PLATFORM_CHROMEBOOK) || defined(PLATFORM_APPLE_SSLVPN)
1033 /*
1034 ** the FILE_SYNCHRONIZER_SUPPORTED define is used to track the platforms where
1035 ** files downloaded directly by VPN API are supported. This is to avoid repeating the
1036 ** platforms in #ifdef clauses in other files.
1037 */
1038 #define FILE_SYNCHRONIZER_SUPPORTED
1039 #endif
1040 
1041 #if defined(_WIN32) || defined(PLATFORM_DARWIN) || (defined(PLATFORM_LINUX) && !defined(PLATFORM_ANDROID) && !defined(PLATFORM_CHROMEBOOK))
1042 /*
1043  ** the SAVE_VPNCONFIG_TO_FILE_SUPPORTED define is used to track the platforms where the
1044  ** writting of the VPN config to file is supported. This is to avoid repeating the
1045  ** platforms in #ifdef clauses in other files.
1046  */
1047 #define SAVE_VPNCONFIG_TO_FILE_SUPPORTED
1048 #endif
1049 
1050 /*
1051 * DSCP preservation is not considered for Downloader. Downloader uses socket transport for IPC.
1052 */
1053 #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_DARWIN) || defined(_WIN32)) && !defined(_DOWNLOADER) && !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_WIN_APP)
1054 // Used to enable preservation of Differentiated Services field in the IP packet header.
1055 #define DIFFSERV_PRESERVATION_SUPPORTED
1056 #endif
1057 
1058 #if !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_WIN_APP)
1059 /*
1060 ** the ROUTE_MANAGER_SUPPORTED define is used to track the platforms
1061 ** where RouteMgr is supported. This is to avoid repeating the
1062 ** platforms in #ifdef clauses in other files.
1063 */
1064 #define ROUTE_MANAGER_SUPPORTED
1065 #endif
1066 
1067 #if !defined(PRODUCT_TYPE_SSA) && !defined(PLATFORM_WIN_APP)
1068 /*
1069 ** the FILTER_MANAGER_SUPPORTED define is used to track the platforms
1070 ** where FilterMgr is supported. This is to avoid repeating the
1071 ** platforms in #ifdef clauses in other files.
1072 */
1073 #define FILTER_MANAGER_SUPPORTED
1074 #endif
1075 
1076 #if defined(PLATFORM_APPLE_SSLVPN)
1077 // Used to enable the file logging for Apple plugins.
1078 //#define FILE_LOGGING_SUPPORTED
1079 #endif
1080 
1081 /*
1082 ** Legacy Single sign on authentication.
1083 ** Explicitly disabled on mobile platforms due to session fixation vulnerability, as described in CSCvg65072
1084 ** To be removed from desktop platforms in some future AnyConnect release (4.7?)
1085 */
1086 #if defined(PLATFORM_DESKTOP)
1087 #define SSO_V1_SUPPORTED
1088 #endif
1089 
1090 /*
1091 ** Single sign on authentication (requires embedded browser).
1092 */
1093 #if !defined(PLATFORM_WIN_APP)
1094 #define SSO_SUPPORTED
1095 #endif
1096 
1097 #if !defined(PLATFORM_WIN_APP)
1098 #define MCA_SUPPORTED
1099 #endif
1100 
1101 #if !defined(PLATFORM_WIN_APP)
1102 #define TIMERS_SUPPORTED
1103 #endif
1104 
1105 #if !defined(PLATFORM_CHROMEBOOK)
1106 #define LOAD_EXTERNAL_MODULES
1107 #endif
1108 
1109 #if defined(PLATFORM_ANDROID)
1110 #define SPLIT_DNS_PROXY_SUPPORTED
1111 #endif
1112 
1113 #if (defined(_WIN32) || defined(PLATFORM_DARWIN)) && defined(PLATFORM_DESKTOP)
1114 /*
1115 ** The MGMT_TUNNEL_SUPPORTED define is used to track the platforms where
1116 ** the management tunnel feature is supported.
1117 */
1118 #define MGMT_TUNNEL_SUPPORTED
1119 #endif
1120 
1121 #if (defined(_WIN32) && defined(PLATFORM_DESKTOP)) || defined(MGMT_TUNNEL_SUPPORTED)
1122 // Machine certificate authentication SSL tunnel connections via agent are supported
1123 // on Windows desktop, and also on all platforms supporting the management tunnel feature.
1124 //
1125 #define SSL_CONNECT_VIA_AGENT_SUPPORTED
1126 #endif
1127 
1128 /*
1129 ** Performance optimization for the tunnel packet processing loop to attempt to process
1130 ** multiple packets before calling back into select().
1131 */
1132 #if !defined(_WIN32)
1133 #define MULTI_TUN_PACKET_PROCESSING_SUPPORTED
1134 #endif
1135 
1136 #if (defined(_WIN32) && defined(_M_ARM64)) || defined(X86_FOR_ARM64)
1137 /*
1138 ** Disable Hostscan on Windows ARM64 builds (both native ARM64 and the hybrid _WIN32_FOR_ARM64).
1139 */
1140 #define ANYCONNECT_NO_CSD
1141 #endif
1142 
1143 #if defined(_WIN32) && defined(PLATFORM_DESKTOP) && !defined(_M_ARM64) && !defined(X86_FOR_ARM64)
1144 /*
1145 ** Connected Standby is supported in Windows desktop but not UWP and not ARM64 (both native ARM64 and the hybrid _WIN32_FOR_ARM64).
1146 */
1147 #define CONNECTED_STANDBY_SUPPORTED
1148 #endif
1149 
1150 
1151 #if defined(_WIN32) && defined(PLATFORM_DESKTOP) || defined(PLATFORM_APPLE_SSLVPN)
1152 /*
1153 ** This define is used to track platforms where multi-line logs are readable, and hence supported.
1154 */
1155 #define MULTI_LINE_LOGS_SUPPORTED
1156 #endif
1157 
1158 #if defined (PLATFORM_ANDROID)
1159 #define PCAP_VA_SUPPORTED
1160 #endif
1161 
1162 /* END OF MACRO HELL */
1163 #endif /*__GENDEFS_H*/