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>
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;
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();
{
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)
{
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;
}
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)
}
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)
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;
}
/// 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");
//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;
}
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)
}
/// 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)
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;
}
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)
{
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;
{
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;
{
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++;
{
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++;
}
#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>
#ifdef __linux__
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
#endif
#include "camutex.h"
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()
{
}
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)
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;
}
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);
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)
{
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)
{
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);
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);
{
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)
{
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;
}
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)
}
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)
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;
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);
}