Use "tvb_get_ntohieee_float()" to fetch floating-point numbers.
[obnox/wireshark/wip.git] / packet-mip.c
index 505061407c9ebd7617691a0f4686f2380a8f5787..fee40ead6ac411be0a05a88b5360605cef43eac6 100644 (file)
@@ -2,7 +2,7 @@
  * Routines for Mobile IP dissection
  * Copyright 2000, Stefan Raab <sraab@cisco.com>
  *
- * $Id: packet-mip.c,v 1.24 2001/12/10 00:25:30 guy Exp $
+ * $Id: packet-mip.c,v 1.27 2002/01/24 09:20:49 guy Exp $
  *
  * Ethereal - Network traffic analyzer
  * By Gerald Combs <gerald@ethereal.com>
@@ -46,7 +46,7 @@
 # include "snprintf.h"
 #endif
 
-#include "packet.h"
+#include <epan/packet.h>
 
 /* Initialize the protocol and registered fields */
 static int proto_mip = -1;
@@ -68,7 +68,6 @@ static int hf_mip_ident = -1;
 static int hf_mip_ext_type = -1;
 static int hf_mip_ext_stype = -1;
 static int hf_mip_ext_len = -1;
-static int hf_mip_ext_len2 = -1;
 static int hf_mip_ext = -1;
 static int hf_mip_aext_spi = -1;
 static int hf_mip_aext_auth = -1;
@@ -167,7 +166,8 @@ static const value_string mip_ext_stypes[]= {
 };
 /* Code to dissect extensions */
 static void
-dissect_mip_extensions( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+dissect_mip_extensions( tvbuff_t *tvb, int offset, packet_info *pinfo,
+                       proto_tree *tree)
 {
   proto_item   *ti;
   proto_tree   *exts_tree=NULL;
@@ -175,22 +175,17 @@ dissect_mip_extensions( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
   size_t        ext_len;
   guint8        ext_type;
   guint8        ext_subtype=0;
-  size_t        offset = 0;
-  gchar         ext_data[256];
-  size_t        dataLength;
   size_t        hdrLen;
 
   /* None of this really matters if we don't have a tree */
   if (!tree) return;
 
   /* Add our tree, if we have extensions */
-  ti = proto_tree_add_text(tree, tvb, offset,
-               tvb_length(tvb)-offset, "Extensions");
+  ti = proto_tree_add_text(tree, tvb, offset, -1, "Extensions");
   exts_tree = proto_item_add_subtree(ti, ett_mip_exts);
 
-  /* And, handle each extensions */
-  dataLength = tvb_length(tvb);
-  while (offset < dataLength) {
+  /* And, handle each extension */
+  while (tvb_reported_length_remaining(tvb, offset) > 0) {
 
        /* Get our extension info */
        ext_type = tvb_get_guint8(tvb, offset);
@@ -207,14 +202,6 @@ dissect_mip_extensions( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
          hdrLen = 2;
        }
        
-       /* If everything seems valid, make a tree for it, and update length */
-       if ((offset + ext_len + hdrLen) > dataLength) {
-         /* Ut-Oh . . . we're done after this one */
-         g_warning("Invalid MIP extension.  Length (%d) greater than remaining data (%d)",
-                               ext_len, (dataLength - (offset + hdrLen)));
-         ext_len = dataLength - (offset + hdrLen); /* Fudge it */
-       }
-
        ti = proto_tree_add_text(exts_tree, tvb, offset, ext_len + hdrLen,
                                 "Extension: %s",
                                 val_to_str(ext_type, mip_ext_types,
@@ -250,7 +237,7 @@ dissect_mip_extensions( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
           */
          proto_tree_add_uint(ext_tree, hf_mip_ext_stype, tvb, offset, 1, ext_subtype);
          offset++;
-         proto_tree_add_uint(ext_tree, hf_mip_ext_len2, tvb, offset, 2, ext_len);
+         proto_tree_add_uint(ext_tree, hf_mip_ext_len, tvb, offset, 2, ext_len);
          offset+=2;
          /* SPI */
          proto_tree_add_item(ext_tree, hf_mip_aext_spi, tvb, offset, 4, FALSE);
@@ -266,10 +253,8 @@ dissect_mip_extensions( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        case MF_CHALLENGE_EXT:  /* RFC 3012 */
          /* The default dissector is good here.  The challenge is all hex anyway. */
        default:
-         tvb_memcpy(tvb, (guint8*)ext_data, offset, MIN(ext_len,
-                    (dataLength - (offset + 2))));
-         proto_tree_add_bytes(ext_tree, hf_mip_ext, tvb, offset, ext_len,
-                                                  ext_data);
+         proto_tree_add_item(ext_tree, hf_mip_ext, tvb, offset, ext_len, FALSE);
+         break;
        } /* ext type */
 
        offset += ext_len;
@@ -309,7 +294,7 @@ dissect_mip( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
                                   ip_to_str(tvb_get_ptr(tvb,12,4)));
        
        if (tree) {
-         ti = proto_tree_add_item(tree, proto_mip, tvb, offset, tvb_length(tvb), FALSE);
+         ti = proto_tree_add_item(tree, proto_mip, tvb, offset, -1, FALSE);
          mip_tree = proto_item_add_subtree(ti, ett_mip);
          
          /* type */
@@ -361,7 +346,7 @@ dissect_mip( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
        
        if (tree) {
          /* Add Subtree */
-         ti = proto_tree_add_item(tree, proto_mip, tvb, offset, tvb_length(tvb), FALSE);
+         ti = proto_tree_add_item(tree, proto_mip, tvb, offset, -1, FALSE);
          mip_tree = proto_item_add_subtree(ti, ett_mip);
          
          /* Type */
@@ -395,13 +380,8 @@ dissect_mip( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
   } /* End switch */
 
   if (tree) {
-       dataRemaining = tvb_length(tvb) - offset;
-       if (dataRemaining > 0) {
-         extensions_tvb = tvb_new_subset(tvb, offset, dataRemaining,
-                                                                         dataRemaining);
-         
-         dissect_mip_extensions(extensions_tvb, pinfo, mip_tree);
-       }
+       if (tvb_offset_exists(tvb, offset))
+         dissect_mip_extensions(tvb, offset, pinfo, mip_tree);
   }
 } /* dissect_mip */
 
@@ -500,11 +480,6 @@ void proto_register_mip(void)
          },
          { &hf_mip_ext_len,
                 { "Extension Length",         "mip.ext.len",
-                       FT_UINT8, BASE_DEC, NULL, 0,
-                       "Mobile IP Extension Length.", HFILL }
-         },
-         { &hf_mip_ext_len2,
-                { "Extension Length",         "mip.ext.len2",
                        FT_UINT16, BASE_DEC, NULL, 0,
                        "Mobile IP Extension Length.", HFILL }
          },