(SIGAR-198) implement net_route_list on AIX
This commit is contained in:
parent
a45a09478f
commit
39fef6c396
|
@ -75,6 +75,9 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <netinet/in6_var.h>
|
#include <netinet/in6_var.h>
|
||||||
|
|
||||||
|
/* for getkerninfo */
|
||||||
|
#include <sys/kinfo.h>
|
||||||
|
|
||||||
/* not defined in aix 4.3 */
|
/* not defined in aix 4.3 */
|
||||||
#ifndef SBITS
|
#ifndef SBITS
|
||||||
#define SBITS 16
|
#define SBITS 16
|
||||||
|
@ -1494,11 +1497,94 @@ int sigar_cpu_info_list_get(sigar_t *sigar,
|
||||||
|
|
||||||
return SIGAR_OK;
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
/* XXX net_route_list copy-n-pasted from darwin_sigar.c; only diff is getkerninfo instead of sysctl */
|
||||||
|
#define rt_s_addr(sa) ((struct sockaddr_in *)(sa))->sin_addr.s_addr
|
||||||
|
|
||||||
|
#ifndef SA_SIZE
|
||||||
|
#define SA_SIZE(sa) \
|
||||||
|
( (!(sa) || ((struct sockaddr *)(sa))->sa_len == 0) ? \
|
||||||
|
sizeof(long) : \
|
||||||
|
1 + ( (((struct sockaddr *)(sa))->sa_len - 1) | (sizeof(long) - 1) ) )
|
||||||
|
#endif
|
||||||
|
|
||||||
int sigar_net_route_list_get(sigar_t *sigar,
|
int sigar_net_route_list_get(sigar_t *sigar,
|
||||||
sigar_net_route_list_t *routelist)
|
sigar_net_route_list_t *routelist)
|
||||||
{
|
{
|
||||||
return SIGAR_ENOTIMPL;
|
size_t needed;
|
||||||
|
int bit;
|
||||||
|
char *buf, *next, *lim;
|
||||||
|
struct rt_msghdr *rtm;
|
||||||
|
|
||||||
|
needed = getkerninfo(KINFO_RT_DUMP, NULL, NULL, 0);
|
||||||
|
if (needed <= 0) {
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = malloc(needed);
|
||||||
|
|
||||||
|
if (getkerninfo(KINFO_RT_DUMP, buf, &needed, 0) < 0) {
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigar_net_route_list_create(routelist);
|
||||||
|
|
||||||
|
lim = buf + needed;
|
||||||
|
|
||||||
|
for (next = buf; next < lim; next += rtm->rtm_msglen) {
|
||||||
|
struct sockaddr *sa;
|
||||||
|
sigar_net_route_t *route;
|
||||||
|
rtm = (struct rt_msghdr *)next;
|
||||||
|
|
||||||
|
if (rtm->rtm_type != RTM_GET) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sa = (struct sockaddr *)(rtm + 1);
|
||||||
|
|
||||||
|
if (sa->sa_family != AF_INET) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
SIGAR_NET_ROUTE_LIST_GROW(routelist);
|
||||||
|
route = &routelist->data[routelist->number++];
|
||||||
|
SIGAR_ZERO(route);
|
||||||
|
|
||||||
|
route->flags = rtm->rtm_flags;
|
||||||
|
if_indextoname(rtm->rtm_index, route->ifname);
|
||||||
|
|
||||||
|
for (bit=RTA_DST;
|
||||||
|
bit && ((char *)sa < lim);
|
||||||
|
bit <<= 1)
|
||||||
|
{
|
||||||
|
if ((rtm->rtm_addrs & bit) == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
switch (bit) {
|
||||||
|
case RTA_DST:
|
||||||
|
sigar_net_address_set(route->destination,
|
||||||
|
rt_s_addr(sa));
|
||||||
|
break;
|
||||||
|
case RTA_GATEWAY:
|
||||||
|
if (sa->sa_family == AF_INET) {
|
||||||
|
sigar_net_address_set(route->gateway,
|
||||||
|
rt_s_addr(sa));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case RTA_NETMASK:
|
||||||
|
sigar_net_address_set(route->mask,
|
||||||
|
rt_s_addr(sa));
|
||||||
|
break;
|
||||||
|
case RTA_IFA:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
sa = (struct sockaddr *)((char *)sa + SA_SIZE(sa));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sigar_net_interface_stat_get(sigar_t *sigar,
|
int sigar_net_interface_stat_get(sigar_t *sigar,
|
||||||
|
|
Loading…
Reference in New Issue