diff options
author | Guy Harris <guy@alum.mit.edu> | 1999-09-21 07:15:38 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 1999-09-21 07:15:38 +0000 |
commit | 453a4e95fb0b91201f2950bac43316f330353034 (patch) | |
tree | acac034a16e90b4ea80e381fde67e684e24b2ecf | |
parent | f37741ebdea19ec9b76e2a5fecf4359c9e63d9d3 (diff) | |
download | wireshark-453a4e95fb0b91201f2950bac43316f330353034.tar.gz wireshark-453a4e95fb0b91201f2950bac43316f330353034.tar.bz2 wireshark-453a4e95fb0b91201f2950bac43316f330353034.zip |
Add code to dissect MX and LOC records ("sparc.com" has both).
svn path=/trunk/; revision=694
-rw-r--r-- | packet-dns.c | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/packet-dns.c b/packet-dns.c index 7ff4b7f113..0cb0e9841b 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.20 1999/07/29 05:46:53 gram Exp $ + * $Id: packet-dns.c,v 1.21 1999/09/21 07:15:38 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -389,6 +389,48 @@ get_dns_name_type_class (const u_char *dns_data_ptr, return len; } +static double +rfc1867_size(const u_char *dptr) +{ + double size; + guint32 exponent; + + size = (*dptr & 0xF0) >> 4; + exponent = (*dptr & 0x0F); + while (exponent != 0) { + size *= 10; + exponent--; + } + return size / 100; /* return size in meters, not cm */ +} + +static char * +rfc1867_angle(const u_char *dptr, const char *nsew) +{ + guint32 angle; + char direction; + guint32 degrees, minutes, secs, tsecs; + static char buf[10+1+3+1 + 2+1+3+1 + 2+1+3+1+3+1 + 1 + 1]; + + angle = pntohl(dptr); + + if (angle < 0x80000000U) { + angle = 0x80000000U - angle; + direction = nsew[1]; + } else { + angle = angle - 0x80000000U; + direction = nsew[0]; + } + tsecs = angle % 1000; + angle = angle / 1000; + secs = angle % 60; + angle = angle / 60; + minutes = angle % 60; + degrees = angle / 60; + sprintf(buf, "%u deg %u min %u.%03u sec %c", degrees, minutes, secs, + tsecs, direction); + return buf; +} static int dissect_dns_query(const u_char *dns_data_ptr, const u_char *pd, int offset, @@ -607,6 +649,70 @@ dissect_dns_answer(const u_char *dns_data_ptr, const u_char *pd, int offset, break; } break; + + case T_MX: + { + guint16 preference; + char mx_name[MAXDNAME]; + int mx_name_len; + + rrptr = dptr; + preference = pntohs(rrptr); + rrptr += 2; + mx_name_len = get_dns_name(dns_data_ptr, rrptr, mx_name, sizeof(mx_name)); + 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); + offset += (dptr - data_start); + proto_tree_add_text(rr_tree, offset, 2, "Preference: %u", preference); + offset += 2; + proto_tree_add_text(rr_tree, offset, mx_name_len, "Mail exchange: %s", mx_name); + } + break; + + case T_LOC: + { + rrptr = dptr; + 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); + offset += (dptr - data_start); + proto_tree_add_text(rr_tree, offset, 1, "Version: %u", *dptr); + if (*rrptr == 0) { + /* Version 0, the only version RFC 1876 discusses. */ + rrptr++; + offset++; + proto_tree_add_text(rr_tree, offset, 1, "Size: %g m", + rfc1867_size(rrptr)); + rrptr++; + offset++; + proto_tree_add_text(rr_tree, offset, 1, "Horizontal precision: %g m", + rfc1867_size(rrptr)); + rrptr++; + offset++; + proto_tree_add_text(rr_tree, offset, 1, "Vertical precision: %g m", + rfc1867_size(rrptr)); + rrptr++; + offset++; + proto_tree_add_text(rr_tree, offset, 4, "Latitude: %s", + rfc1867_angle(rrptr, "NS")); + rrptr += 4; + offset += 4; + proto_tree_add_text(rr_tree, offset, 4, "Longitude: %s", + rfc1867_angle(rrptr, "EW")); + rrptr += 4; + offset += 4; + proto_tree_add_text(rr_tree, offset, 4, "Altitude: %g m", + (pntohl(rrptr) - 10000000)/100.0); + } else + proto_tree_add_text(rr_tree, offset, data_len, "Data"); + break; + } + break; /* TODO: parse more record types */ |