diff options
author | Jaap Keuter <jaap.keuter@xs4all.nl> | 2006-12-31 00:00:06 +0000 |
---|---|---|
committer | Jaap Keuter <jaap.keuter@xs4all.nl> | 2006-12-31 00:00:06 +0000 |
commit | f824a895a48bf5f9efec2ee7ef4edd5db7e71563 (patch) | |
tree | 4fdcbf832cf42f0368491900ceaec2ebec584326 /epan/dissectors/packet-dns.c | |
parent | 14ad19db5f904bf94c9b9c9a6a8bbeb9e54b1630 (diff) |
From Paul Erkkila:
parse NAPTR records in dns dissector (rfc 3403)
svn path=/trunk/; revision=20250
Diffstat (limited to 'epan/dissectors/packet-dns.c')
-rw-r--r-- | epan/dissectors/packet-dns.c | 84 |
1 files changed, 75 insertions, 9 deletions
diff --git a/epan/dissectors/packet-dns.c b/epan/dissectors/packet-dns.c index ff3d3cf80c..7f564c6b8a 100644 --- a/epan/dissectors/packet-dns.c +++ b/epan/dissectors/packet-dns.c @@ -1,14 +1,9 @@ /* packet-dns.c * Routines for DNS packet disassembly - * - * RFC 1034, RFC 1035 - * RFC 2136 for dynamic DNS - * http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt - * for multicast DNS + * Copyright 2004, Nicolas DICHTEL - 6WIND - <nicolas.dichtel@6wind.com> * * $Id$ * - * Copyright 2004, Nicolas DICHTEL - 6WIND - <nicolas.dichtel@6wind.com> * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> * Copyright 1998 Gerald Combs @@ -25,7 +20,14 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* + * RFC 1034, RFC 1035 + * RFC 2136 for dynamic DNS + * http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt + * for multicast DNS */ #ifdef HAVE_CONFIG_H @@ -177,7 +179,7 @@ typedef struct _dns_conv_info_t { #define T_NIMLOC 32 /* ??? (Nimrod?) */ #define T_SRV 33 /* service location (RFC 2052) */ #define T_ATMA 34 /* ??? */ -#define T_NAPTR 35 /* naming authority pointer (RFC 2168) */ +#define T_NAPTR 35 /* naming authority pointer (RFC 3403) */ #define T_KX 36 /* Key Exchange (RFC 2230) */ #define T_CERT 37 /* Certificate (RFC 2538) */ #define T_A6 38 /* IPv6 address with indirection (RFC 2874) */ @@ -373,7 +375,7 @@ static const value_string dns_types[] = { { T_NIMLOC, "NIMLOC" }, { T_SRV, "SRV" }, /* RFC 2052 */ { T_ATMA, "ATMA" }, - { T_NAPTR, "NAPTR" }, /* RFC 2168 */ + { T_NAPTR, "NAPTR" }, /* RFC 3403 */ { T_KX, "KX" }, /* RFC 2230 */ { T_CERT, "CERT" }, /* RFC 2538 */ { T_A6, "A6" }, /* RFC 2874 */ @@ -2300,6 +2302,70 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset, } break; + case T_NAPTR: + { + int offset = cur_offset; + guint16 order; + guint16 preference; + gchar *flags; + guint8 flags_len; + guchar *service; + guint8 service_len; + guchar *regex; + guint8 regex_len; + guchar *replacement; + guint8 replacement_len; + + order = tvb_get_ntohs(tvb, offset); + offset += 2; + preference = tvb_get_ntohs(tvb, offset); + offset += 2; + flags_len = tvb_get_guint8(tvb, offset); + offset++; + flags = tvb_get_ephemeral_string(tvb, offset, flags_len); + offset += flags_len; + service_len = tvb_get_guint8(tvb, offset); + offset++; + service = tvb_get_ephemeral_string(tvb, offset, service_len); + offset += service_len; + regex_len = tvb_get_guint8(tvb, offset); + offset++; + regex = tvb_get_ephemeral_string(tvb, offset, regex_len); + offset += regex_len; + replacement_len = tvb_get_guint8(tvb, offset); + offset++; + replacement = tvb_get_ephemeral_string(tvb, offset, replacement_len); + + if (cinfo != NULL) + col_append_fstr(cinfo, COL_INFO, " %u %u %s", order, preference, flags); + + if (dns_tree != NULL) { + proto_item_append_text(trr, ", order %u, preference %u, flags %s", + order, preference, flags); + offset = cur_offset; + proto_tree_add_text(rr_tree, tvb, offset, 2, "Order: %u", order); + offset += 2; + proto_tree_add_text(rr_tree, tvb, offset, 2, "Preference: %u", preference); + offset += 2; + proto_tree_add_text(rr_tree, tvb, offset, 1, "Flags length: %u", flags_len); + offset++; + proto_tree_add_text(rr_tree, tvb, offset, flags_len, "Flags: \"%s\"", flags); + offset += flags_len; + proto_tree_add_text(rr_tree, tvb, offset, 1, "Service length: %u", service_len); + offset++; + proto_tree_add_text(rr_tree, tvb, offset, service_len, "Service: \"%s\"", service); + offset += service_len; + proto_tree_add_text(rr_tree, tvb, offset, 1, "Regex length: %u", regex_len); + offset++; + proto_tree_add_text(rr_tree, tvb, offset, regex_len, "Regex: \"%s\"", regex); + offset += regex_len; + proto_tree_add_text(rr_tree, tvb, offset, 1, "Replacement length: %u", replacement_len); + offset++; + proto_tree_add_text(rr_tree, tvb, offset, replacement_len, "Replacement: \"%s\"", replacement); + } + } + break; + /* TODO: parse more record types */ default: |