[CA] Fix for DTLS secure unicast port.
authorSachin Agrawal <sachin.agrawal@intel.com>
Wed, 1 Jul 2015 20:44:41 +0000 (13:44 -0700)
committerSachin Agrawal <sachin.agrawal@intel.com>
Wed, 1 Jul 2015 21:50:19 +0000 (21:50 +0000)
Not to set "reuse_address" option when secure unicast port is requested.

Change-Id: Ieffa4fda038946a02c500aa43a85041a2a3b77b3
Signed-off-by: koushik.girijala <g.koushik@samsung.com>
Signed-off-by: Sachin Agrawal <sachin.agrawal@intel.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/1440
Reviewed-by: Erich Keane <erich.keane@intel.com>
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
resource/csdk/connectivity/samples/linux/sample_main.c
resource/csdk/connectivity/samples/tizen/casample.c
resource/csdk/connectivity/src/ip_adapter/caipserver.c

index 3f0c299..432b579 100644 (file)
@@ -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);
index c2ed61d..a87a5a4 100644 (file)
@@ -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
index e78936b..23a3c69 100644 (file)
@@ -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");