aboutsummaryrefslogtreecommitdiffstats
path: root/asn1/cmip/packet-cmip-template.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2004-11-14 05:12:49 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2004-11-14 05:12:49 +0000
commitede6ed2e8efa502a74213feb3c16b54c09860572 (patch)
tree64f8347287cdc368a6b86ed557fd3e82b9abbcff /asn1/cmip/packet-cmip-template.c
parentbb0cf08d8cb55d61f1f1a8568098562477eff26e (diff)
New protocol for the telco people to play with : CMIP
Only one function is implemented so fat M-Get but it would be trivial to add all the missing ones once there are example captures. svn path=/trunk/; revision=12521
Diffstat (limited to 'asn1/cmip/packet-cmip-template.c')
-rw-r--r--asn1/cmip/packet-cmip-template.c163
1 files changed, 163 insertions, 0 deletions
diff --git a/asn1/cmip/packet-cmip-template.c b/asn1/cmip/packet-cmip-template.c
new file mode 100644
index 0000000000..5eddcc2af9
--- /dev/null
+++ b/asn1/cmip/packet-cmip-template.c
@@ -0,0 +1,163 @@
+/* packet-cmip.c
+ * Routines for X.711 CMIP packet dissection
+ * Ronnie Sahlberg 2004
+ *
+ * $Id: packet-cmip-template.c 12245 2004-10-08 20:28:04Z guy $
+ *
+ * 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glib.h>
+#include <epan/packet.h>
+#include <epan/conversation.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#include "packet-ber.h"
+#include "packet-cmip.h"
+
+#define PNAME "X711 CMIP"
+#define PSNAME "CMIP"
+#define PFNAME "cmip"
+
+/* XXX some stuff we need until we can get rid of it */
+#include "packet-ses.h"
+#include "packet-pres.h"
+
+/* Initialize the protocol and registered fields */
+int proto_cmip = -1;
+#include "packet-cmip-hf.c"
+
+/* Initialize the subtree pointers */
+static gint ett_cmip = -1;
+#include "packet-cmip-ett.c"
+
+static guint32 opcode;
+
+static int opcode_type;
+#define OPCODE_INVOKE 1
+#define OPCODE_RETURN_RESULT 2
+#define OPCODE_RETURN_ERROR 3
+#define OPCODE_REJECT 4
+
+static int attributeform;
+#define ATTRIBUTE_LOCAL_FORM 0
+#define ATTRIBUTE_GLOBAL_FORM 1
+static char attribute_identifier_id[64]; /*64 chars should be long enough? */
+
+static int objectclassform;
+#define OBJECTCLASS_LOCAL_FORM 0
+#define OBJECTCLASS_GLOBAL_FORM 1
+static char objectclass_identifier_id[64]; /*64 chars should be long enough? */
+
+#include "packet-cmip-fn.c"
+
+/* 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 struct SESSION_DATA_STRUCTURE* session = NULL;
+ proto_item *item = NULL;
+ proto_tree *tree = NULL;
+
+
+ /* do we have spdu type from the session dissector? */
+ if( !pinfo->private_data ){
+ if(tree){
+ proto_tree_add_text(tree, tvb, 0, -1,
+ "Internal error:can't get spdu type from session dissector.");
+ return;
+ }
+ } else {
+ session = ( (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data) );
+ if(session->spdu_type == 0 ){
+ if(tree){
+ proto_tree_add_text(tree, tvb, 0, -1,
+ "Internal error:wrong spdu type %x from session dissector.",session->spdu_type);
+ return;
+ }
+ }
+ }
+
+ if(parent_tree){
+ item = proto_tree_add_item(parent_tree, proto_cmip, tvb, 0, -1, FALSE);
+ tree = proto_item_add_subtree(item, ett_cmip);
+ }
+
+ if (check_col(pinfo->cinfo, COL_PROTOCOL))
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, "CMIP");
+ if (check_col(pinfo->cinfo, COL_INFO))
+ col_clear(pinfo->cinfo, COL_INFO);
+ switch(session->spdu_type){
+ case SES_CONNECTION_REQUEST:
+ case SES_CONNECTION_ACCEPT:
+ case SES_DISCONNECT:
+ case SES_FINISH:
+ dissect_cmip_CMIPUserInfo(FALSE,tvb,0,pinfo,tree,-1);
+ break;
+ case SES_ABORT:
+ case SES_REFUSE:
+ dissect_cmip_CMIPAbortInfo(FALSE,tvb,0,pinfo,tree,-1);
+ break;
+ case SES_DATA_TRANSFER:
+ dissect_cmip_ROS(FALSE,tvb,0,pinfo,tree,-1);
+ break;
+ default:
+ ;
+ }
+}
+
+/*--- proto_register_cmip ----------------------------------------------*/
+void proto_register_cmip(void) {
+
+ /* List of fields */
+ static hf_register_info hf[] = {
+#include "packet-cmip-hfarr.c"
+ };
+
+ /* List of subtrees */
+ static gint *ett[] = {
+ &ett_cmip,
+#include "packet-cmip-ettarr.c"
+ };
+
+ /* Register protocol */
+ proto_cmip = proto_register_protocol(PNAME, PSNAME, PFNAME);
+
+ /* Register fields and subtrees */
+ proto_register_field_array(proto_cmip, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+}
+
+
+/*--- proto_reg_handoff_cmip -------------------------------------------*/
+void proto_reg_handoff_cmip(void) {
+ dissector_handle_t cmip_handle;
+
+ /*XXX this to be removed later and shoved into the conformance file */
+ cmip_handle = create_dissector_handle(dissect_cmip,proto_cmip);
+ dissector_add_string("acse.application_context", "2.9.0.0.2", cmip_handle);
+}
+