diff --git a/include/sigar.h b/include/sigar.h index cfe07543..91c31993 100644 --- a/include/sigar.h +++ b/include/sigar.h @@ -409,6 +409,8 @@ SIGAR_DECLARE(int) sigar_net_address_to_string(sigar_t *sigar, sigar_net_address_t *address, char *addr_str); +SIGAR_DECLARE(sigar_uint32_t) sigar_net_address_hash(sigar_net_address_t *address); + #ifndef INET6_ADDRSTRLEN # define INET6_ADDRSTRLEN 46 #endif diff --git a/src/sigar.c b/src/sigar.c index b30ebf5c..926b240b 100644 --- a/src/sigar.c +++ b/src/sigar.c @@ -1672,6 +1672,44 @@ SIGAR_DECLARE(int) sigar_net_address_to_string(sigar_t *sigar, return SIGAR_OK; } +SIGAR_DECLARE(sigar_uint32_t) sigar_net_address_hash(sigar_net_address_t *address) +{ + sigar_uint32_t hash = 0; + unsigned char *data; + int i=0, size, elts; + + switch (address->family) { + case SIGAR_AF_UNSPEC: + case SIGAR_AF_INET: + return address->addr.in; + case SIGAR_AF_INET6: + data = (unsigned char *)&address->addr.in6; + size = sizeof(address->addr.in6); + elts = 4; + break; + case SIGAR_AF_LINK: + data = (unsigned char *)&address->addr.mac; + size = sizeof(address->addr.mac); + elts = 2; + break; + default: + return -1; + } + + while (i