Apparently bit 0x80 of a SAMR domain handle is the permission to look
[metze/wireshark/wip.git] / packet-igrp.c
index 6b2ad76e94ae9f3c9f0fce8adad3560563db0c20..bd2462900d7348f1309defd246db260e7337b681 100644 (file)
@@ -1,25 +1,25 @@
 /* packet-igrp.c
  * Routines for IGRP dissection
  * Copyright 2000, Paul Ionescu <paul@acorp.ro>
- * 
- * $Id: packet-igrp.c,v 1.4 2001/01/09 06:31:36 guy Exp $
+ *
+ * $Id: packet-igrp.c,v 1.13 2002/08/28 21:00:17 jmayer Exp $
  *
  * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@zing.org>
+ * By Gerald Combs <gerald@ethereal.com>
  * Copyright 1998 Gerald Combs
  *
  * Copied from packet-syslog.c
- * 
+ *
  * 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.
@@ -35,9 +35,9 @@
 
 #include <string.h>
 #include <glib.h>
-#include "packet.h"
+#include <epan/packet.h>
+#include "ipproto.h"
 
-#define IP_PROTO_IGRP 9
 #define IGRP_HEADER_LENGTH 12
 #define IGRP_ENTRY_LENGTH 14
 
@@ -58,45 +58,43 @@ static void dissect_igrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
   guint16 as,net1,net2,net3;
   proto_item *ti;
   proto_tree *igrp_tree, *igrp_vektor_tree;
-  tvbuff_t   *next_tvb; 
-  
-  CHECK_DISPLAY_AS_DATA(proto_igrp, tvb, pinfo, tree);
+  tvbuff_t   *next_tvb;
+
+  if (check_col(pinfo->cinfo, COL_PROTOCOL))
+    col_set_str(pinfo->cinfo, COL_PROTOCOL, "IGRP");
+  if (check_col(pinfo->cinfo, COL_INFO))
+    col_clear(pinfo->cinfo, COL_INFO);
 
-  pinfo->current_proto = "IGRP";
-  
   ver_and_opcode = tvb_get_guint8(tvb,0);
   update        = tvb_get_guint8(tvb,1);
   as            = tvb_get_ntohs(tvb,2);
-  
-  
-  if (check_col(pinfo->fd, COL_PROTOCOL)) 
-    col_set_str(pinfo->fd, COL_PROTOCOL, "IGRP");
-    
-  if (check_col(pinfo->fd, COL_INFO)) {
+
+
+  if (check_col(pinfo->cinfo, COL_INFO)) {
     switch (ver_and_opcode) {
     case 0x11:
-       col_add_fstr(pinfo->fd, COL_INFO, "Response" );
+       col_add_fstr(pinfo->cinfo, COL_INFO, "Response" );
        break;
     case 0x12:
-       col_add_fstr(pinfo->fd, COL_INFO, "Request" );
+       col_add_fstr(pinfo->cinfo, COL_INFO, "Request" );
         break;
-    default:           
-        col_add_fstr(pinfo->fd, COL_INFO, "Unknown version or opcode"); 
+    default:
+        col_add_fstr(pinfo->cinfo, COL_INFO, "Unknown version or opcode");
     }
   }
 
 
 
-  
+
   if (tree) {
-      ti = proto_tree_add_protocol_format(tree, proto_igrp, tvb, 0,
-        tvb_length(tvb), "Cisco IGRP ");
-        
+      ti = proto_tree_add_protocol_format(tree, proto_igrp, tvb, 0, -1,
+        "Cisco IGRP");
+
       igrp_tree = proto_item_add_subtree(ti, ett_igrp);
-      
+
       version = (ver_and_opcode&0xf0)>>4 ; /* version is the fist half of the byte */
       opcode = ver_and_opcode&0x0f ;       /* opcode is the last half of the byte */
-      
+
       proto_tree_add_text(igrp_tree,  tvb, 0,1,"IGRP Version  : %d %s",version,(version==1?" ":" -  Unknown Version, The dissection may be innacurate"));
       proto_tree_add_text(igrp_tree,  tvb, 0,1,"Command       : %d %s",opcode,(opcode==1?"(Response)":"(Request)"));
       proto_tree_add_uint(igrp_tree, hf_igrp_update, tvb, 1,1, update);
@@ -108,7 +106,7 @@ static void dissect_igrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
       /* this is a ugly hack to find the first byte of the IP source address */
       network = pinfo->net_src.data[0];
-      
+
       ti = proto_tree_add_text(igrp_tree,  tvb, 4,2,"Interior routes : %d",net1);
        for( ; net1>0 ; net1-- )
        {
@@ -157,21 +155,21 @@ static void dissect_vektor_igrp (tvbuff_t *tvb, proto_tree *igrp_vektor_tree, gu
        if (network==0) ptr_addr=&addr[1];
 
        ti = proto_tree_add_text (igrp_vektor_tree, tvb, 0 ,14,
-         "Entry for network %s", ip_to_str(ptr_addr)) ; 
+         "Entry for network %s", ip_to_str(ptr_addr)) ;
        igrp_vektor_tree =  proto_item_add_subtree(ti,ett_igrp_net);
-       proto_tree_add_text (igrp_vektor_tree, tvb, 0 ,3,"Network     = %s",ip_to_str(ptr_addr)) ; 
-       proto_tree_add_text (igrp_vektor_tree, tvb, 3 ,3,"Delay       = %d",tvb_get_ntoh24(tvb,3)) ; 
-       proto_tree_add_text (igrp_vektor_tree, tvb, 6 ,3,"Bandwidth   = %d",tvb_get_ntoh24(tvb,6)) ; 
-       proto_tree_add_text (igrp_vektor_tree, tvb, 9 ,2,"MTU         = %d  bytes",tvb_get_ntohs(tvb,9)) ; 
-       proto_tree_add_text (igrp_vektor_tree, tvb, 11,1,"Reliability = %d",tvb_get_guint8(tvb,11)) ; 
-       proto_tree_add_text (igrp_vektor_tree, tvb, 12,1,"Load        = %d",tvb_get_guint8(tvb,12)) ; 
-       proto_tree_add_text (igrp_vektor_tree, tvb, 13,1,"Hop count   = %d  hops",tvb_get_guint8(tvb,13)) ; 
-}      
-
+       proto_tree_add_text (igrp_vektor_tree, tvb, 0 ,3,"Network     = %s",ip_to_str(ptr_addr)) ;
+       proto_tree_add_text (igrp_vektor_tree, tvb, 3 ,3,"Delay       = %d",tvb_get_ntoh24(tvb,3)) ;
+       proto_tree_add_text (igrp_vektor_tree, tvb, 6 ,3,"Bandwidth   = %d",tvb_get_ntoh24(tvb,6)) ;
+       proto_tree_add_text (igrp_vektor_tree, tvb, 9 ,2,"MTU         = %d  bytes",tvb_get_ntohs(tvb,9)) ;
+       proto_tree_add_text (igrp_vektor_tree, tvb, 11,1,"Reliability = %d",tvb_get_guint8(tvb,11)) ;
+       proto_tree_add_text (igrp_vektor_tree, tvb, 12,1,"Load        = %d",tvb_get_guint8(tvb,12)) ;
+       proto_tree_add_text (igrp_vektor_tree, tvb, 13,1,"Hop count   = %d  hops",tvb_get_guint8(tvb,13)) ;
+}
+
+
 /* Register the protocol with Ethereal */
 void proto_register_igrp(void)
-{                 
+{
 
   /* Setup list of header fields */
   static hf_register_info hf[] = {
@@ -179,12 +177,12 @@ void proto_register_igrp(void)
     { &hf_igrp_update,
       { "Update Release",           "igrp.update",
       FT_UINT8, BASE_DEC, NULL, 0x0 ,
-      "Update Release number" },
+      "Update Release number", HFILL }
     },
     { &hf_igrp_as,
       { "Autonomous System",           "igrp.as",
       FT_UINT16, BASE_DEC, NULL, 0x0 ,
-      "Autonomous System number" }
+      "Autonomous System number", HFILL }
     }
   };
 
@@ -207,7 +205,10 @@ void proto_register_igrp(void)
 void
 proto_reg_handoff_igrp(void)
 {
-  dissector_add("ip.proto", IP_PROTO_IGRP , dissect_igrp, proto_igrp);
+  dissector_handle_t igrp_handle;
+
+  igrp_handle = create_dissector_handle(dissect_igrp, proto_igrp);
+  dissector_add("ip.proto", IP_PROTO_IGRP, igrp_handle);
 }
 
 /*     IGRP Packet structure:
@@ -219,7 +220,7 @@ HEADER structure is 12 bytes as follows :
 
 4  bits                Version (only version 1 is defined)
 4  bits                Opcode (1=Replay, 2=Request)
-8  bits                Update Release 
+8  bits                Update Release
 16 bits                Autonomous system number
 16 bits                Number of Interior routes
 16 bits                Number of System routes