Fix wrong operation for group research 70/185770/1
authorJihoon Jung <jh8801.jung@samsung.com>
Thu, 2 Aug 2018 07:36:18 +0000 (16:36 +0900)
committerJihoon Jung <jh8801.jung@samsung.com>
Thu, 2 Aug 2018 07:36:18 +0000 (16:36 +0900)
Change-Id: I9e72f6be12c72db324b22594238ed463706b738d
Signed-off-by: Jihoon Jung <jh8801.jung@samsung.com>
src/mdg-manager/include/mdgd_typedef.h
src/mdg-manager/src/mdgd_iot_client.cpp
src/mdg-manager/src/mdgd_iot_server.cpp

index b9fbc8a691c264660fd01624637258193fce68db..6ddf462c543b36911bf13c3e12572d49992e09ca 100755 (executable)
@@ -126,6 +126,7 @@ typedef struct {
 typedef struct {
        char *device_id; /**< Device Id */
        char *file_path;
+       char *conn_type;
 } mdgd_receive_file_t;
 
 typedef struct {
@@ -170,6 +171,7 @@ typedef struct {
        unsigned char *data;
        int data_len;
 #endif
+       int conn_type;
        void *user_data;
 } mdgd_command_t;
 
index 8aa187c697444287e138a092053ac45dbff5640f..4be35d9620627cc88bdb09818246b003c3b67164 100755 (executable)
@@ -66,6 +66,7 @@ static gpointer __file_send_thread_func(gpointer user_data)
        int ret = MDGD_ERROR_NONE;
        int sock;
        struct sockaddr_in serveraddr;
+       struct sockaddr_in6 serveraddr_v6;
        int retval;
        mdgd_command_t *cmd = (mdgd_command_t *)user_data;
        long num_read;
@@ -76,7 +77,6 @@ static gpointer __file_send_thread_func(gpointer user_data)
        char buf[MAXBUF];
        long total_bytes;
        char tempaddr[26] = {0,};
-       char *tmpaddr;
 
        LOG_BEGIN();
 
@@ -86,28 +86,50 @@ static gpointer __file_send_thread_func(gpointer user_data)
                goto SEND_THREAD_EXIT;
        }
 
-       sock = socket(AF_INET, SOCK_STREAM, 0);
+       /* create socket */
+       if (cmd->conn_type & CT_IP_USE_V6)
+               sock = socket(AF_INET6, SOCK_STREAM, 0);
+       else
+               sock = socket(AF_INET, SOCK_STREAM, 0);
+
        if(sock < 0) {
                LOG_ERR("socket() error");
                ret = MDGD_ERROR_OPERATION_FAILED;
                goto SEND_THREAD_EXIT;
        }
 
-       serveraddr.sin_family = AF_INET;
-       serveraddr.sin_port = htons(PORT);
+       if (cmd->conn_type & CT_IP_USE_V6) {
+               serveraddr_v6.sin6_family = AF_INET6;
+               serveraddr_v6.sin6_port = htons(PORT);
+               serveraddr_v6.sin6_flowinfo = 0;
+               serveraddr_v6.sin6_scope_id = if_nametoindex("wlan0");
+
+               sscanf(cmd->addr, "coaps://[%s", &tempaddr);
+               strtok(tempaddr, "%");
+
+               inet_pton(AF_INET6, tempaddr, &serveraddr_v6.sin6_addr);
+               retval = connect(sock, (struct sockaddr*)&serveraddr_v6, sizeof(serveraddr_v6));
+       } else {
+               serveraddr.sin_family = AF_INET;
+               serveraddr.sin_port = htons(PORT);
 
-       sscanf(cmd->addr, "coaps://%s", &tempaddr);
-       strtok(tempaddr, ":");
+               sscanf(cmd->addr, "coaps://%s", &tempaddr);
+               strtok(tempaddr, ":");
 
-       inet_pton(AF_INET, tempaddr, &serveraddr.sin_addr.s_addr);
-       retval = connect(sock, (struct sockaddr*) &serveraddr, sizeof(serveraddr));
+               inet_pton(AF_INET, tempaddr, &serveraddr.sin_addr.s_addr);
+               retval = connect(sock, (struct sockaddr*)&serveraddr, sizeof(serveraddr));
+       }
+
+       LOG_DEBUG("Connect to %s. Sending %s file...", tempaddr, cmd->arg1);
+
+       /* connect */
        if(retval < 0) {
                LOG_ERR("connect() error : %s", strerror(errno));
                ret = MDGD_ERROR_OPERATION_FAILED;
                goto SEND_THREAD_EXIT;
        }
 
-       LOG_DEBUG("Connect to %s. Sending %s file...", tempaddr, cmd->arg1);
+
 
        fd = fopen(cmd->arg1, "rb");
        if(fd == NULL) {
@@ -298,6 +320,16 @@ static bool _found_resource(std::shared_ptr<OCResource> resource,
                                case MDGD_REQ_SEND_FILE:
                                        rep.setValue("file_path", std::string(cmd->arg1));
                                        cmd->addr = g_strdup(resource->host().c_str());
+                                       cmd->conn_type = resource->connectivityType();
+
+                                       if (cmd->conn_type & CT_IP_USE_V6) {
+                                               rep.setValue("conn_type", std::string("V6"));
+                                               LOG_DEBUG("The connection type is IPv6");
+                                       } else {
+                                               rep.setValue("conn_type", std::string("V4"));
+                                               LOG_DEBUG("The connection type is IPv4");
+                                       }
+
                                        break;
                                case MDGD_REQ_SEND_DATA:
                                {
@@ -379,7 +411,7 @@ int mdgd_iot_discovery_resource(mdgd_resource_type_e resource_type,
 
                auto found_cb = std::bind (&_found_resource, std::placeholders::_1, cmd);
 
-               ret = OCPlatform::findResource("", requestURI.str(), CT_IP_USE_V4, found_cb);
+               ret = OCPlatform::findResource("", requestURI.str(), CT_ADAPTER_IP, found_cb);
 
        } catch (OCException &e) {
                LOG_ERR("Failed to find resource %s", e.what());
index c8ce1bc70dcef85ebb29d9f563aba012a96a687b..c70739cbe12db314ba530c1632c7fbe6f275ab28 100755 (executable)
@@ -64,15 +64,17 @@ static gpointer __file_receive_thread_func(gpointer user_data)
 {
        LOG_BEGIN();
 
-       int server_sockfd;
-       int client_sockfd;
+       int server_sockfd, client_sockfd;
        int fd;
        struct sockaddr_in serveraddr, clientaddr;
+       struct sockaddr_in6 serveraddr_v6, clientaddr_v6;
        char client_ipaddr[INET_ADDRSTRLEN];
+       char client_ipaddr_v6[INET6_ADDRSTRLEN];
        int read_len, file_read_len;
        socklen_t client_len;
        struct linger ling;
        mdgd_receive_file_t *receive_file = (mdgd_receive_file_t *)user_data;
+       struct timeval tv_timeo = { 3, 0 };
 
        if (receive_file == NULL) {
                LOG_ERR("receive_file is NULL");
@@ -86,6 +88,10 @@ static gpointer __file_receive_thread_func(gpointer user_data)
                LOG_ERR("receive_file->device_id is NULL");
                goto RECEIVE_THREAD_EXIT;
        }
+       if (receive_file->conn_type == NULL) {
+               LOG_ERR("receive_file->conn_type is NULL");
+               goto RECEIVE_THREAD_EXIT;
+       }
 
        LOG_DEBUG("file path : %s", receive_file->file_path);
 
@@ -98,24 +104,40 @@ static gpointer __file_receive_thread_func(gpointer user_data)
        ling.l_onoff = 1;
        ling.l_linger = 0;
 
-       client_len = sizeof(clientaddr);
+       if (g_strcmp0(receive_file->conn_type, "V6") == 0)
+               server_sockfd = socket(AF_INET6, SOCK_STREAM, 0);
+       else
+               server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
 
-       server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if(server_sockfd == -1) {
                LOG_ERR("socket error : %s", strerror(errno));
                goto RECEIVE_THREAD_EXIT;
        }
 
+       setsockopt(server_sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv_timeo, sizeof(tv_timeo));
        setsockopt(server_sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
 
-       bzero(&serveraddr, sizeof(serveraddr));
-       serveraddr.sin_family = AF_INET;
-       serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
-       serveraddr.sin_port = htons(PORT);
+       if (g_strcmp0(receive_file->conn_type, "V6") == 0) {
+               bzero(&serveraddr_v6, sizeof(serveraddr_v6));
+               serveraddr_v6.sin6_family = AF_INET6;
+               serveraddr_v6.sin6_addr = in6addr_any;
+               serveraddr_v6.sin6_port = htons(PORT);
+               serveraddr_v6.sin6_flowinfo = 0;
+               serveraddr_v6.sin6_scope_id = if_nametoindex("wlan0");
+
+               if (bind(server_sockfd, (struct sockaddr *)&serveraddr_v6, sizeof(serveraddr_v6)) < 0) {
+                       LOG_ERR("bind error : %s", strerror(errno));
+                       goto RECEIVE_THREAD_EXIT;
+               }
+       } else {
+               serveraddr.sin_family = AF_INET;
+               serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
+               serveraddr.sin_port = htons(PORT);
 
-       if (bind(server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) {
-               LOG_ERR("bind error : %s", strerror(errno));
-               goto RECEIVE_THREAD_EXIT;
+               if (bind(server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0) {
+                       LOG_ERR("bind error : %s", strerror(errno));
+                       goto RECEIVE_THREAD_EXIT;
+               }
        }
 
        if (listen(server_sockfd, 5) != 0) {
@@ -123,10 +145,22 @@ static gpointer __file_receive_thread_func(gpointer user_data)
                goto RECEIVE_THREAD_EXIT;
        }
 
-       client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len);
-       inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, client_ipaddr, sizeof(client_ipaddr));
+       if (g_strcmp0(receive_file->conn_type, "V6") == 0) {
+               client_len = sizeof(clientaddr_v6);
+               client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr_v6, &client_len);
+               inet_ntop(AF_INET6, &clientaddr_v6.sin6_addr, client_ipaddr_v6, sizeof(client_ipaddr_v6));
+               LOG_DEBUG("Accepted IP : %s, client socket : %d", client_ipaddr_v6, client_sockfd);
+       } else {
+               client_len = sizeof(clientaddr);
+               client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, &client_len);
+               inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, client_ipaddr, sizeof(client_ipaddr));
+               LOG_DEBUG("Accepted IP : %s, client socket : %d", client_ipaddr);
+       }
 
-       LOG_DEBUG("Accepted IP : %s", client_ipaddr);
+       if(client_sockfd == -1) {
+               LOG_ERR("socket error : %s", strerror(errno));
+               goto RECEIVE_THREAD_EXIT;
+       }
 
        while(1) {
                char buf[MAXBUF] = {0,};
@@ -217,7 +251,7 @@ OCEntityHandlerResult _request_handler(std::shared_ptr<OCResourceRequest> reques
                        int arg_len = 0;
                        int result = MDGD_ERROR_NONE;
                        int cmd;
-                       std::string requester_id, group_name, uuid, data, data_length, channel_id, file_path;
+                       std::string requester_id, group_name, uuid, data, data_length, channel_id, file_path, conn_type;
 #ifdef SUPPORT_BASE64_ENCODING
                        int data_len;
                        size_t outSize;
@@ -242,9 +276,13 @@ OCEntityHandlerResult _request_handler(std::shared_ptr<OCResourceRequest> reques
                                        if (!requestRep.getValue("file_path", file_path))
                                                LOG_ERR("CMD not found in representation");
 
+                                       if (!requestRep.getValue("conn_type", conn_type))
+                                               LOG_ERR("conn_type not found in representation");
+
                                        mdgd_receive_file_t *receive_file = g_new0(mdgd_receive_file_t, 1);
                                        receive_file->file_path = g_strdup(file_path.c_str());
                                        receive_file->device_id = g_strdup(requester_id.c_str());
+                                       receive_file->conn_type = g_strdup(conn_type.c_str());
 
                                        g_thread_try_new("file_receive_thread",
                                                __file_receive_thread_func, receive_file, NULL);