#define WITH_PRESENCE
#include "ocpresence.h"
+
+// TODO : need for secure psi
+#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
+#define __SECURE_PSI__
+#endif
+
//-----------------------------------------------------------------------------
// Defines
//-----------------------------------------------------------------------------
+#define IOTIVITY_VERSION "1.2.1"
+
/**
* OIC Virtual resources supported by every OIC device.
*/
/** MQ Broker URI.*/
#define OC_RSRVD_WELL_KNOWN_MQ_URI "/oic/ps"
+/** KeepAlive URI.*/
+#define OC_RSRVD_KEEPALIVE_URI "/oic/ping"
+#ifdef WITH_PRESENCE
/** Presence */
/** Presence URI through which the OIC devices advertise their presence.*/
/** Presence URI through which the OIC devices advertise their device presence.*/
#define OC_RSRVD_DEVICE_PRESENCE_URI "/oic/prs"
-/** Sets the default time to live (TTL) for presence.*/
-#define OC_DEFAULT_PRESENCE_TTL_SECONDS (60)
+#endif // WITH_PRESENCE
/** For multicast Discovery mechanism.*/
#define OC_MULTICAST_DISCOVERY_URI "/oic/res"
/** Separator for multiple query string.*/
#define OC_QUERY_SEPARATOR "&;"
+#ifdef WITH_PRESENCE
/**
* OC_DEFAULT_PRESENCE_TTL_SECONDS sets the default time to live (TTL) for presence.
*/
/** To delete.*/
#define OC_RSRVD_TRIGGER_DELETE "delete"
+#endif // WITH_PRESENCE
+
/**
* Attributes used to form a proper OIC conforming JSON message.
*/
/** To represent resource type.*/
#define OC_RSRVD_RESOURCE_TYPE "rt"
+#ifdef WITH_PRESENCE
/** To represent resource type with presence.*/
#define OC_RSRVD_RESOURCE_TYPE_PRESENCE "oic.wk.ad"
+#endif
/** To represent resource type with device.*/
#define OC_RSRVD_RESOURCE_TYPE_DEVICE "oic.wk.d"
/** To represent resource type with platform.*/
#define OC_RSRVD_RESOURCE_TYPE_PLATFORM "oic.wk.p"
+/** To represent resource type with collection.*/
+#define OC_RSRVD_RESOURCE_TYPE_COLLECTION "oic.wk.col"
+
/** To represent resource type with RES.*/
#define OC_RSRVD_RESOURCE_TYPE_RES "oic.wk.res"
/** TCP Port. */
#define OC_RSRVD_TCP_PORT "x.org.iotivity.tcp"
+/** TLS Port. */
+#define OC_RSRVD_TLS_PORT "x.org.iotivity.tls"
+
/** For Server instance ID.*/
#define OC_RSRVD_SERVER_INSTANCE_ID "sid"
/** System time for the platform. */
#define OC_RSRVD_SYSTEM_TIME "st"
+/** VID for the platform. */
+#define OC_RSRVD_VID "vid"
/**
* Device.
*/
#define OC_RSRVD_DATA_MODEL_VERSION "dmv"
/** Device specification version.*/
-#define OC_SPEC_VERSION "core.1.0.0"
+#define OC_SPEC_VERSION "core.1.1.0"
/** Device Data Model version.*/
-#define OC_DATA_MODEL_VERSION "res.1.0.0"
-
+#define OC_DATA_MODEL_VERSION "res.1.1.0,sh.1.1.0"
/**
* These provide backward compatibility - their use is deprecated.
*/
/** Account URI.*/
#define OC_RSRVD_ACCOUNT_URI "/oic/account"
+/** Account user URI.*/
+#define OC_RSRVD_ACCOUNT_SEARCH_URI "/oic/account/search"
+
/** Account session URI.*/
#define OC_RSRVD_ACCOUNT_SESSION_URI "/oic/account/session"
/** Defines user UUID. */
#define OC_RSRVD_USER_UUID "uid"
-/** Defines user ID. */
-#define OC_RSRVD_USER_ID "userid"
-
/** Defines group ID. */
#define OC_RSRVD_GROUP_ID "gid"
-/** Defines group Master ID. */
-#define OC_RSRVD_GROUP_MASTER_ID "gmid"
-
-/** Defines group type. */
-#define OC_RSRVD_GROUP_TYPE "gtype"
-
/** Defines member of group ID. */
#define OC_RSRVD_MEMBER_ID "mid"
-/** Defines device ID list. */
-#define OC_RSRVD_DEVICE_ID_LIST "dilist"
+/** Defines invite. */
+#define OC_RSRVD_INVITE "invite"
-/** Defines public. */
-#define OC_RSRVD_PUBLIC "Public"
+/** Defines accept. */
+#define OC_RSRVD_ACCEPT "accept"
-/** Defines private. */
-#define OC_RSRVD_PRIVATE "Private"
+/** Defines operation. */
+#define OC_RSRVD_OPERATION "op"
-/** Defines invite. */
-#define OC_RSRVD_INVITE "invite"
+/** Defines add. */
+#define OC_RSRVD_ADD "add"
+
+/** Defines delete. */
+#define OC_RSRVD_DELETE "delete"
+
+/** Defines owner. */
+#define OC_RSRVD_OWNER "owner"
+
+/** Defines members. */
+#define OC_RSRVD_MEMBERS "members"
/** To represent grant type with refresh token. */
#define OC_RSRVD_GRANT_TYPE_REFRESH_TOKEN "refresh_token"
OC_ADAPTER_NFC = (1 << 5)
} OCTransportAdapter;
+typedef enum
+{
+ OC_DEFAULT_BT_FLAGS = 0,
+ // flags for BLE transport
+ OC_LE_ADV_DISABLE = 0x1, // disable BLE advertisement.
+ OC_LE_ADV_ENABLE = 0x2, // enable BLE advertisement.
+ OC_LE_SERVER_DISABLE = (1 << 4), // disable gatt server.
+ // flags for EDR transport
+ OC_EDR_SERVER_DISABLE = (1 << 7) // disable rfcomm server.
+} OCTransportBTFlags_t;
+
+/**
+ * Log level to print can be controlled through this enum.
+ * And privacy logs contained uid, Token, Device id, etc can also disable.
+ * This enum (OCLogLevel) must be kept synchronized with
+ * CAUtilLogLevel_t (in CACommon.h).
+ */
+typedef enum
+{
+ OC_LOG_LEVEL_ALL = 1, // all logs.
+ OC_LOG_LEVEL_INFO, // debug level is disabled.
+} OCLogLevel;
+
/**
* Enum layout assumes some targets have 16-bit integer (e.g., Arduino).
*/
/** usually zero for default interface.*/
uint32_t ifindex;
-#if defined (ROUTING_GATEWAY) || defined (ROUTING_EP)
- char routeData[MAX_ADDR_STR_SIZE]; //destination GatewayID:ClientId
-#endif
+
+ /** destination GatewayID:ClientId.*/
+ char routeData[MAX_ADDR_STR_SIZE];
+
+ /** device ID of remote.*/
+ char remoteId[MAX_IDENTITY_SIZE];
} OCDevAddr;
/**
/** Register observe request for all notifications, including stale notifications.*/
OC_REST_OBSERVE_ALL = (1 << 5),
- /** De-register observation, intended for internal use.*/
- OC_REST_CANCEL_OBSERVE = (1 << 6),
-
#ifdef WITH_PRESENCE
/** Subscribe for all presence notifications of a particular resource.*/
OC_REST_PRESENCE = (1 << 7),
* processing its requests from clients.*/
OC_SLOW = (1 << 3),
-#ifdef __WITH_DTLS__
+#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
/** When this bit is set, the resource is a secure resource.*/
OC_SECURE = (1 << 4),
#else
OC_STACK_PDM_IS_NOT_INITIALIZED,
OC_STACK_DUPLICATE_UUID,
OC_STACK_INCONSISTENT_DB,
+ OC_STACK_SVR_DB_NOT_EXIST,
/**
* Error code from OTM
* This error is pushed from DTLS interface when handshake failure happens
*/
OC_STACK_AUTHENTICATION_FAILURE,
+ OC_STACK_NOT_ALLOWED_OXM,
/** Insert all new error codes here!.*/
#ifdef WITH_PRESENCE
OC_STACK_PRESENCE_TIMEOUT,
OC_STACK_PRESENCE_DO_NOT_HANDLE,
#endif
+
+ /** Request is denied by the user*/
+ OC_STACK_USER_DENIED_REQ,
+ OC_STACK_NOT_ACCEPTABLE,
+ OC_STACK_METHOD_NOT_ALLOWED,
+
+ /** ERROR code from server */
+ OC_STACK_FORBIDDEN_REQ, /** 403*/
+ OC_STACK_INTERNAL_SERVER_ERROR, /** 500*/
+ OC_STACK_NOT_IMPLEMENTED, /** 501*/
+ OC_STACK_BAD_GATEWAY, /** 502*/
+ OC_STACK_SERVICE_UNAVAILABLE, /** 503*/
+ OC_STACK_GATEWAY_TIMEOUT, /** 504*/
+ OC_STACK_PROXY_NOT_SUPPORTED, /** 505*/
+
/** ERROR in stack.*/
OC_STACK_ERROR = 255
/** Error status code - END HERE.*/
/**
* Handle to an OCRequest object owned by the OCStack.
*/
-typedef void * OCRequestHandle;
+typedef uint32_t OCRequestHandle;
/**
* Unique identifier for each observation request. Used when observations are
typedef uint8_t OCObservationId;
/**
+ * Sequence number is a 24 bit field,
+ * per https://tools.ietf.org/html/rfc7641.
+ */
+#define MAX_SEQUENCE_NUMBER (0xFFFFFF)
+
+/**
* Action associated with observation.
*/
typedef enum
/** Persistent storage unlink handler.*/
int (* unlink)(const char *path);
+
+ /** Persistent Storage Handler for Encryption.*/
+ int (* encrypt)(const unsigned char *pt, size_t size,
+ unsigned char**ct, size_t *ct_len);
+
+ /**Persistent Storage Handler for Decryption.*/
+ int (* decrypt)(const unsigned char *ct, size_t size,
+ unsigned char**pt, size_t *pt_len);
} OCPersistentStorage;
/**
OC_EH_TOO_LARGE = 413,
OC_EH_UNSUPPORTED_MEDIA_TYPE = 415,
OC_EH_INTERNAL_SERVER_ERROR = 500,
+ OC_EH_NOT_IMPLEMENTED = 501,
OC_EH_BAD_GATEWAY = 502,
OC_EH_SERVICE_UNAVAILABLE = 503,
- OC_EH_RETRANSMIT_TIMEOUT = 504
+ OC_EH_RETRANSMIT_TIMEOUT = 504,
+ OC_EH_PROXY_NOT_SUPPORTED = 505
} OCEntityHandlerResult;
/**
/**
* This structure describes the platform properties. All non-Null properties will be
* included in a platform discovery request.
+ * @deprecated: Use OCSetPropertyValue to set platform value.
*/
typedef struct
{
* This structure is expected as input for device properties.
* device name is mandatory and expected from the application.
* device id of type UUID will be generated by the stack.
+ * @deprecated: Use OCSetPropertyValue to set device value.
*/
typedef struct
{
PAYLOAD_TYPE_INVALID,
/** The payload is an OCDiscoveryPayload */
PAYLOAD_TYPE_DISCOVERY,
- /** The payload is an OCDevicePayload */
+ /** The payload of the device */
PAYLOAD_TYPE_DEVICE,
- /** The payload is an OCPlatformPayload */
+ /** The payload type of the platform */
PAYLOAD_TYPE_PLATFORM,
/** The payload is an OCRepPayload */
PAYLOAD_TYPE_REPRESENTATION,
/** The payload is an OCSecurityPayload */
PAYLOAD_TYPE_SECURITY,
+#ifdef WITH_PRESENCE
/** The payload is an OCPresencePayload */
- PAYLOAD_TYPE_PRESENCE,
- /** The payload is an OCRDPayload */
- PAYLOAD_TYPE_RD,
+ PAYLOAD_TYPE_PRESENCE
+#endif
} OCPayloadType;
/**
struct OCResourcePayload* next;
} OCResourcePayload;
-/**
- * Structure holding Links Payload. It is a sub-structure used in
- * OCResourceCollectionPayload.
- */
-typedef struct OCLinksPayload
-{
- /** This is the target relative URI. */
- char *href;
- /** The relation of the target URI referenced by the link to the context URI;
- * The default value is null. */
- char *rel;
- /** Resource Type - A standard OIC specified or vendor defined resource
- * type of the resource referenced by the target URI. */
- OCStringLL *rt;
- /** Interface - The interfaces supported by the resource referenced by the target URI. */
- OCStringLL *itf;
- /** Bitmap - The bitmap holds observable, discoverable, secure option flag. */
- uint8_t p;
- /** A title for the link relation. Can be used by the UI to provide a context. */
- char *title;
- /** This is used to override the context URI e.g. override the URI of the containing collection. */
- char *anchor;
- /** The instance identifier for this web link in an array of web links - used in links. */
- union
- {
- /** An ordinal number that is not repeated - must be unique in the collection context. */
- uint8_t ins;
- /** Any unique string including a URI. */
- char *uniqueStr;
- /** Use UUID for universal uniqueness - used in /oic/res to identify the device. */
- OCIdentity uniqueUUID;
- };
- /** Time to keep holding resource.*/
- uint64_t ttl;
- /** A hint of the media type of the representation of the resource referenced by the target URI. */
- OCStringLL *type;
- /** Holding address of the next resource. */
- struct OCLinksPayload *next;
-} OCLinksPayload;
-
-/** Structure holding tags value of the links payload. */
-typedef struct
-{
- /** Name of tags. */
- OCDeviceInfo n;
- /** Device identifier. */
- OCIdentity di;
- /** Time to keep holding resource.*/
- uint64_t ttl;
-} OCTagsPayload;
-
-/** Resource collection payload. */
-typedef struct OCResourceCollectionPayload
-{
- /** Collection tags payload.*/
- OCTagsPayload *tags;
- /** Array of links payload. */
- OCLinksPayload *setLinks;
-} OCResourceCollectionPayload;
-
typedef struct OCDiscoveryPayload
{
OCPayload base;
/** Name */
char *name;
- /** HREF */
- char *uri;
-
/** Resource Type */
OCStringLL *type;
} OCDiscoveryPayload;
-/**
- * Structure holding discovery payload.
- */
-typedef struct
-{
- /** Device Name. */
- OCDeviceInfo n;
- /** Device Identity. */
- OCIdentity di;
- /** Value holding the bias factor of the RD. */
- uint8_t sel;
-} OCRDDiscoveryPayload;
-
-/**
- * RD Payload that will be transmitted over the wire.
- */
-typedef struct
-{
- OCPayload base;
- /** Pointer to the discovery response payload.*/
- OCRDDiscoveryPayload *rdDiscovery;
- /** Pointer to the publish payload.*/
- OCResourceCollectionPayload *rdPublish;
-} OCRDPayload;
-
-typedef struct
-{
- OCPayload base;
- char *sid;
- char* deviceName;
- char* specVersion;
- OCStringLL *dataModelVersions;
- OCStringLL *interfaces;
- OCStringLL *types;
-} OCDevicePayload;
-
-typedef struct
-{
- OCPayload base;
- char* uri;
- OCPlatformInfo info;
- OCStringLL* rt;
- OCStringLL* interfaces;
-} OCPlatformPayload;
-
typedef struct
{
OCPayload base;
*/
typedef void (*OCDirectPairingCB)(void *ctx, OCDPDev_t *peer, OCStackResult result);
//#endif // DIRECT_PAIRING
+#if defined(__WITH_DTLS__) || defined(__WITH_TLS__)
+/**
+ * Callback function definition for Change in TrustCertChain
+ *
+ * @param[IN] ctx - user context returned in the callback.
+ * @param[IN] credId - trustCertChain changed for this ID
+ * @param[IN] trustCertChain - trustcertchain binary blob.
+ * @param[IN] chainSize - size of trustchain
+ */
+typedef void (*TrustCertChainChangeCB)(void *ctx, uint16_t credId, uint8_t *trustCertChain,
+ size_t chainSize);
+
+/**
+ * certChain context structure.
+ */
+typedef struct trustCertChainContext
+{
+ TrustCertChainChangeCB callback;
+ void *context;
+} trustCertChainContext_t;
+#endif
+
+/**
+ * OTM State
+ */
+typedef enum
+{
+ OC_OTM_READY = 0,
+ OC_OTM_STARTED = 1,
+ OC_OTM_DONE = 2,
+ OC_OTM_ERROR = 3
+} OCOtmEvent_t;
+
+/**
+ * Callback function to receive the OTM event on server side.
+ *
+ * @param[in] ctx user context returned in the callback
+ * @param[in] addr PT's address (address can be NULL in case of init state)
+ * @param[in] port PT's port (It is meaningless in case of init state & BLE)
+ * @param[in] uuid PT's UUID (UUID can be NULL in case of init state & coap reqest)
+ * @param[in] event OTM state (@ref OCOtmEvent_t)
+ */
+typedef void (*OCOtmEventHandler)(void *ctx, const char *addr, uint16_t port,
+ const char *ownerId, OCOtmEvent_t event);
#ifdef __cplusplus
}