Replace os_sockQueryInterfaces by os_getifaddrs
Signed-off-by: Jeroen Koekkoek <jeroen@koekkoek.nl>
This commit is contained in:
parent
2fc4cac1a7
commit
458b1df3f7
23 changed files with 696 additions and 597 deletions
|
@ -17,7 +17,7 @@
|
|||
enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory_t tran, const nn_locator_t *loc, size_t ninterf, const struct nn_interface interf[]);
|
||||
enum ddsi_locator_from_string_result ddsi_ipaddr_from_string (ddsi_tran_factory_t tran, nn_locator_t *loc, const char *str, int32_t kind);
|
||||
char *ddsi_ipaddr_to_string (ddsi_tran_factory_t tran, char *dst, size_t sizeof_dst, const nn_locator_t *loc, int with_port);
|
||||
void ddsi_ipaddr_to_loc (nn_locator_t *dst, const os_sockaddr_storage *src, int32_t kind);
|
||||
void ddsi_ipaddr_to_loc (nn_locator_t *dst, const os_sockaddr *src, int32_t kind);
|
||||
void ddsi_ipaddr_from_loc (os_sockaddr_storage *dst, const nn_locator_t *src);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -75,7 +75,7 @@ typedef enum ddsi_locator_from_string_result (*ddsi_locator_from_string_fn_t) (d
|
|||
|
||||
typedef char * (*ddsi_locator_to_string_fn_t) (ddsi_tran_factory_t tran, char *dst, size_t sizeof_dst, const nn_locator_t *loc, int with_port);
|
||||
|
||||
typedef int (*ddsi_enumerate_interfaces_fn_t) (ddsi_tran_factory_t tran, int max, struct os_ifAttributes_s *interfs);
|
||||
typedef int (*ddsi_enumerate_interfaces_fn_t) (ddsi_tran_factory_t tran, os_ifaddrs_t **interfs);
|
||||
|
||||
/* Data types */
|
||||
|
||||
|
@ -237,7 +237,7 @@ enum ddsi_locator_from_string_result ddsi_locator_from_string (nn_locator_t *loc
|
|||
char *ddsi_locator_to_string (char *dst, size_t sizeof_dst, const nn_locator_t *loc);
|
||||
char *ddsi_locator_to_string_no_port (char *dst, size_t sizeof_dst, const nn_locator_t *loc);
|
||||
|
||||
int ddsi_enumerate_interfaces (ddsi_tran_factory_t factory, int max, struct os_ifAttributes_s *interfs);
|
||||
int ddsi_enumerate_interfaces (ddsi_tran_factory_t factory, os_ifaddrs_t **interfs);
|
||||
|
||||
#define ddsi_listener_locator(s,l) (ddsi_tran_locator (&(s)->m_base,(l)))
|
||||
ddsi_tran_conn_t ddsi_listener_accept (ddsi_tran_listener_t listener);
|
||||
|
|
|
@ -49,7 +49,7 @@ enum ddsi_locator_from_string_result ddsi_ipaddr_from_string (ddsi_tran_factory_
|
|||
return AFSR_INVALID;
|
||||
if ((ipv4 && tmpaddr.ss_family != AF_INET) || (!ipv4 && tmpaddr.ss_family != AF_INET6))
|
||||
return AFSR_MISMATCH;
|
||||
ddsi_ipaddr_to_loc (loc, &tmpaddr, kind);
|
||||
ddsi_ipaddr_to_loc (loc, (os_sockaddr *)&tmpaddr, kind);
|
||||
/* This is just an address, so there is no valid value for port, other than INVALID.
|
||||
Without a guarantee that tmpaddr has port 0, best is to set it explicitly here */
|
||||
loc->port = NN_LOCATOR_PORT_INVALID;
|
||||
|
@ -94,10 +94,10 @@ char *ddsi_ipaddr_to_string (ddsi_tran_factory_t tran, char *dst, size_t sizeof_
|
|||
return dst;
|
||||
}
|
||||
|
||||
void ddsi_ipaddr_to_loc (nn_locator_t *dst, const os_sockaddr_storage *src, int32_t kind)
|
||||
void ddsi_ipaddr_to_loc (nn_locator_t *dst, const os_sockaddr *src, int32_t kind)
|
||||
{
|
||||
dst->kind = kind;
|
||||
switch (src->ss_family)
|
||||
switch (src->sa_family)
|
||||
{
|
||||
case AF_INET:
|
||||
{
|
||||
|
@ -137,7 +137,7 @@ void ddsi_ipaddr_to_loc (nn_locator_t *dst, const os_sockaddr_storage *src, int3
|
|||
}
|
||||
#endif
|
||||
default:
|
||||
NN_FATAL ("nn_address_to_loc: family %d unsupported\n", (int) src->ss_family);
|
||||
NN_FATAL ("nn_address_to_loc: family %d unsupported\n", (int) src->sa_family);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -347,42 +347,23 @@ static void ddsi_raweth_deinit(void)
|
|||
}
|
||||
}
|
||||
|
||||
static int ddsi_raweth_enumerate_interfaces (ddsi_tran_factory_t factory, int max, struct os_ifAttributes_s *interfs)
|
||||
static int ddsi_raweth_enumerate_interfaces (ddsi_tran_factory_t factory, os_ifaddrs_t **interfs)
|
||||
{
|
||||
struct ifaddrs *ifaddr, *ifa;
|
||||
int err = 0;
|
||||
int cnt = 0;
|
||||
os_ifaddrs_t *ifa;
|
||||
os_ifaddr_filter_t filt = { .af_packet = 1 };
|
||||
|
||||
(void)factory;
|
||||
if (getifaddrs (&ifaddr) == -1)
|
||||
return -errno;
|
||||
for (ifa = ifaddr; ifa && cnt < max; ifa = ifa->ifa_next)
|
||||
{
|
||||
struct os_ifAttributes_s *f = &interfs[cnt];
|
||||
struct sockaddr_ll *x;
|
||||
if (ifa->ifa_addr == NULL)
|
||||
continue;
|
||||
if (ifa->ifa_addr->sa_family != AF_PACKET)
|
||||
continue;
|
||||
if ((ifa->ifa_flags & (IFF_UP | IFF_BROADCAST)) != (IFF_UP | IFF_BROADCAST))
|
||||
continue;
|
||||
strncpy(f->name, ifa->ifa_name, sizeof(f->name));
|
||||
f->name[sizeof(f->name)-1] = 0;
|
||||
f->flags = ifa->ifa_flags;
|
||||
f->interfaceIndexNo = if_nametoindex(f->name);
|
||||
x = (struct sockaddr_ll *)&f->address;
|
||||
memcpy(x, ifa->ifa_addr, sizeof (*x));
|
||||
x = (struct sockaddr_ll *)&f->network_mask;
|
||||
if (ifa->ifa_netmask)
|
||||
memcpy(x, ifa->ifa_netmask, sizeof (*x));
|
||||
else
|
||||
memset(x, 0, sizeof(*x));
|
||||
x = (struct sockaddr_ll *)&f->broadcast_address;
|
||||
if (ifa->ifa_broadaddr)
|
||||
memcpy(x, ifa->ifa_broadaddr, sizeof (*x));
|
||||
else
|
||||
memset(x, 0, sizeof(*x));
|
||||
cnt++;
|
||||
|
||||
if ((err = os_getifaddrs(interfs, &filt)) == 0) {
|
||||
for (ifa = *interfs; ifa != NULL; ifa = ifa->next, cnt++) {
|
||||
/* do nothing */
|
||||
}
|
||||
} else {
|
||||
return -err;
|
||||
}
|
||||
freeifaddrs (ifaddr);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
|
|
|
@ -145,7 +145,7 @@ static ddsi_tcp_conn_t ddsi_tcp_new_conn (os_socket, bool, os_sockaddr_storage *
|
|||
static char *sockaddr_to_string_with_port (char *dst, size_t sizeof_dst, const os_sockaddr_storage *src)
|
||||
{
|
||||
nn_locator_t loc;
|
||||
ddsi_ipaddr_to_loc(&loc, src, src->ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
ddsi_ipaddr_to_loc(&loc, (const os_sockaddr *)src, src->ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
ddsi_locator_to_string(dst, sizeof_dst, &loc);
|
||||
return dst;
|
||||
}
|
||||
|
@ -452,7 +452,7 @@ static ssize_t ddsi_tcp_conn_read (ddsi_tran_conn_t conn, unsigned char * buf, s
|
|||
{
|
||||
if (srcloc)
|
||||
{
|
||||
ddsi_ipaddr_to_loc(srcloc, &tcp->m_peer_addr, tcp->m_peer_addr.ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
ddsi_ipaddr_to_loc(srcloc, (os_sockaddr *)&tcp->m_peer_addr, tcp->m_peer_addr.ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
}
|
||||
return (ssize_t) pos;
|
||||
}
|
||||
|
@ -869,7 +869,7 @@ static void ddsi_tcp_conn_peer_locator (ddsi_tran_conn_t conn, nn_locator_t * lo
|
|||
char buff[DDSI_LOCSTRLEN];
|
||||
ddsi_tcp_conn_t tc = (ddsi_tcp_conn_t) conn;
|
||||
assert (tc->m_sock != Q_INVALID_SOCKET);
|
||||
ddsi_ipaddr_to_loc (loc, &tc->m_peer_addr, tc->m_peer_addr.ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
ddsi_ipaddr_to_loc (loc, (os_sockaddr *)&tc->m_peer_addr, tc->m_peer_addr.ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
ddsi_locator_to_string(buff, sizeof(buff), loc);
|
||||
TRACE (("(%s EP:%s)", ddsi_name, buff));
|
||||
}
|
||||
|
@ -976,7 +976,7 @@ static void ddsi_tcp_close_conn (ddsi_tran_conn_t tc)
|
|||
sockaddr_to_string_with_port(buff, sizeof(buff), &conn->m_peer_addr);
|
||||
nn_log (LC_INFO, "%s close %s connnection on socket %"PRIsock" to %s\n", ddsi_name, conn->m_base.m_server ? "server" : "client", conn->m_sock, buff);
|
||||
(void) shutdown (conn->m_sock, 2);
|
||||
ddsi_ipaddr_to_loc(&loc, &conn->m_peer_addr, conn->m_peer_addr.ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
ddsi_ipaddr_to_loc(&loc, (os_sockaddr *)&conn->m_peer_addr, conn->m_peer_addr.ss_family == AF_INET ? NN_LOCATOR_KIND_TCPv4 : NN_LOCATOR_KIND_TCPv6);
|
||||
loc.port = conn->m_peer_port;
|
||||
purge_proxy_participants (&loc, conn->m_base.m_server);
|
||||
}
|
||||
|
|
|
@ -332,10 +332,10 @@ char *ddsi_locator_to_string_no_port (char *dst, size_t sizeof_dst, const nn_loc
|
|||
return dst;
|
||||
}
|
||||
|
||||
int ddsi_enumerate_interfaces (ddsi_tran_factory_t factory, int max, struct os_ifAttributes_s *interfs)
|
||||
int ddsi_enumerate_interfaces (ddsi_tran_factory_t factory, os_ifaddrs_t **interfs)
|
||||
{
|
||||
/* FIXME: HACK */
|
||||
if (factory->m_enumerate_interfaces_fn == 0)
|
||||
return 0;
|
||||
return factory->m_enumerate_interfaces_fn (factory, max, interfs);
|
||||
return factory->m_enumerate_interfaces_fn (factory, interfs);
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ static ssize_t ddsi_udp_conn_read (ddsi_tran_conn_t conn, unsigned char * buf, s
|
|||
if (ret > 0)
|
||||
{
|
||||
if (srcloc)
|
||||
ddsi_ipaddr_to_loc(srcloc, &src, src.ss_family == AF_INET ? NN_LOCATOR_KIND_UDPv4 : NN_LOCATOR_KIND_UDPv6);
|
||||
ddsi_ipaddr_to_loc(srcloc, (os_sockaddr *)&src, src.ss_family == AF_INET ? NN_LOCATOR_KIND_UDPv4 : NN_LOCATOR_KIND_UDPv6);
|
||||
|
||||
/* Check for udp packet truncation */
|
||||
if ((((size_t) ret) > len)
|
||||
|
@ -90,7 +90,7 @@ static ssize_t ddsi_udp_conn_read (ddsi_tran_conn_t conn, unsigned char * buf, s
|
|||
{
|
||||
char addrbuf[DDSI_LOCSTRLEN];
|
||||
nn_locator_t tmp;
|
||||
ddsi_ipaddr_to_loc(&tmp, &src, src.ss_family == AF_INET ? NN_LOCATOR_KIND_UDPv4 : NN_LOCATOR_KIND_UDPv6);
|
||||
ddsi_ipaddr_to_loc(&tmp, (os_sockaddr *)&src, src.ss_family == AF_INET ? NN_LOCATOR_KIND_UDPv4 : NN_LOCATOR_KIND_UDPv6);
|
||||
ddsi_locator_to_string(addrbuf, sizeof(addrbuf), &tmp);
|
||||
NN_WARNING ("%s => %d truncated to %d\n", addrbuf, (int)ret, (int)len);
|
||||
}
|
||||
|
|
|
@ -455,63 +455,51 @@ int find_own_ip (const char *requested_address)
|
|||
const char *sep = " ";
|
||||
char last_if_name[80] = "";
|
||||
int quality = -1;
|
||||
os_result res;
|
||||
int i;
|
||||
unsigned int nif;
|
||||
os_ifAttributes *ifs;
|
||||
os_ifaddrs_t *ifa, *ifa_root = NULL;
|
||||
int maxq_list[MAX_INTERFACES];
|
||||
int maxq_count = 0;
|
||||
size_t maxq_strlen = 0;
|
||||
int selected_idx = -1;
|
||||
char addrbuf[DDSI_LOCSTRLEN];
|
||||
|
||||
ifs = os_malloc (MAX_INTERFACES * sizeof (*ifs));
|
||||
|
||||
nn_log (LC_CONFIG, "interfaces:");
|
||||
|
||||
{
|
||||
int retcode;
|
||||
nif = 0;
|
||||
retcode = ddsi_enumerate_interfaces(gv.m_factory, (int)(MAX_INTERFACES - nif), ifs);
|
||||
if (retcode > 0)
|
||||
{
|
||||
nif = (unsigned)retcode;
|
||||
res = os_resultSuccess;
|
||||
}
|
||||
else if (retcode < 0)
|
||||
{
|
||||
NN_ERROR ("ddsi_enumerate_interfaces(%s): %d\n", gv.m_factory->m_typename, retcode);
|
||||
res = os_resultFail;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (config.transport_selector == TRANS_TCP6 || config.transport_selector == TRANS_UDP6)
|
||||
res = os_sockQueryIPv6Interfaces (ifs, MAX_INTERFACES, &nif);
|
||||
else if (config.transport_selector == TRANS_TCP || config.transport_selector == TRANS_UDP)
|
||||
res = os_sockQueryInterfaces (ifs, MAX_INTERFACES, &nif);
|
||||
else
|
||||
{
|
||||
NN_ERROR ("ddsi_enumerate_interfaces(%s): no go but neither UDP[46] nor TCP[46]\n", gv.m_factory->m_typename);
|
||||
res = os_resultFail;
|
||||
retcode = ddsi_enumerate_interfaces(gv.m_factory, &ifa_root);
|
||||
if (retcode < 0) {
|
||||
NN_ERROR("ddsi_enumerate_interfaces(%s): %d\n", gv.m_factory->m_typename, retcode);
|
||||
} else if (retcode == 0) {
|
||||
int err;
|
||||
const os_ifaddr_filter_t fltr = {
|
||||
.af_inet = (config.transport_selector == TRANS_TCP || config.transport_selector == TRANS_UDP),
|
||||
.af_inet6 = (config.transport_selector == TRANS_TCP6 || config.transport_selector == TRANS_UDP6)
|
||||
};
|
||||
|
||||
if ((err = os_getifaddrs(&ifa_root, &fltr)) != 0) {
|
||||
NN_ERROR("os_getifaddrs: %s\n", os_strerror(err));
|
||||
retcode = -1;
|
||||
} else if (ifa_root == NULL) {
|
||||
NN_ERROR("ddsi_enumerate_interfaces(%s): no go but neither UDP[46] nor TCP[46]\n", gv.m_factory->m_typename);
|
||||
retcode = -1;
|
||||
}
|
||||
}
|
||||
if (res != os_resultSuccess)
|
||||
{
|
||||
NN_ERROR ("os_sockQueryInterfaces: %d\n", (int) res);
|
||||
os_free (ifs);
|
||||
|
||||
if (retcode < 0) {
|
||||
os_freeifaddrs(ifa_root);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
gv.n_interfaces = 0;
|
||||
last_if_name[0] = 0;
|
||||
for (i = 0; i < (int) nif; i++, sep = ", ")
|
||||
for (ifa = ifa_root; ifa != NULL; ifa = ifa->next)
|
||||
{
|
||||
os_sockaddr_storage tmpip, tmpmask;
|
||||
char if_name[sizeof (last_if_name)];
|
||||
int q = 0;
|
||||
|
||||
strncpy (if_name, ifs[i].name, sizeof (if_name) - 1);
|
||||
strncpy (if_name, ifa->name, sizeof (if_name) - 1);
|
||||
if_name[sizeof (if_name) - 1] = 0;
|
||||
|
||||
if (strcmp (if_name, last_if_name))
|
||||
|
@ -519,46 +507,44 @@ int find_own_ip (const char *requested_address)
|
|||
strcpy (last_if_name, if_name);
|
||||
|
||||
/* interface must be up */
|
||||
if ((ifs[i].flags & IFF_UP) == 0)
|
||||
if ((ifa->flags & IFF_UP) == 0)
|
||||
{
|
||||
nn_log (LC_CONFIG, " (interface down)");
|
||||
continue;
|
||||
}
|
||||
|
||||
tmpip = ifs[i].address;
|
||||
tmpmask = ifs[i].network_mask;
|
||||
#ifdef __linux
|
||||
if (tmpip.ss_family == AF_PACKET)
|
||||
if (ifa->addr->sa_family == AF_PACKET)
|
||||
{
|
||||
/* FIXME: weirdo warning warranted */
|
||||
nn_locator_t *l = &gv.interfaces[gv.n_interfaces].loc;
|
||||
l->kind = NN_LOCATOR_KIND_RAWETH;
|
||||
l->port = NN_LOCATOR_PORT_INVALID;
|
||||
memset(l->address, 0, 10);
|
||||
memcpy(l->address + 10, ((struct sockaddr_ll *)&tmpip)->sll_addr, 6);
|
||||
memcpy(l->address + 10, ((struct sockaddr_ll *)ifa->addr)->sll_addr, 6);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
ddsi_ipaddr_to_loc(&gv.interfaces[gv.n_interfaces].loc, &tmpip, gv.m_factory->m_kind);
|
||||
ddsi_ipaddr_to_loc(&gv.interfaces[gv.n_interfaces].loc, ifa->addr, gv.m_factory->m_kind);
|
||||
}
|
||||
ddsi_locator_to_string_no_port(addrbuf, sizeof(addrbuf), &gv.interfaces[gv.n_interfaces].loc);
|
||||
nn_log (LC_CONFIG, " %s(", addrbuf);
|
||||
|
||||
if (!(ifs[i].flags & IFF_MULTICAST) && multicast_override (if_name))
|
||||
if (!(ifa->flags & IFF_MULTICAST) && multicast_override (if_name))
|
||||
{
|
||||
nn_log (LC_CONFIG, "assume-mc:");
|
||||
ifs[i].flags |= IFF_MULTICAST;
|
||||
ifa->flags |= IFF_MULTICAST;
|
||||
}
|
||||
|
||||
if (ifs[i].flags & IFF_LOOPBACK)
|
||||
if (ifa->flags & IFF_LOOPBACK)
|
||||
{
|
||||
/* Loopback device has the lowest priority of every interface
|
||||
available, because the other interfaces at least in principle
|
||||
allow communicating with other machines. */
|
||||
q += 0;
|
||||
#if OS_SOCKET_HAS_IPV6
|
||||
if (!(tmpip.ss_family == AF_INET6 && IN6_IS_ADDR_LINKLOCAL (&((os_sockaddr_in6 *) &tmpip)->sin6_addr)))
|
||||
if (!(ifa->addr->sa_family == AF_INET6 && IN6_IS_ADDR_LINKLOCAL (&((os_sockaddr_in6 *)ifa->addr)->sin6_addr)))
|
||||
q += 1;
|
||||
#endif
|
||||
}
|
||||
|
@ -575,16 +561,16 @@ int find_own_ip (const char *requested_address)
|
|||
which it was received. But that means proper multi-homing
|
||||
support and has quite an impact in various places, not least of
|
||||
which is the abstraction layer. */
|
||||
if (!(tmpip.ss_family == AF_INET6 && IN6_IS_ADDR_LINKLOCAL (&((os_sockaddr_in6 *) &tmpip)->sin6_addr)))
|
||||
if (!(ifa->addr->sa_family == AF_INET6 && IN6_IS_ADDR_LINKLOCAL (&((os_sockaddr_in6 *)ifa->addr)->sin6_addr)))
|
||||
q += 5;
|
||||
#endif
|
||||
|
||||
/* We strongly prefer a multicast capable interface, if that's
|
||||
not available anything that's not point-to-point, or else we
|
||||
hope IP routing will take care of the issues. */
|
||||
if (ifs[i].flags & IFF_MULTICAST)
|
||||
if (ifa->flags & IFF_MULTICAST)
|
||||
q += 4;
|
||||
else if (!(ifs[i].flags & IFF_POINTOPOINT))
|
||||
else if (!(ifa->flags & IFF_POINTOPOINT))
|
||||
q += 3;
|
||||
else
|
||||
q += 2;
|
||||
|
@ -604,10 +590,9 @@ int find_own_ip (const char *requested_address)
|
|||
|
||||
/* FIXME: HACK HACK */
|
||||
//ddsi_ipaddr_to_loc(&gv.interfaces[gv.n_interfaces].loc, &tmpip, gv.m_factory->m_kind);
|
||||
if (tmpip.ss_family == AF_INET || tmpip.ss_family == AF_INET6)
|
||||
if (ifa->addr->sa_family == AF_INET || ifa->addr->sa_family == AF_INET6)
|
||||
{
|
||||
tmpmask.ss_family = tmpip.ss_family;
|
||||
ddsi_ipaddr_to_loc(&gv.interfaces[gv.n_interfaces].netmask, &tmpmask, gv.m_factory->m_kind);
|
||||
ddsi_ipaddr_to_loc(&gv.interfaces[gv.n_interfaces].netmask, ifa->netmask, gv.m_factory->m_kind);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -615,14 +600,14 @@ int find_own_ip (const char *requested_address)
|
|||
gv.interfaces[gv.n_interfaces].netmask.port = NN_LOCATOR_PORT_INVALID;
|
||||
memset(&gv.interfaces[gv.n_interfaces].netmask.address, 0, sizeof(gv.interfaces[gv.n_interfaces].netmask.address));
|
||||
}
|
||||
gv.interfaces[gv.n_interfaces].mc_capable = ((ifs[i].flags & IFF_MULTICAST) != 0);
|
||||
gv.interfaces[gv.n_interfaces].point_to_point = ((ifs[i].flags & IFF_POINTOPOINT) != 0);
|
||||
gv.interfaces[gv.n_interfaces].if_index = ifs[i].interfaceIndexNo;
|
||||
gv.interfaces[gv.n_interfaces].mc_capable = ((ifa->flags & IFF_MULTICAST) != 0);
|
||||
gv.interfaces[gv.n_interfaces].point_to_point = ((ifa->flags & IFF_POINTOPOINT) != 0);
|
||||
gv.interfaces[gv.n_interfaces].if_index = ifa->index;
|
||||
gv.interfaces[gv.n_interfaces].name = os_strdup (if_name);
|
||||
gv.n_interfaces++;
|
||||
}
|
||||
nn_log (LC_CONFIG, "\n");
|
||||
os_free (ifs);
|
||||
os_freeifaddrs (ifa_root);
|
||||
|
||||
if (requested_address == NULL)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue