1 /* packet-coseventcomm.c
2 *
3 * Routines for IDL dissection
4 *
5 * Autogenerated from idl2wrs
6 * Copyright 2001 Frank Singleton <frank.singleton@ericsson.com>
7 */
8
9
10 /*
11 * Wireshark - Network traffic analyzer
12 * By Gerald Combs <gerald@wireshark.org>
13 * Copyright 1998 Gerald Combs
14 */
15
16 /*
17 * SPDX-License-Identifier: GPL-2.0-or-later
18 */
19
20
21 #include "config.h"
22
23 #include <string.h>
24 #include <epan/packet.h>
25 #include <epan/proto.h>
26 #include <epan/dissectors/packet-giop.h>
27 #include <epan/expert.h>
28
29 #include "ws_diag_control.h"
30 #include "ws_compiler_tests.h"
31
32 #ifdef _MSC_VER
33 /* disable warning: "unreference local variable" */
34 #pragma warning(disable:4101)
35 #endif
36
37 /* XXX this should be autogenerated, or the warnings fixed in the generator */
38 DIAG_OFF(unused-function)
39 DIAG_OFF(unused-variable)
40 #if WS_IS_AT_LEAST_GNUC_VERSION(6,0)
41 DIAG_OFF(unused-const-variable)
42 #endif
43
44 void proto_register_giop_coseventcomm(void);
45 void proto_reg_handoff_giop_coseventcomm(void);
46
47 /* Initialise the protocol and subtree pointers */
48 static int proto_coseventcomm = -1;
49 static gint ett_coseventcomm = -1;
50
51
52 /* Initialise the initial Alignment */
53 static guint32 boundary = GIOP_HEADER_SIZE; /* initial value */
54
55 static int hf_operationrequest = -1;/* Request_Operation field */
56
57 /* Operation filters */
58 static int hf_CosEventComm_PullSupplier_try_pull_has_event = -1;
59 /* User exception filters */
60 /* Expert info filters */
61 static expert_field ei_coseventcomm_unknown_giop_msg = EI_INIT;
62 static expert_field ei_coseventcomm_unknown_exception = EI_INIT;
63 static expert_field ei_coseventcomm_unknown_reply_status = EI_INIT;
64
65
66 static proto_tree *start_dissecting(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int *offset);
67
68
69 /* Begin Exception Helper Functions */
70
71
72
73 /* End Exception Helper Functions */
74
75 /*
76 * Main delegator for exception handling
77 *
78 */
79 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_)80 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_)
81 {
82 proto_tree *tree _U_;
83
84 if (!header->exception_id)
85 return FALSE;
86
87
88 return FALSE; /* user exception not found */
89 }
90
91 /*
92 * IDL:omg.org/CosEventComm/PushConsumer/push:1.0
93 */
94 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_)95 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_)
96 {
97 switch(header->message_type) {
98 case Request:
99 get_CDR_any(tvb, pinfo, tree, item, offset, stream_is_big_endian, boundary, header);
100
101 break;
102 case Reply:
103 switch(header->rep_status) {
104 case NO_EXCEPTION:
105 /* Function returns void */
106
107 break;
108 case USER_EXCEPTION:
109 break;
110 default:
111 /* Unknown Exception */
112 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
113 break;
114 } /* switch(header->rep_status) */
115
116 break;
117 default:
118 /* Unknown GIOP Message */
119 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
120 break;
121 } /* switch(header->message_type) */
122 }
123
124 /*
125 * IDL:omg.org/CosEventComm/PushConsumer/disconnect_push_consumer:1.0
126 */
127 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_)128 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_)
129 {
130 switch(header->message_type) {
131 case Request:
132 break;
133 case Reply:
134 switch(header->rep_status) {
135 case NO_EXCEPTION:
136 /* Function returns void */
137
138 break;
139 case USER_EXCEPTION:
140 break;
141 default:
142 /* Unknown Exception */
143 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
144 break;
145 } /* switch(header->rep_status) */
146
147 break;
148 default:
149 /* Unknown GIOP Message */
150 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
151 break;
152 } /* switch(header->message_type) */
153 }
154
155 /*
156 * IDL:omg.org/CosEventComm/PushSupplier/disconnect_push_supplier:1.0
157 */
158 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_)159 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_)
160 {
161 switch(header->message_type) {
162 case Request:
163 break;
164 case Reply:
165 switch(header->rep_status) {
166 case NO_EXCEPTION:
167 /* Function returns void */
168
169 break;
170 case USER_EXCEPTION:
171 break;
172 default:
173 /* Unknown Exception */
174 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
175 break;
176 } /* switch(header->rep_status) */
177
178 break;
179 default:
180 /* Unknown GIOP Message */
181 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
182 break;
183 } /* switch(header->message_type) */
184 }
185
186 /*
187 * IDL:omg.org/CosEventComm/PullSupplier/pull:1.0
188 */
189 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_)190 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_)
191 {
192 switch(header->message_type) {
193 case Request:
194 break;
195 case Reply:
196 switch(header->rep_status) {
197 case NO_EXCEPTION:
198 get_CDR_any(tvb, pinfo, tree, item, offset, stream_is_big_endian, boundary, header);
199
200 break;
201 case USER_EXCEPTION:
202 break;
203 default:
204 /* Unknown Exception */
205 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
206 break;
207 } /* switch(header->rep_status) */
208
209 break;
210 default:
211 /* Unknown GIOP Message */
212 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
213 break;
214 } /* switch(header->message_type) */
215 }
216
217 /*
218 * IDL:omg.org/CosEventComm/PullSupplier/try_pull:1.0
219 */
220 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_)221 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_)
222 {
223 switch(header->message_type) {
224 case Request:
225 break;
226 case Reply:
227 switch(header->rep_status) {
228 case NO_EXCEPTION:
229 get_CDR_any(tvb, pinfo, tree, item, offset, stream_is_big_endian, boundary, header);
230
231 proto_tree_add_boolean(tree, hf_CosEventComm_PullSupplier_try_pull_has_event, tvb, *offset-1, 1, get_CDR_boolean(tvb,offset));
232
233 break;
234 case USER_EXCEPTION:
235 break;
236 default:
237 /* Unknown Exception */
238 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
239 break;
240 } /* switch(header->rep_status) */
241
242 break;
243 default:
244 /* Unknown GIOP Message */
245 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
246 break;
247 } /* switch(header->message_type) */
248 }
249
250 /*
251 * IDL:omg.org/CosEventComm/PullSupplier/disconnect_pull_supplier:1.0
252 */
253 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_)254 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_)
255 {
256 switch(header->message_type) {
257 case Request:
258 break;
259 case Reply:
260 switch(header->rep_status) {
261 case NO_EXCEPTION:
262 /* Function returns void */
263
264 break;
265 case USER_EXCEPTION:
266 break;
267 default:
268 /* Unknown Exception */
269 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
270 break;
271 } /* switch(header->rep_status) */
272
273 break;
274 default:
275 /* Unknown GIOP Message */
276 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
277 break;
278 } /* switch(header->message_type) */
279 }
280
281 /*
282 * IDL:omg.org/CosEventComm/PullConsumer/disconnect_pull_consumer:1.0
283 */
284 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_)285 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_)
286 {
287 switch(header->message_type) {
288 case Request:
289 break;
290 case Reply:
291 switch(header->rep_status) {
292 case NO_EXCEPTION:
293 /* Function returns void */
294
295 break;
296 case USER_EXCEPTION:
297 break;
298 default:
299 /* Unknown Exception */
300 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_exception, "Unknown exception %d", header->rep_status);
301 break;
302 } /* switch(header->rep_status) */
303
304 break;
305 default:
306 /* Unknown GIOP Message */
307 expert_add_info_format(pinfo, item, &ei_coseventcomm_unknown_giop_msg, "Unknown GIOP message %d", header->message_type);
308 break;
309 } /* switch(header->message_type) */
310 }
311
312 /*
313 * Called once we accept the packet as being for us; it sets the
314 * Protocol and Info columns and creates the top-level protocol
315 * tree item.
316 */
317 static proto_tree *
start_dissecting(tvbuff_t * tvb,packet_info * pinfo,proto_tree * ptree,int * offset)318 start_dissecting(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int *offset)
319 {
320
321 proto_item *ti = NULL;
322 proto_tree *tree = NULL; /* init later, inside if(tree) */
323
324 col_set_str(pinfo->cinfo, COL_PROTOCOL, "COSEVENTCOMM");
325
326 /*
327 * Do not clear COL_INFO, as nothing is being written there by
328 * this dissector yet. So leave it as is from the GIOP dissector.
329 * TODO: add something useful to COL_INFO
330 * col_clear(pinfo->cinfo, COL_INFO);
331 */
332
333 if (ptree) {
334 ti = proto_tree_add_item(ptree, proto_coseventcomm, tvb, *offset, tvb_reported_length_remaining(tvb, *offset), ENC_NA);
335 tree = proto_item_add_subtree(ti, ett_coseventcomm);
336 }
337 return tree;
338 }
339
340 static proto_item*
process_RequestOperation(tvbuff_t * tvb,packet_info * pinfo,proto_tree * ptree,MessageHeader * header,const gchar * operation)341 process_RequestOperation(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, MessageHeader *header, const gchar *operation)
342 {
343 proto_item *pi;
344 if(header->message_type == Reply) {
345 /* fill-up info column */
346 col_append_fstr(pinfo->cinfo, COL_INFO, " op = %s",operation);
347 }
348 /* fill-up the field */
349 pi=proto_tree_add_string(ptree, hf_operationrequest, tvb, 0, 0, operation);
350 proto_item_set_generated(pi);
351 return pi;
352 }
353
354 static gboolean
dissect_coseventcomm(tvbuff_t * tvb,packet_info * pinfo,proto_tree * ptree,int * offset,MessageHeader * header,const gchar * operation,gchar * idlname)355 dissect_coseventcomm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *ptree, int *offset, MessageHeader *header, const gchar *operation, gchar *idlname)
356 {
357 proto_item *item _U_;
358 proto_tree *tree _U_;
359 gboolean stream_is_big_endian = is_big_endian(header); /* get endianess */
360
361 /* If we have a USER Exception, then decode it and return */
362 if ((header->message_type == Reply) && (header->rep_status == USER_EXCEPTION)) {
363 return decode_user_exception(tvb, pinfo, ptree, offset, header, operation, stream_is_big_endian);
364 }
365
366 switch(header->message_type) {
367
368 case Request:
369 case Reply:
370
371 if (strcmp(operation, "push") == 0
372 && (!idlname || strcmp(idlname, "CosEventComm/PushConsumer") == 0)) {
373 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
374 tree = start_dissecting(tvb, pinfo, ptree, offset);
375 decode_CosEventComm_PushConsumer_push(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
376 return TRUE;
377 }
378
379 if (strcmp(operation, "disconnect_push_consumer") == 0
380 && (!idlname || strcmp(idlname, "CosEventComm/PushConsumer") == 0)) {
381 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
382 tree = start_dissecting(tvb, pinfo, ptree, offset);
383 decode_CosEventComm_PushConsumer_disconnect_push_consumer(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
384 return TRUE;
385 }
386
387 if (strcmp(operation, "disconnect_push_supplier") == 0
388 && (!idlname || strcmp(idlname, "CosEventComm/PushSupplier") == 0)) {
389 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
390 tree = start_dissecting(tvb, pinfo, ptree, offset);
391 decode_CosEventComm_PushSupplier_disconnect_push_supplier(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
392 return TRUE;
393 }
394
395 if (strcmp(operation, "pull") == 0
396 && (!idlname || strcmp(idlname, "CosEventComm/PullSupplier") == 0)) {
397 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
398 tree = start_dissecting(tvb, pinfo, ptree, offset);
399 decode_CosEventComm_PullSupplier_pull(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
400 return TRUE;
401 }
402
403 if (strcmp(operation, "try_pull") == 0
404 && (!idlname || strcmp(idlname, "CosEventComm/PullSupplier") == 0)) {
405 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
406 tree = start_dissecting(tvb, pinfo, ptree, offset);
407 decode_CosEventComm_PullSupplier_try_pull(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
408 return TRUE;
409 }
410
411 if (strcmp(operation, "disconnect_pull_supplier") == 0
412 && (!idlname || strcmp(idlname, "CosEventComm/PullSupplier") == 0)) {
413 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
414 tree = start_dissecting(tvb, pinfo, ptree, offset);
415 decode_CosEventComm_PullSupplier_disconnect_pull_supplier(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
416 return TRUE;
417 }
418
419 if (strcmp(operation, "disconnect_pull_consumer") == 0
420 && (!idlname || strcmp(idlname, "CosEventComm/PullConsumer") == 0)) {
421 item = process_RequestOperation(tvb, pinfo, ptree, header, operation); /* fill-up Request_Operation field & info column */
422 tree = start_dissecting(tvb, pinfo, ptree, offset);
423 decode_CosEventComm_PullConsumer_disconnect_pull_consumer(tvb, pinfo, tree, item, offset, header, operation, stream_is_big_endian);
424 return TRUE;
425 }
426
427 break;
428
429 case CancelRequest:
430 case LocateRequest:
431 case LocateReply:
432 case CloseConnection:
433 case MessageError:
434 case Fragment:
435 return FALSE; /* not handled yet */
436
437 default:
438 return FALSE; /* not handled yet */
439
440 } /* switch */
441
442
443 return FALSE;
444
445 } /* End of main dissector */
446
447
448 /* Register the protocol with Wireshark */
proto_register_giop_coseventcomm(void)449 void proto_register_giop_coseventcomm(void)
450 {
451 /* setup list of header fields */
452 static hf_register_info hf[] = {
453 /* field that indicates the currently ongoing request/reply exchange */
454 {&hf_operationrequest, {"Request_Operation","giop-coseventcomm.Request_Operation",FT_STRING,BASE_NONE,NULL,0x0,NULL,HFILL}},
455 /* Operation filters */
456 {&hf_CosEventComm_PullSupplier_try_pull_has_event, {"has_event","giop-coseventcomm.PullSupplier.try_pull.has_event",FT_BOOLEAN,8,NULL,0x01,NULL,HFILL}},
457 /* Attribute filters */
458 /* Struct filters */
459 /* User exception filters */
460 /* Union filters */
461
462 };
463
464 static ei_register_info ei[] = {
465 { &ei_coseventcomm_unknown_giop_msg, { "giop-coseventcomm.unknown_giop_msg", PI_PROTOCOL, PI_WARN, "Unknown GIOP message", EXPFILL }},
466 { &ei_coseventcomm_unknown_exception, { "giop-coseventcomm.unknown_exception", PI_PROTOCOL, PI_WARN, "Unknown exception", EXPFILL }},
467 { &ei_coseventcomm_unknown_reply_status, { "giop-coseventcomm.unknown_reply_status", PI_PROTOCOL, PI_WARN, "Unknown reply status", EXPFILL }},
468 };
469
470 /* setup protocol subtree array */
471
472 static gint *ett[] = {
473 &ett_coseventcomm,
474 };
475
476 expert_module_t* expert_coseventcomm;
477
478
479 /* Register the protocol name and description */
480 proto_coseventcomm = proto_register_protocol("Coseventcomm Dissector Using GIOP API" , "COSEVENTCOMM", "giop-coseventcomm" );
481 proto_register_field_array(proto_coseventcomm, hf, array_length(hf));
482 proto_register_subtree_array(ett, array_length(ett));
483
484 expert_coseventcomm = expert_register_protocol(proto_coseventcomm);
485 expert_register_field_array(expert_coseventcomm, ei, array_length(ei));
486 }
487
488 /* register me as handler for these interfaces */
proto_reg_handoff_giop_coseventcomm(void)489 void proto_reg_handoff_giop_coseventcomm(void)
490 {
491 /* Register for Explicit Dissection */
492 register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PullConsumer", proto_coseventcomm ); /* explicit dissector */
493
494 /* Register for Explicit Dissection */
495 register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PullSupplier", proto_coseventcomm ); /* explicit dissector */
496
497 /* Register for Explicit Dissection */
498 register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PushConsumer", proto_coseventcomm ); /* explicit dissector */
499
500 /* Register for Explicit Dissection */
501 register_giop_user_module(dissect_coseventcomm, "COSEVENTCOMM", "CosEventComm/PushSupplier", proto_coseventcomm ); /* explicit dissector */
502
503 /* Register for Heuristic Dissection */
504 register_giop_user(dissect_coseventcomm, "COSEVENTCOMM" ,proto_coseventcomm); /* heuristic dissector */
505
506 }
507
508 /*
509 * Editor modelines - https://www.wireshark.org/tools/modelines.html
510 *
511 * Local Variables:
512 * c-basic-offset: 4
513 * tab-width: 8
514 * indent-tabs-mode: nil
515 * End:
516 *
517 * ex: set shiftwidth=4 tabstop=8 expandtab:
518 * :indentSize=4:tabSize=8:noTabs=true:
519 */
520