From 9c6ac3835fa68a9dfb9779c55dd3260bffc30590 Mon Sep 17 00:00:00 2001 From: Graeme Lunt Date: Sat, 15 Dec 2007 15:21:25 +0000 Subject: Revised DAP dissector using latest asn2wrs features (requiring fewer changes the ASN.1 module) and table-driven operations. svn path=/trunk/; revision=23875 --- asn1/dap/packet-dap-template.c | 220 ++++------------------------------------- 1 file changed, 17 insertions(+), 203 deletions(-) (limited to 'asn1/dap/packet-dap-template.c') diff --git a/asn1/dap/packet-dap-template.c b/asn1/dap/packet-dap-template.c index 6d1cc51f7a..aa1d0128c4 100644 --- a/asn1/dap/packet-dap-template.c +++ b/asn1/dap/packet-dap-template.c @@ -74,203 +74,24 @@ static struct SESSION_DATA_STRUCTURE* session = NULL; static gint ett_dap = -1; #include "packet-dap-ett.c" +#include "packet-dap-val.h" + +#include "packet-dap-table.c" /* operation and error codes */ + #include "packet-dap-fn.c" -/* -* Dissect DAP PDUs inside a ROS PDUs -*/ -static void -dissect_dap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) -{ - int offset = 0; - int old_offset; - proto_item *item=NULL; - proto_tree *tree=NULL; - int (*dap_dissector)(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_) = NULL; - char *dap_op_name; - asn1_ctx_t asn1_ctx; - - asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo); - - /* do we have operation information from the ROS dissector? */ - if( !pinfo->private_data ){ - if(parent_tree){ - proto_tree_add_text(parent_tree, tvb, offset, -1, - "Internal error: can't get operation information from ROS dissector."); - } - return ; - } else { - session = ( (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data) ); - } - - if(parent_tree){ - item = proto_tree_add_item(parent_tree, proto_dap, tvb, 0, -1, FALSE); - tree = proto_item_add_subtree(item, ett_dap); - } - if (check_col(pinfo->cinfo, COL_PROTOCOL)) - col_set_str(pinfo->cinfo, COL_PROTOCOL, "DAP"); - if (check_col(pinfo->cinfo, COL_INFO)) - col_clear(pinfo->cinfo, COL_INFO); - - switch(session->ros_op & ROS_OP_MASK) { - case (ROS_OP_BIND | ROS_OP_ARGUMENT): /* BindInvoke */ - dap_dissector = dissect_dap_DirectoryBindArgument; - dap_op_name = "Bind-Argument"; - break; - case (ROS_OP_BIND | ROS_OP_RESULT): /* BindResult */ - dap_dissector = dissect_dap_DirectoryBindResult; - dap_op_name = "Bind-Result"; - break; - case (ROS_OP_BIND | ROS_OP_ERROR): /* BindError */ - dap_dissector = dissect_dap_DirectoryBindError; - dap_op_name = "Bind-Error"; - break; - case (ROS_OP_INVOKE | ROS_OP_ARGUMENT): /* Invoke Argument */ - switch(session->ros_op & ROS_OP_OPCODE_MASK) { - case 1: /* read */ - dap_dissector = dissect_dap_ReadArgument; - dap_op_name = "Read-Argument"; - break; - case 2: /* compare */ - dap_dissector = dissect_dap_CompareArgument; - dap_op_name = "Compare-Argument"; - break; - case 3: /* abandon */ - dap_dissector = dissect_dap_AbandonArgument; - dap_op_name = "Abandon-Argument"; - break; - case 4: /* list */ - dap_dissector = dissect_dap_ListArgument; - dap_op_name = "List-Argument"; - break; - case 5: /* search */ - dap_dissector = dissect_dap_SearchArgument; - dap_op_name = "Search-Argument"; - break; - case 6: /* addEntry */ - dap_dissector = dissect_dap_AddEntryArgument; - dap_op_name = "Add-Entry-Argument"; - break; - case 7: /* removeEntry */ - dap_dissector = dissect_dap_RemoveEntryArgument; - dap_op_name = "Remove-Entry-Argument"; - break; - case 8: /* modifyEntry */ - dap_dissector = dissect_dap_ModifyEntryArgument; - dap_op_name = "Modify-Entry-Argument"; - break; - case 9: /* modifyDN */ - dap_dissector = dissect_dap_ModifyDNArgument; - dap_op_name = "Modify-DN-Argument"; - break; - default: - proto_tree_add_text(tree, tvb, offset, -1,"Unsupported DAP opcode (%d)", - session->ros_op & ROS_OP_OPCODE_MASK); - break; - } - break; - case (ROS_OP_INVOKE | ROS_OP_RESULT): /* Return Result */ - switch(session->ros_op & ROS_OP_OPCODE_MASK) { - case 1: /* read */ - dap_dissector = dissect_dap_ReadResult; - dap_op_name = "Read-Result"; - break; - case 2: /* compare */ - dap_dissector = dissect_dap_CompareResult; - dap_op_name = "Compare-Result"; - break; - case 3: /* abandon */ - dap_dissector = dissect_dap_AbandonResult; - dap_op_name = "Abandon-Result"; - break; - case 4: /* list */ - dap_dissector = dissect_dap_ListResult; - dap_op_name = "List-Result"; - break; - case 5: /* search */ - dap_dissector = dissect_dap_SearchResult; - dap_op_name = "Search-Result"; - break; - case 6: /* addEntry */ - dap_dissector = dissect_dap_AddEntryResult; - dap_op_name = "Add-Entry-Result"; - break; - case 7: /* removeEntry */ - dap_dissector = dissect_dap_RemoveEntryResult; - dap_op_name = "Remove-Entry-Result"; - break; - case 8: /* modifyEntry */ - dap_dissector = dissect_dap_ModifyEntryResult; - dap_op_name = "Modify-Entry-Result"; - break; - case 9: /* modifyDN */ - dap_dissector = dissect_dap_ModifyDNResult; - dap_op_name = "Modify-DN-Result"; - break; - default: - proto_tree_add_text(tree, tvb, offset, -1,"Unsupported DAP opcode"); - break; - } - break; - case (ROS_OP_INVOKE | ROS_OP_ERROR): /* Return Error */ - switch(session->ros_op & ROS_OP_OPCODE_MASK) { - case 1: /* attributeError */ - dap_dissector = dissect_dap_AttributeError; - dap_op_name = "Attribute-Error"; - break; - case 2: /* nameError */ - dap_dissector = dissect_dap_NameError; - dap_op_name = "Name-Error"; - break; - case 3: /* serviceError */ - dap_dissector = dissect_dap_ServiceError; - dap_op_name = "Service-Error"; - break; - case 4: /* referral */ - dap_dissector = dissect_dap_Referral; - dap_op_name = "Referral"; - break; - case 5: /* abandoned */ - dap_dissector = dissect_dap_Abandoned; - dap_op_name = "Abandoned"; - break; - case 6: /* securityError */ - dap_dissector = dissect_dap_SecurityError; - dap_op_name = "Security-Error"; - break; - case 7: /* abandonFailed */ - dap_dissector = dissect_dap_AbandonFailedError; - dap_op_name = "Abandon-Failed-Error"; - break; - case 8: /* updateError */ - dap_dissector = dissect_dap_UpdateError; - dap_op_name = "Update-Error"; - break; - default: - proto_tree_add_text(tree, tvb, offset, -1,"Unsupported DAP errcode"); - break; - } - break; - default: - proto_tree_add_text(tree, tvb, offset, -1,"Unsupported DAP PDU"); - return; - } - - if(dap_dissector) { - if (check_col(pinfo->cinfo, COL_INFO)) - col_set_str(pinfo->cinfo, COL_INFO, dap_op_name); - - while (tvb_reported_length_remaining(tvb, offset) > 0){ - old_offset=offset; - offset=(*dap_dissector)(FALSE, tvb, offset, &asn1_ctx, tree, -1); - if(offset == old_offset){ - proto_tree_add_text(tree, tvb, offset, -1,"Internal error, zero-byte DAP PDU"); - offset = tvb_length(tvb); - break; - } - } - } -} +#include "packet-dap-table11.c" /* operation argument/result dissectors */ +#include "packet-dap-table21.c" /* error dissector */ + +static const ros_info_t dap_ros_info = { + "DAP", + &proto_dap, + &ett_dap, + dap_opr_code_string_vals, + dap_opr_tab, + dap_err_code_string_vals, + dap_err_tab +}; /*--- proto_register_dap -------------------------------------------*/ @@ -291,7 +112,6 @@ void proto_register_dap(void) { /* Register protocol */ proto_dap = proto_register_protocol(PNAME, PSNAME, PFNAME); - register_dissector("dap", dissect_dap, proto_dap); /* Register fields and subtrees */ proto_register_field_array(proto_dap, hf, array_length(hf)); @@ -299,11 +119,7 @@ void proto_register_dap(void) { /* Register our configuration options for DAP, particularly our port */ -#ifdef PREFERENCE_GROUPING dap_module = prefs_register_protocol_subtree("OSI/X.500", proto_dap, prefs_register_dap); -#else - dap_module = prefs_register_protocol(proto_dap, prefs_register_dap); -#endif prefs_register_uint_preference(dap_module, "tcp.port", "DAP TCP Port", "Set the port for DAP operations (if other" @@ -326,9 +142,7 @@ void proto_reg_handoff_dap(void) { /* ABSTRACT SYNTAXES */ /* Register DAP with ROS (with no use of RTSE) */ - if((handle = find_dissector("dap"))) { - register_ros_oid_dissector_handle("2.5.9.1", handle, 0, "id-as-directory-access", FALSE); - } + register_ros_protocol_info("2.5.9.1", &dap_ros_info, 0, "id-as-directory-access", FALSE); /* remember the tpkt handler for change in preferences */ tpkt_handle = find_dissector("tpkt"); -- cgit v1.2.1