From a95f7ffaa3d1c826ecd5e78727a50688e80e710a Mon Sep 17 00:00:00 2001 From: "hyuna0213.jo" Date: Fri, 29 Jul 2016 17:43:52 +0900 Subject: [PATCH] Enabled IP CAGetNetworkInformation() API currently CAGetNetworkInformation is not working on linux platform. because stack doesn't set the device address. Change-Id: Ia80c9e61d4c9180f3abbe7234e512fa475132da5 Signed-off-by: hyuna0213.jo Reviewed-on: https://gerrit.iotivity.org/gerrit/9871 Tested-by: jenkins-iotivity Reviewed-by: Dave Thaler Reviewed-by: jihwan seo Reviewed-by: Jaehong Jo Reviewed-by: Madan Lanka --- resource/csdk/connectivity/inc/caipinterface.h | 2 +- .../src/ip_adapter/android/caipnwmonitor.c | 26 ++++++++---------- .../src/ip_adapter/arduino/caipnwmonitor_eth.cpp | 10 +++---- .../src/ip_adapter/arduino/caipnwmonitor_wifi.cpp | 8 +++--- .../src/ip_adapter/arduino/caipserver_eth.cpp | 4 +-- .../src/ip_adapter/arduino/caipserver_wifi.cpp | 4 +-- .../csdk/connectivity/src/ip_adapter/caipserver.c | 6 ++-- .../src/ip_adapter/linux/caipnwmonitor.c | 27 ++++++++++++------ .../src/ip_adapter/tizen/caipnwmonitor.c | 32 +++++++++++----------- .../csdk/connectivity/test/ca_api_unittest.cpp | 9 ++++++ 10 files changed, 68 insertions(+), 60 deletions(-) diff --git a/resource/csdk/connectivity/inc/caipinterface.h b/resource/csdk/connectivity/inc/caipinterface.h index 14a5471..6701825 100644 --- a/resource/csdk/connectivity/inc/caipinterface.h +++ b/resource/csdk/connectivity/inc/caipinterface.h @@ -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; diff --git a/resource/csdk/connectivity/src/ip_adapter/android/caipnwmonitor.c b/resource/csdk/connectivity/src/ip_adapter/android/caipnwmonitor.c index 0809c8d..64bc8aa 100644 --- a/resource/csdk/connectivity/src/ip_adapter/android/caipnwmonitor.c +++ b/resource/csdk/connectivity/src/ip_adapter/android/caipnwmonitor.c @@ -41,10 +41,10 @@ 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; diff --git a/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_eth.cpp b/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_eth.cpp index c9ef984..97b4981 100644 --- a/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_eth.cpp +++ b/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_eth.cpp @@ -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) diff --git a/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_wifi.cpp b/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_wifi.cpp index 3323c4a..e31e825 100644 --- a/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_wifi.cpp +++ b/resource/csdk/connectivity/src/ip_adapter/arduino/caipnwmonitor_wifi.cpp @@ -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) diff --git a/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_eth.cpp b/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_eth.cpp index b014254..476a297 100644 --- a/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_eth.cpp +++ b/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_eth.cpp @@ -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; diff --git a/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_wifi.cpp b/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_wifi.cpp index 48d52e2..5bbff11 100644 --- a/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_wifi.cpp +++ b/resource/csdk/connectivity/src/ip_adapter/arduino/caipserver_wifi.cpp @@ -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; diff --git a/resource/csdk/connectivity/src/ip_adapter/caipserver.c b/resource/csdk/connectivity/src/ip_adapter/caipserver.c index 80bda03..f569b7c 100644 --- a/resource/csdk/connectivity/src/ip_adapter/caipserver.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipserver.c @@ -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++; } diff --git a/resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c b/resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c index 40a0552..7d09727 100644 --- a/resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c +++ b/resource/csdk/connectivity/src/ip_adapter/linux/caipnwmonitor.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -38,8 +37,6 @@ #ifdef __linux__ #include #include -#include -#include #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) { diff --git a/resource/csdk/connectivity/src/ip_adapter/tizen/caipnwmonitor.c b/resource/csdk/connectivity/src/ip_adapter/tizen/caipnwmonitor.c index 0d30c79..a09de25 100644 --- a/resource/csdk/connectivity/src/ip_adapter/tizen/caipnwmonitor.c +++ b/resource/csdk/connectivity/src/ip_adapter/tizen/caipnwmonitor.c @@ -49,10 +49,10 @@ 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; diff --git a/resource/csdk/connectivity/test/ca_api_unittest.cpp b/resource/csdk/connectivity/test/ca_api_unittest.cpp index d45ef4d..f773e9c 100644 --- a/resource/csdk/connectivity/test/ca_api_unittest.cpp +++ b/resource/csdk/connectivity/test/ca_api_unittest.cpp @@ -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); } -- 2.7.4