diff options
Diffstat (limited to 'epan/dissectors/packet-coseventcomm.c')
-rw-r--r-- | epan/dissectors/packet-coseventcomm.c | 519 |
1 files changed, 519 insertions, 0 deletions
diff --git a/epan/dissectors/packet-coseventcomm.c b/epan/dissectors/packet-coseventcomm.c new file mode 100644 index 00000000..e7ad24a9 --- /dev/null +++ b/epan/dissectors/packet-coseventcomm.c @@ -0,0 +1,519 @@ +/* packet-coseventcomm.c + * + * Routines for IDL dissection + * + * Autogenerated from idl2wrs + * Copyright 2001 Frank Singleton <frank.singleton@ericsson.com> + */ + + +/* + * Wireshark - Network traffic analyzer + * By Gerald Combs <gerald@wireshark.org> + * Copyright 1998 Gerald Combs + */ + +/* + * SPDX-License-Identifier: GPL-2.0-or-later + */ + + +#include "config.h" + +#include <string.h> +#include <epan/packet.h> +#include <epan/proto.h> +#include "packet-giop.h" +#include <epan/expert.h> + +#include "ws_diag_control.h" +#include "ws_compiler_tests.h" + +#ifdef _MSC_VER +/* disable warning: "unreference local variable" */ +#pragma warning(disable:4101) +#endif + +/* XXX this should be autogenerated, or the warnings fixed in the generator */ +DIAG_OFF(unused-function) +DIAG_OFF(unused-variable) +#if WS_IS_AT_LEAST_GNUC_VERSION(6,0) +DIAG_OFF(unused-const-variable) +#endif + +void proto_register_giop_coseventcomm(void); +void proto_reg_handoff_giop_coseventcomm(void); + +/* Initialise the protocol and subtree pointers */ +static int proto_coseventcomm = -1; +static gint ett_coseventcomm = -1; + + +/* Initialise the initial Alignment */ +static guint32 boundary = GIOP_HEADER_SIZE; /* initial value */ + +static int hf_operationrequest = -1;/* Request_Operation field */ + + /* Operation filters */ +static int hf_CosEventComm_PullSupplier_try_pull_has_event = -1; + /* User exception filters */ + /* Expert info filters */ +static expert_field ei_coseventcomm_unknown_giop_msg = EI_INIT; +static expert_field ei_coseventcomm_unknown_exception = EI_INIT; +static expert_field ei_coseventcomm_unknown_reply_status = EI_INIT; + + +static proto_tree *start_dissecting(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int *offset); + + +/* Begin Exception Helper Functions */ + + + +/* End Exception Helper Functions */ + +/* + * Main delegator for exception handling + * + */ +static gboolean +decode_user_exception(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *ptree _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + proto_tree *tree _U_; + + if (!header->exception_id) + return FALSE; + + + return FALSE; /* user exception not found */ +} + +/* + * IDL:omg.org/CosEventComm/PushConsumer/push:1.0 + */ +static void +decode_CosEventComm_PushConsumer_push(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + get_CDR_any(tvb, pinfo, tree, item, offset, stream_is_big_endian, boundary, header); + + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + /* Function returns void */ + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * IDL:omg.org/CosEventComm/PushConsumer/disconnect_push_consumer:1.0 + */ +static void +decode_CosEventComm_PushConsumer_disconnect_push_consumer(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + /* Function returns void */ + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * IDL:omg.org/CosEventComm/PushSupplier/disconnect_push_supplier:1.0 + */ +static void +decode_CosEventComm_PushSupplier_disconnect_push_supplier(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + /* Function returns void */ + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * IDL:omg.org/CosEventComm/PullSupplier/pull:1.0 + */ +static void +decode_CosEventComm_PullSupplier_pull(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + get_CDR_any(tvb, pinfo, tree, item, offset, stream_is_big_endian, boundary, header); + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * IDL:omg.org/CosEventComm/PullSupplier/try_pull:1.0 + */ +static void +decode_CosEventComm_PullSupplier_try_pull(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + get_CDR_any(tvb, pinfo, tree, item, offset, stream_is_big_endian, boundary, header); + + proto_tree_add_boolean(tree, hf_CosEventComm_PullSupplier_try_pull_has_event, tvb, *offset-1, 1, get_CDR_boolean(tvb,offset)); + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * IDL:omg.org/CosEventComm/PullSupplier/disconnect_pull_supplier:1.0 + */ +static void +decode_CosEventComm_PullSupplier_disconnect_pull_supplier(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + /* Function returns void */ + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * IDL:omg.org/CosEventComm/PullConsumer/disconnect_pull_consumer:1.0 + */ +static void +decode_CosEventComm_PullConsumer_disconnect_pull_consumer(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, proto_item *item _U_, int *offset _U_, MessageHeader *header, const gchar *operation _U_, gboolean stream_is_big_endian _U_) +{ + switch(header->message_type) { + case Request: + break; + case Reply: + switch(header->rep_status) { + case NO_EXCEPTION: + /* Function returns void */ + + break; + case USER_EXCEPTION: + break; + default: + /* Unknown Exception */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status); + break; + } /* switch(header->rep_status) */ + + break; + default: + /* Unknown GIOP Message */ + expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type); + break; + } /* switch(header->message_type) */ +} + +/* + * Called once we accept the packet as being for us; it sets the + * Protocol and Info columns and creates the top-level protocol + * tree item. + */ +static proto_tree * +start_dissecting(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int *offset) +{ + + proto_item *ti = NULL; + proto_tree *tree = NULL; /* init later, inside if(tree) */ + + col_set_str(pinfo->cinfo, COL_PROTOCOL, "COSEVENTCOMM"); + + /* + * Do not clear COL_INFO, as nothing is being written there by + * this dissector yet. So leave it as is from the GIOP dissector. + * TODO: add something useful to COL_INFO + * col_clear(pinfo->cinfo, COL_INFO); + */ + + if (ptree) { + ti = proto_tree_add_item(ptree, proto_coseventcomm, tvb, *offset, tvb_reported_length_remaining(tvb, *offset), ENC_NA); + tree = proto_item_add_subtree(ti, ett_coseventcomm); + } + return tree; +} + +static proto_item* +process_RequestOperation(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, MessageHeader *header, const gchar *operation) +{ + proto_item *pi; + if(header->message_type == Reply) { + /* fill-up info column */ + col_append_fstr(pinfo->cinfo, COL_INFO, " op = %s",operation); + } + /* fill-up the field */ + pi=proto_tree_add_string(ptree, hf_operationrequest, tvb, 0, 0, operation); + proto_item_set_generated(pi); + return pi; +} + +static gboolean +dissect_coseventcomm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int *offset, MessageHeader *header, const gchar *operation, gchar *idlname) +{ + proto_item *item _U_; + proto_tree *tree _U_; + gboolean stream_is_big_endian = is_big_endian(header); /* get endianess */ + + /* If we have a USER Exception, then decode it and return */ + if ((header->message_type == Reply) && (header->rep_status == USER_EXCEPTION)) { + return decode_user_exception(tvb, pinfo, ptree, offset, header, operation, stream_is_big_endian); + } + + switch(header->message_type) { + + case Request: + case Reply: + + if (strcmp(operation, "push") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PushConsumer") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PushConsumer_push(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + if (strcmp(operation, "disconnect_push_consumer") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PushConsumer") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PushConsumer_disconnect_push_consumer(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + if (strcmp(operation, "disconnect_push_supplier") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PushSupplier") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PushSupplier_disconnect_push_supplier(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + if (strcmp(operation, "pull") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PullSupplier") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PullSupplier_pull(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + if (strcmp(operation, "try_pull") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PullSupplier") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PullSupplier_try_pull(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + if (strcmp(operation, "disconnect_pull_supplier") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PullSupplier") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PullSupplier_disconnect_pull_supplier(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + if (strcmp(operation, "disconnect_pull_consumer") == 0 + && (!idlname || strcmp(idlname, "CosEventComm/PullConsumer") == 0)) { + item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */ + tree = start_dissecting(tvb, pinfo, ptree, offset); + decode_CosEventComm_PullConsumer_disconnect_pull_consumer(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian); + return TRUE; + } + + break; + + case CancelRequest: + case LocateRequest: + case LocateReply: + case CloseConnection: + case MessageError: + case Fragment: + return FALSE; /* not handled yet */ + + default: + return FALSE; /* not handled yet */ + + } /* switch */ + + + return FALSE; + +} /* End of main dissector */ + + +/* Register the protocol with Wireshark */ +void proto_register_giop_coseventcomm(void) +{ + /* setup list of header fields */ + static hf_register_info hf[] = { + /* field that indicates the currently ongoing request/reply exchange */ + {&hf_operationrequest, {"Request_Operation","giop-coseventcomm.Request_Operation",FT_STRING,BASE_NONE,NULL,0x0,NULL,HFILL}}, + /* Operation filters */ + {&hf_CosEventComm_PullSupplier_try_pull_has_event, {"has_event","giop-coseventcomm.PullSupplier.try_pull.has_event",FT_BOOLEAN,8,NULL,0x01,NULL,HFILL}}, + /* Attribute filters */ + /* Struct filters */ + /* User exception filters */ + /* Union filters */ + + }; + + static ei_register_info ei[] = { + { &ei_coseventcomm_unknown_giop_msg, { "giop-coseventcomm.unknown_giop_msg", PI_PROTOCOL, PI_WARN, "Unknown GIOP message", EXPFILL }}, + { &ei_coseventcomm_unknown_exception, { "giop-coseventcomm.unknown_exception", PI_PROTOCOL, PI_WARN, "Unknown exception", EXPFILL }}, + { &ei_coseventcomm_unknown_reply_status, { "giop-coseventcomm.unknown_reply_status", PI_PROTOCOL, PI_WARN, "Unknown reply status", EXPFILL }}, + }; + + /* setup protocol subtree array */ + + static gint *ett[] = { + &ett_coseventcomm, + }; + + expert_module_t* expert_coseventcomm; + + + /* Register the protocol name and description */ + proto_coseventcomm = proto_register_protocol("Coseventcomm Dissector Using GIOP API" , "COSEVENTCOMM", "giop-coseventcomm" ); + proto_register_field_array(proto_coseventcomm, hf, array_length(hf)); + proto_register_subtree_array(ett, array_length(ett)); + + expert_coseventcomm = expert_register_protocol(proto_coseventcomm); + expert_register_field_array(expert_coseventcomm, ei, array_length(ei)); +} + +/* register me as handler for these interfaces */ +void proto_reg_handoff_giop_coseventcomm(void) +{ + /* Register for Explicit Dissection */ + register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PullConsumer", proto_coseventcomm ); /* explicit dissector */ + + /* Register for Explicit Dissection */ + register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PullSupplier", proto_coseventcomm ); /* explicit dissector */ + + /* Register for Explicit Dissection */ + register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PushConsumer", proto_coseventcomm ); /* explicit dissector */ + + /* Register for Explicit Dissection */ + register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PushSupplier", proto_coseventcomm ); /* explicit dissector */ + + /* Register for Heuristic Dissection */ + register_giop_user(dissect_coseventcomm, "COSEVENTCOMM" ,proto_coseventcomm); /* heuristic dissector */ + +} + +/* + * Editor modelines - https://www.wireshark.org/tools/modelines.html + * + * Local Variables: + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil + * End: + * + * ex: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: + */ |