Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 324391
b: refs/heads/master
c: 6a60a6a
h: refs/heads/master
i:
  324389: 1b1c915
  324387: 8fd1dc0
  324383: 59d3203
v: v3
  • Loading branch information
K. Y. Srinivasan authored and Greg Kroah-Hartman committed Aug 17, 2012
1 parent 55ed120 commit aac0c22
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 04405784591117539eac4f5348c86d66dc0dd4f1
refs/heads/master: 6a60a6a8ea97795a288469c21262522894a1e6db
46 changes: 36 additions & 10 deletions trunk/tools/hv/hv_kvp_daemon.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,15 @@ void kvp_get_os_info(void)
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,
int family, char *buffer,
int length, int *offset)
Expand Down Expand Up @@ -535,10 +544,15 @@ kvp_get_ip_address(int family, char *if_name, int op,
struct ifaddrs *curp;
int offset = 0;
int sn_offset = 0;
const char *str;
int error = 0;
char *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) {
buffer = out_buffer;
Expand Down Expand Up @@ -611,18 +625,30 @@ kvp_get_ip_address(int family, char *if_name, int op,
goto gather_ipaddr;
} else {
ip_buffer->addr_family |= ADDR_FAMILY_IPV6;

/*
* Get subnet info.
* Get subnet info in CIDR format.
*/
error = kvp_process_ip_address(
curp->ifa_netmask,
AF_INET6,
(char *)
ip_buffer->sub_net,
length,
&sn_offset);
if (error)
weight = 0;
sn_str = (char *)ip_buffer->sub_net;
addr6 = (struct sockaddr_in6 *)
curp->ifa_netmask;
w = addr6->sin6_addr.s6_addr32;

for (i = 0; i < 4; i++)
weight += hweight32(&w[i]);

sprintf(cidr_mask, "/%d", weight);
if ((length - sn_offset) <
(strlen(cidr_mask) + 1))
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;
}
}

Expand Down

0 comments on commit aac0c22

Please sign in to comment.