Enabled IP CAGetNetworkInformation() API
authorhyuna0213.jo <hyuna0213.jo@samsung.com>
Fri, 29 Jul 2016 08:43:52 +0000 (17:43 +0900)
committerMadan Lanka <lanka.madan@samsung.com>
Mon, 8 Aug 2016 12:43:17 +0000 (12:43 +0000)
currently CAGetNetworkInformation is not working on linux platform.
because stack doesn't set the device address.

Change-Id: Ia80c9e61d4c9180f3abbe7234e512fa475132da5
Signed-off-by: hyuna0213.jo <hyuna0213.jo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/9871
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Dave Thaler <dthaler@microsoft.com>
Reviewed-by: jihwan seo <jihwan.seo@samsung.com>
Reviewed-by: Jaehong Jo <jaehong.jo@samsung.com>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
resource/csdk/connectivity/inc/caipinterface.h
resource/csdk/connectivity/src/ip_adapter/android/caipnwmonitor.c
resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_eth.cpp
resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_wifi.cpp
resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_eth.cpp
resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_wifi.cpp
resource/csdk/connectivity/src/ip_adapter/caipserver.c
resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c
resource/csdk/connectivity/src/ip_adapter/tizen/caipnwmonitor.c
resource/csdk/connectivity/test/ca_api_unittest.cpp

index 14a5471..6701825 100644 (file)
@@ -170,7 +170,7 @@ typedef struct
     uint32_t index;
     uint32_t flags;
     uint16_t family;
-    uint32_t ipv4addr;        /**< used for IPv4 only. */
+    char addr[MAX_ADDR_STR_SIZE_CA];
 } CAInterface_t;
 
 
index 0809c8d..64bc8aa 100644 (file)
 static CAIPConnectionStateChangeCallback g_networkChangeCallback;
 
 static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family,
-                                         uint32_t addr, int flags);
+                                         const char *addr, int flags);
 
 static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
-                            const char *name, int family, uint32_t addr, int flags);
+                                     const char *name, int family, const char *addr, int flags);
 
 CAResult_t CAIPJniInit();
 
@@ -215,8 +215,6 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
     {
         struct ifreq* item = &ifr[i];
         char *name = item->ifr_name;
-        struct sockaddr_in *sa4 = (struct sockaddr_in *)&item->ifr_addr;
-        uint32_t ipv4addr = sa4->sin_addr.s_addr;
 
         if (ioctl(s, SIOCGIFFLAGS, item) < 0)
         {
@@ -243,15 +241,13 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
             continue;
         }
 
-        // Add IPv4 interface
-        CAResult_t result = CAAddInterfaceItem(iflist, ifindex, name, AF_INET, ipv4addr, flags);
-        if (CA_STATUS_OK != result)
-        {
-            goto exit;
-        }
+        // Get address of network interface.
+        char addr[MAX_ADDR_STR_SIZE_CA] = { 0 };
+        struct sockaddr_in *sa = (struct sockaddr_in *)&item->ifr_addr;
+        inet_ntop(AF_INET, (void *)&(sa->sin_addr), addr, sizeof(addr));
 
-        // Add IPv6 interface
-        result = CAAddInterfaceItem(iflist, ifindex, name, AF_INET6, ipv4addr, flags);
+        // Add IPv4 interface
+        CAResult_t result = CAAddInterfaceItem(iflist, ifindex, name, AF_INET, addr, flags);
         if (CA_STATUS_OK != result)
         {
             goto exit;
@@ -265,7 +261,7 @@ exit:
 }
 
 static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
-                            const char *name, int family, uint32_t addr, int flags)
+                                     const char *name, int family, const char *addr, int flags)
 {
     CAInterface_t *ifitem = CANewInterfaceItem(index, name, family, addr, flags);
     if (!ifitem)
@@ -284,7 +280,7 @@ static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
 }
 
 static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family,
-                                         uint32_t addr, int flags)
+                                         const char *addr, int flags)
 {
     CAInterface_t *ifitem = (CAInterface_t *)OICCalloc(1, sizeof (CAInterface_t));
     if (!ifitem)
@@ -296,7 +292,7 @@ static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family
     OICStrcpy(ifitem->name, sizeof (ifitem->name), name);
     ifitem->index = index;
     ifitem->family = family;
-    ifitem->ipv4addr = addr;
+    OICStrcpy(ifitem->addr, sizeof (ifitem->addr), addr);
     ifitem->flags = flags;
 
     return ifitem;
index c9ef984..97b4981 100644 (file)
@@ -56,7 +56,7 @@ CAResult_t CAIPStopNetworkMonitor()
 }
 
 /// Retrieves the IP address assigned to Arduino Ethernet shield
-void CAArduinoGetInterfaceAddress(uint32_t *address)
+void CAArduinoGetInterfaceAddress(char *address, size_t len)
 {
     OIC_LOG(DEBUG, TAG, "IN");
     VERIFY_NON_NULL_VOID(address, TAG, "address");
@@ -64,10 +64,10 @@ void CAArduinoGetInterfaceAddress(uint32_t *address)
     //TODO : Fix this for scenarios when this API is invoked when device is not connected
     uint8_t rawIPAddr[4];
     W5100.getIPAddress(rawIPAddr);
-    *address = (uint32_t) rawIPAddr;
+    snprintf(address, len, "%d.%d.%d.%d",
+             rawIPAddr[0], rawIPAddr[1], rawIPAddr[2], rawIPAddr[3]);
 
-    OIC_LOG_V(DEBUG, TAG, "address:%d.%d.%d.%d", rawIPAddr[0], rawIPAddr[1],
-              rawIPAddr[2], rawIPAddr[3]);
+    OIC_LOG_V(DEBUG, TAG, "address: %s", address);
     OIC_LOG(DEBUG, TAG, "OUT");
     return;
 }
@@ -95,7 +95,7 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
     ifitem->index = 1;
     ifitem->family = AF_INET;
     ifitem->flags = 0;
-    CAArduinoGetInterfaceAddress(&ifitem->ipv4addr);
+    CAArduinoGetInterfaceAddress(ifitem->addr, sizeof(ifitem->addr));
 
     result = u_arraylist_add(iflist, ifitem);
     if (!result)
index 3323c4a..e31e825 100644 (file)
@@ -57,7 +57,7 @@ CAResult_t CAIPStopNetworkMonitor()
 }
 
 /// Retrieves the IP address assigned to Arduino WiFi shield
-void CAArduinoGetInterfaceAddress(uint32_t *address)
+void CAArduinoGetInterfaceAddress(char *address, size_t len)
 {
     OIC_LOG(DEBUG, TAG, "IN");
     if (WiFi.status() != WL_CONNECTED)
@@ -69,9 +69,9 @@ void CAArduinoGetInterfaceAddress(uint32_t *address)
     VERIFY_NON_NULL_VOID(address, TAG, "Invalid address");
 
     IPAddress ip = WiFi.localIP();
-    *address = (uint32_t) ip;
+    snprintf(address, len, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
 
-    OIC_LOG_V(DEBUG, TAG, "Wifi shield address is: %d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
+    OIC_LOG_V(DEBUG, TAG, "Wifi shield address is: %s", address);
     OIC_LOG(DEBUG, TAG, "OUT");
     return;
 }
@@ -99,7 +99,7 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
     ifitem->index = 1;
     ifitem->family = AF_INET;
     ifitem->flags = 0;
-    CAArduinoGetInterfaceAddress(&ifitem->ipv4addr);
+    CAArduinoGetInterfaceAddress(ifitem->addr, sizeof(ifitem->addr));
 
     result = u_arraylist_add(iflist, ifitem);
     if (!result)
index b014254..476a297 100644 (file)
@@ -362,9 +362,7 @@ CAResult_t CAGetIPInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
         {
             continue;
         }
-        unsigned char *addr=  (unsigned char *) &(ifitem->ipv4addr);
-        snprintf(eps[j].addr, MAX_ADDR_STR_SIZE_CA, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
-
+        OICStrcpy(eps[j].addr, MAX_ADDR_STR_SIZE_CA, ifitem->addr);
         eps[j].flags = CA_IPV4;
         eps[j].adapter = CA_ADAPTER_IP;
         eps[j].ifindex = 0;
index 48d52e2..5bbff11 100644 (file)
@@ -299,9 +299,7 @@ CAResult_t CAGetIPInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
         {
             continue;
         }
-        unsigned char *addr=  (unsigned char *) &(ifitem->ipv4addr);
-        snprintf(eps[j].addr, MAX_ADDR_STR_SIZE_CA, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
-
+        OICStrcpy(eps[j].addr, MAX_ADDR_STR_SIZE_CA, ifitem->addr);
         eps[j].flags = CA_IPV4;
         eps[j].adapter = CA_ADAPTER_IP;
         eps[j].ifindex = 0;
index 80bda03..f569b7c 100644 (file)
@@ -1478,10 +1478,8 @@ CAResult_t CAGetIPInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
         {
             eps[j].flags = CA_IPV4;
             eps[j].port = caglobals.ip.u4.port;
-            /** @todo eps[j].addr not populated with IPv4 address string.
-             * it was using ifitem->ipv4addr to accomplish this.
-             * Need to understand what ipv4addr means to whom*/
         }
+        OICStrcpy(eps[j].addr, sizeof(eps[j].addr), ifitem->addr);
 
 #ifdef __WITH_DTLS__
         j++;
@@ -1498,8 +1496,8 @@ CAResult_t CAGetIPInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
         {
             eps[j].flags = CA_IPV4 | CA_SECURE;
             eps[j].port = caglobals.ip.u4s.port;
-            inet_ntop(AF_INET, &(ifitem->ipv4addr), eps[j].addr, MAX_ADDR_STR_SIZE_CA);
         }
+        OICStrcpy(eps[j].addr, sizeof(eps[j].addr), ifitem->addr);
 #endif
         j++;
     }
index 40a0552..7d09727 100644 (file)
@@ -24,7 +24,6 @@
 #include <string.h>
 #include <sys/types.h>
 #include <sys/socket.h>
-#include <sys/types.h>
 #include <sys/select.h>
 #include <ifaddrs.h>
 #include <unistd.h>
@@ -38,8 +37,6 @@
 #ifdef __linux__
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
 #endif
 
 #include "camutex.h"
@@ -65,7 +62,7 @@ static CAIPConnectionStateChangeCallback g_networkChangeCallback = NULL;
 static CAResult_t CAIPInitializeNetworkMonitorList();
 static void CAIPDestroyNetworkMonitorList();
 static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family,
-                                         uint32_t addr, int flags);
+                                         const char *addr, int flags);
 
 static CAResult_t CAIPInitializeNetworkMonitorList()
 {
@@ -196,7 +193,7 @@ void CAIPSetNetworkMonitorCallback(CAIPConnectionStateChangeCallback callback)
 }
 
 static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family,
-                                         uint32_t addr, int flags)
+                                         const char *addr, int flags)
 {
     CAInterface_t *ifitem = (CAInterface_t *)OICCalloc(1, sizeof (CAInterface_t));
     if (!ifitem)
@@ -208,7 +205,7 @@ static CAInterface_t *CANewInterfaceItem(int index, const char *name, int family
     OICStrcpy(ifitem->name, sizeof (ifitem->name), name);
     ifitem->index = index;
     ifitem->family = family;
-    ifitem->ipv4addr = addr;
+    OICStrcpy(ifitem->addr, sizeof (ifitem->addr), addr);
     ifitem->flags = flags;
 
     return ifitem;
@@ -277,7 +274,7 @@ CAInterface_t *CAFindInterfaceChange()
             }
 
             foundNewInterface = CANewInterfaceItem(ifitem->index, ifitem->name, ifitem->family,
-                                                   ifitem->ipv4addr, ifitem->flags);
+                                                   ifitem->addr, ifitem->flags);
             break;    // we found the one we were looking for
         }
         u_arraylist_destroy(iflist);
@@ -358,9 +355,21 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
         OICStrcpy(ifitem->name, INTERFACE_NAME_MAX, ifa->ifa_name);
         ifitem->index = ifindex;
         ifitem->family = family;
-        ifitem->ipv4addr = ((struct sockaddr_in *)(ifa->ifa_addr))->sin_addr.s_addr;
         ifitem->flags = ifa->ifa_flags;
 
+        if (ifitem->family == AF_INET6)
+        {
+            struct sockaddr_in6 *in6 = (struct sockaddr_in6*) ifa->ifa_addr;
+            inet_ntop(ifitem->family, (void *)&(in6->sin6_addr), ifitem->addr,
+                      sizeof(ifitem->addr));
+        }
+        else if (ifitem->family == AF_INET)
+        {
+            struct sockaddr_in *in = (struct sockaddr_in*) ifa->ifa_addr;
+            inet_ntop(ifitem->family, (void *)&(in->sin_addr), ifitem->addr,
+                      sizeof(ifitem->addr));
+        }
+
         bool result = u_arraylist_add(iflist, ifitem);
         if (!result)
         {
@@ -372,7 +381,7 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
         if (!isFound)
         {
             CAInterface_t *newifitem = CANewInterfaceItem(ifitem->index, ifitem->name, ifitem->family,
-                                                          ifitem->ipv4addr, ifitem->flags);
+                                                          ifitem->addr, ifitem->flags);
             CAResult_t ret = CAAddNetworkMonitorList(newifitem);
             if (CA_STATUS_OK != ret)
             {
index 0d30c79..a09de25 100644 (file)
 static CAIPConnectionStateChangeCallback g_networkChangeCallback;
 
 static CAInterface_t *CANewInterfaceItem(int index, char *name, int family,
-                                         uint32_t addr, int flags);
+                                         const char *addr, int flags);
 
 static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
-                                     char *name, int family, uint32_t addr, int flags);
+                                     char *name, int family, const char *addr, int flags);
 
 static void CAWIFIConnectionStateChangedCb(wifi_connection_state_e state, wifi_ap_h ap,
                                            void *userData);
@@ -121,9 +121,13 @@ CAInterface_t *CAFindInterfaceChange()
                 continue;
             }
 
+            // Get address of network interface.
+            char addr[MAX_ADDR_STR_SIZE_CA] = { 0 };
+            struct sockaddr_in *sa4 = (struct sockaddr_in *)&item->ifr_addr;
+            inet_ntop(AF_INET, (void *)&(sa4->sin_addr), addr, sizeof(addr));
 
             foundNewInterface = CANewInterfaceItem(ifitem->index, ifitem->name, ifitem->family,
-                                                   ifitem->ipv4addr, ifitem->flags);
+                                                   addr, ifitem->flags);
             break;    // we found the one we were looking for
         }
         u_arraylist_destroy(iflist);
@@ -233,8 +237,6 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
     {
         struct ifreq* item = &ifr[i];
         char *name = item->ifr_name;
-        struct sockaddr_in *sa4 = (struct sockaddr_in *)&item->ifr_addr;
-        uint32_t ipv4addr = sa4->sin_addr.s_addr;
 
         if (ioctl(s, SIOCGIFFLAGS, item) < 0)
         {
@@ -261,15 +263,13 @@ u_arraylist_t *CAIPGetInterfaceInformation(int desiredIndex)
             continue;
         }
 
-        // Add IPv4 interface
-        CAResult_t result = CAAddInterfaceItem(iflist, ifindex, name, AF_INET, ipv4addr, flags);
-        if (CA_STATUS_OK != result)
-        {
-            goto exit;
-        }
+        // Get address of network interface.
+        char addr[MAX_ADDR_STR_SIZE_CA] = { 0 };
+        struct sockaddr_in *sa = (struct sockaddr_in *)&item->ifr_addr;
+        inet_ntop(AF_INET, (void *)&(sa->sin_addr), addr, sizeof(addr));
 
-        // Add IPv6 interface
-        result = CAAddInterfaceItem(iflist, ifindex, name, AF_INET6, ipv4addr, flags);
+        // Add IPv4 interface
+        CAResult_t result = CAAddInterfaceItem(iflist, ifindex, name, AF_INET, addr, flags);
         if (CA_STATUS_OK != result)
         {
             goto exit;
@@ -283,7 +283,7 @@ exit:
 }
 
 static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
-                                     char *name, int family, uint32_t addr, int flags)
+                                     char *name, int family, const char *addr, int flags)
 {
     CAInterface_t *ifitem = CANewInterfaceItem(index, name, family, addr, flags);
     if (!ifitem)
@@ -302,7 +302,7 @@ static CAResult_t CAAddInterfaceItem(u_arraylist_t *iflist, int index,
 }
 
 static CAInterface_t *CANewInterfaceItem(int index, char *name, int family,
-                                         uint32_t addr, int flags)
+                                         const char *addr, int flags)
 {
     CAInterface_t *ifitem = (CAInterface_t *)OICCalloc(1, sizeof (CAInterface_t));
     if (!ifitem)
@@ -314,7 +314,7 @@ static CAInterface_t *CANewInterfaceItem(int index, char *name, int family,
     OICStrcpy(ifitem->name, INTERFACE_NAME_MAX, name);
     ifitem->index = index;
     ifitem->family = family;
-    ifitem->ipv4addr = addr;
+    OICStrcpy(ifitem->addr, sizeof(ifitem->addr), addr);
     ifitem->flags = flags;
 
     return ifitem;
index d45ef4d..f773e9c 100644 (file)
@@ -510,6 +510,15 @@ TEST_F (CATests, GetNetworkInformationTest)
     EXPECT_EQ(CA_STATUS_OK, CASelectNetwork(CA_ADAPTER_IP));
     EXPECT_EQ(CA_STATUS_OK, CAGetNetworkInformation(&tempInfo, &tempSize));
 
+// @todo: if this api is supported on windows platform, it should be changed.
+#if !defined(_WIN32)
+    for (uint32_t index = 0; index < tempSize; index++)
+    {
+        EXPECT_TRUE(tempInfo[index].adapter != 0);
+        EXPECT_TRUE(strlen(tempInfo[index].addr) != 0);
+    }
+#endif
+
     free(tempInfo);
 }