aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/addr_resolv.c49
-rw-r--r--epan/addr_resolv.h10
-rw-r--r--ui/qt/models/resolved_addresses_models.cpp4
3 files changed, 37 insertions, 26 deletions
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c
index 1d0eb7cc94..76c1ee519f 100644
--- a/epan/addr_resolv.c
+++ b/epan/addr_resolv.c
@@ -159,12 +159,8 @@ typedef struct ss7pc {
} hashss7pc_t;
/* hash tables used for ethernet and manufacturer lookup */
-#define HASHETHER_STATUS_UNRESOLVED 1
-#define HASHETHER_STATUS_RESOLVED_DUMMY 2
-#define HASHETHER_STATUS_RESOLVED_NAME 3
-
struct hashether {
- guint status; /* (See above) */
+ uint8_t flags; /* (See above) */
guint8 addr[6];
char hexaddr[6*3];
char resolved_name[MAXNAMELEN];
@@ -1672,10 +1668,12 @@ add_manuf_name(const guint8 *addr, unsigned int mask, gchar *name, gchar *longna
break;
}
case 48:
+ {
/* This is a well-known MAC address; add it to the Ethernet hash table */
- add_eth_name(addr, name);
+ hashether_t *entry = add_eth_name(addr, name);
+ entry->flags |= STATIC_HOSTNAME;
break;
-
+ }
default:
{
/* This is a range of well-known addresses; add it to the well-known-address table */
@@ -1782,7 +1780,12 @@ wka_name_lookup(const guint8 *addr, const unsigned int mask)
guint get_hash_ether_status(hashether_t* ether)
{
- return ether->status;
+ return ether->flags;
+}
+
+bool get_hash_ether_used(hashether_t* ether)
+{
+ return ((ether->flags & TRIED_OR_RESOLVED_MASK) == TRIED_OR_RESOLVED_MASK);
}
char* get_hash_ether_hexaddr(hashether_t* ether)
@@ -1961,7 +1964,7 @@ eth_addr_resolve(hashether_t *tp) {
if ( (eth = get_ethbyaddr(addr)) != NULL) {
(void) g_strlcpy(tp->resolved_name, eth->name, MAXNAMELEN);
- tp->status = HASHETHER_STATUS_RESOLVED_NAME;
+ tp->flags |= NAME_RESOLVED | STATIC_HOSTNAME;
return tp;
} else {
guint mask;
@@ -1976,7 +1979,7 @@ eth_addr_resolve(hashether_t *tp) {
if ((name = wka_name_lookup(addr, mask+40)) != NULL) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x",
name, addr[5] & (0xFF >> mask));
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
} while (mask--);
@@ -1987,7 +1990,7 @@ eth_addr_resolve(hashether_t *tp) {
if ((name = wka_name_lookup(addr, mask+32)) != NULL) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x:%02x",
name, addr[4] & (0xFF >> mask), addr[5]);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
} while (mask--);
@@ -1998,7 +2001,7 @@ eth_addr_resolve(hashether_t *tp) {
if ((name = wka_name_lookup(addr, mask+24)) != NULL) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x:%02x:%02x",
name, addr[3] & (0xFF >> mask), addr[4], addr[5]);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
} while (mask--);
@@ -2008,7 +2011,7 @@ eth_addr_resolve(hashether_t *tp) {
if ((manuf_value != NULL) && ((manuf_value->flags & NAME_RESOLVED) == NAME_RESOLVED)) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x:%02x:%02x",
manuf_value->resolved_name, addr[3], addr[4], addr[5]);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
@@ -2021,7 +2024,7 @@ eth_addr_resolve(hashether_t *tp) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x:%02x:%02x:%02x",
name, addr[2] & (0xFF >> mask), addr[3], addr[4],
addr[5]);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
} while (mask--);
@@ -2033,7 +2036,7 @@ eth_addr_resolve(hashether_t *tp) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x:%02x:%02x:%02x:%02x",
name, addr[1] & (0xFF >> mask), addr[2], addr[3],
addr[4], addr[5]);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
} while (mask--);
@@ -2045,7 +2048,7 @@ eth_addr_resolve(hashether_t *tp) {
snprintf(tp->resolved_name, MAXNAMELEN, "%s_%02x:%02x:%02x:%02x:%02x:%02x",
name, addr[0] & (0xFF >> mask), addr[1], addr[2],
addr[3], addr[4], addr[5]);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
} while (--mask); /* Work down to the last bit */
@@ -2064,13 +2067,12 @@ eth_addr_resolve(hashether_t *tp) {
manuf_hash_new_entry(addr, short_name, long_name);
}
eth_resolved_name_fill(tp, short_name, mask, addr);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
+ tp->flags |= NAME_RESOLVED | NAME_RESOLVED_PREFIX;
return tp;
}
/* No match whatsoever. */
set_address(&ether_addr, AT_ETHER, 6, addr);
address_to_str_buf(&ether_addr, tp->resolved_name, MAXNAMELEN);
- tp->status = HASHETHER_STATUS_RESOLVED_DUMMY;
return tp;
}
ws_assert_not_reached();
@@ -2084,7 +2086,7 @@ eth_hash_new_entry(const guint8 *addr, const gboolean resolve)
tp = wmem_new(addr_resolv_scope, hashether_t);
memcpy(tp->addr, addr, sizeof(tp->addr));
- tp->status = HASHETHER_STATUS_UNRESOLVED;
+ tp->flags = 0;
/* Values returned by bytes_to_hexstr_punct() are *not* null-terminated */
endp = bytes_to_hexstr_punct(tp->hexaddr, addr, sizeof(tp->addr), ':');
*endp = '\0';
@@ -2111,7 +2113,7 @@ add_eth_name(const guint8 *addr, const gchar *name)
if (strcmp(tp->resolved_name, name) != 0) {
(void) g_strlcpy(tp->resolved_name, name, MAXNAMELEN);
- tp->status = HASHETHER_STATUS_RESOLVED_NAME;
+ tp->flags |= NAME_RESOLVED;
new_resolved_objects = TRUE;
}
@@ -2128,10 +2130,11 @@ eth_name_lookup(const guint8 *addr, const gboolean resolve)
if (tp == NULL) {
tp = eth_hash_new_entry(addr, resolve);
} else {
- if (resolve && (tp->status == HASHETHER_STATUS_UNRESOLVED)) {
+ if (resolve && !(tp->flags & NAME_RESOLVED)) {
eth_addr_resolve(tp); /* Found but needs to be resolved */
}
}
+ tp->flags |= TRIED_RESOLVE_ADDRESS;
return tp;
@@ -3524,8 +3527,8 @@ get_ether_name_if_known(const guint8 *addr)
* if it doesn't exist, so it never returns NULL */
tp = eth_name_lookup(addr, TRUE);
- if (tp->status == HASHETHER_STATUS_RESOLVED_NAME) {
- /* Name is from an ethers file */
+ if ((tp->flags & (NAME_RESOLVED | NAME_RESOLVED_PREFIX)) == NAME_RESOLVED) {
+ /* Name is from an exact match, not a prefix/OUI */
return tp->resolved_name;
}
else {
diff --git a/epan/addr_resolv.h b/epan/addr_resolv.h
index 9428861346..b2fa6ff72e 100644
--- a/epan/addr_resolv.h
+++ b/epan/addr_resolv.h
@@ -84,12 +84,13 @@ typedef struct _resolved_name {
} resolved_name_t;
/*
- * Flags for various IPv4/IPv6 hash table entries.
+ * Flags for various resolved name hash table entries.
*/
#define TRIED_RESOLVE_ADDRESS (1U<<0) /* XXX - what does this bit *really* mean? */
#define NAME_RESOLVED (1U<<1) /* the name field contains a host name, not a printable address */
#define RESOLVED_ADDRESS_USED (1U<<2) /* a get_hostname* call returned the host name */
#define STATIC_HOSTNAME (1U<<3) /* do not update entries from hosts file with DNS responses */
+#define NAME_RESOLVED_PREFIX (1U<<4) /* name was generated from a prefix (e.g., OUI) instead of the entire address */
#define TRIED_OR_RESOLVED_MASK (TRIED_RESOLVE_ADDRESS | NAME_RESOLVED)
#define USED_AND_RESOLVED_MASK (NAME_RESOLVED | RESOLVED_ADDRESS_USED)
@@ -220,7 +221,11 @@ void fill_unresolved_ss7pc(const gchar * pc_addr, const guint8 ni, const guint32
/* Same as get_ether_name with tvb support */
WS_DLL_PUBLIC const gchar *tvb_get_ether_name(tvbuff_t *tvb, gint offset);
-/* get_ether_name_if_known returns the logical name if found in ethers files else NULL */
+/* get_ether_name_if_known returns the logical name if an exact match is
+ * found (in ethers files or from ARP) else NULL.
+ * @note: It returns NULL for addresses if only a prefix can be resolved
+ * into a manufacturer name.
+ */
const gchar *get_ether_name_if_known(const guint8 *addr);
/*
@@ -290,6 +295,7 @@ extern gchar *get_ipxnet_name(wmem_allocator_t *allocator, const guint32 addr);
extern gchar *get_vlan_name(wmem_allocator_t *allocator, const guint16 id);
WS_DLL_PUBLIC guint get_hash_ether_status(hashether_t* ether);
+WS_DLL_PUBLIC bool get_hash_ether_used(hashether_t* ether);
WS_DLL_PUBLIC char* get_hash_ether_hexaddr(hashether_t* ether);
WS_DLL_PUBLIC char* get_hash_ether_resolved_name(hashether_t* ether);
diff --git a/ui/qt/models/resolved_addresses_models.cpp b/ui/qt/models/resolved_addresses_models.cpp
index 176b825cc2..8601735415 100644
--- a/ui/qt/models/resolved_addresses_models.cpp
+++ b/ui/qt/models/resolved_addresses_models.cpp
@@ -88,7 +88,9 @@ eth_hash_to_qstringlist(gpointer, gpointer value, gpointer sl_ptr)
QList<QStringList> *values = (QList<QStringList> *) sl_ptr;
hashether_t* tp = (hashether_t*)value;
- *values << (QStringList() << QString(get_hash_ether_hexaddr(tp)) << QString(get_hash_ether_resolved_name(tp)));
+ if (get_hash_ether_used(tp)) {
+ *values << (QStringList() << QString(get_hash_ether_hexaddr(tp)) << QString(get_hash_ether_resolved_name(tp)));
+ }
}
static void