b16dd08406cb9a6c4c05aa44d83a66e1aa460bfc
[metze/wireshark/wip.git] / epan / dissectors / packet-rtse.c
1 /* Do not modify this file. Changes will be overwritten.                      */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler       */
3 /* packet-rtse.c                                                              */
4 /* ../../tools/asn2wrs.py -b -p rtse -c ./rtse.cnf -s ./packet-rtse-template -D . -O ../../epan/dissectors rtse.asn */
5
6 /* Input file: packet-rtse-template.c */
7
8 #line 1 "../../asn1/rtse/packet-rtse-template.c"
9 /* packet-rtse_asn1.c
10  * Routines for RTSE packet dissection
11  * Graeme Lunt 2005
12  *
13  * $Id$
14  *
15  * Wireshark - Network traffic analyzer
16  * By Gerald Combs <gerald@wireshark.org>
17  * Copyright 1998 Gerald Combs
18  *
19  * This program is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU General Public License
21  * as published by the Free Software Foundation; either version 2
22  * of the License, or (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program; if not, write to the Free Software
31  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32  */
33
34 #include "config.h"
35
36 #include <glib.h>
37 #include <epan/packet.h>
38 #include <epan/conversation.h>
39 #include <epan/prefs.h>
40 #include <epan/reassemble.h>
41 #include <epan/asn1.h>
42 #include <epan/expert.h>
43
44 #include "packet-ber.h"
45 #include "packet-pres.h"
46 #include "packet-acse.h"
47 #include "packet-ros.h"
48 #include "packet-rtse.h"
49
50 #define PNAME  "X.228 OSI Reliable Transfer Service"
51 #define PSNAME "RTSE"
52 #define PFNAME "rtse"
53
54 /* Initialize the protocol and registered fields */
55 static int proto_rtse = -1;
56
57 static struct SESSION_DATA_STRUCTURE* session = NULL;
58
59 static gboolean open_request=FALSE;
60 static guint32 app_proto=0;
61
62 static proto_tree *top_tree=NULL;
63
64 /* Preferences */
65 static gboolean rtse_reassemble = TRUE;
66
67
68 /*--- Included file: packet-rtse-hf.c ---*/
69 #line 1 "../../asn1/rtse/packet-rtse-hf.c"
70 static int hf_rtse_rtorq_apdu = -1;               /* RTORQapdu */
71 static int hf_rtse_rtoac_apdu = -1;               /* RTOACapdu */
72 static int hf_rtse_rtorj_apdu = -1;               /* RTORJapdu */
73 static int hf_rtse_rttp_apdu = -1;                /* RTTPapdu */
74 static int hf_rtse_rttr_apdu = -1;                /* RTTRapdu */
75 static int hf_rtse_rtab_apdu = -1;                /* RTABapdu */
76 static int hf_rtse_checkpointSize = -1;           /* INTEGER */
77 static int hf_rtse_windowSize = -1;               /* INTEGER */
78 static int hf_rtse_dialogueMode = -1;             /* T_dialogueMode */
79 static int hf_rtse_connectionDataRQ = -1;         /* ConnectionData */
80 static int hf_rtse_applicationProtocol = -1;      /* T_applicationProtocol */
81 static int hf_rtse_connectionDataAC = -1;         /* ConnectionData */
82 static int hf_rtse_refuseReason = -1;             /* RefuseReason */
83 static int hf_rtse_userDataRJ = -1;               /* T_userDataRJ */
84 static int hf_rtse_abortReason = -1;              /* AbortReason */
85 static int hf_rtse_reflectedParameter = -1;       /* BIT_STRING */
86 static int hf_rtse_userdataAB = -1;               /* T_userdataAB */
87 static int hf_rtse_open = -1;                     /* T_open */
88 static int hf_rtse_recover = -1;                  /* SessionConnectionIdentifier */
89 static int hf_rtse_callingSSuserReference = -1;   /* CallingSSuserReference */
90 static int hf_rtse_commonReference = -1;          /* CommonReference */
91 static int hf_rtse_additionalReferenceInformation = -1;  /* AdditionalReferenceInformation */
92 static int hf_rtse_t61String = -1;                /* T_t61String */
93 static int hf_rtse_octetString = -1;              /* T_octetString */
94
95 /*--- End of included file: packet-rtse-hf.c ---*/
96 #line 60 "../../asn1/rtse/packet-rtse-template.c"
97
98 /* Initialize the subtree pointers */
99 static gint ett_rtse = -1;
100
101 /*--- Included file: packet-rtse-ett.c ---*/
102 #line 1 "../../asn1/rtse/packet-rtse-ett.c"
103 static gint ett_rtse_RTSE_apdus = -1;
104 static gint ett_rtse_RTORQapdu = -1;
105 static gint ett_rtse_RTOACapdu = -1;
106 static gint ett_rtse_RTORJapdu = -1;
107 static gint ett_rtse_RTABapdu = -1;
108 static gint ett_rtse_ConnectionData = -1;
109 static gint ett_rtse_SessionConnectionIdentifier = -1;
110 static gint ett_rtse_CallingSSuserReference = -1;
111
112 /*--- End of included file: packet-rtse-ett.c ---*/
113 #line 64 "../../asn1/rtse/packet-rtse-template.c"
114
115
116 static dissector_table_t rtse_oid_dissector_table=NULL;
117 static GHashTable *oid_table=NULL;
118 static gint ett_rtse_unknown = -1;
119
120 static reassembly_table rtse_reassembly_table;
121
122 static int hf_rtse_segment_data = -1;
123 static int hf_rtse_fragments = -1;
124 static int hf_rtse_fragment = -1;
125 static int hf_rtse_fragment_overlap = -1;
126 static int hf_rtse_fragment_overlap_conflicts = -1;
127 static int hf_rtse_fragment_multiple_tails = -1;
128 static int hf_rtse_fragment_too_long_fragment = -1;
129 static int hf_rtse_fragment_error = -1;
130 static int hf_rtse_fragment_count = -1;
131 static int hf_rtse_reassembled_in = -1;
132 static int hf_rtse_reassembled_length = -1;
133
134 static gint ett_rtse_fragment = -1;
135 static gint ett_rtse_fragments = -1;
136
137 static const fragment_items rtse_frag_items = {
138         /* Fragment subtrees */
139         &ett_rtse_fragment,
140         &ett_rtse_fragments,
141         /* Fragment fields */
142         &hf_rtse_fragments,
143         &hf_rtse_fragment,
144         &hf_rtse_fragment_overlap,
145         &hf_rtse_fragment_overlap_conflicts,
146         &hf_rtse_fragment_multiple_tails,
147         &hf_rtse_fragment_too_long_fragment,
148         &hf_rtse_fragment_error,
149         &hf_rtse_fragment_count,
150         /* Reassembled in field */
151         &hf_rtse_reassembled_in,
152         /* Reassembled length field */
153         &hf_rtse_reassembled_length,
154         /* Reassembled data field */
155         NULL,
156         /* Tag */
157         "RTSE fragments"
158 };
159
160 void
161 register_rtse_oid_dissector_handle(const char *oid, dissector_handle_t dissector, int proto, const char *name, gboolean uses_ros)
162 {
163 /* XXX: Note that this fcn is called from proto_reg_handoff in *other* dissectors ... */
164
165   static  dissector_handle_t rtse_handle = NULL;
166   static  dissector_handle_t ros_handle = NULL;
167
168   if (rtse_handle == NULL)
169     rtse_handle = find_dissector("rtse");
170   if (ros_handle == NULL)
171     ros_handle = find_dissector("ros");
172
173   /* save the name - but not used */
174   g_hash_table_insert(oid_table, (gpointer)oid, (gpointer)name);
175
176   /* register RTSE with the BER (ACSE) */
177   register_ber_oid_dissector_handle(oid, rtse_handle, proto, name);
178
179   if(uses_ros) {
180     /* make sure we call ROS ... */
181     dissector_add_string("rtse.oid", oid, ros_handle);
182
183     /* and then tell ROS how to dissect the AS*/
184     register_ros_oid_dissector_handle(oid, dissector, proto, name, TRUE);
185
186   } else {
187     /* otherwise we just remember how to dissect the AS */
188     dissector_add_string("rtse.oid", oid, dissector);
189   }
190 }
191
192 static int
193 call_rtse_oid_callback(const char *oid, tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
194 {
195         tvbuff_t *next_tvb;
196
197         next_tvb = tvb_new_subset_remaining(tvb, offset);
198         if(!dissector_try_string(rtse_oid_dissector_table, oid, next_tvb, pinfo, tree)){
199                 proto_item *item=proto_tree_add_text(tree, next_tvb, 0, tvb_length_remaining(tvb, offset), "RTSE: Dissector for OID:%s not implemented. Contact Wireshark developers if you want this supported", oid);
200                 proto_tree *next_tree=proto_item_add_subtree(item, ett_rtse_unknown);
201
202                 expert_add_info_format (pinfo, item, PI_UNDECODED, PI_WARN,
203                                         "RTSE: Dissector for OID %s not implemented", oid);
204                 dissect_unknown_ber(pinfo, next_tvb, offset, next_tree);
205         }
206
207         /*XXX until we change the #.REGISTER signature for _PDU()s
208          * into new_dissector_t   we have to do this kludge with
209          * manually step past the content in the ANY type.
210          */
211         offset+=tvb_length_remaining(tvb, offset);
212
213         return offset;
214 }
215
216 static int
217 call_rtse_external_type_callback(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, asn1_ctx_t *actx, proto_tree *tree, int hf_index _U_)
218 {
219         const char      *oid = NULL;
220
221         if (actx->external.indirect_ref_present) {
222                 oid = (const char *)find_oid_by_pres_ctx_id(actx->pinfo, actx->external.indirect_reference);
223         } else if (actx->external.direct_ref_present) {
224                 oid = actx->external.direct_reference;
225         }
226
227         if (oid)
228                 offset = call_rtse_oid_callback(oid, tvb, offset, actx->pinfo, top_tree ? top_tree : tree);
229
230         return offset;
231 }
232
233
234 /*--- Included file: packet-rtse-fn.c ---*/
235 #line 1 "../../asn1/rtse/packet-rtse-fn.c"
236
237
238 static int
239 dissect_rtse_INTEGER(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
240   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
241                                                 NULL);
242
243   return offset;
244 }
245
246
247 static const value_string rtse_T_dialogueMode_vals[] = {
248   {   0, "monologue" },
249   {   1, "twa" },
250   { 0, NULL }
251 };
252
253
254 static int
255 dissect_rtse_T_dialogueMode(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
256   offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
257                                                 NULL);
258
259   return offset;
260 }
261
262
263
264 static int
265 dissect_rtse_T_open(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
266 #line 53 "../../asn1/rtse/rtse.cnf"
267
268         const char *oid = NULL;
269
270         switch(app_proto)  {
271         case 1:         /* mts-transfer-protocol-1984 */
272                 oid = "applicationProtocol.1";
273                 break;
274         case 12:        /* mts-transfer-protocol */
275                 oid = "applicationProtocol.12";
276                 break;
277         default:
278                 if(session && session->pres_ctx_id)
279                         oid = find_oid_by_pres_ctx_id(actx->pinfo, session->pres_ctx_id);
280                 break;
281         }
282
283         if(!oid) /* XXX: problem here is we haven't decoded the applicationProtocol yet - so we make assumptions! */
284                 oid = "applicationProtocol.12";
285
286         if(oid) {
287
288                 offset = call_rtse_oid_callback(oid, tvb, offset, actx->pinfo, top_tree ? top_tree : tree);
289         }
290
291         /* else XXX: need to flag we can't find the presentation context */
292
293
294
295   return offset;
296 }
297
298
299
300 static int
301 dissect_rtse_T_t61String(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
302 #line 108 "../../asn1/rtse/rtse.cnf"
303   tvbuff_t *string = NULL;
304     offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
305                                             actx, tree, tvb, offset, hf_index,
306                                             &string);
307
308   if(open_request && string)
309     col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", tvb_format_text(string, 0, tvb_length(string)));
310
311
312
313   return offset;
314 }
315
316
317
318 static int
319 dissect_rtse_T_octetString(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
320 #line 124 "../../asn1/rtse/rtse.cnf"
321   tvbuff_t *string = NULL;
322     offset = dissect_ber_octet_string(implicit_tag, actx, tree, tvb, offset, hf_index,
323                                        &string);
324
325   if(open_request && string)
326     col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", tvb_format_text(string, 0, tvb_length(string)));
327
328
329
330   return offset;
331 }
332
333
334 static const value_string rtse_CallingSSuserReference_vals[] = {
335   {   0, "t61String" },
336   {   1, "octetString" },
337   { 0, NULL }
338 };
339
340 static const ber_choice_t CallingSSuserReference_choice[] = {
341   {   0, &hf_rtse_t61String      , BER_CLASS_UNI, BER_UNI_TAG_TeletexString, BER_FLAGS_NOOWNTAG, dissect_rtse_T_t61String },
342   {   1, &hf_rtse_octetString    , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_rtse_T_octetString },
343   { 0, NULL, 0, 0, 0, NULL }
344 };
345
346 static int
347 dissect_rtse_CallingSSuserReference(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
348   offset = dissect_ber_choice(actx, tree, tvb, offset,
349                                  CallingSSuserReference_choice, hf_index, ett_rtse_CallingSSuserReference,
350                                  NULL);
351
352   return offset;
353 }
354
355
356
357 static int
358 dissect_rtse_CommonReference(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
359 #line 116 "../../asn1/rtse/rtse.cnf"
360   tvbuff_t *string = NULL;
361     offset = dissect_ber_UTCTime(implicit_tag, actx, tree, tvb, offset, hf_index);
362
363   if(open_request && string)
364     col_append_fstr(actx->pinfo->cinfo, COL_INFO, " %s", tvb_format_text(string, 0, tvb_length(string)));
365
366
367
368   return offset;
369 }
370
371
372
373 static int
374 dissect_rtse_AdditionalReferenceInformation(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
375   offset = dissect_ber_restricted_string(implicit_tag, BER_UNI_TAG_TeletexString,
376                                             actx, tree, tvb, offset, hf_index,
377                                             NULL);
378
379   return offset;
380 }
381
382
383 static const ber_sequence_t SessionConnectionIdentifier_sequence[] = {
384   { &hf_rtse_callingSSuserReference, BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_rtse_CallingSSuserReference },
385   { &hf_rtse_commonReference, BER_CLASS_UNI, BER_UNI_TAG_UTCTime, BER_FLAGS_NOOWNTAG, dissect_rtse_CommonReference },
386   { &hf_rtse_additionalReferenceInformation, BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_AdditionalReferenceInformation },
387   { NULL, 0, 0, 0, NULL }
388 };
389
390 static int
391 dissect_rtse_SessionConnectionIdentifier(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
392 #line 101 "../../asn1/rtse/rtse.cnf"
393   if(open_request)
394     col_append_str(actx->pinfo->cinfo, COL_INFO, "Recover");
395     offset = dissect_ber_sequence(implicit_tag, actx, tree, tvb, offset,
396                                    SessionConnectionIdentifier_sequence, hf_index, ett_rtse_SessionConnectionIdentifier);
397
398
399
400
401   return offset;
402 }
403
404
405 static const value_string rtse_ConnectionData_vals[] = {
406   {   0, "open" },
407   {   1, "recover" },
408   { 0, NULL }
409 };
410
411 static const ber_choice_t ConnectionData_choice[] = {
412   {   0, &hf_rtse_open           , BER_CLASS_CON, 0, 0, dissect_rtse_T_open },
413   {   1, &hf_rtse_recover        , BER_CLASS_CON, 1, BER_FLAGS_IMPLTAG, dissect_rtse_SessionConnectionIdentifier },
414   { 0, NULL, 0, 0, 0, NULL }
415 };
416
417 static int
418 dissect_rtse_ConnectionData(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
419   offset = dissect_ber_choice(actx, tree, tvb, offset,
420                                  ConnectionData_choice, hf_index, ett_rtse_ConnectionData,
421                                  NULL);
422
423   return offset;
424 }
425
426
427 static const value_string rtse_T_applicationProtocol_vals[] = {
428   {  12, "mts-transfer-protocol" },
429   {   1, "mts-transfer-protocol-1984" },
430   { 0, NULL }
431 };
432
433
434 static int
435 dissect_rtse_T_applicationProtocol(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
436 #line 97 "../../asn1/rtse/rtse.cnf"
437
438   offset = dissect_ber_integer(TRUE, actx, tree, tvb, offset, hf_index, &app_proto);
439
440
441
442   return offset;
443 }
444
445
446 static const ber_sequence_t RTORQapdu_set[] = {
447   { &hf_rtse_checkpointSize , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_INTEGER },
448   { &hf_rtse_windowSize     , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_INTEGER },
449   { &hf_rtse_dialogueMode   , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_T_dialogueMode },
450   { &hf_rtse_connectionDataRQ, BER_CLASS_CON, 3, BER_FLAGS_NOTCHKTAG, dissect_rtse_ConnectionData },
451   { &hf_rtse_applicationProtocol, BER_CLASS_CON, 4, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_T_applicationProtocol },
452   { NULL, 0, 0, 0, NULL }
453 };
454
455 int
456 dissect_rtse_RTORQapdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
457 #line 38 "../../asn1/rtse/rtse.cnf"
458
459   if((session = (struct SESSION_DATA_STRUCTURE*)(actx->pinfo->private_data)) != NULL)
460         session->ros_op = (ROS_OP_BIND | ROS_OP_ARGUMENT);
461   open_request=TRUE;
462     offset = dissect_ber_set(implicit_tag, actx, tree, tvb, offset,
463                               RTORQapdu_set, hf_index, ett_rtse_RTORQapdu);
464
465   open_request=FALSE;
466
467
468
469   return offset;
470 }
471
472
473 static const ber_sequence_t RTOACapdu_set[] = {
474   { &hf_rtse_checkpointSize , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_INTEGER },
475   { &hf_rtse_windowSize     , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_INTEGER },
476   { &hf_rtse_connectionDataAC, BER_CLASS_CON, 2, BER_FLAGS_NOTCHKTAG, dissect_rtse_ConnectionData },
477   { NULL, 0, 0, 0, NULL }
478 };
479
480 int
481 dissect_rtse_RTOACapdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
482 #line 46 "../../asn1/rtse/rtse.cnf"
483
484   if((session = (struct SESSION_DATA_STRUCTURE*)(actx->pinfo->private_data)) != NULL)
485         session->ros_op = (ROS_OP_BIND | ROS_OP_RESULT);
486
487     offset = dissect_ber_set(implicit_tag, actx, tree, tvb, offset,
488                               RTOACapdu_set, hf_index, ett_rtse_RTOACapdu);
489
490
491
492
493   return offset;
494 }
495
496
497 static const value_string rtse_RefuseReason_vals[] = {
498   {   0, "rtsBusy" },
499   {   1, "cannotRecover" },
500   {   2, "validationFailure" },
501   {   3, "unacceptableDialogueMode" },
502   { 0, NULL }
503 };
504
505
506 static int
507 dissect_rtse_RefuseReason(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
508 #line 148 "../../asn1/rtse/rtse.cnf"
509   int reason = -1;
510
511     offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
512                                                 &reason);
513
514
515   if(reason != -1)
516    col_append_fstr(actx->pinfo->cinfo, COL_INFO, " (%s)", val_to_str(reason, rtse_RefuseReason_vals, "reason(%d)"));
517
518
519
520   return offset;
521 }
522
523
524
525 static int
526 dissect_rtse_T_userDataRJ(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
527 #line 9 "../../asn1/rtse/rtse.cnf"
528         const char *oid = NULL;
529
530         switch(app_proto)  {
531         case 1:         /* mts-transfer-protocol-1984 */
532                 oid = "applicationProtocol.1";
533                 break;
534         case 12:        /* mts-transfer-protocol */
535                 oid = "applicationProtocol.12";
536                 break;
537         default:
538                 if(session && session->pres_ctx_id)
539                         oid = find_oid_by_pres_ctx_id(actx->pinfo, session->pres_ctx_id);
540                 break;
541         }
542
543         if(!oid) /* XXX: problem here is we haven't decoded the applicationProtocol yet - so we make assumptions! */
544                 oid = "applicationProtocol.12";
545
546         if(oid) {
547           if((session = (struct SESSION_DATA_STRUCTURE*)(actx->pinfo->private_data)) != NULL)
548                 session->ros_op = (ROS_OP_BIND | ROS_OP_ERROR);
549
550                 offset = call_rtse_oid_callback(oid, tvb, offset, actx->pinfo, top_tree ? top_tree : tree);
551         }
552
553
554
555   return offset;
556 }
557
558
559 static const ber_sequence_t RTORJapdu_set[] = {
560   { &hf_rtse_refuseReason   , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_RefuseReason },
561   { &hf_rtse_userDataRJ     , BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL, dissect_rtse_T_userDataRJ },
562   { NULL, 0, 0, 0, NULL }
563 };
564
565 int
566 dissect_rtse_RTORJapdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
567 #line 140 "../../asn1/rtse/rtse.cnf"
568   col_append_fstr(actx->pinfo->cinfo, COL_INFO, "Refuse");
569
570     offset = dissect_ber_set(implicit_tag, actx, tree, tvb, offset,
571                               RTORJapdu_set, hf_index, ett_rtse_RTORJapdu);
572
573
574
575
576   return offset;
577 }
578
579
580
581 static int
582 dissect_rtse_RTTPapdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
583 #line 130 "../../asn1/rtse/rtse.cnf"
584   int priority = -1;
585
586   col_append_fstr(actx->pinfo->cinfo, COL_INFO, "Turn-Please");
587
588     offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
589                                                 &priority);
590
591
592   if(priority != -1)
593     col_append_fstr(actx->pinfo->cinfo, COL_INFO, " (%d)", priority);
594
595
596
597   return offset;
598 }
599
600
601
602 static int
603 dissect_rtse_RTTRapdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
604 #line 80 "../../asn1/rtse/rtse.cnf"
605         tvbuff_t *next_tvb = NULL;
606
607         offset = dissect_ber_octet_string(FALSE, actx, tree, tvb, offset, hf_index, &next_tvb);
608
609         if(next_tvb) {
610
611                 /* XXX: we should check is this is an EXTERNAL first */
612
613                 /* ROS won't do this for us */
614                 if(session)
615                         session->ros_op = (ROS_OP_INVOKE | ROS_OP_ARGUMENT);
616
617                 offset = dissect_ber_external_type(FALSE, tree, next_tvb, 0, actx,  -1, call_rtse_external_type_callback);
618         }
619
620
621
622
623   return offset;
624 }
625
626
627 static const value_string rtse_AbortReason_vals[] = {
628   {   0, "localSystemProblem" },
629   {   1, "invalidParameter" },
630   {   2, "unrecognizedActivity" },
631   {   3, "temporaryProblem" },
632   {   4, "protocolError" },
633   {   5, "permanentProblem" },
634   {   6, "userError" },
635   {   7, "transferCompleted" },
636   { 0, NULL }
637 };
638
639
640 static int
641 dissect_rtse_AbortReason(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
642 #line 164 "../../asn1/rtse/rtse.cnf"
643   int reason = -1;
644
645     offset = dissect_ber_integer(implicit_tag, actx, tree, tvb, offset, hf_index,
646                                                 &reason);
647
648
649   if(reason != -1)
650    col_append_fstr(actx->pinfo->cinfo, COL_INFO, " (%s)", val_to_str(reason, rtse_AbortReason_vals, "reason(%d)"));
651
652
653
654   return offset;
655 }
656
657
658
659 static int
660 dissect_rtse_BIT_STRING(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
661   offset = dissect_ber_bitstring(implicit_tag, actx, tree, tvb, offset,
662                                     NULL, hf_index, -1,
663                                     NULL);
664
665   return offset;
666 }
667
668
669
670 static int
671 dissect_rtse_T_userdataAB(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
672 #line 35 "../../asn1/rtse/rtse.cnf"
673 /*XXX not implemented yet */
674
675
676
677   return offset;
678 }
679
680
681 static const ber_sequence_t RTABapdu_set[] = {
682   { &hf_rtse_abortReason    , BER_CLASS_CON, 0, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_AbortReason },
683   { &hf_rtse_reflectedParameter, BER_CLASS_CON, 1, BER_FLAGS_OPTIONAL|BER_FLAGS_IMPLTAG, dissect_rtse_BIT_STRING },
684   { &hf_rtse_userdataAB     , BER_CLASS_CON, 2, BER_FLAGS_OPTIONAL, dissect_rtse_T_userdataAB },
685   { NULL, 0, 0, 0, NULL }
686 };
687
688 int
689 dissect_rtse_RTABapdu(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
690 #line 156 "../../asn1/rtse/rtse.cnf"
691   col_append_fstr(actx->pinfo->cinfo, COL_INFO, "Abort");
692
693     offset = dissect_ber_set(implicit_tag, actx, tree, tvb, offset,
694                               RTABapdu_set, hf_index, ett_rtse_RTABapdu);
695
696
697
698
699   return offset;
700 }
701
702
703 static const value_string rtse_RTSE_apdus_vals[] = {
704   {   0, "rtorq-apdu" },
705   {   1, "rtoac-apdu" },
706   {   2, "rtorj-apdu" },
707   {   3, "rttp-apdu" },
708   {   4, "rttr-apdu" },
709   {   5, "rtab-apdu" },
710   { 0, NULL }
711 };
712
713 static const ber_choice_t RTSE_apdus_choice[] = {
714   {   0, &hf_rtse_rtorq_apdu     , BER_CLASS_CON, 16, BER_FLAGS_IMPLTAG, dissect_rtse_RTORQapdu },
715   {   1, &hf_rtse_rtoac_apdu     , BER_CLASS_CON, 17, BER_FLAGS_IMPLTAG, dissect_rtse_RTOACapdu },
716   {   2, &hf_rtse_rtorj_apdu     , BER_CLASS_CON, 18, BER_FLAGS_IMPLTAG, dissect_rtse_RTORJapdu },
717   {   3, &hf_rtse_rttp_apdu      , BER_CLASS_UNI, BER_UNI_TAG_INTEGER, BER_FLAGS_NOOWNTAG, dissect_rtse_RTTPapdu },
718   {   4, &hf_rtse_rttr_apdu      , BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_rtse_RTTRapdu },
719   {   5, &hf_rtse_rtab_apdu      , BER_CLASS_CON, 22, BER_FLAGS_IMPLTAG, dissect_rtse_RTABapdu },
720   { 0, NULL, 0, 0, 0, NULL }
721 };
722
723 static int
724 dissect_rtse_RTSE_apdus(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
725   offset = dissect_ber_choice(actx, tree, tvb, offset,
726                                  RTSE_apdus_choice, hf_index, ett_rtse_RTSE_apdus,
727                                  NULL);
728
729   return offset;
730 }
731
732
733 /*--- End of included file: packet-rtse-fn.c ---*/
734 #line 184 "../../asn1/rtse/packet-rtse-template.c"
735
736 /*
737 * Dissect RTSE PDUs inside a PPDU.
738 */
739 static void
740 dissect_rtse(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree)
741 {
742         int offset = 0;
743         int old_offset;
744         proto_item *item=NULL;
745         proto_tree *tree=NULL;
746         proto_tree *next_tree=NULL;
747         tvbuff_t *next_tvb = NULL;
748         tvbuff_t *data_tvb = NULL;
749         fragment_data *frag_msg = NULL;
750         guint32 fragment_length;
751         guint32 rtse_id = 0;
752         gboolean data_handled = FALSE;
753         conversation_t *conversation = NULL;
754         asn1_ctx_t asn1_ctx;
755         asn1_ctx_init(&asn1_ctx, ASN1_ENC_BER, TRUE, pinfo);
756
757         /* save parent_tree so subdissectors can create new top nodes */
758         top_tree=parent_tree;
759
760         /* do we have application context from the acse dissector?  */
761         if( !pinfo->private_data ){
762                 if(parent_tree){
763                         proto_tree_add_text(parent_tree, tvb, offset, -1,
764                                 "Internal error:can't get application context from ACSE dissector.");
765                 }
766                 return  ;
767         } else {
768                 session  = ( (struct SESSION_DATA_STRUCTURE*)(pinfo->private_data) );
769
770         }
771
772         col_set_str(pinfo->cinfo, COL_PROTOCOL, "RTSE");
773         col_clear(pinfo->cinfo, COL_INFO);
774
775         if (rtse_reassemble &&
776             ((session->spdu_type == SES_DATA_TRANSFER) ||
777              (session->spdu_type == SES_MAJOR_SYNC_POINT))) {
778                 /* Use conversation index as fragment id */
779                 conversation  = find_conversation (pinfo->fd->num,
780                                                    &pinfo->src, &pinfo->dst, pinfo->ptype,
781                                                    pinfo->srcport, pinfo->destport, 0);
782                 if (conversation != NULL) {
783                         rtse_id = conversation->index;
784                 }
785                 session->rtse_reassemble = TRUE;
786         }
787         if (rtse_reassemble && session->spdu_type == SES_MAJOR_SYNC_POINT) {
788                 frag_msg = fragment_end_seq_next (&rtse_reassembly_table,
789                                                   pinfo, rtse_id, NULL);
790                 next_tvb = process_reassembled_data (tvb, offset, pinfo, "Reassembled RTSE",
791                                                      frag_msg, &rtse_frag_items, NULL, parent_tree);
792         }
793         if(parent_tree){
794                 item = proto_tree_add_item(parent_tree, proto_rtse, next_tvb ? next_tvb : tvb, 0, -1, ENC_NA);
795                 tree = proto_item_add_subtree(item, ett_rtse);
796         }
797         if (rtse_reassemble && session->spdu_type == SES_DATA_TRANSFER) {
798                 /* strip off the OCTET STRING encoding - including any CONSTRUCTED OCTET STRING */
799                 dissect_ber_octet_string(FALSE, &asn1_ctx, tree, tvb, offset, hf_rtse_segment_data, &data_tvb);
800
801                 if (data_tvb) {
802                         fragment_length = tvb_length_remaining (data_tvb, 0);
803                         proto_item_append_text(asn1_ctx.created_item, " (%u byte%s)", fragment_length,
804                                       plurality(fragment_length, "", "s"));
805                         frag_msg = fragment_add_seq_next (&rtse_reassembly_table,
806                                                           data_tvb, 0, pinfo,
807                                                           rtse_id, NULL,
808                                                           fragment_length, TRUE);
809                         if (frag_msg && pinfo->fd->num != frag_msg->reassembled_in) {
810                                 /* Add a "Reassembled in" link if not reassembled in this frame */
811                                 proto_tree_add_uint (tree, *(rtse_frag_items.hf_reassembled_in),
812                                                      data_tvb, 0, 0, frag_msg->reassembled_in);
813                         }
814                         pinfo->fragmented = TRUE;
815                         data_handled = TRUE;
816                 } else {
817                         fragment_length = tvb_length_remaining (tvb, offset);
818                 }
819
820                 if (check_col(pinfo->cinfo, COL_INFO))
821                         col_append_fstr(pinfo->cinfo, COL_INFO, "[RTSE fragment, %u byte%s]",
822                                         fragment_length, plurality(fragment_length, "", "s"));
823         } else if (rtse_reassemble && session->spdu_type == SES_MAJOR_SYNC_POINT) {
824                 if (next_tvb) {
825                         /* ROS won't do this for us */
826                         session->ros_op = (ROS_OP_INVOKE | ROS_OP_ARGUMENT);
827                         offset=dissect_ber_external_type(FALSE, tree, next_tvb, 0, &asn1_ctx, -1, call_rtse_external_type_callback);
828                 } else {
829                         offset = tvb_length (tvb);
830                 }
831                 pinfo->fragmented = FALSE;
832                 data_handled = TRUE;
833         }
834
835         if (!data_handled) {
836                 while (tvb_reported_length_remaining(tvb, offset) > 0){
837                         old_offset=offset;
838                         offset=dissect_rtse_RTSE_apdus(TRUE, tvb, offset, &asn1_ctx, tree, -1);
839                         if(offset == old_offset){
840                                 item = proto_tree_add_text(tree, tvb, offset, -1, "Unknown RTSE PDU");
841
842                                 if(item){
843                                         expert_add_info_format (pinfo, item, PI_UNDECODED, PI_WARN, "Unknown RTSE PDU");
844                                         next_tree=proto_item_add_subtree(item, ett_rtse_unknown);
845                                         dissect_unknown_ber(pinfo, tvb, offset, next_tree);
846                                 }
847
848                                 break;
849                         }
850                 }
851         }
852
853         top_tree = NULL;
854 }
855
856 static void rtse_reassemble_init (void)
857 {
858         reassembly_table_init (&rtse_reassembly_table,
859                                &addresses_reassembly_table_functions);
860 }
861
862 /*--- proto_register_rtse -------------------------------------------*/
863 void proto_register_rtse(void) {
864
865   /* List of fields */
866   static hf_register_info hf[] =
867   {
868     /* Fragment entries */
869     { &hf_rtse_segment_data,
870       { "RTSE segment data", "rtse.segment", FT_NONE, BASE_NONE,
871         NULL, 0x00, NULL, HFILL } },
872     { &hf_rtse_fragments,
873       { "RTSE fragments", "rtse.fragments", FT_NONE, BASE_NONE,
874         NULL, 0x00, NULL, HFILL } },
875     { &hf_rtse_fragment,
876       { "RTSE fragment", "rtse.fragment", FT_FRAMENUM, BASE_NONE,
877         NULL, 0x00, NULL, HFILL } },
878     { &hf_rtse_fragment_overlap,
879       { "RTSE fragment overlap", "rtse.fragment.overlap", FT_BOOLEAN,
880         BASE_NONE, NULL, 0x0, NULL, HFILL } },
881     { &hf_rtse_fragment_overlap_conflicts,
882       { "RTSE fragment overlapping with conflicting data",
883         "rtse.fragment.overlap.conflicts", FT_BOOLEAN, BASE_NONE,
884         NULL, 0x0, NULL, HFILL } },
885     { &hf_rtse_fragment_multiple_tails,
886       { "RTSE has multiple tail fragments",
887         "rtse.fragment.multiple_tails", FT_BOOLEAN, BASE_NONE,
888         NULL, 0x0, NULL, HFILL } },
889     { &hf_rtse_fragment_too_long_fragment,
890       { "RTSE fragment too long", "rtse.fragment.too_long_fragment",
891         FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } },
892     { &hf_rtse_fragment_error,
893       { "RTSE defragmentation error", "rtse.fragment.error", FT_FRAMENUM,
894         BASE_NONE, NULL, 0x00, NULL, HFILL } },
895     { &hf_rtse_fragment_count,
896       { "RTSE fragment count", "rtse.fragment.count", FT_UINT32, BASE_DEC,
897         NULL, 0x00, NULL, HFILL } },
898     { &hf_rtse_reassembled_in,
899       { "Reassembled RTSE in frame", "rtse.reassembled.in", FT_FRAMENUM, BASE_NONE,
900         NULL, 0x00, "This RTSE packet is reassembled in this frame", HFILL } },
901     { &hf_rtse_reassembled_length,
902       { "Reassembled RTSE length", "rtse.reassembled.length", FT_UINT32, BASE_DEC,
903         NULL, 0x00, "The total length of the reassembled payload", HFILL } },
904
905
906 /*--- Included file: packet-rtse-hfarr.c ---*/
907 #line 1 "../../asn1/rtse/packet-rtse-hfarr.c"
908     { &hf_rtse_rtorq_apdu,
909       { "rtorq-apdu", "rtse.rtorq_apdu_element",
910         FT_NONE, BASE_NONE, NULL, 0,
911         "RTORQapdu", HFILL }},
912     { &hf_rtse_rtoac_apdu,
913       { "rtoac-apdu", "rtse.rtoac_apdu_element",
914         FT_NONE, BASE_NONE, NULL, 0,
915         "RTOACapdu", HFILL }},
916     { &hf_rtse_rtorj_apdu,
917       { "rtorj-apdu", "rtse.rtorj_apdu_element",
918         FT_NONE, BASE_NONE, NULL, 0,
919         "RTORJapdu", HFILL }},
920     { &hf_rtse_rttp_apdu,
921       { "rttp-apdu", "rtse.rttp_apdu",
922         FT_INT32, BASE_DEC, NULL, 0,
923         "RTTPapdu", HFILL }},
924     { &hf_rtse_rttr_apdu,
925       { "rttr-apdu", "rtse.rttr_apdu",
926         FT_BYTES, BASE_NONE, NULL, 0,
927         "RTTRapdu", HFILL }},
928     { &hf_rtse_rtab_apdu,
929       { "rtab-apdu", "rtse.rtab_apdu_element",
930         FT_NONE, BASE_NONE, NULL, 0,
931         "RTABapdu", HFILL }},
932     { &hf_rtse_checkpointSize,
933       { "checkpointSize", "rtse.checkpointSize",
934         FT_INT32, BASE_DEC, NULL, 0,
935         "INTEGER", HFILL }},
936     { &hf_rtse_windowSize,
937       { "windowSize", "rtse.windowSize",
938         FT_INT32, BASE_DEC, NULL, 0,
939         "INTEGER", HFILL }},
940     { &hf_rtse_dialogueMode,
941       { "dialogueMode", "rtse.dialogueMode",
942         FT_INT32, BASE_DEC, VALS(rtse_T_dialogueMode_vals), 0,
943         NULL, HFILL }},
944     { &hf_rtse_connectionDataRQ,
945       { "connectionDataRQ", "rtse.connectionDataRQ",
946         FT_UINT32, BASE_DEC, VALS(rtse_ConnectionData_vals), 0,
947         "ConnectionData", HFILL }},
948     { &hf_rtse_applicationProtocol,
949       { "applicationProtocol", "rtse.applicationProtocol",
950         FT_INT32, BASE_DEC, VALS(rtse_T_applicationProtocol_vals), 0,
951         NULL, HFILL }},
952     { &hf_rtse_connectionDataAC,
953       { "connectionDataAC", "rtse.connectionDataAC",
954         FT_UINT32, BASE_DEC, VALS(rtse_ConnectionData_vals), 0,
955         "ConnectionData", HFILL }},
956     { &hf_rtse_refuseReason,
957       { "refuseReason", "rtse.refuseReason",
958         FT_INT32, BASE_DEC, VALS(rtse_RefuseReason_vals), 0,
959         NULL, HFILL }},
960     { &hf_rtse_userDataRJ,
961       { "userDataRJ", "rtse.userDataRJ_element",
962         FT_NONE, BASE_NONE, NULL, 0,
963         NULL, HFILL }},
964     { &hf_rtse_abortReason,
965       { "abortReason", "rtse.abortReason",
966         FT_INT32, BASE_DEC, VALS(rtse_AbortReason_vals), 0,
967         NULL, HFILL }},
968     { &hf_rtse_reflectedParameter,
969       { "reflectedParameter", "rtse.reflectedParameter",
970         FT_BYTES, BASE_NONE, NULL, 0,
971         "BIT_STRING", HFILL }},
972     { &hf_rtse_userdataAB,
973       { "userdataAB", "rtse.userdataAB_element",
974         FT_NONE, BASE_NONE, NULL, 0,
975         NULL, HFILL }},
976     { &hf_rtse_open,
977       { "open", "rtse.open_element",
978         FT_NONE, BASE_NONE, NULL, 0,
979         NULL, HFILL }},
980     { &hf_rtse_recover,
981       { "recover", "rtse.recover_element",
982         FT_NONE, BASE_NONE, NULL, 0,
983         "SessionConnectionIdentifier", HFILL }},
984     { &hf_rtse_callingSSuserReference,
985       { "callingSSuserReference", "rtse.callingSSuserReference",
986         FT_UINT32, BASE_DEC, VALS(rtse_CallingSSuserReference_vals), 0,
987         NULL, HFILL }},
988     { &hf_rtse_commonReference,
989       { "commonReference", "rtse.commonReference",
990         FT_STRING, BASE_NONE, NULL, 0,
991         NULL, HFILL }},
992     { &hf_rtse_additionalReferenceInformation,
993       { "additionalReferenceInformation", "rtse.additionalReferenceInformation",
994         FT_STRING, BASE_NONE, NULL, 0,
995         NULL, HFILL }},
996     { &hf_rtse_t61String,
997       { "t61String", "rtse.t61String",
998         FT_STRING, BASE_NONE, NULL, 0,
999         NULL, HFILL }},
1000     { &hf_rtse_octetString,
1001       { "octetString", "rtse.octetString",
1002         FT_BYTES, BASE_NONE, NULL, 0,
1003         NULL, HFILL }},
1004
1005 /*--- End of included file: packet-rtse-hfarr.c ---*/
1006 #line 355 "../../asn1/rtse/packet-rtse-template.c"
1007   };
1008
1009   /* List of subtrees */
1010   static gint *ett[] = {
1011     &ett_rtse,
1012     &ett_rtse_unknown,
1013     &ett_rtse_fragment,
1014     &ett_rtse_fragments,
1015
1016 /*--- Included file: packet-rtse-ettarr.c ---*/
1017 #line 1 "../../asn1/rtse/packet-rtse-ettarr.c"
1018     &ett_rtse_RTSE_apdus,
1019     &ett_rtse_RTORQapdu,
1020     &ett_rtse_RTOACapdu,
1021     &ett_rtse_RTORJapdu,
1022     &ett_rtse_RTABapdu,
1023     &ett_rtse_ConnectionData,
1024     &ett_rtse_SessionConnectionIdentifier,
1025     &ett_rtse_CallingSSuserReference,
1026
1027 /*--- End of included file: packet-rtse-ettarr.c ---*/
1028 #line 364 "../../asn1/rtse/packet-rtse-template.c"
1029   };
1030
1031   module_t *rtse_module;
1032
1033   /* Register protocol */
1034   proto_rtse = proto_register_protocol(PNAME, PSNAME, PFNAME);
1035   register_dissector("rtse", dissect_rtse, proto_rtse);
1036   /* Register fields and subtrees */
1037   proto_register_field_array(proto_rtse, hf, array_length(hf));
1038   proto_register_subtree_array(ett, array_length(ett));
1039   register_init_routine (&rtse_reassemble_init);
1040   rtse_module = prefs_register_protocol_subtree("OSI", proto_rtse, NULL);
1041
1042   prefs_register_bool_preference(rtse_module, "reassemble",
1043                                  "Reassemble segmented RTSE datagrams",
1044                                  "Whether segmented RTSE datagrams should be reassembled."
1045                                  " To use this option, you must also enable"
1046                                  " \"Allow subdissectors to reassemble TCP streams\""
1047                                  " in the TCP protocol settings.", &rtse_reassemble);
1048
1049   rtse_oid_dissector_table = register_dissector_table("rtse.oid", "RTSE OID Dissectors", FT_STRING, BASE_NONE);
1050   oid_table=g_hash_table_new(g_str_hash, g_str_equal);
1051
1052
1053 }
1054
1055
1056 /*--- proto_reg_handoff_rtse --- */
1057 void proto_reg_handoff_rtse(void) {
1058
1059
1060 }