From d98ee5ef393b70dee2a385b352642209eab97cb5 Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Tue, 22 Jul 2003 03:14:31 +0000 Subject: [PATCH] Add two preferences to control ADNS, one to enable/disable it and one to set its concurrency level. Fix an ADNS queueing bug. svn path=/trunk/; revision=8063 --- doc/ethereal.pod.template | 1 + doc/tethereal.pod.template | 1 + epan/resolv.c | 28 +++++++++++++----------- epan/resolv.h | 3 ++- gtk/file_dlg.c | 5 +++-- gtk/nameres_prefs.c | 45 ++++++++++++++++++++++++++++++++++++-- prefs.c | 21 +++++++++++++----- prefs.h | 3 ++- 8 files changed, 82 insertions(+), 25 deletions(-) diff --git a/doc/ethereal.pod.template b/doc/ethereal.pod.template index 37ef31a376..509894090c 100644 --- a/doc/ethereal.pod.template +++ b/doc/ethereal.pod.template @@ -198,6 +198,7 @@ numbers turned off; the argument is a string that may contain the letters B to enable MAC address resolution, B to enable network address resolution, and B to enable transport-layer port number resolution. This overrides B<-n> if both B<-N> and B<-n> are present. +The letter B enables concurrent (asynchronous) DNS lookups. =item -o diff --git a/doc/tethereal.pod.template b/doc/tethereal.pod.template index 0393a18943..43a61436fd 100644 --- a/doc/tethereal.pod.template +++ b/doc/tethereal.pod.template @@ -269,6 +269,7 @@ numbers turned off; the argument is a string that may contain the letters B to enable MAC address resolution, B to enable network address resolution, and B to enable transport-layer port number resolution. This overrides B<-n> if both B<-N> and B<-n> are present. +The letter B enables concurrent (asynchronous) DNS lookups. =item -o diff --git a/epan/resolv.c b/epan/resolv.c index b93cace39e..8b5c449903 100644 --- a/epan/resolv.c +++ b/epan/resolv.c @@ -1,7 +1,7 @@ /* resolv.c * Routines for network object lookup * - * $Id: resolv.c,v 1.33 2003/05/15 07:44:54 guy Exp $ + * $Id: resolv.c,v 1.34 2003/07/22 03:14:30 gerald Exp $ * * Laurent Deniel * @@ -86,6 +86,7 @@ #include "ipv6-utils.h" #include "resolv.h" #include "filesystem.h" +#include "prefs.h" #define ENAME_ETHERS "ethers" #define ENAME_IPXNETS "ipxnets" @@ -193,8 +194,6 @@ gchar *g_pipxnets_path = NULL; /* personal ipxnets file */ adns_state ads; -/* XXX - Create a preference for this */ -#define ADNS_MAX_CONCURRENCY 500 int adns_currently_queued = 0; typedef struct _adns_queue_msg @@ -329,15 +328,18 @@ static guchar *host_name_lookup(guint addr, gboolean *found) tp->next = NULL; #ifdef HAVE_GNU_ADNS - qmsg = g_malloc(sizeof(adns_queue_msg_t)); - qmsg->type = AF_INET; - qmsg->ip4_addr = addr; - qmsg->submitted = FALSE; - adns_queue_head = g_list_append(adns_queue_head, (gpointer) qmsg); + if (g_resolv_flags & RESOLV_CONCURRENT != 0 && + prefs.name_resolve_concurrency > 0) { + qmsg = g_malloc(sizeof(adns_queue_msg_t)); + qmsg->type = AF_INET; + qmsg->ip4_addr = addr; + qmsg->submitted = FALSE; + adns_queue_head = g_list_append(adns_queue_head, (gpointer) qmsg); - tp->is_dummy_entry = TRUE; - ip_to_str_buf((guint8 *)&addr, tp->name); - return tp->name; + tp->is_dummy_entry = TRUE; + ip_to_str_buf((guint8 *)&addr, tp->name); + return tp->name; + } #else /* @@ -1445,8 +1447,8 @@ host_name_lookup_process(gpointer data _U_) { adns_queue_head = g_list_first(adns_queue_head); cur = adns_queue_head; - while (cur && adns_currently_queued < ADNS_MAX_CONCURRENCY) { - almsg = (adns_queue_msg_t *) adns_queue_head->data; + while (cur && adns_currently_queued <= prefs.name_resolve_concurrency) { + almsg = (adns_queue_msg_t *) cur->data; if (! almsg->submitted && almsg->type == AF_INET) { addr_bytes = (guint8 *) &almsg->ip4_addr; sprintf(addr_str, "%u.%u.%u.%u.in-addr.arpa.", addr_bytes[3], diff --git a/epan/resolv.h b/epan/resolv.h index 5613e11db3..4001999c0a 100644 --- a/epan/resolv.h +++ b/epan/resolv.h @@ -1,7 +1,7 @@ /* resolv.h * Definitions for network object lookup * - * $Id: resolv.h,v 1.13 2003/05/05 08:20:01 guy Exp $ + * $Id: resolv.h,v 1.14 2003/07/22 03:14:30 gerald Exp $ * * Laurent Deniel * @@ -43,6 +43,7 @@ extern guint32 g_resolv_flags; #define RESOLV_MAC 0x1 #define RESOLV_NETWORK 0x2 #define RESOLV_TRANSPORT 0x4 +#define RESOLV_CONCURRENT 0x8 #define RESOLV_ALL 0xFFFFFFFF /* global variables */ diff --git a/gtk/file_dlg.c b/gtk/file_dlg.c index dd0858f83e..ea4e63d4aa 100644 --- a/gtk/file_dlg.c +++ b/gtk/file_dlg.c @@ -1,7 +1,7 @@ /* file_dlg.c * Dialog boxes for handling files * - * $Id: file_dlg.c,v 1.56 2003/07/18 20:55:11 oabad Exp $ + * $Id: file_dlg.c,v 1.57 2003/07/22 03:14:30 gerald Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -42,6 +42,7 @@ #include "dlg_utils.h" #include "main.h" #include "compat_macros.h" +#include "prefs.h" static void file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs); static void file_open_destroy_cb(GtkWidget *win, gpointer user_data); @@ -234,7 +235,7 @@ file_open_ok_cb(GtkWidget *w, GtkFileSelection *fs) { cfile.rfcode = rfcode; /* Set the global resolving variable */ - g_resolv_flags = 0; + g_resolv_flags = prefs.name_resolve & RESOLV_CONCURRENT; m_resolv_cb = OBJECT_GET_DATA(w, E_FILE_M_RESOLVE_KEY); g_resolv_flags |= GTK_TOGGLE_BUTTON (m_resolv_cb)->active ? RESOLV_MAC : RESOLV_NONE; n_resolv_cb = OBJECT_GET_DATA(w, E_FILE_N_RESOLVE_KEY); diff --git a/gtk/nameres_prefs.c b/gtk/nameres_prefs.c index dd67909c4a..1e662d7f29 100644 --- a/gtk/nameres_prefs.c +++ b/gtk/nameres_prefs.c @@ -1,7 +1,7 @@ /* nameres_prefs.c * Dialog box for name resolution preferences * - * $Id: nameres_prefs.c,v 1.7 2002/11/11 18:57:00 oabad Exp $ + * $Id: nameres_prefs.c,v 1.8 2003/07/22 03:14:31 gerald Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -41,13 +41,25 @@ #define M_RESOLVE_KEY "m_resolve" #define N_RESOLVE_KEY "n_resolve" #define T_RESOLVE_KEY "t_resolve" +#ifdef HAVE_GNU_ADNS +# define C_RESOLVE_KEY "c_resolve" +# define RESOLVE_CONCURRENCY_KEY "resolve_concurrency" +#endif /* HAVE_GNU_ADNS */ -#define RESOLV_TABLE_ROWS 3 +#ifdef HAVE_GNU_ADNS +# define RESOLV_TABLE_ROWS 5 +#else +# define RESOLV_TABLE_ROWS 3 +#endif /* HAVE_GNU_ADNS */ GtkWidget* nameres_prefs_show(void) { GtkWidget *main_tb, *main_vb; GtkWidget *m_resolv_cb, *n_resolv_cb, *t_resolv_cb; +#ifdef HAVE_GNU_ADNS + GtkWidget *c_resolv_cb, *resolv_concurrency_te; + char concur_str[10+1]; +#endif /* HAVE_GNU_ADNS */ /* * XXX - it would be nice if the current setting of the resolver @@ -88,6 +100,21 @@ nameres_prefs_show(void) prefs.name_resolve & RESOLV_TRANSPORT); OBJECT_SET_DATA(main_vb, T_RESOLVE_KEY, t_resolv_cb); +#ifdef HAVE_GNU_ADNS + /* Enable concurrent (asynchronous) DNS lookups */ + c_resolv_cb = create_preference_check_button(main_tb, 3, + "Enable concurrent DNS name resolution:", NULL, + prefs.name_resolve & RESOLV_CONCURRENT); + OBJECT_SET_DATA(main_vb, C_RESOLVE_KEY, c_resolv_cb); + + /* Max concurrent requests */ + sprintf(concur_str, "%d", prefs.name_resolve_concurrency); + resolv_concurrency_te = create_preference_entry(main_tb, 4, + "Maximum concurrent requests:", NULL, concur_str); + OBJECT_SET_DATA(main_vb, RESOLVE_CONCURRENCY_KEY, resolv_concurrency_te); + +#endif /* HAVE_GNU_ADNS */ + /* Show 'em what we got */ gtk_widget_show_all(main_vb); @@ -98,15 +125,29 @@ void nameres_prefs_fetch(GtkWidget *w) { GtkWidget *m_resolv_cb, *n_resolv_cb, *t_resolv_cb; +#ifdef HAVE_GNU_ADNS + GtkWidget *c_resolv_cb, *resolv_concurrency_te; +#endif /* HAVE_GNU_ADNS */ m_resolv_cb = (GtkWidget *)OBJECT_GET_DATA(w, M_RESOLVE_KEY); n_resolv_cb = (GtkWidget *)OBJECT_GET_DATA(w, N_RESOLVE_KEY); t_resolv_cb = (GtkWidget *)OBJECT_GET_DATA(w, T_RESOLVE_KEY); +#ifdef HAVE_GNU_ADNS + c_resolv_cb = (GtkWidget *)OBJECT_GET_DATA(w, C_RESOLVE_KEY); + + resolv_concurrency_te = (GtkWidget *)OBJECT_GET_DATA(w, RESOLVE_CONCURRENCY_KEY); +#endif /* HAVE_GNU_ADNS */ prefs.name_resolve = RESOLV_NONE; prefs.name_resolve |= (GTK_TOGGLE_BUTTON (m_resolv_cb)->active ? RESOLV_MAC : RESOLV_NONE); prefs.name_resolve |= (GTK_TOGGLE_BUTTON (n_resolv_cb)->active ? RESOLV_NETWORK : RESOLV_NONE); prefs.name_resolve |= (GTK_TOGGLE_BUTTON (t_resolv_cb)->active ? RESOLV_TRANSPORT : RESOLV_NONE); +#ifdef HAVE_GNU_ADNS + prefs.name_resolve |= (GTK_TOGGLE_BUTTON (c_resolv_cb)->active ? RESOLV_CONCURRENT : RESOLV_NONE); + + prefs.name_resolve_concurrency = strtol (gtk_entry_get_text( + GTK_ENTRY(resolv_concurrency_te)), NULL, 10); +#endif /* HAVE_GNU_ADNS */ } void diff --git a/prefs.c b/prefs.c index 5fe016a87f..0d50dba5d7 100644 --- a/prefs.c +++ b/prefs.c @@ -1,7 +1,7 @@ /* prefs.c * Routines for handling preferences * - * $Id: prefs.c,v 1.101 2003/05/15 07:44:53 guy Exp $ + * $Id: prefs.c,v 1.102 2003/07/22 03:14:28 gerald Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -978,11 +978,12 @@ read_prefs(int *gpf_errno_return, char **gpf_path_return, prefs.gui_geometry_main_height = -1; /* set the default values for the capture dialog box */ - prefs.capture_device = NULL; - prefs.capture_prom_mode = TRUE; - prefs.capture_real_time = FALSE; - prefs.capture_auto_scroll = FALSE; - prefs.name_resolve = RESOLV_ALL ^ RESOLV_NETWORK; + prefs.capture_device = NULL; + prefs.capture_prom_mode = TRUE; + prefs.capture_real_time = FALSE; + prefs.capture_auto_scroll = FALSE; + prefs.name_resolve = RESOLV_ALL ^ RESOLV_NETWORK; + prefs.name_resolve_concurrency = 500; } /* Construct the pathname of the global preferences file. */ @@ -1247,6 +1248,7 @@ prefs_set_pref(char *prefarg) * over the place, so its name doesn't have two components. */ #define PRS_NAME_RESOLVE "name_resolve" +#define PRS_NAME_RESOLVE_CONCURRENCY "name_resolve_concurrency" #define PRS_CAP_NAME_RESOLVE "capture.name_resolve" /* values for the capture dialog box */ @@ -1271,6 +1273,7 @@ static name_resolve_opt_t name_resolve_opt[] = { { 'm', RESOLV_MAC }, { 'n', RESOLV_NETWORK }, { 't', RESOLV_TRANSPORT }, + { 'C', RESOLV_CONCURRENT }, }; #define N_NAME_RESOLVE_OPT (sizeof name_resolve_opt / sizeof name_resolve_opt[0]) @@ -1536,6 +1539,8 @@ set_pref(gchar *pref_name, gchar *value) if (string_to_name_resolve(value, &prefs.name_resolve) != '\0') return PREFS_SET_SYNTAX_ERR; } + } else if (strcmp(pref_name, PRS_NAME_RESOLVE_CONCURRENCY) == 0) { + prefs.name_resolve_concurrency = strtol(value, NULL, 10); } else { /* To which module does this preference belong? */ module = NULL; @@ -2032,6 +2037,9 @@ write_prefs(char **pf_path_return) fprintf(pf, "\n# Resolve addresses to names? TRUE/FALSE/{list of address types to resolve}\n"); fprintf(pf, PRS_NAME_RESOLVE ": %s\n", name_resolve_to_string(prefs.name_resolve)); + fprintf(pf, "\n# Name resolution concurrency Decimal integer.\n"); + fprintf(pf, PRS_NAME_RESOLVE_CONCURRENCY ": %d\n", + prefs.name_resolve_concurrency); /* write the capture options */ if (prefs.capture_device != NULL) { @@ -2108,6 +2116,7 @@ copy_prefs(e_prefs *dest, e_prefs *src) dest->capture_real_time = src->capture_real_time; dest->capture_auto_scroll = src->capture_auto_scroll; dest->name_resolve = src->name_resolve; + dest->name_resolve_concurrency = src->name_resolve_concurrency; } diff --git a/prefs.h b/prefs.h index 68097be5e5..cbb1cbb64f 100644 --- a/prefs.h +++ b/prefs.h @@ -1,7 +1,7 @@ /* prefs.h * Definitions for preference handling routines * - * $Id: prefs.h,v 1.42 2002/12/20 01:48:54 guy Exp $ + * $Id: prefs.h,v 1.43 2003/07/22 03:14:28 gerald Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs @@ -69,6 +69,7 @@ typedef struct _e_prefs { gint gui_geometry_main_width; gint gui_geometry_main_height; guint32 name_resolve; + gint name_resolve_concurrency; gchar *capture_device; gboolean capture_prom_mode; gboolean capture_real_time;