Add support for IPv6 addresses for interfaces.
authorguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 18 Jul 2004 18:47:44 +0000 (18:47 +0000)
committerguy <guy@f5534014-38df-0310-8fa8-9805f1628bb7>
Sun, 18 Jul 2004 18:47:44 +0000 (18:47 +0000)
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@11411 f5534014-38df-0310-8fa8-9805f1628bb7

gtk/capture_dlg.c
gtk/capture_if_dlg.c
pcap-util-unix.c
pcap-util.c
pcap-util.h

index 0689dadbfa958be963e434f160becb44ecb7c55b..56d06f75d7edeea56ea390900b2507b417961942 100644 (file)
@@ -213,23 +213,6 @@ get_if_name(char *if_text)
  */
 static GtkWidget *cap_open_w;
 
-
-/* From tcptraceroute, convert a numeric IP address to a string */
-/* XXX - this functionality is already somewhere in our code */
-#define IPTOSBUFFERS    12
-char *iptos(u_long in)
-{
-    static char output[IPTOSBUFFERS][3*4+3+1];
-    static short which;
-    u_char *p;
-
-    p = (u_char *)&in;
-    which = (which + 1 == IPTOSBUFFERS ? 0 : which + 1);
-    sprintf(output[which], "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
-    return output[which];
-}
-
-
 static void
 set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry)
 {
@@ -252,6 +235,7 @@ set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry)
   GString *ip_str = g_string_new("IP address: ");
   int ips = 0;
   GSList *curr_ip;
+  if_addr_t *ip_addr;
 
   lt_menu = gtk_menu_new();
   entry_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
@@ -290,18 +274,28 @@ set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry)
           */
          lt_list = get_pcap_linktype_list(if_name, err_buf);
 
-      /* create string of list of IP addresses of this interface */
-      for( ; (curr_ip = g_slist_nth(if_info->ip_addr, ips)) != NULL; ips++) {
-          if (ips != 0) {
-              g_string_append(ip_str, ", ");
-          }
+         /* create string of list of IP addresses of this interface */
+         for (; (curr_ip = g_slist_nth(if_info->ip_addr, ips)) != NULL; ips++) {
+           if (ips != 0)
+             g_string_append(ip_str, ", ");
 
-          g_string_append(ip_str, iptos(*((guint32 *)curr_ip->data)));
-      }
+           ip_addr = (if_addr_t *)curr_ip->data;
+           switch (ip_addr->family) {
 
-      if(if_info->loopback) {
-          g_string_append(ip_str, " (loopback)");
-      }
+           case FAM_IPv4:
+             g_string_append(ip_str,
+               ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr));
+             break;
+
+           case FAM_IPv6:
+             g_string_append(ip_str,
+                 ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr));
+             break;
+           }
+         }
+
+         if (if_info->loopback)
+           g_string_append(ip_str, " (loopback)");
        }
       }
       free_interface_list(if_list);
index f56964793742176061f4a5b0a278f8f2a970a6ae..b4cc35de86337ec6d03f386337867e66760d1f62 100644 (file)
@@ -63,8 +63,6 @@
 #include "capture.h"
 
 
-extern char *iptos(u_long in);
-
 extern gboolean is_capture_in_progress(void);
 
 /*
@@ -312,15 +310,14 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
   gchar         *cant_get_if_list_errstr;
   int           row;
   if_dlg_data_t *if_dlg_data;
-  int ifs;
-  GList *curr;
-  if_info_t *if_info;
-  GSList *curr_ip;
-  guint32       ip_addr;
+  int           ifs;
+  GList         *curr;
+  if_info_t     *if_info;
+  GSList        *curr_ip;
+  if_addr_t     *ip_addr;
   GString       *if_tool_str = g_string_new("");
   gchar         *tmp_str;
 
-
   if (cap_if_w != NULL) {
     /* There's already a "Capture Interfaces" dialog box; reactivate it. */
     reactivate_window(cap_if_w);
@@ -440,19 +437,33 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_)
       }
 
       /* IP address */
-      /* only one IP address will be shown */
+      /* only the first IP address will be shown */
       g_string_append(if_tool_str, "IP: ");
       curr_ip = g_slist_nth(if_info->ip_addr, 0);
       if(curr_ip) {
-        ip_addr = *((guint32 *)curr_ip->data);
-        if_dlg_data->ip_lb = gtk_label_new(iptos(ip_addr));
-        g_string_append(if_tool_str, iptos(ip_addr));
+        ip_addr = (if_addr_t *)curr_ip->data;
+        switch (ip_addr->family) {
+
+        case FAM_IPv4:
+          tmp_str = ip_to_str((guint8 *)&ip_addr->ip_addr.ip4_addr);
+          break;
+
+        case FAM_IPv6:
+          tmp_str = ip6_to_str((struct e_in6_addr *)&ip_addr->ip_addr.ip6_addr);
+          break;
+
+        default:
+          g_assert_not_reached();
+          tmp_str = NULL;
+        }
+        if_dlg_data->ip_lb = gtk_label_new(tmp_str);
+        gtk_widget_set_sensitive(if_dlg_data->ip_lb, TRUE);
+        g_string_append(if_tool_str, tmp_str);
       } else {
-        ip_addr = 0;
         if_dlg_data->ip_lb = gtk_label_new("unknown");
+        gtk_widget_set_sensitive(if_dlg_data->ip_lb, FALSE);
         g_string_append(if_tool_str, "unknown");
       }
-      gtk_widget_set_sensitive(if_dlg_data->ip_lb, ip_addr);
       gtk_table_attach_defaults(GTK_TABLE(if_tb), if_dlg_data->ip_lb, 2, 3, row, row+1);
       g_string_append(if_tool_str, "\n");
 
index 02b253c72686bdd500361ef07ebb5bdc476fc995..d9a697ee764f63077de7be4f48c6f709eac969bd 100644 (file)
@@ -144,7 +144,7 @@ get_interface_list(int *err, char *err_str)
 
                /*
                 * If we already have this interface name on the list,
-                * don't add it, but, if we don't already have an IPv4
+                * don't add it, but, if we don't already have an IP
                 * address for it, add that address (SIOCGIFCONF returns,
                 * at least on BSD-flavored systems, one entry per
                 * interface *address*; if an interface has multiple
index a1e9feb8cfe3cde629fc8569ff8f80bcf813b819..c0b92c91c4431fa30a9774bebddacbb2f0cd241e 100644 (file)
@@ -197,23 +197,40 @@ if_info_new(char *name, char *description)
 void
 if_info_add_address(if_info_t *if_info, struct sockaddr *addr)
 {
+       if_addr_t *ip_addr;
        struct sockaddr_in *ai;
-       guint32 *ip_addr;
+#ifdef AF_INET6
+       struct sockaddr_in6 *ai6;
+#endif
 
        switch (addr->sa_family) {
 
        case AF_INET:
                ai = (struct sockaddr_in *)addr;
                ip_addr = g_malloc(sizeof(*ip_addr));
-               *ip_addr = *((guint32 *)&(ai->sin_addr.s_addr));
+               ip_addr->family = FAM_IPv4;
+               ip_addr->ip_addr.ip4_addr =
+                   *((guint32 *)&(ai->sin_addr.s_addr));
+               if_info->ip_addr = g_slist_append(if_info->ip_addr, ip_addr);
+               break;
+
+#ifdef AF_INET6
+       case AF_INET6:
+               ai6 = (struct sockaddr_in6 *)addr;
+               ip_addr = g_malloc(sizeof(*ip_addr));
+               ip_addr->family = FAM_IPv6;
+               memcpy((void *)&ip_addr->ip_addr.ip6_addr,
+                   (void *)&ai6->sin6_addr.s6_addr,
+                   sizeof ip_addr->ip_addr.ip6_addr);
                if_info->ip_addr = g_slist_append(if_info->ip_addr, ip_addr);
                break;
+#endif
        }
 }
 
 #ifdef HAVE_PCAP_FINDALLDEVS
 /*
- * Get all IPv4 address information, and the loopback flag, for the given
+ * Get all IP address information, and the loopback flag, for the given
  * interface.
  */
 static void
@@ -265,7 +282,7 @@ get_interface_list_findalldevs(int *err, char *err_str)
 static void
 free_if_info_addr_cb(gpointer addr, gpointer user_data _U_)
 {
-    g_free(addr);
+       g_free(addr);
 }
 
 static void
@@ -277,8 +294,8 @@ free_if_cb(gpointer data, gpointer user_data _U_)
        if (if_info->description != NULL)
                g_free(if_info->description);
 
-    g_slist_foreach(if_info->ip_addr, free_if_info_addr_cb, NULL);
-    g_slist_free(if_info->ip_addr);
+       g_slist_foreach(if_info->ip_addr, free_if_info_addr_cb, NULL);
+       g_slist_free(if_info->ip_addr);
 }
 
 void
index 7f864fd470bef756c735cae4996606d0564d7812..3a7ffc66521b7604f3e7f2f65d5ae7728d24fd9a 100644 (file)
@@ -50,10 +50,26 @@ extern "C" {
 typedef struct {
        char    *name;
        char    *description;
-    GSList  *ip_addr;       /* containing guint32 values */
-    gboolean loopback;
+       GSList  *ip_addr;       /* containing address values */
+       gboolean loopback;
 } if_info_t;
 
+/*
+ * An address in the "ip_addr" list.
+ */
+typedef enum {
+       FAM_IPv4,
+       FAM_IPv6
+} address_family;
+
+typedef struct {
+       address_family family;
+       union {
+               guint32 ip4_addr;
+               guint8 ip6_addr[16];
+       } ip_addr;
+} if_addr_t;
+
 GList *get_interface_list(int *err, char *err_str);
 
 /* Error values from "get_interface_list()". */