summaryrefslogtreecommitdiff
path: root/asn1/dap/packet-dap-template.c
diff options
context:
space:
mode:
authorGraeme Lunt <graeme.lunt@smhs.co.uk>2007-12-15 15:21:25 +0000
committerGraeme Lunt <graeme.lunt@smhs.co.uk>2007-12-15 15:21:25 +0000
commit9c6ac3835fa68a9dfb9779c55dd3260bffc30590 (patch)
treeca6741ca6915aa66bcce5b87256b922113d32fe8 /asn1/dap/packet-dap-template.c
parent7a5f960bb72daedc7d34fa813e309e40adfd02d8 (diff)
downloadwireshark-9c6ac3835fa68a9dfb9779c55dd3260bffc30590.tar.gz
Revised DAP dissector using latest asn2wrs features (requiring fewer changes the ASN.1 module) and table-driven operations.
svn path=/trunk/; revision=23875
Diffstat (limited to 'asn1/dap/packet-dap-template.c')
-rw-r--r--asn1/dap/packet-dap-template.c220
1 files changed, 17 insertions, 203 deletions
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");