1 /* ****************************************************************
3 * Copyright 2016 Samsung Electronics All Rights Reserved.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 ******************************************************************/
21 #include "ocendpoint.h"
23 #include "oic_malloc.h"
24 #include "oic_string.h"
26 #include "cainterface.h"
28 #define VERIFY_NON_NULL(arg) { if (!arg) {OIC_LOG(FATAL, TAG, #arg " is NULL"); goto exit;} }
29 #define VERIFY_GT_ZERO(arg) { if (arg < 1) {OIC_LOG(FATAL, TAG, #arg " < 1"); goto exit;} }
30 #define VERIFY_GT(arg1, arg2) { if (arg1 <= arg2) {OIC_LOG(FATAL, TAG, #arg1 " <= " #arg2); goto exit;} }
31 #define VERIFY_LT_OR_EQ(arg1, arg2) { if (arg1 > arg2) {OIC_LOG(FATAL, TAG, #arg1 " > " #arg2); goto exit;} }
32 #define TAG "OIC_RI_ENDPOINT"
34 OCStackResult OCGetSupportedEndpointFlags(const OCTpsSchemeFlags givenFlags, OCTpsSchemeFlags* out)
38 return OC_STACK_INVALID_PARAM;
41 CATransportAdapter_t SelectedNetwork = CAGetSelectedNetwork();
42 if ((givenFlags & (OC_COAP | OC_COAPS)) && (SelectedNetwork & CA_ADAPTER_IP))
44 *out = (OCTpsSchemeFlags)(*out | OC_COAP);
48 *out = (OCTpsSchemeFlags)(*out | OC_COAPS);
52 if ((givenFlags & (OC_COAP_TCP | OC_COAPS_TCP)) && (SelectedNetwork & CA_ADAPTER_TCP))
55 *out = (OCTpsSchemeFlags)(*out | OC_COAP_TCP);
59 *out = (OCTpsSchemeFlags)(*out | OC_COAPS_TCP);
64 if ((givenFlags & OC_COAP_RFCOMM) && (SelectedNetwork & CA_ADAPTER_RFCOMM_BTEDR))
66 *out = (OCTpsSchemeFlags)(*out | OC_COAP_RFCOMM);
70 if ((givenFlags & OC_COAP_GATT) && (SelectedNetwork & CA_ADAPTER_GATT_BTLE))
72 *out = (OCTpsSchemeFlags)(*out | OC_COAP_GATT);
76 if ((givenFlags & OC_COAP_NFC) && (SelectedNetwork & CA_ADAPTER_NFC))
78 *out = (OCTpsSchemeFlags)(*out | OC_COAP_NFC);
82 if ((givenFlags & OC_COAP_RA) && (SelectedNetwork & CA_ADAPTER_REMOTE_ACCESS))
84 *out = (OCTpsSchemeFlags)(*out | OC_COAP_RA);
91 OCStackResult OCGetMatchedTpsFlags(const CATransportAdapter_t adapter,
92 const CATransportFlags_t flags,
93 OCTpsSchemeFlags* out)
95 // return matched TPS Flags with given CA flags.
98 OIC_LOG(ERROR, TAG, "out param is NULL!!!");
99 return OC_STACK_INVALID_PARAM;
102 if ((adapter & OC_ADAPTER_IP) && (flags & (OC_IP_USE_V4 | OC_IP_USE_V6)))
104 if (flags & OC_FLAG_SECURE)
107 // typecasting to support C90(arduino)
108 *out = (OCTpsSchemeFlags)(*out | OC_COAPS);
112 // typecasting to support C90(arduino)
113 *out = (OCTpsSchemeFlags)(*out | OC_COAP);
118 if ((adapter & OC_ADAPTER_TCP) && (flags & (OC_IP_USE_V4 | OC_IP_USE_V6)))
120 if (flags & OC_FLAG_SECURE)
123 // typecasting to support C90(arduino)
124 *out = (OCTpsSchemeFlags)(*out | OC_COAPS_TCP);
129 // typecasting to support C90(arduino)
130 *out = (OCTpsSchemeFlags)(*out | OC_COAP_TCP);
136 // @todo iotivity not support http transport yet...
139 // @todo iotivity not support https transport yet...
143 if (adapter & OC_ADAPTER_RFCOMM_BTEDR)
145 // typecasting to support C90(arduino)
146 *out = (OCTpsSchemeFlags)(*out | OC_COAP_RFCOMM);
151 if (adapter & CA_ADAPTER_GATT_BTLE)
153 // typecasting to support C90(arduino)
154 *out = (OCTpsSchemeFlags)(*out | OC_COAP_GATT);
159 if (adapter & CA_ADAPTER_NFC)
161 // typecasting to support C90(arduino)
162 *out = (OCTpsSchemeFlags)(*out | OC_COAP_NFC);
167 if (adapter & CA_ADAPTER_REMOTE_ACCESS)
169 // typecasting to support C90(arduino)
170 *out = (OCTpsSchemeFlags)(*out | OC_COAP_RA);
177 OCStackResult OCConvertTpsToString(const OCTpsSchemeFlags tps, char** out)
179 // return given tps as string for payload
180 // OC_COAP_IPV4 -> OC_COAP
184 return OC_STACK_INVALID_PARAM;
190 *out = OICStrdup(COAP_STR);
194 *out = OICStrdup(COAPS_STR);
198 *out = OICStrdup(COAP_TCP_STR);
202 *out = OICStrdup(COAPS_TCP_STR);
207 *out = OICStrdup(HTTP_STR);
211 *out = OICStrdup(HTTPS_STR);
216 *out = OICStrdup(COAP_RFCOMM_STR);
220 return OC_STACK_INVALID_PARAM;
222 VERIFY_NON_NULL(*out);
226 return OC_STACK_NO_MEMORY;
229 char* OCCreateEndpointString(const OCEndpointPayload* endpoint)
236 char* buf = (char*)OICCalloc(MAX_ADDR_STR_SIZE, sizeof(char));
237 VERIFY_NON_NULL(buf);
239 if ((strcmp(endpoint->tps, COAP_STR) == 0) || (strcmp(endpoint->tps, COAPS_STR) == 0)
241 || (strcmp(endpoint->tps, COAP_TCP_STR) == 0) ||(strcmp(endpoint->tps, COAPS_TCP_STR) == 0)
244 || (strcmp(endpoint->tps, HTTP_STR) == 0) ||(strcmp(endpoint->tps, HTTPS_STR) == 0)
248 // checking addr is ipv4 or not
249 if (endpoint->family & OC_IP_USE_V4)
252 sprintf(buf, "%s://%s:%d", endpoint->tps, endpoint->addr, endpoint->port);
257 sprintf(buf, "%s://[%s]:%d", endpoint->tps, endpoint->addr, endpoint->port);
261 else if ((strcmp(endpoint->tps, COAP_RFCOMM_STR) == 0))
264 sprintf(buf, "%s://%s", endpoint->tps, endpoint->addr);
269 OIC_LOG_V(ERROR, TAG, "Payload has invalid TPS!!! %s", endpoint->tps);
278 OCStackResult OCParseEndpointString(const char* endpointStr, OCEndpointPayload* out)
280 if (!endpointStr || !out)
282 return OC_STACK_INVALID_PARAM;
291 size_t tpsCharsToWrite = 0;
292 size_t addrCharsToWrite = 0;
293 OCStackResult isEnabledAdapter = OC_STACK_ADAPTER_NOT_ENABLED;
294 OCTransportAdapter parsedAdapter = OC_DEFAULT_ADAPTER;
296 tps = (char*)OICCalloc(OC_MAX_TPS_STR_SIZE, sizeof(char));
297 VERIFY_NON_NULL(tps);
299 addr = (char*)OICCalloc(OC_MAX_ADDR_STR_SIZE, sizeof(char));
300 VERIFY_NON_NULL(addr);
302 origin = OICStrdup(endpointStr);
303 VERIFY_NON_NULL(origin);
306 tokPos = strstr(origin, OC_ENDPOINT_TPS_TOKEN);
307 VERIFY_NON_NULL(tokPos);
310 tpsCharsToWrite = tokPos - origin;
311 VERIFY_GT_ZERO(tpsCharsToWrite);
312 VERIFY_GT((size_t)OC_MAX_TPS_STR_SIZE, tpsCharsToWrite);
313 ret = memcpy(tps, origin, tpsCharsToWrite);
314 VERIFY_NON_NULL(ret);
315 OIC_LOG_V(INFO, TAG, "parsed tps is:%s", tps);
318 if (strcmp(tps, COAP_STR) == 0)
320 isEnabledAdapter = OC_STACK_OK;
321 parsedAdapter = OC_ADAPTER_IP;
323 else if (strcmp(tps, COAPS_STR) == 0)
325 isEnabledAdapter = OC_STACK_OK;
326 parsedAdapter = OC_ADAPTER_IP;
329 else if (strcmp(tps, COAP_TCP_STR) == 0)
331 isEnabledAdapter = OC_STACK_OK;
332 parsedAdapter = OC_ADAPTER_TCP;
334 else if (strcmp(tps, COAPS_TCP_STR) == 0)
336 isEnabledAdapter = OC_STACK_OK;
337 parsedAdapter = OC_ADAPTER_TCP;
341 // @todo iotivity not support http, https transport yet...
344 else if (strcmp(tps, COAP_RFCOMM_STR) == 0)
346 isEnabledAdapter = OC_STACK_OK;
347 parsedAdapter = OC_ADAPTER_RFCOMM_BTEDR;
350 // ignore unrecognized tps type
351 if (isEnabledAdapter == OC_STACK_ADAPTER_NOT_ENABLED
352 && parsedAdapter == OC_DEFAULT_ADAPTER)
357 return OC_STACK_ADAPTER_NOT_ENABLED;
361 if (parsedAdapter == OC_ADAPTER_RFCOMM_BTEDR)
365 ret = strcpy(addr, tokPos);
366 VERIFY_NON_NULL(ret);
369 out->family = OC_DEFAULT_FLAGS;
375 // first check epl has square bracket
376 tmp = strchr(origin, OC_ENDPOINT_BRACKET_START);
379 out->family = OC_IP_USE_V6;
381 tmp = strrchr(origin, OC_ENDPOINT_BRACKET_END);
385 out->family = OC_IP_USE_V4;
387 tmp = strrchr(origin, OC_ENDPOINT_ADDR_TOKEN);
389 VERIFY_NON_NULL(tmp);
392 addrCharsToWrite = tmp - tokPos;
393 VERIFY_GT_ZERO(addrCharsToWrite);
394 VERIFY_GT((size_t)OC_MAX_ADDR_STR_SIZE, addrCharsToWrite);
395 ret = memcpy(addr, tokPos, addrCharsToWrite);
396 VERIFY_NON_NULL(ret);
397 OIC_LOG_V(INFO, TAG, "parsed addr is:%s", addr);
399 tmp = strrchr(origin, OC_ENDPOINT_ADDR_TOKEN);
400 VERIFY_NON_NULL(tmp);
405 long port = strtol(tokPos, &end, 10);
406 VERIFY_GT_ZERO(port);
407 VERIFY_LT_OR_EQ(port, UINT16_MAX);
408 OIC_LOG_V(INFO, TAG, "parsed port is:%s", tokPos);
412 out->port = (uint16_t)port;
433 return OC_STACK_ERROR;
436 OCTpsSchemeFlags OCGetSupportedTpsFlags()
438 OCTpsSchemeFlags ret = OC_NO_TPS;
439 CATransportAdapter_t SelectedNetwork = CAGetSelectedNetwork();
441 if (SelectedNetwork & CA_ADAPTER_IP)
443 ret = (OCTpsSchemeFlags)(ret | OC_COAP);
447 ret = (OCTpsSchemeFlags)(ret | OC_COAPS);
451 if (SelectedNetwork & CA_ADAPTER_TCP)
453 ret = (OCTpsSchemeFlags)(ret | OC_COAP_TCP);
457 ret = (OCTpsSchemeFlags)(ret | OC_COAPS_TCP);
462 if (SelectedNetwork & CA_ADAPTER_RFCOMM_BTEDR)
464 ret = (OCTpsSchemeFlags)(ret | OC_COAP_RFCOMM);
468 if (SelectedNetwork & CA_ADAPTER_GATT_BTLE)
470 ret = (OCTpsSchemeFlags)(ret | OC_COAP_GATT);
474 if (SelectedNetwork & CA_ADAPTER_NFC)
476 ret = (OCTpsSchemeFlags)(ret | OC_COAP_NFC);
480 if (SelectedNetwork & CA_ADAPTER_REMOTE_ACCESS)
482 ret = (OCTpsSchemeFlags)(ret | OC_COAP_RA);