diff options
-rw-r--r-- | packet-sdp.c | 234 |
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); } |