Commit 6a60a6a8 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman

Tools: hv: Represent the ipv6 mask using CIDR notation

Transform ipv6 subnet information to CIDR notation.
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: default avatarHaiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 04405784
...@@ -491,6 +491,15 @@ void kvp_get_os_info(void) ...@@ -491,6 +491,15 @@ void kvp_get_os_info(void)
return; return;
} }
static unsigned int hweight32(unsigned int *w)
{
unsigned int res = *w - ((*w >> 1) & 0x55555555);
res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
res = (res + (res >> 4)) & 0x0F0F0F0F;
res = res + (res >> 8);
return (res + (res >> 16)) & 0x000000FF;
}
static int kvp_process_ip_address(void *addrp, static int kvp_process_ip_address(void *addrp,
int family, char *buffer, int family, char *buffer,
int length, int *offset) int length, int *offset)
...@@ -535,10 +544,15 @@ kvp_get_ip_address(int family, char *if_name, int op, ...@@ -535,10 +544,15 @@ kvp_get_ip_address(int family, char *if_name, int op,
struct ifaddrs *curp; struct ifaddrs *curp;
int offset = 0; int offset = 0;
int sn_offset = 0; int sn_offset = 0;
const char *str;
int error = 0; int error = 0;
char *buffer; char *buffer;
struct hv_kvp_ipaddr_value *ip_buffer; struct hv_kvp_ipaddr_value *ip_buffer;
char cidr_mask[5]; /* /xyz */
int weight;
int i;
unsigned int *w;
char *sn_str;
struct sockaddr_in6 *addr6;
if (op == KVP_OP_ENUMERATE) { if (op == KVP_OP_ENUMERATE) {
buffer = out_buffer; buffer = out_buffer;
...@@ -611,18 +625,30 @@ kvp_get_ip_address(int family, char *if_name, int op, ...@@ -611,18 +625,30 @@ kvp_get_ip_address(int family, char *if_name, int op,
goto gather_ipaddr; goto gather_ipaddr;
} else { } else {
ip_buffer->addr_family |= ADDR_FAMILY_IPV6; ip_buffer->addr_family |= ADDR_FAMILY_IPV6;
/* /*
* Get subnet info. * Get subnet info in CIDR format.
*/ */
error = kvp_process_ip_address( weight = 0;
curp->ifa_netmask, sn_str = (char *)ip_buffer->sub_net;
AF_INET6, addr6 = (struct sockaddr_in6 *)
(char *) curp->ifa_netmask;
ip_buffer->sub_net, w = addr6->sin6_addr.s6_addr32;
length,
&sn_offset); for (i = 0; i < 4; i++)
if (error) weight += hweight32(&w[i]);
sprintf(cidr_mask, "/%d", weight);
if ((length - sn_offset) <
(strlen(cidr_mask) + 1))
goto gather_ipaddr; goto gather_ipaddr;
if (sn_offset == 0)
strcpy(sn_str, cidr_mask);
else
strcat(sn_str, cidr_mask);
strcat((char *)ip_buffer->sub_net, ";");
sn_offset += strlen(sn_str) + 1;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment