Ethereal-dev: [Ethereal-dev] Re: [Ethereal-users] SLPv2 support
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Brad Hards <bhards@xxxxxxxxxxxxxx>
Date: Sun, 29 Sep 2002 13:39:21 +1000
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On Sat, 28 Sep 2002 06:47, Ronnie Sahlberg wrote: > Give it a try and post your patch to ethereal-dev, > the people there can provide comments on how to > improve it/clean it up. First cut patch attached. I am a newbie to ethereal (even as a user), so I don't know if there are some tragic style or coding errors in this. Feedback appreciated - please be gentle, this is my first time.... Brad BTW: Is there some set of test files (eg in libpcap form) that I can contribute my tests to? > aussie aussie aussie oy oy oy - whatever. - -- http://conf.linux.org.au. 22-25Jan2003. Perth, Aust. Tickets booked. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.6 (GNU/Linux) Comment: For info see http://www.gnupg.org iD8DBQE9lnXpW6pHgIdAuOMRAlRmAJ9eJ7Oo4zvOJ8LFEbP9++IpPEdVOwCgrav/ DihlN7d4V63pjo2FwbOPLB8= =Y8mb -----END PGP SIGNATURE-----
diff -Naur -x doc -x'*.1' -xtest1 -x 'ps*' -x 'register*' clean/ethereal-0.9.6/packet-srvloc.c ethereal-0.9.6/packet-srvloc.c --- clean/ethereal-0.9.6/packet-srvloc.c Fri Aug 9 12:34:37 2002 +++ ethereal-0.9.6/packet-srvloc.c Sun Sep 29 12:31:42 2002 @@ -13,6 +13,8 @@ * Copyright 1998 Gerald Combs * * Service Location Protocol is RFC 2165 + * Service Location Protocol Version 2 is RFC 2608 + * - initial support by Brad Hards <bradh@xxxxxxxxxxxxx> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -48,6 +50,7 @@ static int hf_srvloc_function = -1; static int hf_srvloc_flags = -1; static int hf_srvloc_error = -1; +static int hf_srvloc_error_v2 = -1; static gint ett_srvloc = -1; static gint ett_srvloc_flags = -1; @@ -67,9 +70,11 @@ #define DAADVERT 8 #define SRVTYPERQST 9 #define SRVTYPERPLY 10 +#define SAADVERT 11 /* SLPv2, section 8 */ /* Create protocol header structure */ - +/* bradh: looks like never used. */ +/* bradh: comment it out for now since it doesn't work for v2 struct srvloc_hdr { guint8 version; guint8 function; @@ -80,6 +85,7 @@ guint16 encoding; guint16 xid; }; +*/ /* List to resolve function numbers to names */ @@ -94,6 +100,7 @@ { DAADVERT, "DA Advertisement" }, { SRVTYPERQST, "Service Type Request" }, { SRVTYPERPLY, "Service Type Reply" }, + { SAADVERT, "SA Advertisement" }, /* v2 only */ { 0, NULL } }; @@ -108,7 +115,12 @@ #define FLAG_A 0x10 #define FLAG_F 0x08 -/* Define Error Codes */ +/* it all changes for Version 2 */ +#define FLAG_O_V2 0x8000 +#define FLAG_F_V2 0x4000 +#define FLAG_R_V2 0x2000 + +/* Define Error Codes - Version 1*/ #define SUCCESS 0 #define LANG_NOT_SPTD 1 @@ -133,6 +145,42 @@ { 0, NULL } }; +/* Define Error Codes for Version 2 */ + +#define LANGUAGE_NOT_SUPPORTED 1 +#define PARSE_ERROR 2 +#define INVALID_REGISTRATION 3 +#define SCOPE_NOT_SUPPORTED 4 +#define AUTHENTICATION_UNKNOWN 5 +#define AUTHENTICATION_ABSENT 6 +#define AUTHENTICATION_FAILED 7 +#define VER_NOT_SUPPORTED 9 +#define INTERNAL_ERROR 10 +#define DA_BUSY_NOW 11 +#define OPTION_NOT_UNDERSTOOD 12 +#define INVALID_UPDATE 13 +#define MSG_NOT_SUPPORTED 14 +#define REFRESH_REJECTED 15 + +static const value_string srvloc_errs_v2[] = { + { SUCCESS, "No Error" }, + { LANGUAGE_NOT_SUPPORTED, "There is data for the service type in the scope in the AttrRqst or SrvRqst, but not in the requested language." }, + { PARSE_ERROR, "The message fails to obey SLP syntax." }, + { INVALID_REGISTRATION, "The SrvReg has problems -- e.g., a zero lifetime or an omitted Language Tag." }, + { SCOPE_NOT_SUPPORTED, "The SLP message did not include a scope in its <scope-list> supported by the SA or DA." }, + { AUTHENTICATION_UNKNOWN, "The DA or SA receives a request for an unsupported SLP SPI." }, + { AUTHENTICATION_ABSENT, "The DA expected URL and ATTR authentication in the SrvReg and did not receive it."}, + { AUTHENTICATION_FAILED, "The DA detected an authentication error in an Authentication block."}, + { VER_NOT_SUPPORTED, "Unsupported version number in message header." }, + { INTERNAL_ERROR, "The DA (or SA) is too sick to respond." }, + { DA_BUSY_NOW, "UA or SA SHOULD retry, using exponential back off." }, + { OPTION_NOT_UNDERSTOOD, "The DA (or SA) received an unknown option from the mandatory range."}, + { INVALID_UPDATE, "The DA received a SrvReg without FRESH set, for an unregistered service or with inconsistent Service Types." }, + { MSG_NOT_SUPPORTED, "The SA received an AttrRqst or SrvTypeRqst and does not support it." }, + { REFRESH_REJECTED, "The SA sent a SrvReg or partial SrvDereg to a DA more frequently than the DA's min-refresh-interval."}, + { 0, NULL } +}; + /* * Character encodings. * This is a small subset of what's in @@ -203,6 +251,49 @@ return offset; } +/* SLPv2 version - Needs to be fixed to match RFC2608 sect 9.2*/ +static int +dissect_authblk_v2(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + struct tm *stamp; + time_t seconds; + guint16 length; + + proto_tree_add_text(tree, tvb, offset, 2, "Block Structure Desciptor: 0x%x", + tvb_get_ntohs(tvb, offset)); + proto_tree_add_text(tree, tvb, offset+2, 2, "Authentication Block Length: %u", + tvb_get_ntohs(tvb, offset + 2)); + + seconds = tvb_get_ntohl(tvb, offset+4) - 2208988800ul; + stamp = gmtime(&seconds); + if (stamp != NULL) { + proto_tree_add_text(tree, tvb, offset, 8, + "Timestamp: %04d-%02d-%02d %02d:%02d:%02d UTC", + stamp->tm_year + 1900, stamp->tm_mon + 1, + stamp->tm_mday, stamp->tm_hour, stamp->tm_min, + stamp->tm_sec); + } else { + proto_tree_add_text(tree, tvb, offset, 4, "Timestamp not representable"); + } + length = tvb_get_ntohs(tvb, offset + 8); + proto_tree_add_text(tree, tvb, offset + 8, 2, "SLP SPI length: %u", + length); + offset += 10; + proto_tree_add_text(tree, tvb, offset, length, "SLP SPIk: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + /* add code in here to handle Structured Authentication Block */ + return offset; +} + +static int +dissect_attrauthblk_v2(tvbuff_t *tvb, int offset, proto_tree *tree) +{ + tvb=tvb; tree=tree; /* silence gcc for now */ + /* add code in here to handle attribute authentication */ + return offset; +} + /* Packet dissection routine called by tcp & udp when port 427 detected */ static void @@ -214,9 +305,10 @@ guint8 version; guint8 function; guint16 encoding; - guint16 length; - guint8 flags; + guint32 length; /* three bytes needed for v2 */ + guint16 flags; /* two byes needed for v2 */ guint32 count; + guint32 next_ext_off; /* three bytes, v2 only */ if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "SRVLOC"); @@ -239,31 +331,32 @@ version); proto_tree_add_uint(srvloc_tree, hf_srvloc_function, tvb, offset + 1, 1, function); - length = tvb_get_ntohs(tvb, offset + 2); - proto_tree_add_text(srvloc_tree, tvb, offset + 2, 2, "Length: %u", - length); - flags = tvb_get_guint8(tvb, offset + 4); - tf = proto_tree_add_uint(srvloc_tree, hf_srvloc_flags, tvb, offset + 4, 1, - flags); - srvloc_flags = proto_item_add_subtree(tf, ett_srvloc_flags); - proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Overflow %d... .xxx", (flags & FLAG_O) >> 7 ); - proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Monolingual .%d.. .xxx", (flags & FLAG_M) >> 6 ); - proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "URL Authentication Present ..%d. .xxx", (flags & FLAG_U) >> 5 ); - proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Attribute Authentication Present ...%d .xxx", (flags & FLAG_A) >> 4 ); - proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Fresh Service Entry .... %dxxx", (flags & FLAG_F) >> 3 ); - proto_tree_add_text(srvloc_tree, tvb, offset + 5, 1, "Dialect: %u", - tvb_get_guint8(tvb, offset + 5)); - proto_tree_add_text(srvloc_tree, tvb, offset + 6, 2, "Language: %s", - tvb_format_text(tvb, offset + 6, 2)); - encoding = tvb_get_ntohs(tvb, offset + 8); - proto_tree_add_text(srvloc_tree, tvb, offset + 8, 2, "Encoding: %u (%s)", - encoding, - val_to_str(encoding, charsets, "Unknown")); - proto_tree_add_text(srvloc_tree, tvb, offset + 10, 2, "Transaction ID: %u", - tvb_get_ntohs(tvb, offset + 10)); - offset += 12; + if (version < 2) { + length = tvb_get_ntohs(tvb, offset + 2); + proto_tree_add_text(srvloc_tree, tvb, offset + 2, 2, "Length: %u", + length); + flags = tvb_get_guint8(tvb, offset + 4); + tf = proto_tree_add_uint(srvloc_tree, hf_srvloc_flags, tvb, offset + 4, 1, + flags); + srvloc_flags = proto_item_add_subtree(tf, ett_srvloc_flags); + proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Overflow %d... .xxx", (flags & FLAG_O) >> 7 ); + proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Monolingual .%d.. .xxx", (flags & FLAG_M) >> 6 ); + proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "URL Authentication Present ..%d. .xxx", (flags & FLAG_U) >> 5 ); + proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Attribute Authentication Present ...%d .xxx", (flags & FLAG_A) >> 4 ); + proto_tree_add_text(srvloc_flags, tvb, offset + 4, 0, "Fresh Service Entry .... %dxxx", (flags & FLAG_F) >> 3 ); + proto_tree_add_text(srvloc_tree, tvb, offset + 5, 1, "Dialect: %u", + tvb_get_guint8(tvb, offset + 5)); + proto_tree_add_text(srvloc_tree, tvb, offset + 6, 2, "Language: %s", + tvb_format_text(tvb, offset + 6, 2)); + encoding = tvb_get_ntohs(tvb, offset + 8); + proto_tree_add_text(srvloc_tree, tvb, offset + 8, 2, "Encoding: %u (%s)", + encoding, + val_to_str(encoding, charsets, "Unknown")); + proto_tree_add_text(srvloc_tree, tvb, offset + 10, 2, "Transaction ID: %u", + tvb_get_ntohs(tvb, offset + 10)); + offset += 12; - switch (function) { + switch (function) { case SRVREQ: proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Request"); length = tvb_get_ntohs(tvb, offset); @@ -280,8 +373,8 @@ proto_tree_add_text(srvloc_tree, tvb, offset, length, "Predicate: %s", tvb_format_text(tvb, offset, length)); offset += length; - break; - + break; + case SRVRPLY: proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Reply"); proto_tree_add_item(srvloc_tree, hf_srvloc_error, tvb, offset, 2, FALSE); @@ -394,7 +487,7 @@ case ATTRRPLY: proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Attribute Reply"); - proto_tree_add_item(srvloc_tree, hf_srvloc_error, tvb, offset, 2, FALSE); + proto_tree_add_item(srvloc_tree, hf_srvloc_error_v2, tvb, offset, 2, FALSE); offset += 2; length = tvb_get_ntohs(tvb, offset); proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Attribute List length: %u", @@ -474,8 +567,379 @@ default: proto_tree_add_text(srvloc_tree, tvb, offset, -1, "Unknown Function Type"); - }; - }; + }; + } + else { /* Version 2 */ + length = tvb_get_ntoh24(tvb, offset + 2); + proto_tree_add_text(srvloc_tree, tvb, offset + 2, 3, "Length: %u", length); + + flags = tvb_get_ntohs(tvb, offset + 5); + tf = proto_tree_add_uint(srvloc_tree, hf_srvloc_flags, tvb, offset + 5, 2, + flags); + srvloc_flags = proto_item_add_subtree(tf, ett_srvloc_flags); + proto_tree_add_text(srvloc_flags, tvb, offset + 5, 0, "Overflow %d..x xxxx", + (flags & FLAG_O_V2) >> 15 ); + proto_tree_add_text(srvloc_flags, tvb, offset + 5, 0, "Fresh Service Entry .%d.x xxxx", + (flags & FLAG_F_V2) >> 14 ); + proto_tree_add_text(srvloc_flags, tvb, offset + 5, 0, "Request Multicast ..%dx xxxx", + (flags & FLAG_R_V2) >> 13 ); + + next_ext_off = tvb_get_ntoh24(tvb, offset + 7); + proto_tree_add_text(srvloc_tree, tvb, offset + 7, 3, "Next Extension offset: %u", next_ext_off); + proto_tree_add_text(srvloc_tree, tvb, offset + 10, 2, "Transaction ID: %u", + tvb_get_ntohs(tvb, offset + 10)); + length = tvb_get_ntohs(tvb, offset + 12); + proto_tree_add_text(srvloc_tree, tvb, offset + 12, 2, "Language Tag Length: %u", length); + proto_tree_add_text(srvloc_tree, tvb, offset + 14, length, "Language Tag: %s", + tvb_format_text(tvb, offset + 14, length)); + offset += 14+length; + + switch (function) { + case SRVREQ: /* RFC2608 8.1 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Request"); + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Previous Response List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Previous Response List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Service Type Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service Type: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Scope List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Predicate length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Predicate: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "SLP SPI length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "SLP SPI: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + break; + + case SRVRPLY: /* RFC2608 8.2 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Reply"); + proto_tree_add_item(srvloc_tree, hf_srvloc_error_v2, tvb, offset, 2, FALSE); + offset += 2; + count = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL Count: %u", + count); + offset += 2; + while (count > 0) { + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Reserved: 0x%x", + tvb_get_guint8(tvb, offset)); + offset += 1; + proto_tree_add_text(srvloc_tree, tvb, offset, 2, " URL lifetime: %u", + tvb_get_ntohs(tvb, offset)); + offset += 2; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, " URL length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, " Service URL: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_guint8(tvb, offset); /* really a count, naming abuse */ + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Number of URL auths: %u", + length); + offset += 1; + while (length > 0) { + offset = dissect_authblk_v2(tvb, offset, srvloc_tree); + length--; + } + count--; + }; + break; + + case SRVREG: /* RFC2608 8.3 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Registration"); + proto_tree_add_text(srvloc_tree, tvb, offset, 1, "Reserved: 0x%x", + tvb_get_guint8(tvb, offset)); + offset += 1; + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL lifetime: %u", + tvb_get_ntohs(tvb, offset)); + offset += 2; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service URL: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_guint8(tvb, offset); /* really a count, naming abuse */ + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Number of URL auths: %u", + length); + offset += 1; + while (length > 0) { + offset = dissect_authblk_v2(tvb, offset, srvloc_tree); + length--; + } + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Length of service type string: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service type: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Length of scope-list string: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Attribute List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Attribute List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_guint8(tvb, offset); /* really a count, naming abuse */ + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Number of Attr auths: %u", + length); + offset += 1; + while (length > 0) { + offset = dissect_attrauthblk_v2(tvb, offset, srvloc_tree); + length--; + } + break; + + case SRVDEREG: /* RFC2608 10.6 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Deregister"); + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Length of scope-list string: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service URL: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Tag List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Tag List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + break; + + case SRVACK: /* RFC2608 8.4 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Acknowledge"); + proto_tree_add_item(srvloc_tree, hf_srvloc_error_v2, tvb, offset, 2, FALSE); + offset += 2; + break; + + case ATTRRQST: /* RFC2608 10.3*/ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Attribute Request"); + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Previous Response List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Previous Response List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service URL: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Scope List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Tag List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Tag List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "SLP SPI length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "SLP SPI: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + break; + + case ATTRRPLY: /* RFC2608 10.4 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Attribute Reply"); + proto_tree_add_item(srvloc_tree, hf_srvloc_error_v2, tvb, offset, 2, FALSE); + offset += 2; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Attribute List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Attribute List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_guint8(tvb, offset); /* really a count, naming abuse */ + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Number of Attr auths: %u", + length); + offset += 1; + while (length > 0) { + offset = dissect_attrauthblk_v2(tvb, offset, srvloc_tree); + length--; + } + break; + + case DAADVERT: /* RCC 2608 8.5 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "DA Advertisement"); + proto_tree_add_item(srvloc_tree, hf_srvloc_error_v2, tvb, offset, 2, FALSE); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, 4, "DA Stateless Boot Timestamp: %u", + tvb_get_ntohl(tvb, offset)); + offset += 4; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service URL: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Scope List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Attr List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Attr List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "SLP SPI Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "SLP SPI: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_guint8(tvb, offset); /* really a count, naming abuse */ + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Number of auth blocks: %u", + length); + offset += 1; + while (length > 0) { + offset = dissect_authblk_v2(tvb, offset, srvloc_tree); + length--; + } + break; + + case SRVTYPERQST: /* RFC2608 10.1 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Type Request"); + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Previous Response List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Previous Response List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Naming Authority List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Naming Authority List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Scope List Length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + break; + + case SRVTYPERPLY: /* rfc2608 10.2 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "Service Type Reply"); + proto_tree_add_item(srvloc_tree, hf_srvloc_error_v2, tvb, offset, 2, FALSE); + offset += 2; + count = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Service Type Count: %u", + count); + offset += 2; + while (count > 0) { + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Service Type List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Service Type List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + count--; + }; + break; + + case SAADVERT: /* rfc2608 10.2 */ + proto_tree_add_text(srvloc_tree, tvb, offset, 0, "SA Advertisement"); + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "URL length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "URL: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Scope List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Scope List: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_ntohs(tvb, offset); + proto_tree_add_text(srvloc_tree, tvb, offset, 2, "Attribute List length: %u", + length); + offset += 2; + proto_tree_add_text(srvloc_tree, tvb, offset, length, "Attribute length: %s", + tvb_format_text(tvb, offset, length)); + offset += length; + length = tvb_get_guint8(tvb, offset); /* really a count, naming abuse */ + proto_tree_add_text(srvloc_tree, tvb, offset, 1, " Number of auth blocks: %u", + length); + offset += 1; + while (length > 0) { + offset = dissect_authblk_v2(tvb, offset, srvloc_tree); + length--; + } + break; + + default: + proto_tree_add_text(srvloc_tree, tvb, offset, -1, "Unknown Function Type"); + }; + }; + } } /* Register protocol with Ethereal. */ @@ -507,6 +971,13 @@ FT_UINT16, BASE_DEC, VALS(srvloc_errs), 0x0, "", HFILL } }, + + {&hf_srvloc_error_v2, + {"Error Code", "srvloc.errv2", + FT_UINT16, BASE_DEC, VALS(srvloc_errs_v2), 0x0, + "", HFILL } + }, + }; static gint *ett[] = {
- Follow-Ups:
- Re: [Ethereal-dev] SLPv2 support
- From: Ronnie Sahlberg
- Re: [Ethereal-dev] SLPv2 support
- Prev by Date: Re: [Ethereal-dev] Question about kerberos packets that fragment.
- Next by Date: [Ethereal-dev] tethereal tree expansion
- Previous by thread: Re: [Ethereal-dev] Question about kerberos packets that fragment.
- Next by thread: Re: [Ethereal-dev] SLPv2 support
- Index(es):