aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packet-sdp.c234
1 files changed, 169 insertions, 65 deletions
diff --git a/packet-sdp.c b/packet-sdp.c
index 99240dd013..22759f182f 100644
--- a/packet-sdp.c
+++ b/packet-sdp.c
@@ -4,7 +4,7 @@
* Jason Lango <jal@netapp.com>
* Liberally copied from packet-http.c, by Guy Harris <guy@alum.mit.edu>
*
- * $Id: packet-sdp.c,v 1.21 2001/12/10 00:25:34 guy Exp $
+ * $Id: packet-sdp.c,v 1.22 2001/12/13 21:49:22 hagbard Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -40,6 +40,27 @@
static int proto_sdp = -1;
+static int hf_protocol_version = -1;
+static int hf_owner = -1;
+static int hf_session_name = -1;
+static int hf_session_info = -1;
+static int hf_uri = -1;
+static int hf_email = -1;
+static int hf_phone = -1;
+static int hf_connection_info = -1;
+static int hf_bandwidth = -1;
+static int hf_time_zone = -1;
+static int hf_encryption_key = -1;
+static int hf_session_attribute = -1;
+static int hf_media_attribute = -1;
+static int hf_time = -1;
+static int hf_repeat_time = -1;
+static int hf_media = -1;
+static int hf_media_title = -1;
+static int hf_unknown = -1;
+static int hf_misplaced = -1;
+static int hf_invalid = -1;
+
static int ett_sdp = -1;
static void
@@ -48,15 +69,14 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
proto_tree *sdp_tree;
proto_item *ti;
gint offset = 0;
- const u_char *line;
gint next_offset;
int linelen;
u_char section;
u_char type;
- const u_char *value;
- int valuelen;
- const char *typename;
+ u_char delim;
int datalen;
+ int tokenoffset;
+ int hf = -1;
/*
* As RFC 2327 says, "SDP is purely a format for session
@@ -104,90 +124,96 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
if (linelen < 2)
break;
- line = tvb_get_ptr(tvb, offset, next_offset - offset);
- type = line[0];
- if (line[1] != '=') {
- proto_tree_add_text(sdp_tree, tvb, offset,
- next_offset - offset,
- "Invalid line: %s",
- tvb_format_text(tvb, offset, next_offset - offset));
+ type = tvb_get_guint8(tvb,offset);
+ delim = tvb_get_guint8(tvb,offset + 1);
+ if (delim != '=') {
+ proto_tree_add_string(sdp_tree,hf_invalid,tvb, offset,
+ linelen,
+ tvb_format_text(tvb,
+ offset,linelen));
offset = next_offset;
continue;
}
- value = line + 2;
- valuelen = linelen - 2;
/*
* Attributes.
*/
switch (type) {
case 'v':
+ hf = hf_protocol_version;
section = 'v';
- typename = "Session Description, version";
break;
case 'o':
- typename = "Owner/Creator, Session Id";
+ hf = hf_owner;
break;
case 's':
- typename = "Session Name";
+ hf = hf_session_name;
break;
case 'i':
- if (section == 'v')
- typename = "Session Information";
- else if (section == 'm')
- typename = "Media Title";
- else
- typename = "Misplaced";
+ if (section == 'v'){
+ hf = hf_session_info;
+ }
+ else if (section == 'm'){
+ hf = hf_media_title;
+ }
+ else{
+ hf = hf_misplaced;
+ }
break;
case 'u':
- typename = "URI of Description";
+ hf = hf_uri;
break;
case 'e':
- typename = "E-mail Address";
+ hf = hf_email;
break;
case 'p':
- typename = "Phone Number";
+ hf = hf_phone;
break;
case 'c':
- typename = "Connection Information";
+ hf = hf_connection_info;
break;
case 'b':
- typename = "Bandwidth Information";
+ hf = hf_bandwidth;
break;
case 't':
+ hf = hf_time;
section = 't';
- typename = "Time Description, active time";
break;
case 'r':
- typename = "Repeat Time";
+ hf = hf_repeat_time;
break;
case 'm':
+ hf = hf_media;
section = 'm';
- typename = "Media Description, name and address";
break;
case 'k':
- typename = "Encryption Key";
+ hf = hf_encryption_key;
break;
case 'a':
- if (section == 'v')
- typename = "Session Attribute";
- else if (section == 'm')
- typename = "Media Attribute";
- else
- typename = "Misplaced";
+ if (section == 'v'){
+ hf = hf_session_attribute;
+ }
+ else if (section == 'm'){
+ hf = hf_media_attribute;
+ }
+ else{
+ hf = hf_misplaced;
+ }
break;
case 'z':
- typename = "Time Zone Adjustment";
+ hf = hf_time_zone;
break;
default:
- typename = "Unknown";
+ hf = hf_unknown;
break;
}
-
- proto_tree_add_text(sdp_tree, tvb, offset,
- next_offset - offset,
- "%s (%c): %s", typename, type,
- format_text(value, valuelen));
+ tokenoffset = 2;
+ if( hf == hf_unknown || hf == hf_misplaced )
+ tokenoffset = 0;
+ proto_tree_add_string(sdp_tree,hf,tvb, offset,
+ linelen,
+ tvb_format_text(tvb,offset+tokenoffset,
+ linelen - tokenoffset));
offset = next_offset;
}
@@ -201,24 +227,102 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
void
proto_register_sdp(void)
{
-/* static hf_register_info hf[] = {
- { &variable,
- { "Name", "sdp.abbreviation", TYPE, VALS_POINTER }},
- };*/
- static gint *ett[] = {
- &ett_sdp,
- };
-
- proto_sdp = proto_register_protocol("Session Description Protocol",
- "SDP", "sdp");
- /* proto_register_field_array(proto_sdp, hf, array_length(hf));*/
- proto_register_subtree_array(ett, array_length(ett));
-
- /*
- * Register the dissector by name, so other dissectors can
- * grab it by name rather than just referring to it directly
- * (you can't refer to it directly from a plugin dissector
- * on Windows without stuffing it into the Big Transfer Vector).
- */
- register_dissector("sdp", dissect_sdp, proto_sdp);
+ static hf_register_info hf[] = {
+ { &hf_protocol_version,
+ { "Session Description (v), version",
+ "sdp.version", FT_STRING, BASE_NONE,NULL,0x0,
+ "Session Description, version", HFILL }},
+ { &hf_owner,
+ { "Owner/Creator, Session Id (o)",
+ "sdp.owner", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Owner/Creator, Session Id", HFILL}},
+ { &hf_session_name,
+ { "Session Name (s)",
+ "sdp.session_name", FT_STRING, BASE_NONE,NULL, 0x0,
+ "Session Name", HFILL }},
+ { &hf_session_info,
+ { "Session Information (i)",
+ "sdp.session_info", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Session Information", HFILL }},
+ { &hf_uri,
+ { "URI of Description (u)",
+ "sdp.uri", FT_STRING, BASE_NONE,NULL, 0x0,
+ "URI of Description", HFILL }},
+ { &hf_email,
+ { "E-mail Address (e)",
+ "sdp.email", FT_STRING, BASE_NONE, NULL, 0x0,
+ "E-mail Address", HFILL }},
+ { &hf_phone,
+ { "Phone Number (p)",
+ "sdp.phone", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Phone Number", HFILL }},
+ { &hf_connection_info,
+ { "Connection Information (c)",
+ "sdp.connection_info", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Connection Information", HFILL }},
+ { &hf_bandwidth,
+ { "Bandwidth Information (b)",
+ "sdp.bandwidth", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Bandwidth Information", HFILL }},
+ { &hf_time_zone,
+ { "Time Zone Adjustments (z)",
+ "sdp.timezone", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Time Zone Adjustments", HFILL }},
+ { &hf_encryption_key,
+ { "Encryption Key (k)",
+ "sdp.encryption_key", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Encryption Key", HFILL }},
+ { &hf_session_attribute,
+ { "Session Attribute (a)",
+ "sdp.session_attr", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Session Attribute", HFILL }},
+ { &hf_session_attribute,
+ { "Media Attribute (a)",
+ "sdp.media_attr", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Session Attribute", HFILL }},
+ { &hf_time,
+ { "Time Description, active time (t)",
+ "sdp.time", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Time Description, active time", HFILL }},
+ { &hf_repeat_time,
+ { "Repeat Time (r)",
+ "sdp.repeat_time", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Repeat Time", HFILL }},
+ { &hf_media,
+ { "Media Description, name and address (m)",
+ "sdp.media", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Media Description, name and address", HFILL }},
+ { &hf_media_title,
+ { "Media Title (i)",
+ "sdp.media_title",FT_STRING, BASE_NONE, NULL, 0x0,
+ "Media Title", HFILL }},
+ { &hf_unknown,
+ { "Unknown",
+ "sdp.unknown",FT_STRING, BASE_NONE, NULL, 0x0,
+ "Unknown", HFILL }},
+ { &hf_misplaced,
+ { "Misplaced",
+ "sdp.misplaced",FT_STRING, BASE_NONE, NULL, 0x0,
+ "Misplaced", HFILL }},
+ { &hf_invalid,
+ { "Invalid line",
+ "sdp.invalid",FT_STRING, BASE_NONE, NULL, 0x0,
+ "Invalid line", HFILL }},
+ };
+ static gint *ett[] = {
+ &ett_sdp,
+ };
+
+ proto_sdp = proto_register_protocol("Session Description Protocol",
+ "SDP", "sdp");
+ proto_register_field_array(proto_sdp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ /*
+ * Register the dissector by name, so other dissectors can
+ * grab it by name rather than just referring to it directly
+ * (you can't refer to it directly from a plugin dissector
+ * on Windows without stuffing it into the Big Transfer Vector).
+ */
+ register_dissector("sdp", dissect_sdp, proto_sdp);
}