Put "WTP" into the Info column for segmented invoke/result PDUs on which
[obnox/wireshark/wip.git] / packet-sdp.c
index f2344094e2b44e66ab548c2857724c72cda172ee..301785b03c401689e1f41527ad84077d6661edb5 100644 (file)
@@ -4,22 +4,22 @@
  * Jason Lango <jal@netapp.com>
  * Liberally copied from packet-http.c, by Guy Harris <guy@alum.mit.edu>
  *
- * $Id: packet-sdp.c,v 1.31 2002/08/02 23:36:00 jmayer Exp $
+ * $Id: packet-sdp.c,v 1.34 2003/06/12 08:33:29 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
  * Copyright 1998 Gerald Combs
- * 
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
@@ -55,7 +55,6 @@ 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;
 
 /* hf_owner subfields*/
@@ -146,7 +145,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        gint            offset = 0;
        gint            next_offset;
        int             linelen;
-       guchar          section;
+       gboolean        in_media_description;
        guchar          type;
        guchar          delim;
        int             datalen;
@@ -185,7 +184,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        /*
         * Show the SDP message a line at a time.
         */
-       section = 0;
+       in_media_description = FALSE;
        while (tvb_offset_exists(tvb, offset)) {
                /*
                 * Find the end of the line.
@@ -214,7 +213,6 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                switch (type) {
                case 'v':
                        hf = hf_protocol_version;
-                       section = 'v';
                        break;
                case 'o':
                        hf = hf_owner;
@@ -223,14 +221,11 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        hf = hf_session_name;
                        break;
                case 'i':
-                       if (section == 'v'){
-                               hf = hf_session_info;
-                       }
-                       else if (section == 'm'){
+                       if (in_media_description) {
                                hf = hf_media_title;
                        }
                        else{
-                               hf = hf_misplaced;
+                               hf = hf_session_info;
                        }
                        break;
                case 'u':
@@ -250,27 +245,23 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        break;
                case 't':
                        hf = hf_time;
-                       section = 't';
                        break;
                case 'r':
                        hf = hf_repeat_time;
                        break;
                case 'm':
                        hf = hf_media;
-                       section = 'm';
+                       in_media_description = TRUE;
                        break;
                case 'k':
                        hf = hf_encryption_key;
                        break;
                case 'a':
-                       if (section == 'v'){
-                               hf = hf_session_attribute; 
-                       }
-                       else if (section == 'm'){
+                       if (in_media_description) {
                                hf = hf_media_attribute;
                        }
                        else{
-                               hf = hf_misplaced;
+                               hf = hf_session_attribute;
                        }
                        break;
                case 'z':
@@ -281,20 +272,17 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                        break;
                }
                tokenoffset = 2;
-               if( hf == hf_unknown || hf == hf_misplaced )
-                 tokenoffset = 0;
-               string = g_malloc(linelen - tokenoffset + 1);
-               CLEANUP_PUSH(g_free, string);
-               tvb_memcpy(tvb, (guint8 *)string, offset + tokenoffset,
+               if (hf == hf_unknown)
+                       tokenoffset = 0;
+               string = tvb_get_string(tvb, offset + tokenoffset,
                    linelen - tokenoffset);
-               string[linelen - tokenoffset] = '\0';
-               sub_ti = proto_tree_add_string_format(sdp_tree,hf,tvb, offset, 
+               sub_ti = proto_tree_add_string_format(sdp_tree,hf,tvb, offset,
                                               linelen, string,
                                               "%s: %s",
                                               proto_registrar_get_name(hf),
                                               format_text(string,
                                                 linelen - tokenoffset));
-               CLEANUP_CALL_AND_POP;
+               g_free(string);
                call_sdp_subdissector(tvb_new_subset(tvb,offset+tokenoffset,
                                                     linelen-tokenoffset,-1),
                                      hf,sub_ti);
@@ -308,7 +296,7 @@ dissect_sdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        }
 }
 
-static void 
+static void
 call_sdp_subdissector(tvbuff_t *tvb, int hf, proto_tree* ti){
   if(hf == hf_owner){
     dissect_sdp_owner(tvb,ti);
@@ -333,7 +321,7 @@ call_sdp_subdissector(tvbuff_t *tvb, int hf, proto_tree* ti){
   }
 }
 
-static void 
+static void
 dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){
   proto_tree *sdp_owner_tree;
   gint offset,next_offset,tokenlen;
@@ -343,7 +331,7 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){
   tokenlen = 0;
 
   sdp_owner_tree = proto_item_add_subtree(ti,ett_sdp_owner);
-  
+
   /* Find the username */
   next_offset = tvb_find_guint8(tvb,offset,-1,' ');
   if( next_offset == -1 )
@@ -360,7 +348,7 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){
     return;
   tokenlen = next_offset - offset;
 
-  proto_tree_add_item(sdp_owner_tree,hf_owner_sessionid, tvb, 
+  proto_tree_add_item(sdp_owner_tree,hf_owner_sessionid, tvb,
                      offset,tokenlen,FALSE);
   offset = next_offset + 1;
 
@@ -380,17 +368,17 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){
     return;
   tokenlen = next_offset - offset;
 
-  proto_tree_add_item(sdp_owner_tree,hf_owner_network_type, tvb, 
+  proto_tree_add_item(sdp_owner_tree,hf_owner_network_type, tvb,
                      offset,tokenlen,FALSE);
   offset = next_offset + 1;
-  
+
   /* Find the address type */
   next_offset = tvb_find_guint8(tvb,offset,-1,' ');
   if( next_offset == -1 )
     return;
   tokenlen = next_offset - offset;
 
-  proto_tree_add_item(sdp_owner_tree,hf_owner_address_type, tvb, 
+  proto_tree_add_item(sdp_owner_tree,hf_owner_address_type, tvb,
                      offset,tokenlen,FALSE);
   offset = next_offset + 1;
 
@@ -398,7 +386,7 @@ dissect_sdp_owner(tvbuff_t *tvb, proto_item *ti){
   proto_tree_add_item(sdp_owner_tree,hf_owner_address, tvb, offset, -1, FALSE);
 }
 
-static void 
+static void
 dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti){
   proto_tree *sdp_connection_info_tree;
   gint offset,next_offset,tokenlen;
@@ -406,10 +394,10 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti){
   offset = 0;
   next_offset = 0;
   tokenlen = 0;
-  
+
   sdp_connection_info_tree = proto_item_add_subtree(ti,
                                                    ett_sdp_connection_info);
-  
+
   /* Find the network type */
   next_offset = tvb_find_guint8(tvb,offset,-1,' ');
   if( next_offset == -1 )
@@ -417,7 +405,7 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti){
   tokenlen = next_offset - offset;
 
   proto_tree_add_item(sdp_connection_info_tree,
-                     hf_connection_info_network_type,tvb, 
+                     hf_connection_info_network_type,tvb,
                      offset,tokenlen,FALSE);
   offset = next_offset + 1;
 
@@ -428,7 +416,7 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti){
   tokenlen = next_offset - offset;
 
   proto_tree_add_item(sdp_connection_info_tree,
-                     hf_connection_info_address_type,tvb, 
+                     hf_connection_info_address_type,tvb,
                      offset,tokenlen,FALSE);
   offset = next_offset + 1;
 
@@ -440,7 +428,7 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti){
     tokenlen = next_offset - offset;
   }
   proto_tree_add_item(sdp_connection_info_tree,
-                     hf_connection_info_connection_address, tvb, 
+                     hf_connection_info_connection_address, tvb,
                      offset,tokenlen,FALSE);
   if(next_offset != -1){
     offset = next_offset + 1;
@@ -461,11 +449,11 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti){
   }
 }
 
-static void 
+static void
 dissect_sdp_bandwidth(tvbuff_t *tvb, proto_item *ti){
   proto_tree * sdp_bandwidth_tree;
   gint offset, next_offset, tokenlen;
-  
+
   offset = 0;
   next_offset = 0;
   tokenlen = 0;
@@ -477,14 +465,14 @@ dissect_sdp_bandwidth(tvbuff_t *tvb, proto_item *ti){
 
   if( next_offset == -1)
     return;
-  
+
   tokenlen = next_offset - offset;
-  
+
   proto_tree_add_item(sdp_bandwidth_tree, hf_bandwidth_modifier,
                      tvb, offset, tokenlen, FALSE);
 
   offset = next_offset + 1;
-  
+
   proto_tree_add_item(sdp_bandwidth_tree, hf_bandwidth_value,
                      tvb, offset, -1, FALSE);
 
@@ -497,7 +485,7 @@ static void dissect_sdp_time(tvbuff_t *tvb, proto_item* ti){
   offset = 0;
   next_offset = 0;
   tokenlen = 0;
-  
+
   sdp_time_tree = proto_item_add_subtree(ti,ett_sdp_time);
 
   /* get start time */
@@ -522,7 +510,7 @@ static void dissect_sdp_repeat_time(tvbuff_t *tvb, proto_item* ti){
   offset = 0;
   next_offset = 0;
   tokenlen = 0;
-  
+
   sdp_repeat_time_tree = proto_item_add_subtree(ti,ett_sdp_time);
 
   /* get interval */
@@ -556,24 +544,24 @@ static void dissect_sdp_repeat_time(tvbuff_t *tvb, proto_item* ti){
     proto_tree_add_item(sdp_repeat_time_tree, hf_repeat_time_offset,
                        tvb, offset, tokenlen, FALSE);
   } while( next_offset != -1 );
-  
+
 }
-static void 
+static void
 dissect_sdp_timezone(tvbuff_t *tvb, proto_item* ti){
   proto_tree* sdp_timezone_tree;
   gint offset, next_offset, tokenlen;
   offset = 0;
   next_offset = 0;
   tokenlen = 0;
-  
+
   sdp_timezone_tree = proto_item_add_subtree(ti,ett_sdp_timezone);
-  
+
   do{
     next_offset = tvb_find_guint8(tvb,offset,-1,' ');
     if(next_offset == -1)
       break;
     tokenlen = next_offset - offset;
-    
+
     proto_tree_add_item(sdp_timezone_tree,hf_timezone_time,tvb,
                        offset, tokenlen, FALSE);
     offset = next_offset + 1;
@@ -587,7 +575,7 @@ dissect_sdp_timezone(tvbuff_t *tvb, proto_item* ti){
                        offset, tokenlen, FALSE);
     offset = next_offset + 1;
   } while (next_offset != -1);
-    
+
 }
 
 
@@ -607,10 +595,10 @@ static void dissect_sdp_encryption_key(tvbuff_t *tvb, proto_item * ti){
     return;
 
   tokenlen = next_offset - offset;
-  
+
   proto_tree_add_item(sdp_encryption_key_tree,hf_encryption_key_type,
                      tvb, offset, tokenlen, FALSE);
-  
+
   offset = next_offset + 1;
   proto_tree_add_item(sdp_encryption_key_tree,hf_encryption_key_data,
                      tvb, offset, -1, FALSE);
@@ -636,11 +624,11 @@ static void dissect_sdp_session_attribute(tvbuff_t *tvb, proto_item * ti){
     return;
 
   tokenlen = next_offset - offset;
-  
+
   proto_tree_add_item(sdp_session_attribute_tree,
                      hf_session_attribute_field,
                      tvb, offset, tokenlen, FALSE);
-  
+
   offset = next_offset + 1;
   proto_tree_add_item(sdp_session_attribute_tree,
                      hf_session_attribute_value,
@@ -648,7 +636,7 @@ static void dissect_sdp_session_attribute(tvbuff_t *tvb, proto_item * ti){
 
 }
 
-static void 
+static void
 dissect_sdp_media(tvbuff_t *tvb, proto_item *ti){
   proto_tree *sdp_media_tree;
   gint offset, next_offset, tokenlen;
@@ -660,13 +648,13 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti){
   sdp_media_tree = proto_item_add_subtree(ti,ett_sdp_media);
 
   next_offset = tvb_find_guint8(tvb,offset, -1, ' ');
-  
+
   if(next_offset == -1)
     return;
 
   tokenlen = next_offset - offset;
-  
-  proto_tree_add_item(sdp_media_tree, hf_media_media, tvb, 
+
+  proto_tree_add_item(sdp_media_tree, hf_media_media, tvb,
                      offset, tokenlen, FALSE);
 
   offset = next_offset + 1;
@@ -676,11 +664,11 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti){
     return;
   tokenlen = next_offset - offset;
   next_offset = tvb_find_guint8(tvb,offset, tokenlen, '/');
-  
+
   if(next_offset != -1){
     tokenlen = next_offset - offset;
-  
-    proto_tree_add_item(sdp_media_tree, hf_media_port, tvb, 
+
+    proto_tree_add_item(sdp_media_tree, hf_media_port, tvb,
                        offset, tokenlen, FALSE);
     offset = next_offset + 1;
     next_offset = tvb_find_guint8(tvb,offset, -1, ' ');
@@ -692,21 +680,21 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti){
     offset = next_offset + 1;
   } else {
     next_offset = tvb_find_guint8(tvb,offset, -1, ' ');
-    
+
     if(next_offset == -1)
       return;
     tokenlen = next_offset - offset;
-    
+
     proto_tree_add_item(sdp_media_tree, hf_media_port, tvb,
                        offset, tokenlen, FALSE);
     offset = next_offset + 1;
   }
 
   next_offset = tvb_find_guint8(tvb,offset,-1,' ');
-  
+
   if( next_offset == -1)
     return;
-  
+
   tokenlen = next_offset - offset;
 
   proto_tree_add_item(sdp_media_tree, hf_media_proto, tvb,
@@ -715,7 +703,7 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti){
   do{
     offset = next_offset + 1;
     next_offset = tvb_find_guint8(tvb,offset,-1,' ');
-    
+
     if(next_offset == -1){
       tokenlen = -1;   /* End of tvbuff */
     } else {
@@ -745,11 +733,11 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, proto_item * ti){
     return;
 
   tokenlen = next_offset - offset;
-  
+
   proto_tree_add_item(sdp_media_attribute_tree,
                      hf_media_attribute_field,
                      tvb, offset, tokenlen, FALSE);
-  
+
   offset = next_offset + 1;
   proto_tree_add_item(sdp_media_attribute_tree,
                      hf_media_attribute_value,
@@ -765,7 +753,7 @@ proto_register_sdp(void)
       { "Session Description Protocol Version (v)",
        "sdp.version", FT_STRING, BASE_NONE,NULL,0x0,
        "Session Description Protocol Version", HFILL }},
-    { &hf_owner, 
+    { &hf_owner,
       { "Owner/Creator, Session Id (o)",
        "sdp.owner", FT_STRING, BASE_NONE, NULL, 0x0,
        "Owner/Creator, Session Id", HFILL}},
@@ -774,7 +762,7 @@ proto_register_sdp(void)
        "sdp.session_name", FT_STRING, BASE_NONE,NULL, 0x0,
        "Session Name", HFILL }},
     { &hf_session_info,
-      { "Session Information (i)", 
+      { "Session Information (i)",
        "sdp.session_info", FT_STRING, BASE_NONE, NULL, 0x0,
        "Session Information", HFILL }},
     { &hf_uri,
@@ -782,7 +770,7 @@ proto_register_sdp(void)
        "sdp.uri", FT_STRING, BASE_NONE,NULL, 0x0,
        "URI of Description", HFILL }},
     { &hf_email,
-      { "E-mail Address (e)", 
+      { "E-mail Address (e)",
        "sdp.email", FT_STRING, BASE_NONE, NULL, 0x0,
        "E-mail Address", HFILL }},
     { &hf_phone,
@@ -805,12 +793,12 @@ proto_register_sdp(void)
       { "Encryption Key (k)",
        "sdp.encryption_key", FT_STRING, BASE_NONE, NULL, 0x0,
        "Encryption Key", HFILL }},
-    { &hf_session_attribute, 
-      { "Session Attribute (a)", 
+    { &hf_session_attribute,
+      { "Session Attribute (a)",
        "sdp.session_attr", FT_STRING, BASE_NONE, NULL, 0x0,
        "Session Attribute", HFILL }},
-    { &hf_media_attribute, 
-      { "Media Attribute (a)", 
+    { &hf_media_attribute,
+      { "Media Attribute (a)",
        "sdp.media_attr", FT_STRING, BASE_NONE, NULL, 0x0,
        "Media Attribute", HFILL }},
     { &hf_time,
@@ -833,10 +821,6 @@ proto_register_sdp(void)
       { "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,
@@ -888,11 +872,11 @@ proto_register_sdp(void)
     { &hf_bandwidth_modifier,
       { "Bandwidth Modifier",
        "sdp.bandwidth.modifier",FT_STRING, BASE_NONE, NULL, 0x0,
-       "Bandwidth Modifier", HFILL }},    
+       "Bandwidth Modifier", HFILL }},
     { &hf_bandwidth_value,
       { "Bandwidth Value",
        "sdp.bandwidth.value",FT_STRING, BASE_NONE, NULL, 0x0,
-       "Bandwidth Value", HFILL }},    
+       "Bandwidth Value", HFILL }},
     { &hf_time_start,
       { "Session Start Time",
        "sdp.time.start",FT_STRING, BASE_NONE, NULL, 0x0,
@@ -980,12 +964,12 @@ proto_register_sdp(void)
     &ett_sdp_media,
     &ett_sdp_media_attribute,
   };
-  
+
   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