aboutsummaryrefslogtreecommitdiffstats
path: root/packet-wsp.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2003-10-09 18:54:06 +0000
committerGuy Harris <guy@alum.mit.edu>2003-10-09 18:54:06 +0000
commit98b0611239476b45b61f1f9431e2b41c54b2c09a (patch)
tree630d30c3f7898078c167a30529eec919ad5f0938 /packet-wsp.c
parente140f2858c29c3876bb1b84381f0e34ca50176c4 (diff)
From Biot Olivier:
Rename WSP defines to avoid collisions with Windows defines. Rename WSP dissector table for integer-value content types. Add WSP dissector table for literal content types. Add WSP dissection registration for literal content types. Register literal and extra WBXML content types to WSP dissector. Register textual MMS content type to WSP dissector. svn path=/trunk/; revision=8648
Diffstat (limited to 'packet-wsp.c')
-rw-r--r--packet-wsp.c141
1 files changed, 78 insertions, 63 deletions
diff --git a/packet-wsp.c b/packet-wsp.c
index 09b3949a71..fa82042a5d 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.76 2003/09/04 19:12:38 guy Exp $
+ * $Id: packet-wsp.c,v 1.77 2003/10/09 18:54:06 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -983,33 +983,26 @@ static const value_string vals_false_true[] = {
{ 0, NULL },
};
-/*
- * Windows appears to define DELETE.
- */
-#ifdef DELETE
-#undef DELETE
-#endif
-
enum {
- RESERVED = 0x00,
- CONNECT = 0x01,
- CONNECTREPLY = 0x02,
- REDIRECT = 0x03, /* No sample data */
- REPLY = 0x04,
- DISCONNECT = 0x05,
- PUSH = 0x06, /* No sample data */
- CONFIRMEDPUSH = 0x07, /* No sample data */
- SUSPEND = 0x08, /* No sample data */
- RESUME = 0x09, /* No sample data */
-
- GET = 0x40,
- OPTIONS = 0x41, /* No sample data */
- HEAD = 0x42, /* No sample data */
- DELETE = 0x43, /* No sample data */
- TRACE = 0x44, /* No sample data */
-
- POST = 0x60,
- PUT = 0x61, /* No sample data */
+ WSP_PDU_RESERVED = 0x00,
+ WSP_PDU_CONNECT = 0x01,
+ WSP_PDU_CONNECTREPLY = 0x02,
+ WSP_PDU_REDIRECT = 0x03, /* No sample data */
+ WSP_PDU_REPLY = 0x04,
+ WSP_PDU_DISCONNECT = 0x05,
+ WSP_PDU_PUSH = 0x06, /* No sample data */
+ WSP_PDU_CONFIRMEDPUSH = 0x07, /* No sample data */
+ WSP_PDU_SUSPEND = 0x08, /* No sample data */
+ WSP_PDU_RESUME = 0x09, /* No sample data */
+
+ WSP_PDU_GET = 0x40,
+ WSP_PDU_OPTIONS = 0x41, /* No sample data */
+ WSP_PDU_HEAD = 0x42, /* No sample data */
+ WSP_PDU_DELETE = 0x43, /* No sample data */
+ WSP_PDU_TRACE = 0x44, /* No sample data */
+
+ WSP_PDU_POST = 0x60,
+ WSP_PDU_PUT = 0x61, /* No sample data */
};
#define VAL_STRING_SIZE 200
@@ -1021,6 +1014,7 @@ typedef enum {
} value_type_t;
static dissector_table_t wsp_dissector_table;
+static dissector_table_t wsp_dissector_table_text;
static heur_dissector_list_t heur_subdissector_list;
static void add_uri (proto_tree *, packet_info *, tvbuff_t *, guint, guint);
@@ -1360,17 +1354,17 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
/* Map extended methods to the main method now the Column info has been written;
* this way we can dissect the extended method PDUs. */
if ((pdut >= 0x50) && (pdut <= 0x5F))
- pdut = GET;
+ pdut = WSP_PDU_GET;
else if ((pdut >= 0x70) && (pdut <= 0x7F))
- pdut = POST;
+ pdut = WSP_PDU_POST;
switch (pdut)
{
- case CONNECT:
- case CONNECTREPLY:
- case RESUME:
+ case WSP_PDU_CONNECT:
+ case WSP_PDU_CONNECTREPLY:
+ case WSP_PDU_RESUME:
if (tree) {
- if (pdut == CONNECT)
+ if (pdut == WSP_PDU_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);
@@ -1387,7 +1381,7 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
offset += count;
ti = proto_tree_add_uint (wsp_tree, hf_wsp_capability_length,tvb,capabilityStart,count,capabilityLength);
- if (pdut != RESUME)
+ if (pdut != WSP_PDU_RESUME)
{
count = 0; /* Initialise count */
headerLength = tvb_get_guintvar (tvb, offset, &count);
@@ -1417,13 +1411,13 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
break;
- case REDIRECT:
+ case WSP_PDU_REDIRECT:
dissect_redirect(tvb, offset, pinfo, wsp_tree,
dissector_handle);
break;
- case DISCONNECT:
- case SUSPEND:
+ case WSP_PDU_DISCONNECT:
+ case WSP_PDU_SUSPEND:
if (tree) {
count = 0; /* Initialise count */
value = tvb_get_guintvar (tvb, offset, &count);
@@ -1431,7 +1425,7 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
break;
- case GET:
+ case WSP_PDU_GET:
count = 0; /* Initialise count */
/* Length of URI and size of URILen field */
value = tvb_get_guintvar (tvb, offset, &count);
@@ -1444,7 +1438,7 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
break;
- case POST:
+ case WSP_PDU_POST:
uriStart = offset;
count = 0; /* Initialise count */
uriLength = tvb_get_guintvar (tvb, offset, &count);
@@ -1477,19 +1471,24 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
offset = nextOffset+headerLength;
}
- /* POST data - First check whether a subdissector exists for the content type */
+ /* WSP_PDU_POST data - First check whether a subdissector exists for the content type */
if (tvb_reported_length_remaining(tvb, headerStart + count + uriLength + headersLength) > 0)
{
tmp_tvb = tvb_new_subset (tvb, headerStart + count + uriLength + headersLength, -1, -1);
/* Try finding a dissector for the content first, then fallback */
- if (!dissector_try_port(wsp_dissector_table, contentType, tmp_tvb, pinfo, tree))
- if (!dissector_try_heuristic(heur_subdissector_list, tmp_tvb, pinfo, tree))
- if (tree) /* Only display if needed */
- add_post_data (wsp_tree, tmp_tvb, contentType, contentTypeStr);
+ if (!dissector_try_port(wsp_dissector_table,
+ contentType, tmp_tvb, pinfo, tree))
+ if (!dissector_try_string(wsp_dissector_table_text,
+ contentTypeStr, tmp_tvb, pinfo, tree))
+ if (!dissector_try_heuristic(heur_subdissector_list,
+ tmp_tvb, pinfo, tree))
+ if (tree) /* Only display if needed */
+ add_post_data (wsp_tree, tmp_tvb,
+ contentType, contentTypeStr);
}
break;
- case REPLY:
+ case WSP_PDU_REPLY:
count = 0; /* Initialise count */
headersLength = tvb_get_guintvar (tvb, offset+1, &count);
headerStart = offset + count + 1;
@@ -1523,21 +1522,26 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
offset += count+headersLength+1;
}
- /* REPLY data - First check whether a subdissector exists for the content type */
+ /* WSP_PDU_REPLY data - First check whether a subdissector exists for the content type */
if (tvb_reported_length_remaining(tvb, headerStart + headersLength) > 0)
{
tmp_tvb = tvb_new_subset (tvb, headerStart + headersLength, -1, -1);
/* Try finding a dissector for the content first, then fallback */
- if (!dissector_try_port(wsp_dissector_table, contentType, tmp_tvb, pinfo, tree))
- if (!dissector_try_heuristic(heur_subdissector_list, tmp_tvb, pinfo, tree))
- if (tree) /* Only display if needed */
- ti = proto_tree_add_item (wsp_tree, hf_wsp_reply_data,
- tmp_tvb, 0, -1, bo_little_endian);
+ if (!dissector_try_port(wsp_dissector_table,
+ contentType, tmp_tvb, pinfo, tree))
+ if (!dissector_try_string(wsp_dissector_table_text,
+ contentTypeStr, tmp_tvb, pinfo, tree))
+ if (!dissector_try_heuristic(heur_subdissector_list,
+ tmp_tvb, pinfo, tree))
+ if (tree) /* Only display if needed */
+ ti = proto_tree_add_item (wsp_tree,
+ hf_wsp_reply_data,
+ tmp_tvb, 0, -1, bo_little_endian);
}
break;
- case PUSH:
- case CONFIRMEDPUSH:
+ case WSP_PDU_PUSH:
+ case WSP_PDU_CONFIRMEDPUSH:
count = 0; /* Initialise count */
headersLength = tvb_get_guintvar (tvb, offset, &count);
headerStart = offset + count;
@@ -1564,16 +1568,21 @@ dissect_wsp_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
}
offset += headersLength;
}
- /* PUSH data - First check whether a subdissector exists for the content type */
+ /* WSP_PDU_PUSH data - First check whether a subdissector exists for the content type */
if (tvb_reported_length_remaining(tvb, headerStart + headersLength) > 0)
{
tmp_tvb = tvb_new_subset (tvb, headerStart + headersLength, -1, -1);
/* Try finding a dissector for the content first, then fallback */
- if (!dissector_try_port(wsp_dissector_table, contentType, tmp_tvb, pinfo, tree))
- if (!dissector_try_heuristic(heur_subdissector_list, tmp_tvb, pinfo, tree))
- if (tree) /* Only display if needed */
- ti = proto_tree_add_item (wsp_tree, hf_wsp_push_data,
- tmp_tvb, 0, -1, bo_little_endian);
+ if (!dissector_try_port(wsp_dissector_table,
+ contentType, tmp_tvb, pinfo, tree))
+ if (!dissector_try_string(wsp_dissector_table_text,
+ contentTypeStr, tmp_tvb, pinfo, tree))
+ if (!dissector_try_heuristic(heur_subdissector_list,
+ tmp_tvb, pinfo, tree))
+ if (tree) /* Only display if needed */
+ ti = proto_tree_add_item (wsp_tree,
+ hf_wsp_push_data,
+ tmp_tvb, 0, -1, bo_little_endian);
}
break;
@@ -3299,7 +3308,7 @@ add_capabilities (proto_tree *tree, tvbuff_t *tvb, int type)
case 0x05 : /* Extended Methods */
offsetStr = offset;
offset++;
- add_capability_vals(tvb, (type == CONNECT),
+ add_capability_vals(tvb, (type == WSP_PDU_CONNECT),
offsetStr, length, capabilitiesStart,
valString, sizeof valString);
proto_tree_add_string(wsp_capabilities, hf_wsp_capabilities_extended_methods, tvb, capabilitiesStart, length+1, valString);
@@ -3307,7 +3316,7 @@ add_capabilities (proto_tree *tree, tvbuff_t *tvb, int type)
case 0x06 : /* Header Code Pages */
offsetStr = offset;
offset++;
- add_capability_vals(tvb, (type == CONNECT),
+ add_capability_vals(tvb, (type == WSP_PDU_CONNECT),
offsetStr, length, capabilitiesStart,
valString, sizeof valString);
proto_tree_add_string(wsp_capabilities, hf_wsp_capabilities_header_code_pages, tvb, capabilitiesStart, length+1, valString);
@@ -5322,8 +5331,14 @@ proto_register_wsp(void)
register_dissector("wsp-co", dissect_wsp_fromwap_co, proto_wsp);
register_dissector("wsp-cl", dissect_wsp_fromwap_cl, proto_wsp);
- wsp_dissector_table = register_dissector_table("wsp.content_type.type",
- "WSP content type", FT_UINT8, BASE_HEX);
+ wsp_dissector_table = register_dissector_table(
+ "wsp.content_type.integer",
+ "WSP content type (well-known integer value)",
+ FT_UINT32, BASE_HEX);
+ wsp_dissector_table_text = register_dissector_table(
+ "wsp.content_type.literal",
+ "WSP content type (textual value)",
+ FT_STRING, BASE_NONE);
register_heur_dissector_list("wsp", &heur_subdissector_list);
wsp_fromudp_handle = create_dissector_handle(dissect_wsp_fromudp,