diff options
author | Guy Harris <guy@alum.mit.edu> | 2001-07-20 04:39:07 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2001-07-20 04:39:07 +0000 |
commit | c766c6c8bd2e2d90ba69f8fa3755b67d93f32a00 (patch) | |
tree | ce0eb0c4bc8e0857d36c76bebe8e1d4a27685283 /packet-wsp.c | |
parent | 4a812d4ad5e61143d7a18b52f1f32a2a369784f6 (diff) |
Dissect WSP redirects, and set up a conversation and conversation
dissector so that the redirected traffic is dissected as WAP traffic.
svn path=/trunk/; revision=3743
Diffstat (limited to 'packet-wsp.c')
-rw-r--r-- | packet-wsp.c | 540 |
1 files changed, 390 insertions, 150 deletions
diff --git a/packet-wsp.c b/packet-wsp.c index e0c5b39fe4..2934a5a12f 100644 --- a/packet-wsp.c +++ b/packet-wsp.c @@ -2,7 +2,7 @@ * * Routines to dissect WSP component of WAP traffic. * - * $Id: packet-wsp.c,v 1.23 2001/07/03 09:53:21 guy Exp $ + * $Id: packet-wsp.c,v 1.24 2001/07/20 04:39:07 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -54,6 +54,7 @@ #include <string.h> #include <glib.h> #include "packet.h" +#include "conversation.h" #include "packet-wap.h" #include "packet-wsp.h" @@ -113,12 +114,26 @@ static int hf_wsp_header_transfer_encoding = HF_EMPTY; static int hf_wsp_header_transfer_encoding_str = HF_EMPTY; static int hf_wsp_header_via = HF_EMPTY; +static int hf_wsp_redirect_flags = HF_EMPTY; +static int hf_wsp_redirect_permanent = HF_EMPTY; +static int hf_wsp_redirect_reuse_security_session = HF_EMPTY; +static int hf_wsp_redirect_afl = HF_EMPTY; +static int hf_wsp_redirect_afl_bearer_type_included = HF_EMPTY; +static int hf_wsp_redirect_afl_port_number_included = HF_EMPTY; +static int hf_wsp_redirect_afl_address_len = HF_EMPTY; +static int hf_wsp_redirect_bearer_type = HF_EMPTY; +static int hf_wsp_redirect_port_num = HF_EMPTY; +static int hf_wsp_redirect_ipv4_addr = HF_EMPTY; +static int hf_wsp_redirect_addr = HF_EMPTY; + /* Initialize the subtree pointers */ static gint ett_wsp = ETT_EMPTY; static gint ett_header = ETT_EMPTY; static gint ett_headers = ETT_EMPTY; static gint ett_capabilities = ETT_EMPTY; static gint ett_content_type = ETT_EMPTY; +static gint ett_redirect_flags = ETT_EMPTY; +static gint ett_redirect_afl = ETT_EMPTY; /* Handle for WMLC dissector */ static dissector_handle_t wmlc_handle; @@ -388,6 +403,24 @@ static const value_string vals_transfer_encoding[] = { }; /* + * Redirect flags. + */ +#define PERMANENT_REDIRECT 0x80 +#define REUSE_SECURITY_SESSION 0x40 + +/* + * Redirect address flags and length. + */ +#define BEARER_TYPE_INCLUDED 0x80 +#define PORT_NUMBER_INCLUDED 0x40 +#define ADDRESS_LEN 0x3f + +static const true_false_string yes_no_truth = { + "Yes" , + "No" +}; + +/* * Windows appears to define DELETE. */ #ifdef DELETE @@ -433,8 +466,111 @@ static void add_capabilities (proto_tree *tree, tvbuff_t *tvb); static guint get_uintvar (tvbuff_t *, guint, guint); /* Code to actually dissect the packets */ + +/* Code to actually dissect the packets */ +static void +dissect_redirect(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree, dissector_t dissector) +{ + guint8 flags; + proto_item *ti; + proto_tree *flags_tree; + guint8 address_flags_len; + int address_len; + proto_tree *atf_tree; + guint8 bearer_type; + guint16 port_num = 0; + guint32 address_ipv4 = 0; + address redir_address; + conversation_t *conv; + + flags = tvb_get_guint8 (tvb, offset); + if (tree) { + ti = proto_tree_add_uint (tree, hf_wsp_redirect_flags, + tvb, offset, 1, flags); + flags_tree = proto_item_add_subtree (ti, ett_redirect_flags); + proto_tree_add_boolean (flags_tree, hf_wsp_redirect_permanent, + tvb, offset, 1, flags); + proto_tree_add_boolean (flags_tree, hf_wsp_redirect_reuse_security_session, + tvb, offset, 1, flags); + } + offset++; + while (tvb_reported_length_remaining (tvb, offset) > 0) { + address_flags_len = tvb_get_guint8 (tvb, offset); + if (tree) { + ti = proto_tree_add_uint (tree, hf_wsp_redirect_afl, + tvb, offset, 1, address_flags_len); + atf_tree = proto_item_add_subtree (ti, ett_redirect_afl); + proto_tree_add_boolean (atf_tree, hf_wsp_redirect_afl_bearer_type_included, + tvb, offset, 1, address_flags_len); + proto_tree_add_boolean (atf_tree, hf_wsp_redirect_afl_port_number_included, + tvb, offset, 1, address_flags_len); + proto_tree_add_uint (atf_tree, hf_wsp_redirect_afl_address_len, + tvb, offset, 1, address_flags_len); + } + offset++; + if (address_flags_len & BEARER_TYPE_INCLUDED) { + if (tree) { + proto_tree_add_item (tree, hf_wsp_redirect_bearer_type, + tvb, offset, 1, bo_little_endian); + } + offset++; + } + if (address_flags_len & PORT_NUMBER_INCLUDED) { + port_num = tvb_get_ntohs (tvb, offset); + if (tree) { + proto_tree_add_uint (tree, hf_wsp_redirect_port_num, + tvb, offset, 2, port_num); + } + offset += 2; + } else { + /* + * Redirecting to the same server port number as was + * being used, i.e. the source port number of this + * redirect. + */ + port_num = pinfo->srcport; + } + address_len = address_flags_len & ADDRESS_LEN; + switch (address_len) { + + case 0: /* no address? */ + break; + + case 4: /* we assume this is IPv4 */ + tvb_memcpy(tvb, (guint8 *)&address_ipv4, offset, 4); + if (tree) { + proto_tree_add_ipv4 (tree, hf_wsp_redirect_ipv4_addr, + tvb, offset, 4, address_ipv4); + } + + redir_address.type = AT_IPv4; + redir_address.len = 4; + redir_address.data = (const guint8 *)&address_ipv4; + conv = find_conversation(&redir_address, &pinfo->dst, + PT_UDP, port_num, 0, NO_PORT_B); + if (conv == NULL) { + conv = conversation_new(&redir_address, &pinfo->dst, + PT_UDP, port_num, 0, NULL, NO_PORT2); + } + conversation_set_dissector(conv, dissector); + break; + + case 16: /* XXX - handle this as IPv6? */ + default: + if (tree) { + proto_tree_add_item (tree, hf_wsp_redirect_addr, + tvb, offset, address_len, bo_little_endian); + } + break; + } + offset += address_len; + } +} + static void -dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) +dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + dissector_t dissector) { frame_data *fdata = pinfo->fd; int offset = 0; @@ -456,7 +592,7 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Set up structures we will need to add the protocol subtree and manage it */ proto_item *ti; - proto_tree *wsp_tree; + proto_tree *wsp_tree = NULL; /* proto_tree *wsp_header_fixed; */ /* This field shows up as the "Info" column in the display; you should make @@ -495,169 +631,187 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Code to process the packet goes here */ /* - wsp_header_fixed = proto_item_add_subtree(ti, ett_header ); + wsp_header_fixed = proto_item_add_subtree(ti, ett_header ); */ - /* Add common items: only TID and PDU Type */ - - /* If this is connectionless, then the TID Field is always first */ - if ( (pinfo->match_port == UDP_PORT_WSP) || - (pinfo->match_port == UDP_PORT_WTLS_WSP)) - { - ti = proto_tree_add_item (wsp_tree, hf_wsp_header_tid,tvb, - 0,1,bo_little_endian); - } - - ti = proto_tree_add_item( - wsp_tree, /* tree */ - hf_wsp_header_pdu_type, /* id */ - tvb, - offset++, /* start of high light */ - 1, /* length of high light */ - bo_little_endian /* value */ - ); - - switch (pdut) - { - case CONNECT: - ti = proto_tree_add_item (wsp_tree, hf_wsp_version_major,tvb,offset,1,bo_little_endian); - ti = proto_tree_add_item (wsp_tree, hf_wsp_version_minor,tvb,offset,1,bo_little_endian); - offset++; - capabilityStart = offset; - count = 0; /* Initialise count */ - capabilityLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); - - headerStart = offset; - count = 0; /* Initialise count */ - headerLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); - if (capabilityLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, offset, capabilityLength, capabilityLength); - add_capabilities (wsp_tree, tmp_tvb); - offset += capabilityLength; - } - - if (headerLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); - } - - break; + /* Add common items: only TID and PDU Type */ - case CONNECTREPLY: - count = 0; /* Initialise count */ - value = tvb_get_guintvar (tvb, offset, &count); - ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); - offset += count; - - capabilityStart = offset; - count = 0; /* Initialise count */ - capabilityLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); - - headerStart = offset; - count = 0; /* Initialise count */ - headerLength = tvb_get_guintvar (tvb, offset, &count); - offset += count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); - if (capabilityLength > 0) - { - tmp_tvb = tvb_new_subset (tvb, offset, capabilityLength, capabilityLength); - add_capabilities (wsp_tree, tmp_tvb); - offset += capabilityLength; - } - - if (headerLength > 0) - { - - /* - ti = proto_tree_add_item (wsp_tree, hf_wsp_headers_section,tvb,offset,headerLength,bo_little_endian); - wsp_headers = proto_item_add_subtree( ti, ett_headers ); - */ - tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); - } + /* If this is connectionless, then the TID Field is always first */ + if ( (pinfo->match_port == UDP_PORT_WSP) || + (pinfo->match_port == UDP_PORT_WTLS_WSP)) + { + ti = proto_tree_add_item (wsp_tree, hf_wsp_header_tid,tvb, + 0,1,bo_little_endian); + } - break; + ti = proto_tree_add_item( + wsp_tree, /* tree */ + hf_wsp_header_pdu_type, /* id */ + tvb, + offset, /* start of high light */ + 1, /* length of high light */ + bo_little_endian /* value */ + ); + } + offset++; - case DISCONNECT: - count = 0; /* Initialise count */ - value = tvb_get_guintvar (tvb, offset, &count); - ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); - break; + switch (pdut) + { + case CONNECT: + if (tree) { + ti = proto_tree_add_item (wsp_tree, hf_wsp_version_major,tvb,offset,1,bo_little_endian); + ti = proto_tree_add_item (wsp_tree, hf_wsp_version_minor,tvb,offset,1,bo_little_endian); + offset++; + capabilityStart = offset; + count = 0; /* Initialise count */ + capabilityLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); + + headerStart = offset; + count = 0; /* Initialise count */ + headerLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); + if (capabilityLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, offset, capabilityLength, capabilityLength); + add_capabilities (wsp_tree, tmp_tvb); + offset += capabilityLength; + } - case GET: - count = 0; /* Initialise count */ - /* Length of URI and size of URILen field */ - value = tvb_get_guintvar (tvb, offset, &count); - nextOffset = offset + count; - add_uri (wsp_tree, tvb, offset, nextOffset); - offset += (value+count); /* VERIFY */ - tmp_tvb = tvb_new_subset (tvb, offset, -1, -1); + if (headerLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); add_headers (wsp_tree, tmp_tvb); - break; - - case POST: - uriStart = offset; - count = 0; /* Initialise count */ - uriLength = tvb_get_guintvar (tvb, offset, &count); - headerStart = uriStart+count; - count = 0; /* Initialise count */ - headersLength = tvb_get_guintvar (tvb, headerStart, &count); - offset = headerStart + count; + } + } - add_uri (wsp_tree, tvb, uriStart, offset); - offset += uriLength; + break; - ti = proto_tree_add_item (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,bo_little_endian); + case CONNECTREPLY: + if (tree) { + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset, &count); + ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); + offset += count; + + capabilityStart = offset; + count = 0; /* Initialise count */ + capabilityLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength); + + headerStart = offset; + count = 0; /* Initialise count */ + headerLength = tvb_get_guintvar (tvb, offset, &count); + offset += count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,headerLength); + if (capabilityLength > 0) + { + tmp_tvb = tvb_new_subset (tvb, offset, capabilityLength, capabilityLength); + add_capabilities (wsp_tree, tmp_tvb); + offset += capabilityLength; + } - contentTypeStart = offset; - nextOffset = add_content_type (wsp_tree, tvb, offset, &contentType); + if (headerLength > 0) + { - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for value-(length of content-type field)*/ - headerLength = headersLength-(nextOffset-contentTypeStart); - tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); + /* + ti = proto_tree_add_item (wsp_tree, hf_wsp_headers_section,tvb,offset,headerLength,bo_little_endian); + wsp_headers = proto_item_add_subtree( ti, ett_headers ); + */ + tmp_tvb = tvb_new_subset (tvb, offset, headerLength, headerLength); add_headers (wsp_tree, tmp_tvb); + } + } - /* TODO: Post DATA */ - /* Runs from start of headers+headerLength to end of frame */ - offset = nextOffset+headerLength; - tmp_tvb = tvb_new_subset (tvb, offset, tvb_reported_length (tvb)-offset, tvb_reported_length (tvb)-offset); - add_post_data (wsp_tree, tmp_tvb, contentType); - break; + break; - case REPLY: - ti = proto_tree_add_item (wsp_tree, hf_wsp_header_status,tvb,offset,1,bo_little_endian); - count = 0; /* Initialise count */ - value = tvb_get_guintvar (tvb, offset+1, &count); - nextOffset = offset + 1 + count; - ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,offset+1,count,value); + case REDIRECT: + dissect_redirect(tvb, offset, pinfo, wsp_tree, + dissector); + break; - contentTypeStart = nextOffset; - nextOffset = add_content_type (wsp_tree, tvb, nextOffset, &contentType); + case DISCONNECT: + if (tree) { + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset, &count); + ti = proto_tree_add_uint (wsp_tree, hf_wsp_server_session_id,tvb,offset,count,value); + } + break; - /* Add headers subtree that will hold the headers fields */ - /* Runs from nextOffset for value-(length of content-type field)*/ - headerLength = value-(nextOffset-contentTypeStart); - tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); - add_headers (wsp_tree, tmp_tvb); - offset += count+value+1; + case GET: + if (tree) { + count = 0; /* Initialise count */ + /* Length of URI and size of URILen field */ + value = tvb_get_guintvar (tvb, offset, &count); + nextOffset = offset + count; + add_uri (wsp_tree, tvb, offset, nextOffset); + offset += (value+count); /* VERIFY */ + tmp_tvb = tvb_new_subset (tvb, offset, -1, -1); + add_headers (wsp_tree, tmp_tvb); + } + break; - /* TODO: Data - decode WMLC */ - /* Runs from offset+1+count+value+1 to end of frame */ - if (offset < tvb_reported_length (tvb)) - { - ti = proto_tree_add_item (wsp_tree, hf_wsp_reply_data,tvb,offset,tvb_length_remaining(tvb, offset),bo_little_endian); - } - break; + case POST: + if (tree) { + uriStart = offset; + count = 0; /* Initialise count */ + uriLength = tvb_get_guintvar (tvb, offset, &count); + headerStart = uriStart+count; + count = 0; /* Initialise count */ + headersLength = tvb_get_guintvar (tvb, headerStart, &count); + offset = headerStart + count; + + add_uri (wsp_tree, tvb, uriStart, offset); + offset += uriLength; + + ti = proto_tree_add_item (wsp_tree, hf_wsp_header_length,tvb,headerStart,count,bo_little_endian); + + contentTypeStart = offset; + nextOffset = add_content_type (wsp_tree, tvb, offset, &contentType); + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for value-(length of content-type field)*/ + headerLength = headersLength-(nextOffset-contentTypeStart); + tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb); + + /* TODO: Post DATA */ + /* Runs from start of headers+headerLength to end of frame */ + offset = nextOffset+headerLength; + tmp_tvb = tvb_new_subset (tvb, offset, tvb_reported_length (tvb)-offset, tvb_reported_length (tvb)-offset); + add_post_data (wsp_tree, tmp_tvb, contentType); + } + break; + + case REPLY: + if (tree) { + ti = proto_tree_add_item (wsp_tree, hf_wsp_header_status,tvb,offset,1,bo_little_endian); + count = 0; /* Initialise count */ + value = tvb_get_guintvar (tvb, offset+1, &count); + nextOffset = offset + 1 + count; + ti = proto_tree_add_uint (wsp_tree, hf_wsp_header_length,tvb,offset+1,count,value); + + contentTypeStart = nextOffset; + nextOffset = add_content_type (wsp_tree, tvb, nextOffset, &contentType); + + /* Add headers subtree that will hold the headers fields */ + /* Runs from nextOffset for value-(length of content-type field)*/ + headerLength = value-(nextOffset-contentTypeStart); + tmp_tvb = tvb_new_subset (tvb, nextOffset, headerLength, headerLength); + add_headers (wsp_tree, tmp_tvb); + offset += count+value+1; + + /* TODO: Data - decode WMLC */ + /* Runs from offset+1+count+value+1 to end of frame */ + if (offset < tvb_reported_length (tvb)) + { + ti = proto_tree_add_item (wsp_tree, hf_wsp_reply_data,tvb,offset,tvb_length_remaining(tvb, offset),bo_little_endian); + } } + break; } } @@ -671,7 +825,7 @@ dissect_wsp_fromudp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (check_col(pinfo->fd, COL_PROTOCOL)) col_set_str(pinfo->fd, COL_PROTOCOL, "WSP" ); - dissect_wsp_common(tvb, pinfo, tree); + dissect_wsp_common(tvb, pinfo, tree, dissect_wsp_fromudp); } /* @@ -682,7 +836,10 @@ dissect_wsp_fromudp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static void dissect_wsp_fromwap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - dissect_wsp_common(tvb, pinfo, tree); + /* + * XXX - what about WTLS->WTP->WSP? + */ + dissect_wsp_common(tvb, pinfo, tree, dissect_wtp_fromudp); } static void @@ -2116,6 +2273,87 @@ proto_register_wsp(void) "Post Data", HFILL } }, + { &hf_wsp_redirect_flags, + { "Flags", + "wsp.redirect_flags", + FT_UINT8, BASE_HEX, NULL, 0x00, + "Redirect Flags", HFILL + } + }, + { &hf_wsp_redirect_permanent, + { "Permanent Redirect", + "wsp.redirect_flags.permanent", + FT_BOOLEAN, 8, TFS(&yes_no_truth), PERMANENT_REDIRECT, + "Permanent Redirect", HFILL + } + }, + { &hf_wsp_redirect_reuse_security_session, + { "Reuse Security Session", + "wsp.redirect_flags.reuse_security_session", + FT_BOOLEAN, 8, TFS(&yes_no_truth), REUSE_SECURITY_SESSION, + "Permanent Redirect", HFILL + } + }, + { &hf_wsp_redirect_afl, + { "Flags/Length", + "wsp.redirect_afl", + FT_UINT8, BASE_HEX, NULL, 0x00, + "Redirect Address Flags/Length", HFILL + } + }, + { &hf_wsp_redirect_afl_bearer_type_included, + { "Bearer Type Included", + "wsp.redirect_afl.bearer_type_included", + FT_BOOLEAN, 8, TFS(&yes_no_truth), BEARER_TYPE_INCLUDED, + "Redirect Address bearer type included", HFILL + } + }, + { &hf_wsp_redirect_afl_port_number_included, + { "Port Number Included", + "wsp.redirect_afl.port_number_included", + FT_BOOLEAN, 8, TFS(&yes_no_truth), PORT_NUMBER_INCLUDED, + "Redirect Address port number included", HFILL + } + }, + { &hf_wsp_redirect_afl_address_len, + { "Address Len", + "wsp.redirect_afl.address_len", + FT_UINT8, BASE_DEC, NULL, ADDRESS_LEN, + "Redirect Address Length", HFILL + } + }, + { &hf_wsp_redirect_bearer_type, + /* + * XXX - the values are specified in the WDP + * specification. + */ + { "Bearer Type", + "wsp.redirect_bearer_type", + FT_UINT8, BASE_DEC, NULL, 0x0, + "Redirect Bearer Type", HFILL + } + }, + { &hf_wsp_redirect_port_num, + { "Port Number", + "wsp.redirect_port_num", + FT_UINT16, BASE_DEC, NULL, 0x0, + "Redirect Port Number", HFILL + } + }, + { &hf_wsp_redirect_ipv4_addr, + { "IP Address", + "wsp.redirect_ipv4_addr", + FT_IPv4, BASE_NONE, NULL, 0x0, + "Redirect Address (IP)", HFILL + } + }, + { &hf_wsp_redirect_addr, + { "Address", + "wsp.redirect_addr", + FT_BYTES, BASE_NONE, NULL, 0x0, + "Redirect Address", HFILL + } + }, }; /* Setup protocol subtree array */ @@ -2125,6 +2363,8 @@ proto_register_wsp(void) &ett_headers, &ett_capabilities, &ett_content_type, + &ett_redirect_flags, + &ett_redirect_afl, }; /* Register the protocol name and description */ |