aboutsummaryrefslogtreecommitdiffstats
path: root/packet-dns.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>1999-09-21 07:15:38 +0000
committerGuy Harris <guy@alum.mit.edu>1999-09-21 07:15:38 +0000
commit453a4e95fb0b91201f2950bac43316f330353034 (patch)
treeacac034a16e90b4ea80e381fde67e684e24b2ecf /packet-dns.c
parentf37741ebdea19ec9b76e2a5fecf4359c9e63d9d3 (diff)
Add code to dissect MX and LOC records ("sparc.com" has both).
svn path=/trunk/; revision=694
Diffstat (limited to 'packet-dns.c')
-rw-r--r--packet-dns.c108
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 */