[Automatic update for 2016-03-13]
[metze/wireshark/wip.git] / asn1 / cmip / packet-cmip-template.c
index a37ae95e5db3312b8ab62bd4c03699c70ec71d87..6ecbaf9918572f467fc2cb35ca7a1dd5b7a1866d 100644 (file)
@@ -2,8 +2,6 @@
  * Routines for X.711 CMIP packet dissection
  *   Ronnie Sahlberg 2004
  *
- * $Id$
- *
  * Wireshark - Network traffic analyzer
  * By Gerald Combs <gerald@wireshark.org>
  * Copyright 1998 Gerald Combs
@@ -25,8 +23,8 @@
 
 #include "config.h"
 
-#include <glib.h>
 #include <epan/packet.h>
+#include <epan/expert.h>
 #include <epan/oids.h>
 #include <epan/asn1.h>
 
@@ -62,6 +60,8 @@ static int hf_ObjectClass = -1;
 static gint ett_cmip = -1;
 #include "packet-cmip-ett.c"
 
+static expert_field ei_wrong_spdu_type = EI_INIT;
+
 static guint32 opcode;
 
 /* Dissector table */
@@ -75,21 +75,8 @@ static int opcode_type;
 #define OPCODE_RETURN_ERROR  3
 #define OPCODE_REJECT        4
 
-static int attributeform;
-#define ATTRIBUTE_LOCAL_FORM  0
-#define ATTRIBUTE_GLOBAL_FORM 1
-static int attribute_local_id;
-static const char *attribute_identifier_id;
-
-static const char *attributevalueassertion_id;
-
 static const char *object_identifier_id;
 
-static int objectclassform;
-#define OBJECTCLASS_LOCAL_FORM  0
-#define OBJECTCLASS_GLOBAL_FORM 1
-static const char *objectclass_identifier_id;
-
 #include "packet-cmip-val.h"
 #include "packet-cmip-fn.c"
 
@@ -97,35 +84,31 @@ static const char *objectclass_identifier_id;
 
 
 /* XXX this one should be broken out later and moved into the conformance file */
-static void
-dissect_cmip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
+static int
+dissect_cmip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* data)
 {
-       static struct SESSION_DATA_STRUCTURE* session;
-       proto_item *item = NULL;
-       proto_tree *tree = NULL;
+       struct SESSION_DATA_STRUCTURE* session;
+       proto_item *item;
+       proto_tree *tree;
        asn1_ctx_t asn1_ctx;
        asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
 
-       session = (struct SESSION_DATA_STRUCTURE*)pinfo->private_data;
-
-       /* do we have spdu type from the session dissector?  */
-       if( !session ){
-               proto_tree_add_text(tree, tvb, 0, -1,
-                       "Internal error:can't get spdu type from session dissector.");
-               return;
-       } else {
-               if(session->spdu_type == 0 ) {
-                       proto_tree_add_text(tree, tvb, 0, -1,
-                               "Internal error:wrong spdu type %x from session dissector.",session->spdu_type);
-                       return;
-               }
-       }
+       /* Reject the packet if data is NULL */
+       if (data == NULL)
+               return 0;
+       session = (struct SESSION_DATA_STRUCTURE*)data;
 
-       if(parent_tree){
-               item = proto_tree_add_item(parent_tree, proto_cmip, tvb, 0, -1, ENC_NA);
-               tree = proto_item_add_subtree(item, ett_cmip);
+       if(session->spdu_type == 0 ) {
+               proto_tree_add_expert_format(parent_tree, pinfo, &ei_wrong_spdu_type, tvb, 0, -1,
+                       "Internal error: wrong spdu type %x from session dissector.", session->spdu_type);
+               return 0;
        }
 
+       asn1_ctx.private_data = session;
+
+       item = proto_tree_add_item(parent_tree, proto_cmip, tvb, 0, -1, ENC_NA);
+       tree = proto_item_add_subtree(item, ett_cmip);
+
        col_set_str(pinfo->cinfo, COL_PROTOCOL, "CMIP");
        col_clear(pinfo->cinfo, COL_INFO);
        switch(session->spdu_type){
@@ -145,6 +128,8 @@ dissect_cmip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
                default:
                        ;
        }
+
+       return tvb_captured_length(tvb);
 }
 
 /*--- proto_register_cmip ----------------------------------------------*/
@@ -194,24 +179,36 @@ void proto_register_cmip(void) {
 #include "packet-cmip-ettarr.c"
   };
 
+  static ei_register_info ei[] = {
+     { &ei_wrong_spdu_type, { "cmip.wrong_spdu_type", PI_PROTOCOL, PI_ERROR, "Internal error: wrong spdu type", EXPFILL }},
+  };
+
+  expert_module_t* expert_cmip;
+
   /* Register protocol */
   proto_cmip = proto_register_protocol(PNAME, PSNAME, PFNAME);
+  register_dissector("cmip", dissect_cmip, proto_cmip);
 
   /* Register fields and subtrees */
   proto_register_field_array(proto_cmip, hf, array_length(hf));
   proto_register_subtree_array(ett, array_length(ett));
+  expert_cmip = expert_register_protocol(proto_cmip);
+  expert_register_field_array(expert_cmip, ei, array_length(ei));
+
 #include "packet-cmip-dis-tab.c"
     oid_add_from_string("discriminatorId(1)","2.9.3.2.7.1");
 
-  attribute_id_dissector_table = register_dissector_table("cmip.attribute_id", "CMIP Attribute Id", FT_UINT32, BASE_DEC);
+  attribute_id_dissector_table = register_dissector_table("cmip.attribute_id", "CMIP Attribute Id", FT_UINT32, BASE_DEC, DISSECTOR_TABLE_NOT_ALLOW_DUPLICATE);
 
 }
 
 
 /*--- proto_reg_handoff_cmip -------------------------------------------*/
 void proto_reg_handoff_cmip(void) {
-       register_ber_oid_dissector("2.9.0.0.2", dissect_cmip, proto_cmip, "cmip");
-       register_ber_oid_dissector("2.9.1.1.4", dissect_cmip, proto_cmip, "joint-iso-itu-t(2) ms(9) cmip(1) cmip-pci(1) abstractSyntax(4)");
+       dissector_handle_t cmip_handle = find_dissector("cmip");
+
+       register_ber_oid_dissector_handle("2.9.0.0.2", cmip_handle, proto_cmip, "cmip");
+       register_ber_oid_dissector_handle("2.9.1.1.4", cmip_handle, proto_cmip, "joint-iso-itu-t(2) ms(9) cmip(1) cmip-pci(1) abstractSyntax(4)");
 
        oid_add_from_string("2.9.3.2.3.1","managedObjectClass(3) alarmRecord(1)");
        oid_add_from_string("2.9.3.2.3.2","managedObjectClass(3) attributeValueChangeRecord(2)");