aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-12-26 00:22:16 +0000
committerGuy Harris <guy@alum.mit.edu>2004-12-26 00:22:16 +0000
commitce604cf8f0d62fd231e06bb4c3ca2b9affee18be (patch)
tree4ceaf8c1480728d2e87320cadd9a29603bc4ddfc /epan/dissectors
parent5a89cfc00b280c986ac253f9c1886fc268c4f904 (diff)
From Luis Ontanon: add more filterable fields to DNS, PGM, GTP, and RADIUS.
svn path=/trunk/; revision=12835
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-dns.c409
-rw-r--r--epan/dissectors/packet-dns.h5
-rw-r--r--epan/dissectors/packet-gtp.c8
-rw-r--r--epan/dissectors/packet-nbns.c39
-rw-r--r--epan/dissectors/packet-pgm.c9
-rw-r--r--epan/dissectors/packet-radius.c8
6 files changed, 282 insertions, 196 deletions
diff --git a/epan/dissectors/packet-dns.c b/epan/dissectors/packet-dns.c
index 5779e04120..6d101c05e7 100644
--- a/epan/dissectors/packet-dns.c
+++ b/epan/dissectors/packet-dns.c
@@ -67,6 +67,14 @@ static int hf_dns_count_prerequisites = -1;
static int hf_dns_count_updates = -1;
static int hf_dns_count_auth_rr = -1;
static int hf_dns_count_add_rr = -1;
+static int hf_dns_qry_name = -1;
+static int hf_dns_qry_type = -1;
+static int hf_dns_qry_class = -1;
+static int hf_dns_rr_name = -1;
+static int hf_dns_rr_type = -1;
+static int hf_dns_rr_class = -1;
+static int hf_dns_rr_ttl = -1;
+static int hf_dns_rr_len = -1;
static gint ett_dns = -1;
static gint ett_dns_qd = -1;
@@ -295,109 +303,88 @@ http://www.windows.com/windows2000/en/server/help/sag_DNS_imp_UsingWinsLookup.ht
http://www.microsoft.com/windows2000/library/resources/reskit/samplechapters/cncf/cncf_imp_wwaw.asp
which discuss them to some extent. */
+
+static const value_string dns_types[] = {
+ { 0, "Unused" },
+ { T_A, "A" },
+ { T_NS, "NS" },
+ { T_MD, "MD" },
+ { T_MF, "MF" },
+ { T_CNAME, "CNAME" },
+ { T_SOA, "SOA" },
+ { T_MB, "MB" },
+ { T_MG, "MG" },
+ { T_MR, "MR" },
+ { T_NULL, "NULL" },
+ { T_WKS, "WKS" },
+ { T_PTR, "PTR" },
+ { T_HINFO, "HINFO" },
+ { T_MINFO, "MINFO" },
+ { T_MX, "MX" },
+ { T_TXT, "TXT" },
+ { T_RP, "RP" }, /* RFC 1183 */
+ { T_AFSDB, "AFSDB" }, /* RFC 1183 */
+ { T_X25, "X25" }, /* RFC 1183 */
+ { T_ISDN, "ISDN" }, /* RFC 1183 */
+ { T_RT, "RT" }, /* RFC 1183 */
+ { T_NSAP, "NSAP" }, /* RFC 1706 */
+ { T_NSAP_PTR, "NSAP-PTR" }, /* RFC 1348 */
+ { T_SIG, "SIG" }, /* RFC 2535 */
+ { T_KEY, "KEY" }, /* RFC 2535 */
+ { T_PX, "PX" }, /* RFC 1664 */
+ { T_GPOS, "GPOS" }, /* RFC 1712 */
+ { T_AAAA, "AAAA" }, /* RFC 1886 */
+ { T_LOC, "LOC" }, /* RFC 1886 */
+ { T_NXT, "NXT" }, /* RFC 1876 */
+ { T_EID, "EID" },
+ { T_NIMLOC, "NIMLOC" },
+ { T_SRV, "SRV" }, /* RFC 2052 */
+ { T_ATMA, "ATMA" },
+ { T_NAPTR, "NAPTR" }, /* RFC 2168 */
+ { T_KX, "KX" }, /* RFC 2230 */
+ { T_CERT, "CERT" }, /* RFC 2538 */
+ { T_A6, "A6" }, /* RFC 2874 */
+ { T_DNAME, "DNAME" }, /* RFC 2672 */
+
+ { T_OPT, "OPT" }, /* RFC 2671 */
+
+ { T_DS, "DS" }, /* RFC 3658 */
+
+ { T_IPSECKEY, "IPSECKEY" }, /* draft-ietf-ipseckey-rr */
+ { T_RRSIG, "RRSIG" }, /* future RFC 2535bis */
+ { T_NSEC, "NSEC" }, /* future RFC 2535bis */
+ { T_DNSKEY, "DNSKEY" }, /* future RFC 2535bis */
+
+ { 100, "UINFO" },
+ { 101, "UID" },
+ { 102, "GID" },
+ { 103, "UNSPEC" },
+
+ { T_TKEY, "TKEY"},
+ { T_TSIG, "TSIG"},
+
+ { T_WINS, "WINS"},
+ { T_WINS_R, "WINS-R"},
+
+ { 251, "IXFR"},
+ { 252, "AXFR"},
+ { 253, "MAILB"},
+ { 254, "MAILA"},
+ { 255, "ANY"},
+
+ {0, NULL}
+};
+
static char *
dns_type_name (guint type)
{
- char *type_names[] = {
- "unused",
- "A",
- "NS",
- "MD",
- "MF",
- "CNAME",
- "SOA",
- "MB",
- "MG",
- "MR",
- "NULL",
- "WKS",
- "PTR",
- "HINFO",
- "MINFO",
- "MX",
- "TXT",
- "RP", /* RFC 1183 */
- "AFSDB", /* RFC 1183 */
- "X25", /* RFC 1183 */
- "ISDN", /* RFC 1183 */
- "RT", /* RFC 1183 */
- "NSAP", /* RFC 1706 */
- "NSAP-PTR", /* RFC 1348 */
- "SIG", /* RFC 2535 */
- "KEY", /* RFC 2535 */
- "PX", /* RFC 1664 */
- "GPOS", /* RFC 1712 */
- "AAAA", /* RFC 1886 */
- "LOC", /* RFC 1876 */
- "NXT", /* RFC 2535 */
- "EID",
- "NIMLOC",
- "SRV", /* RFC 2052 */
- "ATMA",
- "NAPTR", /* RFC 2168 */
- "KX", /* RFC 2230 */
- "CERT", /* RFC 2538 */
- "A6", /* RFC 2874 */
- "DNAME", /* RFC 2672 */
- NULL,
- "OPT", /* RFC 2671 */
- NULL,
- "DS", /* RFC 3658 */
- NULL,
- "IPSECKEY", /* draft-ietf-ipseckey-rr */
- "RRSIG", /* future RFC 2535bis */
- "NSEC", /* future RFC 2535bis */
- "DNSKEY" /* future RFC 2535bis */
- };
-
- if (type < sizeof(type_names)/sizeof(type_names[0]))
- return type_names[type] ? type_names[type] : "unknown";
-
- /* special cases */
- switch (type)
- {
- /* non standard */
- case 100:
- return "UINFO";
- case 101:
- return "UID";
- case 102:
- return "GID";
- case 103:
- return "UNSPEC";
- case T_WINS:
- return "WINS";
- case T_WINS_R:
- return "WINS-R";
-
- /* meta */
- case T_TKEY:
- return "TKEY";
- case T_TSIG:
- return "TSIG";
-
- /* queries */
- case 251:
- return "IXFR"; /* RFC 1995 */
- case 252:
- return "AXFR";
- case 253:
- return "MAILB";
- case 254:
- return "MAILA";
- case 255:
- return "ANY";
-
- }
-
- return "unknown";
+ return val_to_str(type, dns_types, "Unknown (%u)");
}
-
static char *
-dns_long_type_name (guint type)
+dns_type_description (guint type)
{
- char *type_names[] = {
+ static const char *type_names[] = {
"unused",
"Host address",
"Authoritative name server",
@@ -448,84 +435,117 @@ dns_long_type_name (guint type)
"Next secured", /* future RFC 2535bis */
"DNS public key" /* future RFC 2535bis */
};
- static char unkbuf[7+1+2+1+4+1+1+10+1+1]; /* "Unknown RR type (%u)" */
-
+ char *short_name;
+ const char *long_name;
+ static char strbuf[1024+1];
+
+ short_name = dns_type_name(type);
+ if (short_name == NULL) {
+ snprintf(strbuf, sizeof strbuf, "Unknown (%u)", type);
+ return strbuf;
+ }
if (type < sizeof(type_names)/sizeof(type_names[0]))
- return type_names[type] ? type_names[type] : "unknown";
-
- /* special cases */
- switch (type)
- {
- /* non standard */
- case 100:
- return "UINFO";
- case 101:
- return "UID";
- case 102:
- return "GID";
- case 103:
- return "UNSPEC";
- case T_WINS:
- return "WINS";
- case T_WINS_R:
- return "WINS-R";
-
- /* meta */
- case T_TKEY:
- return "Transaction Key";
- case T_TSIG:
- return "Transaction Signature";
-
- /* queries */
- case 251:
- return "Request for incremental zone transfer"; /* RFC 1995 */
- case 252:
- return "Request for full zone transfer";
- case 253:
- return "Request for mailbox-related records";
- case 254:
- return "Request for mail agent resource records";
- case 255:
- return "Request for all records";
- }
+ long_name = type_names[type];
+ else {
+ /* special cases */
+ switch (type) {
+ /* meta */
+ case T_TKEY:
+ long_name = "Transaction Key";
+ break;
+ case T_TSIG:
+ long_name = "Transaction Signature";
+ break;
+
+ /* queries */
+ case 251:
+ long_name = "Request for incremental zone transfer"; /* RFC 1995 */
+ break;
+ case 252:
+ long_name = "Request for full zone transfer";
+ break;
+ case 253:
+ long_name = "Request for mailbox-related records";
+ break;
+ case 254:
+ long_name = "Request for mail agent resource records";
+ break;
+ case 255:
+ long_name = "Request for all records";
+ break;
+ default:
+ long_name = NULL;
+ break;
+ }
+ }
- sprintf(unkbuf, "Unknown RR type (%u)", type);
- return unkbuf;
+ if (long_name != NULL)
+ snprintf(strbuf, sizeof strbuf, "%s (%s)", short_name, long_name);
+ else
+ snprintf(strbuf, sizeof strbuf, "%s", short_name);
+ return strbuf;
}
+static const value_string dns_classes[] = {
+ {C_IN, "IN"},
+ {C_CS, "CS"},
+ {C_CH, "CH"},
+ {C_HS, "HS"},
+ {C_NONE, "NONE"},
+ {C_ANY, "ANY"},
+ {C_IN | C_FLUSH, "FLUSH"},
+ {0,NULL}
+};
char *
dns_class_name(int class)
{
- char *class_name;
+ return val_to_str(class, dns_classes, "Unknown (%u)");
+}
+char *
+dns_class_description(int class)
+{
+ char *short_name, *long_name;
+ static char strbuf[1024+1];
+
+ short_name = dns_class_name(class);
+ if (short_name == NULL) {
+ snprintf(strbuf, sizeof strbuf, "Unknown (%u)", class);
+ return strbuf;
+ }
switch (class) {
case C_IN:
- class_name = "inet";
+ long_name = "Internet";
break;
case ( C_IN | C_FLUSH ):
- class_name = "inet (data flush)";
+ long_name = "Internet (data flush)";
break;
case C_CS:
- class_name = "csnet";
+ long_name = "CSNET";
break;
case C_CH:
- class_name = "chaos";
+ long_name = "CHAOS";
break;
case C_HS:
- class_name = "hesiod";
+ long_name = "Hesiod";
break;
case C_NONE:
- class_name = "none";
+ long_name = "None";
break;
case C_ANY:
- class_name = "any";
+ long_name = "Any";
break;
default:
- class_name = "unknown";
+ long_name = NULL;
+ break;
}
- return class_name;
+ if (long_name != NULL)
+ snprintf(strbuf, sizeof strbuf, "%s (%s)", short_name, long_name);
+ else
+ snprintf(strbuf, sizeof strbuf, "%s", short_name);
+ return strbuf;
}
int
@@ -775,9 +795,7 @@ dissect_dns_query(tvbuff_t *tvb, int offset, int dns_data_offset,
int name_len;
int type;
int class;
- char *class_name;
char *type_name;
- char *long_type_name;
int data_offset;
int data_start;
proto_tree *q_tree;
@@ -790,23 +808,23 @@ dissect_dns_query(tvbuff_t *tvb, int offset, int dns_data_offset,
data_offset += len;
type_name = dns_type_name(type);
- class_name = dns_class_name(class);
- long_type_name = dns_long_type_name(type);
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s %s", type_name, name);
if (dns_tree != NULL) {
tq = proto_tree_add_text(dns_tree, tvb, offset, len, "%s: type %s, class %s",
- name, type_name, class_name);
+ name, type_name, dns_class_name(class));
q_tree = proto_item_add_subtree(tq, ett_dns_qd);
- proto_tree_add_text(q_tree, tvb, offset, name_len, "Name: %s", name);
+ proto_tree_add_string(q_tree, hf_dns_qry_name, tvb, offset, name_len, name);
offset += name_len;
- proto_tree_add_text(q_tree, tvb, offset, 2, "Type: %s", long_type_name);
+ proto_tree_add_uint_format(q_tree, hf_dns_qry_type, tvb, offset, 2, type,
+ "Type: %s", dns_type_description(type));
offset += 2;
- proto_tree_add_text(q_tree, tvb, offset, 2, "Class: %s", class_name);
+ proto_tree_add_uint_format(q_tree, hf_dns_qry_class, tvb, offset, 2, class,
+ "Class: %s", dns_class_description(class));
offset += 2;
}
@@ -814,39 +832,43 @@ dissect_dns_query(tvbuff_t *tvb, int offset, int dns_data_offset,
}
-proto_tree *
+static proto_tree *
add_rr_to_tree(proto_item *trr, int rr_type, tvbuff_t *tvb, int offset,
- const char *name, int namelen, const char *type_name, const char *class_name,
+ const char *name, int namelen, int type, int class,
guint ttl, gushort data_len)
{
proto_tree *rr_tree;
rr_tree = proto_item_add_subtree(trr, rr_type);
- proto_tree_add_text(rr_tree, tvb, offset, namelen, "Name: %s", name);
+ proto_tree_add_string(rr_tree, hf_dns_rr_name, tvb, offset, namelen, name);
offset += namelen;
- proto_tree_add_text(rr_tree, tvb, offset, 2, "Type: %s", type_name);
+ proto_tree_add_uint_format(rr_tree, hf_dns_rr_type, tvb, offset, 2, type,
+ "Type: %s", dns_type_description(type));
offset += 2;
- proto_tree_add_text(rr_tree, tvb, offset, 2, "Class: %s", class_name);
+ proto_tree_add_uint_format(rr_tree, hf_dns_rr_class, tvb, offset, 2, class,
+ "Class: %s", dns_class_description(class));
offset += 2;
- proto_tree_add_text(rr_tree, tvb, offset, 4, "Time to live: %s",
- time_secs_to_str(ttl));
+ proto_tree_add_uint_format(rr_tree, hf_dns_rr_ttl, tvb, offset, 4, ttl,
+ "Time to live: %s", time_secs_to_str(ttl));
offset += 4;
- proto_tree_add_text(rr_tree, tvb, offset, 2, "Data length: %u", data_len);
+ proto_tree_add_uint(rr_tree, hf_dns_rr_len, tvb, offset, 2, data_len);
return rr_tree;
}
+
static proto_tree *
add_opt_rr_to_tree(proto_item *trr, int rr_type, tvbuff_t *tvb, int offset,
- const char *name, int namelen, const char *type_name, int class,
+ const char *name, int namelen, int type, int class,
guint ttl, gushort data_len)
{
proto_tree *rr_tree, *Z_tree;
proto_item *Z_item = NULL;
rr_tree = proto_item_add_subtree(trr, rr_type);
- proto_tree_add_text(rr_tree, tvb, offset, namelen, "Name: %s", name);
+ proto_tree_add_string(rr_tree, hf_dns_rr_name, tvb, offset, namelen, name);
offset += namelen;
- proto_tree_add_text(rr_tree, tvb, offset, 2, "Type: %s", type_name);
+ proto_tree_add_uint_format(rr_tree, hf_dns_rr_type, tvb, offset, 2, type,
+ "Type: %s", dns_type_description(type));
offset += 2;
proto_tree_add_text(rr_tree, tvb, offset, 2, "UDP payload size: %u",
class & 0xffff);
@@ -864,7 +886,7 @@ add_opt_rr_to_tree(proto_item *trr, int rr_type, tvbuff_t *tvb, int offset,
proto_tree_add_text(Z_tree, tvb, offset, 2, "Bits 1-15: 0x%x (reserved)", (ttl >> 17) & 0xff);
}
offset += 2;
- proto_tree_add_text(rr_tree, tvb, offset, 2, "Data length: %u", data_len);
+ proto_tree_add_uint(rr_tree, hf_dns_rr_len, tvb, offset, 2, data_len);
return rr_tree;
}
@@ -950,7 +972,6 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
int class;
char *class_name;
char *type_name;
- char *long_type_name;
int data_offset;
int cur_offset;
int data_start;
@@ -969,7 +990,6 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
type_name = dns_type_name(type);
class_name = dns_class_name(class);
- long_type_name = dns_long_type_name(type);
ttl = tvb_get_ntohl(tvb, data_offset);
data_offset += 4;
@@ -988,10 +1008,10 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
name, type_name, class_name);
if (type != T_OPT) {
rr_tree = add_rr_to_tree(trr, ett_dns_rr, tvb, offset, name, name_len,
- long_type_name, class_name, ttl, data_len);
+ type, class, ttl, data_len);
} else {
rr_tree = add_opt_rr_to_tree(trr, ett_dns_rr, tvb, offset, name, name_len,
- long_type_name, class, ttl, data_len);
+ type, class, ttl, data_len);
}
}
@@ -1280,9 +1300,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
if (rr_len < 2)
goto bad_rr;
type_covered = tvb_get_ntohs(tvb, cur_offset);
- proto_tree_add_text(rr_tree, tvb, cur_offset, 2, "Type covered: %s (%s)",
- dns_type_name(type_covered),
- dns_long_type_name(type_covered));
+ proto_tree_add_text(rr_tree, tvb, cur_offset, 2, "Type covered: %s",
+ dns_type_description(type_covered));
cur_offset += 2;
rr_len -= 2;
@@ -1673,9 +1692,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
for (i = 0; i < 8; i++) {
if (bits & mask) {
proto_tree_add_text(rr_tree, tvb, cur_offset, 1,
- "RR type in bit map: %s (%s)",
- dns_type_name(rr_type),
- dns_long_type_name(rr_type));
+ "RR type in bit map: %s",
+ dns_type_description(rr_type));
}
mask >>= 1;
rr_type++;
@@ -1716,9 +1734,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
for (i = 0; i < 8; i++) {
if (bits & mask) {
proto_tree_add_text(rr_tree, tvb, cur_offset, 1,
- "RR type in bit map: %s (%s)",
- dns_type_name(rr_type),
- dns_long_type_name(rr_type));
+ "RR type in bit map: %s",
+ dns_type_description(rr_type));
}
mask >>= 1;
rr_type++;
@@ -2554,6 +2571,38 @@ proto_register_dns(void)
{ "Transaction ID", "dns.id",
FT_UINT16, BASE_HEX, NULL, 0x0,
"Identification of transaction", HFILL }},
+ { &hf_dns_qry_type,
+ { "Type", "dns.qry.type",
+ FT_UINT16, BASE_HEX, VALS(dns_types), 0x0,
+ "Query Type", HFILL }},
+ { &hf_dns_qry_class,
+ { "Class", "dns.qry.class",
+ FT_UINT16, BASE_HEX, VALS(dns_classes), 0x0,
+ "Query Class", HFILL }},
+ { &hf_dns_qry_name,
+ { "Name", "dns.qry.name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Query Name", HFILL }},
+ { &hf_dns_rr_type,
+ { "Type", "dns.resp.type",
+ FT_UINT16, BASE_HEX, VALS(dns_types), 0x0,
+ "Response Type", HFILL }},
+ { &hf_dns_rr_class,
+ { "Class", "dns.resp.class",
+ FT_UINT16, BASE_HEX, VALS(dns_classes), 0x0,
+ "Response Class", HFILL }},
+ { &hf_dns_rr_name,
+ { "Name", "dns.resp.name",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Response Name", HFILL }},
+ { &hf_dns_rr_ttl,
+ { "Time to live", "dns.resp.ttl",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Response TTL", HFILL }},
+ { &hf_dns_rr_len,
+ { "Data length", "dns.resp.len",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Response Length", HFILL }},
{ &hf_dns_count_questions,
{ "Questions", "dns.count.queries",
FT_UINT16, BASE_DEC, NULL, 0x0,
diff --git a/epan/dissectors/packet-dns.h b/epan/dissectors/packet-dns.h
index 5f751c7c7d..f05d07b90c 100644
--- a/epan/dissectors/packet-dns.h
+++ b/epan/dissectors/packet-dns.h
@@ -28,13 +28,10 @@
#define __PACKET_DNS_H__
char *dns_class_name(int class);
+char *dns_class_description(int class);
int get_dns_name(tvbuff_t *, int, int, char *, int);
#define MAXDNAME 1025 /* maximum domain name length */
-proto_tree *
-add_rr_to_tree(proto_item *, int, tvbuff_t *, int, const char *,
- int, const char *, const char *, guint, gushort);
-
#endif /* packet-dns.h */
diff --git a/epan/dissectors/packet-gtp.c b/epan/dissectors/packet-gtp.c
index 0360336739..a0d872bd81 100644
--- a/epan/dissectors/packet-gtp.c
+++ b/epan/dissectors/packet-gtp.c
@@ -109,6 +109,7 @@ static int hf_gtp_node_ipv6 = -1;
static int hf_gtp_nsapi = -1;
static int hf_gtp_ptmsi = -1;
static int hf_gtp_ptmsi_sig = -1;
+static int hf_gtp_qos_version = -1;
static int hf_gtp_qos_spare1 = -1;
static int hf_gtp_qos_delay = -1;
static int hf_gtp_qos_mean = -1;
@@ -3107,7 +3108,6 @@ decode_qos_umts(tvbuff_t *tvb, int offset, proto_tree *tree, gchar* qos_str, gui
* inconsistent and unuseful, I will check hyphen presence here and
* will signal its presence.
* */
- guint8 version_buffer[2];
guint8 hyphen;
/* Will keep the value that will be returned
@@ -3140,9 +3140,8 @@ decode_qos_umts(tvbuff_t *tvb, int offset, proto_tree *tree, gchar* qos_str, gui
te = proto_tree_add_text (tree, tvb, offset - 1, length, "%s", qos_str);
ext_tree_qos = proto_item_add_subtree (te, ett_gtp_qos);
- version_buffer[0] = tvb_get_guint8(tvb, offset + 1);
- version_buffer[1] = tvb_get_guint8(tvb, offset + 2);
- proto_tree_add_text (ext_tree_qos, tvb, offset + 1, 2, "Version: %c%c", version_buffer[0], version_buffer[1]);
+
+ proto_tree_add_item (ext_tree_qos, hf_gtp_qos_version, tvb, offset + 1, 2, FALSE);
/* Hyphen handling */
hyphen = tvb_get_guint8(tvb, offset + 3);
@@ -4443,6 +4442,7 @@ proto_register_gtp(void)
{ &hf_gtp_node_ipv6, { "Node address IPv6", "gtp.node_ipv6", FT_IPv6, BASE_HEX, NULL, 0, "Recommended node address IPv6", HFILL }},
{ &hf_gtp_npdu_number, { "N-PDU Number", "gtp.npdu_number", FT_UINT8, BASE_HEX, NULL, 0, "N-PDU Number", HFILL }},
{ &hf_gtp_nsapi, { "NSAPI", "gtp.nsapi", FT_UINT8, BASE_DEC, NULL, 0, "Network layer Service Access Point Identifier", HFILL }},
+ { &hf_gtp_qos_version, { "Version", "gtp.qos_version", FT_STRING, BASE_DEC, NULL, 0, "Version of the QoS Profile", HFILL }},
{ &hf_gtp_qos_spare1, { "Spare", "gtp.qos_spare1", FT_UINT8, BASE_DEC, NULL, GTP_EXT_QOS_SPARE1_MASK, "Spare (shall be sent as '00' )", HFILL }},
{ &hf_gtp_qos_delay, { "QoS delay", "gtp.qos_delay", FT_UINT8, BASE_DEC, VALS(qos_delay_type), GTP_EXT_QOS_DELAY_MASK, "Quality of Service Delay Class", HFILL }},
{ &hf_gtp_qos_reliability, { "QoS reliability", "gtp.qos_reliabilty", FT_UINT8, BASE_DEC, VALS(qos_reliability_type), GTP_EXT_QOS_RELIABILITY_MASK, "Quality of Service Reliability Class", HFILL }},
diff --git a/epan/dissectors/packet-nbns.c b/epan/dissectors/packet-nbns.c
index c78e535e11..d80e09646f 100644
--- a/epan/dissectors/packet-nbns.c
+++ b/epan/dissectors/packet-nbns.c
@@ -245,6 +245,28 @@ nbns_type_name (int type)
#define NBNAME_BUF_LEN 128
+static proto_tree *
+add_rr_to_tree(proto_item *trr, int rr_type, tvbuff_t *tvb, int offset,
+ const char *name, int namelen,
+ const char *type_name, const char *class_description,
+ guint ttl, gushort data_len)
+{
+ proto_tree *rr_tree;
+
+ rr_tree = proto_item_add_subtree(trr, rr_type);
+ proto_tree_add_text(rr_tree, tvb, offset+1, namelen-1, "Name: %s", name);
+ offset += namelen;
+ proto_tree_add_text(rr_tree, tvb, offset, 2, "Type: %s", type_name);
+ offset += 2;
+ proto_tree_add_text(rr_tree, tvb, offset, 2, "Class: %s", class_description);
+ offset += 2;
+ proto_tree_add_text(rr_tree, tvb, offset, 4, "Time to live: %s",
+ time_secs_to_str(ttl));
+ offset += 4;
+ proto_tree_add_text(rr_tree, tvb, offset, 2, "Data length: %u", data_len);
+ return rr_tree;
+}
+
static int
get_nbns_name(tvbuff_t *tvb, int offset, int nbns_data_offset,
char *name_ret, int *name_type_ret)
@@ -386,7 +408,6 @@ dissect_nbns_query(tvbuff_t *tvb, int offset, int nbns_data_offset,
int name_type;
int type;
int class;
- char *class_name;
char *type_name;
int data_offset;
int data_start;
@@ -400,13 +421,13 @@ dissect_nbns_query(tvbuff_t *tvb, int offset, int nbns_data_offset,
data_offset += len;
type_name = nbns_type_name(type);
- class_name = dns_class_name(class);
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s %s", type_name, name);
if (nbns_tree != NULL) {
tq = proto_tree_add_text(nbns_tree, tvb, offset, len,
- "%s: type %s, class %s", name, type_name, class_name);
+ "%s: type %s, class %s", name, type_name,
+ dns_class_name(class));
q_tree = proto_item_add_subtree(tq, ett_nbns_qd);
add_name_and_type(q_tree, tvb, offset, name_len, "Name", name,
@@ -416,7 +437,8 @@ dissect_nbns_query(tvbuff_t *tvb, int offset, int nbns_data_offset,
proto_tree_add_text(q_tree, tvb, offset, 2, "Type: %s", type_name);
offset += 2;
- proto_tree_add_text(q_tree, tvb, offset, 2, "Class: %s", class_name);
+ proto_tree_add_text(q_tree, tvb, offset, 2, "Class: %s",
+ dns_class_description(class));
offset += 2;
}
@@ -631,7 +653,8 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset,
strcat(name, netbios_name_type_descr(name_type));
strcat(name, ")");
rr_tree = add_rr_to_tree(trr, ett_nbns_rr, tvb, offset, name,
- name_len, type_name, class_name, ttl, data_len);
+ name_len, type_name, dns_class_description(class),
+ ttl, data_len);
while (data_len > 0) {
if (opcode == OPCODE_WACK) {
/* WACK response. This doesn't contain the
@@ -683,7 +706,8 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset,
"%s: type %s, class %s",
name, type_name, class_name);
rr_tree = add_rr_to_tree(trr, ett_nbns_rr, tvb, offset, name,
- name_len, type_name, class_name, ttl, data_len);
+ name_len, type_name, dns_class_description(class),
+ ttl, data_len);
if (data_len < 1) {
proto_tree_add_text(rr_tree, tvb, cur_offset,
data_len, "(incomplete entry)");
@@ -927,7 +951,8 @@ dissect_nbns_answer(tvbuff_t *tvb, int offset, int nbns_data_offset,
"%s: type %s, class %s",
name, type_name, class_name);
rr_tree = add_rr_to_tree(trr, ett_nbns_rr, tvb, offset, name,
- name_len, type_name, class_name, ttl, data_len);
+ name_len, type_name, dns_class_description(class),
+ ttl, data_len);
proto_tree_add_text(rr_tree, tvb, cur_offset, data_len, "Data");
cur_offset += data_len;
break;
diff --git a/epan/dissectors/packet-pgm.c b/epan/dissectors/packet-pgm.c
index 6b90fbdb06..1a100a1408 100644
--- a/epan/dissectors/packet-pgm.c
+++ b/epan/dissectors/packet-pgm.c
@@ -373,6 +373,7 @@ static int ett_pgm_opts_fragment = -1;
static int hf_pgm_main_sport = -1;
static int hf_pgm_main_dport = -1;
+static int hf_pgm_port = -1;
static int hf_pgm_main_type = -1;
static int hf_pgm_main_opts = -1;
static int hf_pgm_main_opts_opt = -1;
@@ -1316,8 +1317,13 @@ dissect_pgm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
pgm_tree = proto_item_add_subtree(ti, ett_pgm);
proto_tree_add_uint(pgm_tree, hf_pgm_main_sport, tvb, offset, 2,
pgmhdr.sport);
+ proto_tree_add_uint_hidden(pgm_tree, hf_pgm_port, tvb, offset, 2,
+ pgmhdr.sport);
proto_tree_add_uint(pgm_tree, hf_pgm_main_dport, tvb, offset+2,
2, pgmhdr.dport);
+ proto_tree_add_uint_hidden(pgm_tree, hf_pgm_port, tvb, offset+2,
+ 2, pgmhdr.dport);
+
proto_tree_add_uint(pgm_tree, hf_pgm_main_type, tvb,
offset+4, 1, pgmhdr.type);
@@ -1600,6 +1606,9 @@ proto_register_pgm(void)
{ &hf_pgm_main_dport,
{ "Destination Port", "pgm.hdr.dport", FT_UINT16, BASE_DEC,
NULL, 0x0, "", HFILL }},
+ { &hf_pgm_port,
+ { "Port", "pgm.port", FT_UINT16, BASE_DEC,
+ NULL, 0x0, "", HFILL }},
{ &hf_pgm_main_type,
{ "Type", "pgm.hdr.type", FT_UINT8, BASE_HEX,
VALS(type_vals), 0x0, "", HFILL }},
diff --git a/epan/dissectors/packet-radius.c b/epan/dissectors/packet-radius.c
index 788a4cf101..32ee3b17c5 100644
--- a/epan/dissectors/packet-radius.c
+++ b/epan/dissectors/packet-radius.c
@@ -79,6 +79,7 @@ static int hf_radius_serviceType = -1;
static int hf_radius_callingStationId = -1;
static int hf_radius_calledStationId = -1;
static int hf_radius_framedAddress = -1;
+static int hf_radius_reply_message = -1;
static int hf_radius_class = -1;
static int hf_radius_nasIp = -1;
static int hf_radius_acctStatusType = -1;
@@ -582,7 +583,7 @@ static const radius_attr_info radius_attrib[] =
{15, RADIUS_INTEGER4, "Login Service", radius_login_service_vals, NULL},
{16, RADIUS_INTEGER4, "Login TCP Port", NULL, NULL},
{17, RADIUS_UNKNOWN, "Unassigned", NULL, NULL},
- {18, RADIUS_STRING, "Reply Message", NULL, NULL},
+ {18, RADIUS_STRING, "Reply Message", NULL, &hf_radius_reply_message},
{19, RADIUS_STRING, "Callback Number", NULL, NULL},
{20, RADIUS_STRING, "Callback Id", NULL, NULL},
{21, RADIUS_UNKNOWN, "Unassigned", NULL, NULL},
@@ -4755,6 +4756,11 @@ proto_register_radius(void)
FT_STRING, BASE_NONE, NULL, 0,
"PacketCable Terminal_Display_Info Calling_Name", HFILL }
},
+ { &hf_radius_reply_message,
+ { "Reply-Message","radius.reply_msg",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Radius Reply Message", HFILL }
+ },
{ &hf_packetcable_terminal_display_info_message_waiting,
{ "Message_Waiting","radius.vendor.pkt.tdi.mw",
FT_STRING, BASE_NONE, NULL, 0,