Add getting global ipaddr function
[platform/core/api/thread.git] / src / thread-network.c
index 8ff70c8..2832d0b 100644 (file)
@@ -689,3 +689,53 @@ int thread_remove_ipaddr(thread_instance_h instance, const uint8_t *ipv6_address
        return ret;
 }
 
+int thread_get_global_ipaddr(thread_instance_h instance, const char **ipaddr)
+{
+       FUNC_ENTRY;
+       THREAD_CHECK_SUPPORTED_FEATURE(THREAD_FEATURE_COMMON);
+       THREAD_CHECK_INIT_STATUS();
+       THREAD_VALIDATE_INPUT_PARAMETER(instance);
+
+       int ret = THREAD_ERROR_NONE;
+       char buffer[THREAD_MAX_BUFFER_SIZE];
+       int session_fd = _thread_get_socket_fd();
+       const char *msg = THREAD_IPADDR_V;
+       char *ret_ptr, *next_ptr;
+
+       ret = _thread_socket_client_write(session_fd, msg, strlen(msg));
+       if (ret != THREAD_ERROR_NONE) {
+               THREAD_DBG("Failed to execute command %s", msg);
+               return ret;
+       }
+       THREAD_DBG("Executed command '%s' with size %zu", msg, strlen(msg));
+
+       /* Check response */
+       ret = _thread_socket_client_read(session_fd, buffer);
+       if (ret != THREAD_ERROR_NONE && ret != THREAD_ERROR_ALREADY_DONE) {
+               THREAD_DBG("Socket response failed..");
+               return ret;
+       }
+
+       /* result is like below:
+        * > ipaddr -v
+        * fdd6:54c2:ee47:f2d2:0:ff:fe00:9400 origin:thread
+        * fd0b:8d9c:ac8c:1:2c82:12dd:825b:70c4 origin:slaac
+        * fdd6:54c2:ee47:f2d2:b267:e8fa:5bd6:2891 origin:thread
+        * fe80:0:0:0:5857:6a63:d5f1:91b6 origin:thread
+        * Done
+        */
+       ret_ptr = strtok_r(buffer, "\n", &next_ptr);
+       while (ret_ptr) {
+               if (strstr(ret_ptr, "origin:slaac")) {
+                       strtok_r(ret_ptr, " ", &next_ptr);
+                       THREAD_DBG("Global Ipaddr: %s", ret_ptr);
+                       *ipaddr = g_strdup(ret_ptr);
+                       return THREAD_ERROR_NONE;
+               }
+               ret_ptr = strtok_r(NULL, "\n", &next_ptr);
+       }
+
+       FUNC_EXIT;
+       return ret;
+}
+