diff options
author | Guy Harris <guy@alum.mit.edu> | 1999-11-07 21:00:40 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 1999-11-07 21:00:40 +0000 |
commit | bd43f0610eec26eaa09c273511d72e239f1555ce (patch) | |
tree | 735c4255a152d4a385c9b1ab7511bd256b332158 | |
parent | d49b158b4926ddaf988fe857bb97cb369cb29823 (diff) | |
download | wireshark-bd43f0610eec26eaa09c273511d72e239f1555ce.tar.gz wireshark-bd43f0610eec26eaa09c273511d72e239f1555ce.tar.bz2 wireshark-bd43f0610eec26eaa09c273511d72e239f1555ce.zip |
Brian J. Murrell's patch to put information about the queries and
answers into the COL_INFO column in the summary pane.
svn path=/trunk/; revision=988
-rw-r--r-- | packet-dns.c | 454 |
1 files changed, 260 insertions, 194 deletions
diff --git a/packet-dns.c b/packet-dns.c index 85b647f96f..148d042136 100644 --- a/packet-dns.c +++ b/packet-dns.c @@ -1,7 +1,7 @@ /* packet-dns.c * Routines for DNS packet disassembly * - * $Id: packet-dns.c,v 1.25 1999/10/16 15:08:11 deniel Exp $ + * $Id: packet-dns.c,v 1.26 1999/11/07 21:00:40 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -466,7 +466,7 @@ rfc1867_angle(const u_char *dptr, const char *nsew) static int dissect_dns_query(const u_char *pd, int offset, int dns_data_offset, - proto_tree *dns_tree) + frame_data *fd, proto_tree *dns_tree) { int len; char name[MAXDNAME]; @@ -495,18 +495,22 @@ dissect_dns_query(const u_char *pd, int offset, int dns_data_offset, class_name = dns_class_name(class); long_type_name = dns_long_type_name(type); - tq = proto_tree_add_text(dns_tree, offset, len, "%s: type %s, class %s", + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s %s", type_name, name); + if (dns_tree != NULL) { + tq = proto_tree_add_text(dns_tree, offset, len, "%s: type %s, class %s", name, type_name, class_name); - q_tree = proto_item_add_subtree(tq, ETT_DNS_QD); + q_tree = proto_item_add_subtree(tq, ETT_DNS_QD); - proto_tree_add_text(q_tree, offset, name_len, "Name: %s", name); - offset += name_len; + proto_tree_add_text(q_tree, offset, name_len, "Name: %s", name); + offset += name_len; - proto_tree_add_text(q_tree, offset, 2, "Type: %s", long_type_name); - offset += 2; + proto_tree_add_text(q_tree, offset, 2, "Type: %s", long_type_name); + offset += 2; - proto_tree_add_text(q_tree, offset, 2, "Class: %s", class_name); - offset += 2; + proto_tree_add_text(q_tree, offset, 2, "Class: %s", class_name); + offset += 2; + } return dptr - data_start; } @@ -535,7 +539,7 @@ add_rr_to_tree(proto_item *trr, int rr_type, int offset, const char *name, static int dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, - proto_tree *dns_tree) + frame_data *fd, proto_tree *dns_tree) { int len; char name[MAXDNAME]; @@ -587,18 +591,24 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, switch (type) { case T_A: - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (fd != NULL) { + col_append_fstr(fd, COL_INFO, " %s %s", type_name, + ip_to_str((guint8 *)dptr)); + } + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, addr %s", name, type_name, class_name, ip_to_str((guint8 *)dptr)); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 4, "Addr: %s", + ip_to_str((guint8 *)dptr)); } - proto_tree_add_text(rr_tree, cur_offset, 4, "Addr: %s", - ip_to_str((guint8 *)dptr)); break; case T_NS: @@ -607,17 +617,21 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, int ns_name_len; ns_name_len = get_dns_name(pd, cur_offset, dns_data_offset, ns_name, sizeof(ns_name)); - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s %s", type_name, ns_name); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, ns %s", name, type_name, class_name, ns_name); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (ns_name_len < 0) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, ns_name_len, "Name server: %s", + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (ns_name_len < 0) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, ns_name_len, "Name server: %s", ns_name); + } } break; @@ -627,17 +641,21 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, int cname_len; cname_len = get_dns_name(pd, cur_offset, dns_data_offset, cname, sizeof(cname)); - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s %s", type_name, cname); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, cname %s", name, type_name, class_name, cname); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (cname_len < 0) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, cname_len, "Primary name: %s", + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (cname_len < 0) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, cname_len, "Primary name: %s", cname); + } } break; @@ -655,75 +673,79 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, mname_len = get_dns_name(pd, cur_offset, dns_data_offset, mname, sizeof(mname)); if (mname_len >= 0) - rname_len = get_dns_name(pd, cur_offset + mname_len, dns_data_offset, rname, sizeof(rname)); + rname_len = get_dns_name(pd, cur_offset + mname_len, dns_data_offset, rname, sizeof(rname)); else { /* We ran past the end of the captured data in the packet. */ - rname_len = -1; + rname_len = -1; } - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s %s", type_name, mname); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, mname %s", name, type_name, class_name, mname); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (mname_len < 0) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, mname_len, "Primary name server: %s", - mname); - cur_offset += mname_len; + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (mname_len < 0) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, mname_len, "Primary name server: %s", + mname); + cur_offset += mname_len; - if (rname_len < 0) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, rname_len, "Responsible authority's mailbox: %s", - rname); - cur_offset += rname_len; + if (rname_len < 0) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, rname_len, "Responsible authority's mailbox: %s", + rname); + cur_offset += rname_len; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - serial = pntohl(&pd[cur_offset]); - proto_tree_add_text(rr_tree, cur_offset, 4, "Serial number: %u", - serial); - cur_offset += 4; + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + serial = pntohl(&pd[cur_offset]); + proto_tree_add_text(rr_tree, cur_offset, 4, "Serial number: %u", + serial); + cur_offset += 4; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - refresh = pntohl(&pd[cur_offset]); - proto_tree_add_text(rr_tree, cur_offset, 4, "Refresh interval: %s", - time_secs_to_str(refresh)); - cur_offset += 4; + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + refresh = pntohl(&pd[cur_offset]); + proto_tree_add_text(rr_tree, cur_offset, 4, "Refresh interval: %s", + time_secs_to_str(refresh)); + cur_offset += 4; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - retry = pntohl(&pd[cur_offset]); - proto_tree_add_text(rr_tree, cur_offset, 4, "Retry interval: %s", - time_secs_to_str(retry)); - cur_offset += 4; + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + retry = pntohl(&pd[cur_offset]); + proto_tree_add_text(rr_tree, cur_offset, 4, "Retry interval: %s", + time_secs_to_str(retry)); + cur_offset += 4; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - expire = pntohl(&pd[cur_offset]); - proto_tree_add_text(rr_tree, cur_offset, 4, "Expiration limit: %s", - time_secs_to_str(expire)); - cur_offset += 4; + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + expire = pntohl(&pd[cur_offset]); + proto_tree_add_text(rr_tree, cur_offset, 4, "Expiration limit: %s", + time_secs_to_str(expire)); + cur_offset += 4; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + minimum = pntohl(&pd[cur_offset]); + proto_tree_add_text(rr_tree, cur_offset, 4, "Minimum TTL: %s", + time_secs_to_str(minimum)); } - minimum = pntohl(&pd[cur_offset]); - proto_tree_add_text(rr_tree, cur_offset, 4, "Minimum TTL: %s", - time_secs_to_str(minimum)); } break; @@ -733,17 +755,21 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, int pname_len; pname_len = get_dns_name(pd, cur_offset, dns_data_offset, pname, sizeof(pname)); - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s %s", type_name, pname); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, ptr %s", name, type_name, class_name, pname); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (pname_len < 0) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, pname_len, "Domain name: %s", + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (pname_len < 0) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, pname_len, "Domain name: %s", pname); + } break; } break; @@ -756,96 +782,108 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, mx_name_len = get_dns_name(pd, cur_offset + 2, dns_data_offset, mx_name, sizeof(mx_name)); if (!BYTES_ARE_IN_FRAME(cur_offset, 2)) { - /* We ran past the end of the captured data in the packet. */ - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (dns_tree != NULL) { + /* We ran past the end of the captured data in the packet. */ + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, <preference goes past end of captured data in packet>", name, type_name, class_name, preference, mx_name); + } } else { - preference = pntohs(&pd[cur_offset]); - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + preference = pntohs(&pd[cur_offset]); + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s %u %s", type_name, preference, mx_name); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s, preference %u, mx %s", name, type_name, class_name, preference, mx_name); + } } - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (!BYTES_ARE_IN_FRAME(cur_offset, 2)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 2, "Preference: %u", preference); - if (mx_name_len < 0) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset + 2, mx_name_len, "Mail exchange: %s", + if (dns_tree != NULL) { + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (!BYTES_ARE_IN_FRAME(cur_offset, 2)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 2, "Preference: %u", preference); + if (mx_name_len < 0) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset + 2, mx_name_len, "Mail exchange: %s", mx_name); + } } break; case T_LOC: { - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s", type_name); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, "%s: type %s, class %s", name, type_name, class_name); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 1, "Version: %u", pd[cur_offset]); - if (pd[cur_offset] == 0) { - /* Version 0, the only version RFC 1876 discusses. */ - cur_offset++; - - if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { - /* We ran past the end of the captured data in the packet. */ - return 0; + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { + /* We ran past the end of the captured data in the packet. */ + return 0; } - proto_tree_add_text(rr_tree, cur_offset, 1, "Size: %g m", + proto_tree_add_text(rr_tree, cur_offset, 1, "Version: %u", pd[cur_offset]); + if (pd[cur_offset] == 0) { + /* Version 0, the only version RFC 1876 discusses. */ + cur_offset++; + + if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 1, "Size: %g m", rfc1867_size(pd[cur_offset])); - cur_offset++; + cur_offset++; - if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 1, "Horizontal precision: %g m", + if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 1, "Horizontal precision: %g m", rfc1867_size(pd[cur_offset])); - cur_offset++; + cur_offset++; - if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 1, "Vertical precision: %g m", + if (!BYTES_ARE_IN_FRAME(cur_offset, 1)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 1, "Vertical precision: %g m", rfc1867_size(pd[cur_offset])); - cur_offset++; + cur_offset++; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 4, "Latitude: %s", + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 4, "Latitude: %s", rfc1867_angle(&pd[cur_offset], "NS")); - cur_offset += 4; + cur_offset += 4; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 4, "Longitude: %s", + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 4, "Longitude: %s", rfc1867_angle(&pd[cur_offset], "EW")); - cur_offset += 4; + cur_offset += 4; - if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { - /* We ran past the end of the captured data in the packet. */ - return 0; - } - proto_tree_add_text(rr_tree, cur_offset, 4, "Altitude: %g m", + if (!BYTES_ARE_IN_FRAME(cur_offset, 4)) { + /* We ran past the end of the captured data in the packet. */ + return 0; + } + proto_tree_add_text(rr_tree, cur_offset, 4, "Altitude: %g m", (pntohl(&pd[cur_offset]) - 10000000)/100.0); - } else - proto_tree_add_text(rr_tree, cur_offset, data_len, "Data"); + } else + proto_tree_add_text(rr_tree, cur_offset, data_len, "Data"); + } break; } break; @@ -853,12 +891,16 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, /* TODO: parse more record types */ default: - trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, - "%s: type %s, class %s", + if (fd != NULL) + col_append_fstr(fd, COL_INFO, " %s", type_name); + if (dns_tree != NULL) { + trr = proto_tree_add_text(dns_tree, offset, (dptr - data_start) + data_len, + "%s: type %s, class %s", name, type_name, class_name); - rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, - long_type_name, class_name, ttl, data_len); - proto_tree_add_text(rr_tree, cur_offset, data_len, "Data"); + rr_tree = add_rr_to_tree(trr, ETT_DNS_RR, offset, name, name_len, + long_type_name, class_name, ttl, data_len); + proto_tree_add_text(rr_tree, cur_offset, data_len, "Data"); + } } dptr += data_len; @@ -868,48 +910,54 @@ dissect_dns_answer(const u_char *pd, int offset, int dns_data_offset, static int dissect_query_records(const u_char *pd, int cur_off, int dns_data_offset, - int count, proto_tree *dns_tree) + int count, frame_data *fd, proto_tree *dns_tree) { int start_off, add_off; - proto_tree *qatree; - proto_item *ti; + proto_tree *qatree = NULL; + proto_item *ti = NULL; start_off = cur_off; - ti = proto_tree_add_text(dns_tree, start_off, 0, "Queries"); - qatree = proto_item_add_subtree(ti, ETT_DNS_QRY); + if (dns_tree) { + ti = proto_tree_add_text(dns_tree, start_off, 0, "Queries"); + qatree = proto_item_add_subtree(ti, ETT_DNS_QRY); + } while (count-- > 0) { - add_off = dissect_dns_query(pd, cur_off, dns_data_offset, qatree); + add_off = dissect_dns_query(pd, cur_off, dns_data_offset, fd, qatree); if (add_off <= 0) { /* We ran past the end of the captured data in the packet. */ break; } cur_off += add_off; } - proto_item_set_len(ti, cur_off - start_off); + if (ti) + proto_item_set_len(ti, cur_off - start_off); return cur_off - start_off; } static int dissect_answer_records(const u_char *pd, int cur_off, int dns_data_offset, - int count, proto_tree *dns_tree, char *name) + int count, frame_data *fd, proto_tree *dns_tree, char *name) { int start_off, add_off; - proto_tree *qatree; - proto_item *ti; + proto_tree *qatree = NULL; + proto_item *ti = NULL; start_off = cur_off; - ti = proto_tree_add_text(dns_tree, start_off, 0, name); - qatree = proto_item_add_subtree(ti, ETT_DNS_ANS); + if (dns_tree) { + ti = proto_tree_add_text(dns_tree, start_off, 0, name); + qatree = proto_item_add_subtree(ti, ETT_DNS_ANS); + } while (count-- > 0) { - add_off = dissect_dns_answer(pd, cur_off, dns_data_offset, qatree); + add_off = dissect_dns_answer(pd, cur_off, dns_data_offset, fd, qatree); if (add_off <= 0) { /* We ran past the end of the captured data in the packet. */ break; } cur_off += add_off; } - proto_item_set_len(ti, cur_off - start_off); + if (ti) + proto_item_set_len(ti, cur_off - start_off); return cur_off - start_off; } @@ -918,7 +966,7 @@ void dissect_dns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { int dns_data_offset; - proto_tree *dns_tree, *field_tree; + proto_tree *dns_tree = NULL, *field_tree; proto_item *ti, *tf; guint16 id, flags, quest, ans, auth, add; char buf[128+1]; @@ -955,12 +1003,18 @@ dissect_dns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) ans = pntohs(&pd[offset + DNS_ANS]); auth = pntohs(&pd[offset + DNS_AUTH]); add = pntohs(&pd[offset + DNS_ADD]); - + if (check_col(fd, COL_INFO)) { col_add_fstr(fd, COL_INFO, "%s%s", val_to_str(flags & F_OPCODE, opcode_vals, "Unknown operation (%x)"), (flags & F_RESPONSE) ? " response" : ""); + } else { + /* Set "fd" to NULL; we pass a NULL "fd" to the query and answer + dissectors, as a way of saying that they shouldn't add stuff + to the COL_INFO column (a call to "check_col(fd, COL_INFO)" + is more expensive than a check that a pointer isn't NULL). */ + fd = NULL; } if (tree) { @@ -1032,23 +1086,35 @@ dissect_dns(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) proto_tree_add_item(dns_tree, hf_dns_count_add_rr, offset + DNS_ADD, 2, add); - cur_off = offset + DNS_HDRLEN; - - if (quest > 0) - cur_off += dissect_query_records(pd, cur_off, dns_data_offset, quest, + } + cur_off = offset + DNS_HDRLEN; + + if (quest > 0) { + /* If this is a response, don't add information about the queries + to the summary, just add information about the answers. */ + cur_off += dissect_query_records(pd, cur_off, dns_data_offset, quest, + (!(flags & F_RESPONSE) ? fd : NULL), dns_tree); + } - if (ans > 0) - cur_off += dissect_answer_records(pd, cur_off, dns_data_offset, ans, - dns_tree, "Answers"); + if (ans > 0) { + /* If this is a request, don't add information about the answers + to the summary, just add information about the queries. */ + cur_off += dissect_answer_records(pd, cur_off, dns_data_offset, ans, + ((flags & F_RESPONSE) ? fd : NULL), + dns_tree, "Answers"); + } + if (tree) { + /* Don't add information about the authoritative name servers, or the + additional records, to the summary. */ if (auth > 0) cur_off += dissect_answer_records(pd, cur_off, dns_data_offset, auth, - dns_tree, "Authoritative nameservers"); + NULL, dns_tree, "Authoritative nameservers"); if (add > 0) cur_off += dissect_answer_records(pd, cur_off, dns_data_offset, add, - dns_tree, "Additional records"); + NULL, dns_tree, "Additional records"); } } |