+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;
+}
+