summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ethereal.pod.template1
-rw-r--r--doc/tethereal.pod.template1
-rw-r--r--epan/resolv.c28
-rw-r--r--epan/resolv.h3
-rw-r--r--gtk/file_dlg.c5
-rw-r--r--gtk/nameres_prefs.c47
-rw-r--r--prefs.c21
-rw-r--r--prefs.h3
8 files changed, 83 insertions, 26 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<m> to enable MAC address resolution, B<n> to enable network
address resolution, and B<t> to enable transport-layer port number
resolution. This overrides B<-n> if both B<-N> and B<-n> are present.
+The letter B<C> 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<m> to enable MAC address resolution, B<n> to enable network
address resolution, and B<t> to enable transport-layer port number
resolution. This overrides B<-n> if both B<-N> and B<-n> are present.
+The letter B<C> 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 <laurent.deniel@free.fr>
*
@@ -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 <laurent.deniel@free.fr>
*
@@ -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 <gerald@ethereal.com>
@@ -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 <gerald@ethereal.com>
@@ -41,13 +41,25 @@
#define M_RESOLVE_KEY "m_resolve"
#define N_RESOLVE_KEY "n_resolve"
#define T_RESOLVE_KEY "t_resolve"
-
-#define RESOLV_TABLE_ROWS 3
+#ifdef HAVE_GNU_ADNS
+# define C_RESOLVE_KEY "c_resolve"
+# define RESOLVE_CONCURRENCY_KEY "resolve_concurrency"
+#endif /* HAVE_GNU_ADNS */
+
+#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 <gerald@ethereal.com>
@@ -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 <gerald@ethereal.com>
@@ -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;