72b90659c11573e7076639aaaedc5796fdb81211
[iotivity.git] / resource / csdk / connectivity / api / cacommon.h
1 /* ****************************************************************
2  *
3  * Copyright 2014 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  ******************************************************************/
20
21 /**
22  * @file cacommon.h
23  * This file contains the common data structures between Resource, CA and adapters
24  */
25
26 /** @addtogroup connectivity_abstraction
27  */
28 /// @{
29
30 #ifndef CA_COMMON_H_
31 #define CA_COMMON_H_
32
33 #include "iotivity_config.h"
34
35 #include <limits.h>
36 #include <stdint.h>
37 #include <stdlib.h>
38 #include <stdbool.h>
39
40 #ifdef HAVE_SYS_POLL_H
41 #include <sys/poll.h>
42 #endif
43
44 #ifdef HAVE_WINSOCK2_H
45 #include <winsock2.h>
46 #include <mswsock.h>
47 #endif
48
49 #ifdef __cplusplus
50 extern "C"
51 {
52 #endif
53
54 /**
55  * TAG of Analyzer log.
56  */
57 #define ANALYZER_TAG "OIC_ANALYZER"
58
59 /**
60  * IP address Length.
61  */
62 #define CA_IPADDR_SIZE 16
63
64 /**
65  * Remote Access jabber ID length.
66  */
67 #define CA_RAJABBERID_SIZE 256
68
69 /**
70  * Mac address length for BT port.
71  */
72 #define CA_MACADDR_SIZE 18
73
74 /**
75  * Max header options data length.
76  */
77 #define CA_MAX_HEADER_OPTION_DATA_LENGTH 1024
78
79 /**
80 * Max token length.
81 */
82 #define CA_MAX_TOKEN_LEN (8)
83
84 /**
85  * Max URI length.
86  */
87 #define CA_MAX_URI_LENGTH 512 /* maximum size of URI */
88
89 /**
90  * Max PDU length supported.
91  */
92 #define COAP_MAX_PDU_SIZE           1400 /* maximum size of a CoAP PDU */
93
94 #ifdef WITH_BWT
95 #define CA_DEFAULT_BLOCK_SIZE       CA_BLOCK_SIZE_1024_BYTE
96 #endif
97
98 /**
99  *Maximum length of the remoteEndpoint identity.
100  */
101 #define CA_MAX_ENDPOINT_IDENTITY_LEN  CA_MAX_IDENTITY_SIZE
102
103 /**
104  * Max identity size.
105  */
106 #define CA_MAX_IDENTITY_SIZE (37)
107
108 /**
109  * option types - the highest option number 63.
110  */
111 #define CA_OPTION_IF_MATCH 1
112 #define CA_OPTION_ETAG 4
113 #define CA_OPTION_IF_NONE_MATCH 5
114 #define CA_OPTION_OBSERVE 6
115 #define CA_OPTION_LOCATION_PATH 8
116 #define CA_OPTION_URI_PATH 11
117 #define CA_OPTION_CONTENT_FORMAT 12
118 #define CA_OPTION_CONTENT_TYPE COAP_OPTION_CONTENT_FORMAT
119 #define CA_OPTION_MAXAGE 14
120 #define CA_OPTION_URI_QUERY 15
121 #define CA_OPTION_ACCEPT 17
122 #define CA_OPTION_LOCATION_QUERY 20
123
124 /**
125  * @def UUID_PREFIX
126  * @brief uuid prefix in certificate subject field
127  */
128 #define UUID_PREFIX "uuid:"
129
130 /**
131  * @def SUBJECT_PREFIX
132  * @brief prefix for specifying part of a cert's subject for a particular uuid
133  */
134 #define SUBJECT_PREFIX "CN=" UUID_PREFIX
135
136 /**
137 * TODO: Move these COAP defines to CoAP lib once approved.
138 */
139 #define COAP_MEDIATYPE_APPLICATION_VND_OCF_CBOR 10000 // application/vnd.ocf+cbor
140 #define CA_OPTION_ACCEPT_VERSION 2049
141 #define CA_OPTION_CONTENT_VERSION 2053
142
143 // The Accept Version and Content-Format Version for OCF 1.0.0 (0b0000 1000 0000 0000).
144 #define DEFAULT_VERSION_VALUE 2048
145
146 /**
147  * Option numbers for Signaling messages are specific to the message code.
148  * They do not share the number space with CoAP options for request/response
149  * messages or with Signaling messages using other codes.
150  */
151 #define CA_OPTION_SERVER_NAME_SETTING 1    /**< Capability and Settings messages, code=7.01 */
152 #define CA_OPTION_MAX_MESSAGE_SIZE 2       /**< Capability and Settings messages, code=7.01 */
153 #define CA_OPTION_BLOCK_WISE_TRANSFER 4    /**< Capability and Settings messages, code=7.01 */
154 #define CA_OPTION_CUSTODY 2                /**< Ping and Pong Messages, code=7.02 */
155 #define CA_OPTION_BAD_SERVER_NAME 2        /**< Release Messages, code=7.04 */
156 #define CA_OPTION_ALTERNATE_ADDRESS 4      /**< Abort Messages, code=7.05 */
157 #define CA_OPTION_HOLD_OFF 6               /**< Abort Messages, code=7.05 */
158
159 /**
160  * Payload information from resource model.
161  */
162 typedef uint8_t *CAPayload_t;
163
164 /**
165  * URI for the OIC base.CA considers relative URI as the URI.
166  */
167 typedef char *CAURI_t;
168
169 /**
170  * Token information for mapping the request and responses by resource model.
171  */
172 typedef char *CAToken_t;
173
174 /*
175  * Socket types and error definitions.
176  */
177 #ifdef HAVE_WINSOCK2_H
178 # define OC_SOCKET_ERROR      SOCKET_ERROR
179 # define OC_INVALID_SOCKET    INVALID_SOCKET
180 typedef SOCKET CASocketFd_t;
181 #else // HAVE_WINSOCK2_H
182 # define OC_SOCKET_ERROR      (-1)
183 # define OC_INVALID_SOCKET    (-1)
184 typedef int    CASocketFd_t;
185 #endif
186
187 /*
188  * The following flags are the same as the equivalent OIC values in
189  * octypes.h, allowing direct copying with slight fixup.
190  * The CA layer should used the OC types when build allows that.
191  */
192 #ifdef RA_ADAPTER
193 #define MAX_ADDR_STR_SIZE_CA (256)
194 #else
195 /*
196  * Max Address could be "coaps+tcp://[xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:yyy.yyy.yyy.yyy]:xxxxx"
197  * Which is 65, +1 for null terminator => 66
198  * OCDevAddr (defined in OCTypes.h) must be the same
199  * as CAEndpoint_t (defined here)
200  */
201 #define MAX_ADDR_STR_SIZE_CA (66)
202 #endif
203
204 typedef enum
205 {
206     CA_DEFAULT_ADAPTER = 0,
207
208     // value zero indicates discovery
209     CA_ADAPTER_IP            = (1 << 0),   // IPv4 and IPv6, including 6LoWPAN
210     CA_ADAPTER_GATT_BTLE     = (1 << 1),   // GATT over Bluetooth LE
211     CA_ADAPTER_RFCOMM_BTEDR  = (1 << 2),   // RFCOMM over Bluetooth EDR
212
213 #ifdef RA_ADAPTER
214     CA_ADAPTER_REMOTE_ACCESS = (1 << 3),   // Remote Access over XMPP.
215 #endif
216
217     CA_ADAPTER_TCP           = (1 << 4),   // CoAP over TCP
218     CA_ADAPTER_NFC           = (1 << 5),   // NFC Adapter
219
220     CA_ALL_ADAPTERS          = 0xffffffff
221 } CATransportAdapter_t;
222
223 typedef enum
224 {
225     CA_DEFAULT_FLAGS = 0,
226
227     // Insecure transport is the default (subject to change)
228     CA_SECURE          = (1 << 4),   // secure the transport path
229     // IPv4 & IPv6 autoselection is the default
230     CA_IPV6            = (1 << 5),   // IP adapter only
231     CA_IPV4            = (1 << 6),   // IP adapter only
232     // Indication that a message was received by multicast.
233     CA_MULTICAST       = (1 << 7),
234     // Link-Local multicast is the default multicast scope for IPv6.
235     // These correspond in both value and position to the IPv6 address bits.
236     CA_SCOPE_INTERFACE = 0x1, // IPv6 Interface-Local scope
237     CA_SCOPE_LINK      = 0x2, // IPv6 Link-Local scope (default)
238     CA_SCOPE_REALM     = 0x3, // IPv6 Realm-Local scope
239     CA_SCOPE_ADMIN     = 0x4, // IPv6 Admin-Local scope
240     CA_SCOPE_SITE      = 0x5, // IPv6 Site-Local scope
241     CA_SCOPE_ORG       = 0x8, // IPv6 Organization-Local scope
242     CA_SCOPE_GLOBAL    = 0xE, // IPv6 Global scope
243 } CATransportFlags_t;
244
245 typedef enum
246 {
247     CA_DEFAULT_BT_FLAGS = 0,
248     // flags for BLE transport
249     CA_LE_ADV_DISABLE   = 0x1,   // disable BLE advertisement.
250     CA_LE_ADV_ENABLE    = 0x2,   // enable BLE advertisement.
251     CA_LE_SERVER_DISABLE = (1 << 4),   // disable gatt server.
252     // flags for EDR transport
253     CA_EDR_SERVER_DISABLE = (1 << 7)
254 } CATransportBTFlags_t;
255
256 #define CA_IPFAMILY_MASK (CA_IPV6|CA_IPV4)
257 #define CA_SCOPE_MASK 0xf     // mask scope bits above
258
259 /**
260  * Information about the network status.
261  */
262 typedef enum
263 {
264     CA_INTERFACE_DOWN,   /**< Connection is not available */
265     CA_INTERFACE_UP    /**< Connection is Available */
266 } CANetworkStatus_t;
267
268 /*
269  * remoteEndpoint identity.
270  */
271 typedef struct
272 {
273     uint16_t id_length;
274     unsigned char id[CA_MAX_ENDPOINT_IDENTITY_LEN];
275 } CARemoteId_t;
276
277 /**
278  * Message Type for Base source code.
279  */
280 typedef enum
281 {
282     CA_MSG_CONFIRM = 0,  /**< confirmable message (requires ACK/RST) */
283     CA_MSG_NONCONFIRM,   /**< non-confirmable message (one-shot message) */
284     CA_MSG_ACKNOWLEDGE,  /**< used to acknowledge confirmable messages */
285     CA_MSG_RESET         /**< used to indicates not-interested or error (lack of context)in
286                                                   received messages */
287 } CAMessageType_t;
288
289 /**
290  * Allowed method to be used by resource model.
291  */
292 typedef enum
293 {
294     CA_GET = 1, /**< GET Method  */
295     CA_POST,    /**< POST Method */
296     CA_PUT,     /**< PUT Method */
297     CA_DELETE   /**< DELETE Method */
298 } CAMethod_t;
299
300 /**
301  * block size.
302  * it depends on defined size in libCoAP.
303  */
304 typedef enum
305 {
306     CA_BLOCK_SIZE_16_BYTE = 0,    /**< 16byte */
307     CA_BLOCK_SIZE_32_BYTE = 1,    /**< 32byte */
308     CA_BLOCK_SIZE_64_BYTE = 2,    /**< 64byte */
309     CA_BLOCK_SIZE_128_BYTE = 3,   /**< 128byte */
310     CA_BLOCK_SIZE_256_BYTE = 4,   /**< 256byte */
311     CA_BLOCK_SIZE_512_BYTE = 5,   /**< 512byte */
312     CA_BLOCK_SIZE_1024_BYTE = 6     /**< 1Kbyte */
313 } CABlockSize_t;
314
315 /**
316  * Endpoint information for connectivities.
317  * Must be identical to OCDevAddr.
318  */
319 typedef struct
320 {
321     CATransportAdapter_t    adapter;    // adapter type
322     CATransportFlags_t      flags;      // transport modifiers
323     uint16_t                port;       // for IP
324     char                    addr[MAX_ADDR_STR_SIZE_CA]; // address for all
325     uint32_t                ifindex;    // usually zero for default interface
326     char                    remoteId[CA_MAX_IDENTITY_SIZE]; // device ID of remote device
327 #if defined (ROUTING_GATEWAY) || defined (ROUTING_EP)
328     char                    routeData[MAX_ADDR_STR_SIZE_CA]; /**< GatewayId:ClientId of
329                                                                     destination. **/
330 #endif
331 } CAEndpoint_t;
332
333 #define CA_SECURE_ENDPOINT_PUBLIC_KEY_MAX_LENGTH    (512)
334
335 /**
336  * Endpoint information for secure messages.
337  */
338 typedef struct
339 {
340     CAEndpoint_t endpoint;      /**< endpoint */
341     // TODO change name to deviceId
342     CARemoteId_t identity;      /**< endpoint device uuid */
343     CARemoteId_t userId;        /**< endpoint user uuid */
344     uint32_t attributes;
345     uint8_t publicKey[CA_SECURE_ENDPOINT_PUBLIC_KEY_MAX_LENGTH]; /**< Peer's DER-encoded public key (if using certificate) */
346     size_t publicKeyLength;     /**< Length of publicKey; zero if not using certificate */
347 } CASecureEndpoint_t;
348
349 /**
350  * Endpoint used for security administration - a special type of identity that
351  * bypasses Access Control Entry checks for SVR resources, while the device is
352  * not ready for normal operation yet.
353  */
354 #define CA_SECURE_ENDPOINT_ATTRIBUTE_ADMINISTRATOR  0x1
355
356 /**
357  * Enums for CA return values.
358  */
359 typedef enum
360 {
361     /* Result code - START HERE */
362     CA_STATUS_OK = 0,               /**< Success */
363     CA_STATUS_INVALID_PARAM,        /**< Invalid Parameter */
364     CA_ADAPTER_NOT_ENABLED,         /**< Adapter is not enabled */
365     CA_SERVER_STARTED_ALREADY,      /**< Server is started already */
366     CA_SERVER_NOT_STARTED,          /**< Server is not started */
367     CA_DESTINATION_NOT_REACHABLE,   /**< Destination is not reachable */
368     CA_SOCKET_OPERATION_FAILED,     /**< Socket operation failed */
369     CA_SEND_FAILED,                 /**< Send request failed */
370     CA_RECEIVE_FAILED,              /**< Receive failed */
371     CA_MEMORY_ALLOC_FAILED,         /**< Memory allocation failed */
372     CA_REQUEST_TIMEOUT,             /**< Request is Timeout */
373     CA_DESTINATION_DISCONNECTED,    /**< Destination is disconnected */
374     CA_NOT_SUPPORTED,               /**< Not supported */
375     CA_STATUS_NOT_INITIALIZED,      /**< Not Initialized*/
376     CA_DTLS_AUTHENTICATION_FAILURE, /**< Decryption error in DTLS */
377     CA_CONTINUE_OPERATION,          /**< Error happens but current operation should continue */
378     CA_HANDLE_ERROR_OTHER_MODULE,   /**< Error happens but it should be handled in other module */
379     CA_STATUS_NOT_FOUND,            /**< Not Found*/
380     CA_STATUS_FAILED =255           /**< Failure */
381     /* Result code - END HERE */
382 } CAResult_t;
383
384 /**
385  * Enums for CA Response values.
386  */
387 typedef enum
388 {
389     /* Response status code - START HERE */
390     CA_EMPTY = 0,                           /**< Empty */
391     CA_CREATED = 201,                       /**< Created */
392     CA_DELETED = 202,                       /**< Deleted */
393     CA_VALID = 203,                         /**< Valid */
394     CA_CHANGED = 204,                       /**< Changed */
395     CA_CONTENT = 205,                       /**< Content */
396     CA_CONTINUE = 231,                      /**< Continue */
397     CA_BAD_REQ = 400,                       /**< Bad Request */
398     CA_UNAUTHORIZED_REQ = 401,              /**< Unauthorized Request */
399     CA_BAD_OPT = 402,                       /**< Bad Option */
400     CA_FORBIDDEN_REQ = 403,                 /**< Forbidden Request */
401     CA_NOT_FOUND = 404,                     /**< Not found */
402     CA_METHOD_NOT_ALLOWED = 405,            /**< Method Not Allowed */
403     CA_NOT_ACCEPTABLE = 406,                /**< Not Acceptable */
404     CA_REQUEST_ENTITY_INCOMPLETE = 408,     /**< Request Entity Incomplete */
405     CA_REQUEST_ENTITY_TOO_LARGE = 413,      /**< Request Entity Too Large */
406     CA_INTERNAL_SERVER_ERROR = 500,         /**< Internal Server Error */
407     CA_BAD_GATEWAY = 502,
408     CA_SERVICE_UNAVAILABLE = 503,           /**< Server Unavailable */
409     CA_RETRANSMIT_TIMEOUT = 504,            /**< Retransmit timeout */
410     CA_PROXY_NOT_SUPPORTED = 505            /**< Proxy not enabled to service a request */
411     /* Response status code - END HERE */
412 } CAResponseResult_t;
413
414 /**
415  * Enums for CA Signaling codes.
416  */
417 typedef enum
418 {
419     /* Signaling code - START HERE */
420     CA_CSM = 701,                           /**< Capability and Settings messages */
421     CA_PING = 702,                          /**< Ping messages */
422     CA_PONG = 703,                          /**< Pong messages */
423     CA_RELEASE = 704,                       /**< Release messages */
424     CA_ABORT = 705,                         /**< Abort messages */
425     /* Signaling code - END HERE */
426 } CASignalingCode_t;
427
428 /**
429  * Data type whether the data is Request Message or Response Message.
430  * if there is some failure before send data on network.
431  * Type will be set as error type for error callback.
432  */
433 typedef enum
434 {
435     CA_REQUEST_DATA = 1,
436     CA_RESPONSE_DATA,
437     CA_ERROR_DATA,
438     CA_RESPONSE_FOR_RES,
439     CA_SIGNALING_DATA
440 } CADataType_t;
441
442 /**
443  * Transport Protocol IDs for additional options.
444  */
445 typedef enum
446 {
447     CA_INVALID_ID = (1 << 0),   /**< Invalid ID */
448     CA_COAP_ID = (1 << 1)       /**< COAP ID */
449 } CATransportProtocolID_t;
450
451 /**
452  * Adapter State to indicate the network changed notifications.
453  */
454 typedef enum
455 {
456     CA_ADAPTER_DISABLED,   /**< Adapter is Disabled */
457     CA_ADAPTER_ENABLED     /**< Adapter is Enabled */
458 } CAAdapterState_t;
459
460 /**
461  * Format indicating which encoding has been used on the payload.
462  */
463 typedef enum
464 {
465     CA_FORMAT_UNDEFINED = 0,            /**< Undefined enoding format */
466     CA_FORMAT_TEXT_PLAIN,
467     CA_FORMAT_APPLICATION_LINK_FORMAT,
468     CA_FORMAT_APPLICATION_XML,
469     CA_FORMAT_APPLICATION_OCTET_STREAM,
470     CA_FORMAT_APPLICATION_RDF_XML,
471     CA_FORMAT_APPLICATION_EXI,
472     CA_FORMAT_APPLICATION_JSON,
473     CA_FORMAT_APPLICATION_CBOR,
474     CA_FORMAT_APPLICATION_VND_OCF_CBOR,
475     CA_FORMAT_UNSUPPORTED
476 } CAPayloadFormat_t;
477
478 /**
479  * Option ID of header option. The values match CoAP option types in pdu.h.
480  */
481 typedef enum
482 {
483     CA_HEADER_OPTION_ID_LOCATION_PATH = 8,
484     CA_HEADER_OPTION_ID_LOCATION_QUERY = 20
485 } CAHeaderOptionId_t;
486
487 /**
488  * Header options structure to be filled.
489  *
490  * This structure is used to hold header information.
491  */
492 typedef struct
493 {
494     CATransportProtocolID_t protocolID;                     /**< Protocol ID of the Option */
495     uint16_t optionID;                                      /**< The header option ID which will be
496                                                             added to communication packets */
497     uint16_t optionLength;                                  /**< Option Length **/
498     char optionData[CA_MAX_HEADER_OPTION_DATA_LENGTH];      /**< Optional data values**/
499 } CAHeaderOption_t;
500
501 /**
502  * Base Information received.
503  *
504  * This structure is used to hold request & response base information.
505  */
506 typedef struct
507 {
508     CAMessageType_t type;       /**< Qos for the request */
509 #ifdef ROUTING_GATEWAY
510     bool skipRetransmission;    /**< Will not attempt retransmission even if type is CONFIRM.
511                                      Required for packet forwarding */
512 #endif
513     uint16_t messageId;         /**< Message id.
514                                  * if message id is zero, it will generated by CA inside.
515                                  * otherwise, you can use it */
516     CAToken_t token;            /**< Token for CA */
517     uint8_t tokenLength;        /**< token length */
518     CAHeaderOption_t *options;  /** Header Options for the request */
519     uint8_t numOptions;         /**< Number of Header options */
520     CAPayload_t payload;        /**< payload of the request  */
521     size_t payloadSize;         /**< size in bytes of the payload */
522     CAPayloadFormat_t payloadFormat;    /**< encoding format of the request payload */
523     CAPayloadFormat_t acceptFormat;     /**< accept format for the response payload */
524     uint16_t payloadVersion;    /**< version of the payload */
525     uint16_t acceptVersion;     /**< expected version for the response payload */
526     CAURI_t resourceUri;        /**< Resource URI information **/
527     CARemoteId_t identity;      /**< endpoint identity */
528     CADataType_t dataType;      /**< data type */
529 } CAInfo_t;
530
531 /**
532  * Request Information to be sent.
533  *
534  * This structure is used to hold request information.
535  */
536 typedef struct
537 {
538     CAMethod_t method;  /**< Name of the Method Allowed */
539     CAInfo_t info;      /**< Information of the request. */
540     bool isMulticast;   /**< is multicast request */
541 } CARequestInfo_t;
542
543 /**
544  * Response information received.
545  *
546  * This structure is used to hold response information.
547  */
548 typedef struct
549 {
550     CAResponseResult_t result;  /**< Result for response by resource model */
551     CAInfo_t info;              /**< Information of the response */
552     bool isMulticast;
553 } CAResponseInfo_t;
554
555 /**
556  * Error information from CA
557  *        contains error code and message information.
558  *
559  * This structure holds error information.
560  */
561 typedef struct
562 {
563     CAResult_t result;  /**< CA API request result  */
564     CAInfo_t info;      /**< message information such as token and payload data
565                              helpful to identify the error */
566 } CAErrorInfo_t;
567
568 /**
569  * Signaling information received.
570  *
571  * This structure is used to hold signaling information.
572  */
573 typedef struct
574 {
575     CASignalingCode_t code;
576     CAInfo_t info;              /**< Information of the signaling */
577 } CASignalingInfo_t;
578
579 /**
580  * Hold global variables for CA layer. (also used by RI layer)
581  */
582 typedef struct
583 {
584     CASocketFd_t fd;    /**< socket fd */
585     uint16_t port;      /**< socket port */
586 } CASocket_t;
587
588 #define HISTORYSIZE (4)
589
590 typedef struct
591 {
592     CATransportFlags_t flags;
593     uint16_t messageId;
594     char token[CA_MAX_TOKEN_LEN];
595     uint8_t tokenLength;
596     uint32_t ifindex;
597 } CAHistoryItem_t;
598
599 typedef struct
600 {
601     int nextIndex;
602     CAHistoryItem_t items[HISTORYSIZE];
603 } CAHistory_t;
604
605 /**
606  * Hold interface index for keeping track of comings and goings.
607  */
608 typedef struct
609 {
610     int32_t ifIndex; /**< network interface index */
611 } CAIfItem_t;
612
613 /**
614  * Hold the port number assigned from application.
615  * It will be used when creating a socket.
616  */
617 typedef struct
618 {
619     struct udpports
620     {
621         uint16_t u6;    /**< unicast IPv6 socket port */
622         uint16_t u6s;   /**< unicast IPv6 socket secure port */
623         uint16_t u4;    /**< unicast IPv4 socket port */
624         uint16_t u4s;   /**< unicast IPv4 socket secure port */
625     } udp;
626 #ifdef TCP_ADAPTER
627     struct tcpports
628     {
629         uint16_t u4;    /**< unicast IPv4 socket port */
630         uint16_t u4s;   /**< unicast IPv6 socket secure port */
631         uint16_t u6;    /**< unicast IPv6 socket port */
632         uint16_t u6s;   /**< unicast IPv6 socket secure port */
633     } tcp;
634 #endif
635 } CAPorts_t;
636
637 typedef struct
638 {
639     CATransportFlags_t clientFlags; /**< flag for client */
640     CATransportFlags_t serverFlags; /**< flag for server */
641     bool client; /**< client mode */
642     bool server; /**< server mode */
643
644     CAPorts_t ports;
645
646     struct sockets
647     {
648         void *threadpool;           /**< threadpool between Initialize and Start */
649         CASocket_t u6;              /**< unicast   IPv6 */
650         CASocket_t u6s;             /**< unicast   IPv6 secure */
651         CASocket_t u4;              /**< unicast   IPv4 */
652         CASocket_t u4s;             /**< unicast   IPv4 secure */
653         CASocket_t m6;              /**< multicast IPv6 */
654         CASocket_t m6s;             /**< multicast IPv6 secure */
655         CASocket_t m4;              /**< multicast IPv4 */
656         CASocket_t m4s;             /**< multicast IPv4 secure */
657 #if defined(_WIN32)
658         WSAEVENT addressChangeEvent;/**< Event used to signal address changes */
659         WSAEVENT shutdownEvent;     /**< Event used to signal threads to stop */
660 #else
661         int netlinkFd;              /**< netlink */
662         int shutdownFds[2];         /**< fds used to signal threads to stop */
663         CASocketFd_t maxfd;         /**< highest fd (for select) */
664 #endif
665         int selectTimeout;          /**< in seconds */
666         bool started;               /**< the IP adapter has started */
667         bool terminate;             /**< the IP adapter needs to stop */
668         bool ipv6enabled;           /**< IPv6 enabled by OCInit flags */
669         bool ipv4enabled;           /**< IPv4 enabled by OCInit flags */
670         bool dualstack;             /**< IPv6 and IPv4 enabled */
671 #if defined (_WIN32)
672         LPFN_WSARECVMSG wsaRecvMsg; /**< Win32 function pointer to WSARecvMsg() */
673 #endif
674
675         struct networkmonitors
676         {
677             CAIfItem_t *ifItems; /**< current network interface index list */
678             size_t sizeIfItems;  /**< size of network interface index array */
679             size_t numIfItems;   /**< number of valid network interfaces */
680         } nm;
681     } ip;
682
683     struct calayer
684     {
685         CAHistory_t requestHistory;  /**< filter IP family in requests */
686     } ca;
687
688 #ifdef TCP_ADAPTER
689     /**
690      * Hold global variables for TCP Adapter.
691      */
692     struct tcpsockets
693     {
694         void *threadpool;       /**< threadpool between Initialize and Start */
695         CASocket_t ipv4;        /**< IPv4 accept socket */
696         CASocket_t ipv4s;       /**< IPv4 accept socket secure */
697         CASocket_t ipv6;        /**< IPv6 accept socket */
698         CASocket_t ipv6s;       /**< IPv6 accept socket secure */
699         int selectTimeout;      /**< in seconds */
700         int listenBacklog;      /**< backlog counts*/
701 #if defined(_WIN32)
702         WSAEVENT updateEvent;   /**< Event used to signal thread to stop or update the FD list */
703 #else
704         int shutdownFds[2];     /**< shutdown pipe */
705         int connectionFds[2];   /**< connection pipe */
706         CASocketFd_t maxfd;     /**< highest fd (for select) */
707 #endif
708         bool started;           /**< the TCP adapter has started */
709         volatile bool terminate;/**< the TCP adapter needs to stop */
710         bool ipv4tcpenabled;    /**< IPv4 TCP enabled by OCInit flags */
711         bool ipv6tcpenabled;    /**< IPv6 TCP enabled by OCInit flags */
712     } tcp;
713 #endif
714     CATransportBTFlags_t bleFlags;   /**< flags related BLE transport */
715 } CAGlobals_t;
716
717 extern CAGlobals_t caglobals;
718
719 typedef enum
720 {
721     CA_LOG_LEVEL_ALL = 1,             // all logs.
722     CA_LOG_LEVEL_INFO,                // debug level is disabled.
723 } CAUtilLogLevel_t;
724
725 /**
726  * Callback function type for request delivery.
727  * @param[out]   object       Endpoint object from which the request is received.
728  *                            It contains endpoint address based on the connectivity type.
729  * @param[out]   requestInfo  Info for resource model to understand about the request.
730  */
731 typedef void (*CARequestCallback)(const CAEndpoint_t *object,
732                                   const CARequestInfo_t *requestInfo);
733
734 /**
735  * Callback function type for response delivery.
736  * @param[out]   object           Endpoint object from which the response is received.
737  * @param[out]   responseInfo     Identifier which needs to be mapped with response.
738  */
739 typedef void (*CAResponseCallback)(const CAEndpoint_t *object,
740                                    const CAResponseInfo_t *responseInfo);
741 /**
742  * Callback function type for error.
743  * @param[out]   object           remote device information.
744  * @param[out]   errorInfo        CA Error information.
745  */
746 typedef void (*CAErrorCallback)(const CAEndpoint_t *object,
747                                 const CAErrorInfo_t *errorInfo);
748
749 /**
750  * Callback function type for error.
751  * @param[out]   object           remote device information.
752  * @param[out]   result           error information.
753  */
754 typedef CAResult_t (*CAHandshakeErrorCallback)(const CAEndpoint_t *object,
755                                                const CAErrorInfo_t *errorInfo);
756
757 /**
758  * Callback function type for network status changes delivery from CA common logic.
759  * @param[out]   info       Endpoint object from which the network status is changed.
760  *                          It contains endpoint address based on the connectivity type.
761  * @param[out]   status     Current network status info.
762  */
763 typedef void (*CANetworkMonitorCallback)(const CAEndpoint_t *info, CANetworkStatus_t status);
764
765 #ifdef __cplusplus
766 } /* extern "C" */
767 #endif
768 /// @}
769 #endif // CA_COMMON_H_