From: Sachin Agrawal Date: Wed, 1 Jul 2015 20:44:41 +0000 (-0700) Subject: [CA] Fix for DTLS secure unicast port. X-Git-Tag: 1.2.0+RC1~1526 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=99cafdd5e3fc58cad7437b2ce9a5d7e2149df0fd;p=platform%2Fupstream%2Fiotivity.git [CA] Fix for DTLS secure unicast port. Not to set "reuse_address" option when secure unicast port is requested. Change-Id: Ieffa4fda038946a02c500aa43a85041a2a3b77b3 Signed-off-by: koushik.girijala Signed-off-by: Sachin Agrawal Reviewed-on: https://gerrit.iotivity.org/gerrit/1440 Reviewed-by: Erich Keane Tested-by: jenkins-iotivity --- diff --git a/resource/csdk/connectivity/samples/linux/sample_main.c b/resource/csdk/connectivity/samples/linux/sample_main.c index 3f0c299..432b579 100644 --- a/resource/csdk/connectivity/samples/linux/sample_main.c +++ b/resource/csdk/connectivity/samples/linux/sample_main.c @@ -1246,7 +1246,7 @@ int get_secure_information(CAPayload_t payLoad) return -1; } - char portStr[4] = {0}; + char portStr[6] = {0}; memcpy(portStr, startPos + 1, (endPos - 1) - startPos); printf("secured port is: %s\n", portStr); diff --git a/resource/csdk/connectivity/samples/tizen/casample.c b/resource/csdk/connectivity/samples/tizen/casample.c index c2ed61d..a87a5a4 100644 --- a/resource/csdk/connectivity/samples/tizen/casample.c +++ b/resource/csdk/connectivity/samples/tizen/casample.c @@ -109,7 +109,7 @@ void send_response(const CAEndpoint_t *endpoint, const CAInfo_t *info); void get_resource_uri(char *URI, char *resourceURI, int length); int get_secure_information(CAPayload_t payLoad); int get_address_set(const char *uri, addressSet_t* outAddress); -void parse_coap_uri(const char* uri, addressSet_t* address); +void parse_coap_uri(const char* uri, addressSet_t* address, CATransportFlags_t *flags); static CAToken_t g_last_request_token = NULL; static const char SECURE_COAPS_PREFIX[] = "coaps://"; @@ -452,12 +452,13 @@ void send_request() // create remote endpoint CAEndpoint_t *endpoint = NULL; + CATransportFlags_t flags; printf("URI : %s\n", uri); addressSet_t address = {}; - parse_coap_uri(uri, &address); + parse_coap_uri(uri, &address, &flags); - res = CACreateEndpoint(CA_DEFAULT_FLAGS, g_selected_nw_type, + res = CACreateEndpoint(flags, g_selected_nw_type, (const char*)address.ipAddress, address.port, &endpoint); if (CA_STATUS_OK != res || !endpoint) { @@ -744,12 +745,13 @@ void send_notification() return; } + CATransportFlags_t flags; addressSet_t address = {}; - parse_coap_uri(uri, &address); + parse_coap_uri(uri, &address, &flags); // create remote endpoint CAEndpoint_t *endpoint = NULL; - res = CACreateEndpoint(0, g_selected_nw_type, address.ipAddress, address.port, &endpoint); + res = CACreateEndpoint(flags, g_selected_nw_type, address.ipAddress, address.port, &endpoint); if (CA_STATUS_OK != res) { printf("Create remote endpoint error, error code: %d\n", res); @@ -1263,7 +1265,7 @@ int get_secure_information(CAPayload_t payLoad) return -1; } - char portStr[4] = {0}; + char portStr[6] = {0}; memcpy(portStr, startPos + 1, (endPos - 1) - startPos); printf("secured port is: %s\n", portStr); @@ -1354,7 +1356,7 @@ CAResult_t get_input_data(char *buf, int32_t length) } -void parse_coap_uri(const char* uri, addressSet_t* address) +void parse_coap_uri(const char* uri, addressSet_t* address, CATransportFlags_t *flags) { if (NULL == uri) { @@ -1369,11 +1371,13 @@ void parse_coap_uri(const char* uri, addressSet_t* address) { printf("uri has '%s' prefix\n", COAPS_PREFIX); startIndex = COAPS_PREFIX_LEN; + *flags = CA_SECURE; } else if (strncmp(COAP_PREFIX, uri, COAP_PREFIX_LEN) == 0) { printf("uri has '%s' prefix\n", COAP_PREFIX); startIndex = COAP_PREFIX_LEN; + *flags = CA_DEFAULT_FLAGS; } // #2. copy uri for parse diff --git a/resource/csdk/connectivity/src/ip_adapter/caipserver.c b/resource/csdk/connectivity/src/ip_adapter/caipserver.c index e78936b..23a3c69 100644 --- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c @@ -297,7 +297,7 @@ static void CAReceiveHandler(void *data) OIC_LOG(DEBUG, IP_SERVER_TAG, "OUT"); } -static CAResult_t CACreateSocket(int *socketFD, const char *localIp, uint16_t *port) +static CAResult_t CACreateSocket(int *socketFD, const char *localIp, uint16_t *port, bool isSecured) { VERIFY_NON_NULL(socketFD, IP_SERVER_TAG, "socketFD is NULL"); VERIFY_NON_NULL(localIp, IP_SERVER_TAG, "localIp is NULL"); @@ -331,7 +331,7 @@ static CAResult_t CACreateSocket(int *socketFD, const char *localIp, uint16_t *p return CA_STATUS_FAILED; } - if (0 != *port) + if (0 != *port && !isSecured) { int setOptionOn = SOCKETOPTION; if (-1 == setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *) &setOptionOn, @@ -353,12 +353,28 @@ static CAResult_t CACreateSocket(int *socketFD, const char *localIp, uint16_t *p sockAddr.sin_addr.s_addr = inet_addr(localIp); } + bool isBound = false; if (-1 != bind(sock, (struct sockaddr *) &sockAddr, sizeof(sockAddr))) { + isBound = true; + } + else if (isSecured) + { + //if secure port 5684 is occupied, trying for another port + serverPort = 0; + sockAddr.sin_port = htons(serverPort); + if (-1 != bind(sock, (struct sockaddr *) &sockAddr, sizeof(sockAddr))) + { + isBound = true; + } + } + + if (true == isBound) + { struct sockaddr_in sin; socklen_t len = sizeof(sin); - if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1) + if (-1 == getsockname(sock, (struct sockaddr *)&sin, &len)) { OIC_LOG_V(ERROR, IP_SERVER_TAG, "Failed to get socket[%s]!", strerror(errno)); @@ -372,8 +388,7 @@ static CAResult_t CACreateSocket(int *socketFD, const char *localIp, uint16_t *p } else { - OIC_LOG_V(ERROR, IP_SERVER_TAG, "Failed to bind socket[%s]!", - strerror(errno)); + OIC_LOG_V(ERROR, IP_SERVER_TAG, "Failed to bind socket[%s]!", strerror(errno)); close(sock); return CA_STATUS_FAILED; } @@ -408,7 +423,7 @@ static CAResult_t CAStartUnicastServer(const char *localAddress, uint16_t *port, VERIFY_NON_NULL(localAddress, IP_SERVER_TAG, "localAddress"); VERIFY_NON_NULL(port, IP_SERVER_TAG, "port"); - CAResult_t ret = CACreateSocket(serverFD, localAddress, port); + CAResult_t ret = CACreateSocket(serverFD, localAddress, port, isSecured); if (CA_STATUS_OK != ret) { OIC_LOG(ERROR, IP_SERVER_TAG, "Failed to create unicast socket"); @@ -675,7 +690,7 @@ CAResult_t CAIPStartMulticastServer(const char *localAddress, const char *multic if (!isMulticastServerStarted) { int mulicastServerFd = -1; - CAResult_t ret = CACreateSocket(&mulicastServerFd, multicastAddress, &port); + CAResult_t ret = CACreateSocket(&mulicastServerFd, multicastAddress, &port, false); if (ret != CA_STATUS_OK) { OIC_LOG(ERROR, IP_SERVER_TAG, "Failed to create multicast socket");