Tools: hv: Gather ipv[4,6] gateway information
K. Y. Srinivasan [Fri, 17 Aug 2012 01:32:18 +0000 (18:32 -0700)]
Gather information on the default gateways - ipv4/ipv6.

Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Reviewed-by: Haiyang Zhang <haiyangz@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

tools/hv/hv_kvp_daemon.c

index a63e83a..65d54c8 100644 (file)
@@ -491,6 +491,68 @@ done:
        return;
 }
 
+static void kvp_process_ipconfig_file(char *cmd,
+                                       char *config_buf, int len,
+                                       int element_size, int offset)
+{
+       char buf[256];
+       char *p;
+       char *x;
+       FILE *file;
+
+       /*
+        * First execute the command.
+        */
+       file = popen(cmd, "r");
+       if (file == NULL)
+               return;
+
+       if (offset == 0)
+               memset(config_buf, 0, len);
+       while ((p = fgets(buf, sizeof(buf), file)) != NULL) {
+               if ((len - strlen(config_buf)) < (element_size + 1))
+                       break;
+
+               x = strchr(p, '\n');
+               *x = '\0';
+               strcat(config_buf, p);
+               strcat(config_buf, ";");
+       }
+       pclose(file);
+}
+
+static void kvp_get_ipconfig_info(char *if_name,
+                                struct hv_kvp_ipaddr_value *buffer)
+{
+       char cmd[512];
+
+       /*
+        * Get the address of default gateway (ipv4).
+        */
+       sprintf(cmd, "%s %s", "ip route show dev", if_name);
+       strcat(cmd, " | awk '/default/ {print $3 }'");
+
+       /*
+        * Execute the command to gather gateway info.
+        */
+       kvp_process_ipconfig_file(cmd, (char *)buffer->gate_way,
+                               (MAX_GATEWAY_SIZE * 2), INET_ADDRSTRLEN, 0);
+
+       /*
+        * Get the address of default gateway (ipv6).
+        */
+       sprintf(cmd, "%s %s", "ip -f inet6  route show dev", if_name);
+       strcat(cmd, " | awk '/default/ {print $3 }'");
+
+       /*
+        * Execute the command to gather gateway info (ipv6).
+        */
+       kvp_process_ipconfig_file(cmd, (char *)buffer->gate_way,
+                               (MAX_GATEWAY_SIZE * 2), INET6_ADDRSTRLEN, 1);
+
+}
+
+
 static unsigned int hweight32(unsigned int *w)
 {
        unsigned int res = *w - ((*w >> 1) & 0x55555555);
@@ -650,6 +712,12 @@ kvp_get_ip_address(int family, char *if_name, int op,
                                strcat((char *)ip_buffer->sub_net, ";");
                                sn_offset += strlen(sn_str) + 1;
                        }
+
+                       /*
+                        * Collect other ip related configuration info.
+                        */
+
+                       kvp_get_ipconfig_info(if_name, ip_buffer);
                }
 
 gather_ipaddr: