1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
4 /* asn2wrs.py -q -L -p h283 -c ./h283.cnf -s ./packet-h283-template -D . -O ../.. LCT-PROTOCOL.asn */
7 * Routines for H.283 packet dissection
10 * Wireshark - Network traffic analyzer
11 * By Gerald Combs <gerald@wireshark.org>
12 * Copyright 1998 Gerald Combs
14 * SPDX-License-Identifier: GPL-2.0-or-later
19 #include <epan/packet.h>
20 #include <epan/oids.h>
21 #include <epan/asn1.h>
22 #include <wsutil/array.h>
24 #include "packet-per.h"
26 #define PNAME "H.283 Logical Channel Transport"
30 void proto_register_h283(void);
31 void proto_reg_handoff_h283(void);
33 /* Initialize the protocol and registered fields */
34 static int proto_h283
;
35 static int hf_h283_LCTPDU_PDU
; /* LCTPDU */
36 static int hf_h283_t35CountryCode
; /* INTEGER_0_255 */
37 static int hf_h283_t35Extension
; /* INTEGER_0_255 */
38 static int hf_h283_manufacturerCode
; /* INTEGER_0_65535 */
39 static int hf_h283_object
; /* OBJECT_IDENTIFIER */
40 static int hf_h283_h221NonStandard
; /* H221NonStandard */
41 static int hf_h283_nonStandardIdentifier
; /* NonStandardIdentifier */
42 static int hf_h283_data
; /* OCTET_STRING */
43 static int hf_h283_srcAddr
; /* MTAddress */
44 static int hf_h283_dstAddr
; /* MTAddress */
45 static int hf_h283_timestamp
; /* INTEGER_0_4294967295 */
46 static int hf_h283_seqNumber
; /* INTEGER_0_65535 */
47 static int hf_h283_pduType
; /* T_pduType */
48 static int hf_h283_ack
; /* NULL */
49 static int hf_h283_rdcData
; /* RDCData */
50 static int hf_h283_nonStandardParameters
; /* SEQUENCE_OF_NonStandardParameter */
51 static int hf_h283_nonStandardParameters_item
; /* NonStandardParameter */
52 static int hf_h283_mAddress
; /* INTEGER_0_65535 */
53 static int hf_h283_tAddress
; /* INTEGER_0_65535 */
54 static int hf_h283_reliable
; /* BOOLEAN */
55 static int hf_h283_dataType
; /* T_dataType */
56 static int hf_h283_lctMessage
; /* LCTMessage */
57 static int hf_h283_rdcPDU
; /* T_rdcPDU */
58 static int hf_h283_lctRequest
; /* LCTRequest */
59 static int hf_h283_lctResponse
; /* LCTResponse */
60 static int hf_h283_lctIndication
; /* LCTIndication */
61 static int hf_h283_nonStandardMessage
; /* NonStandardMessage */
62 static int hf_h283_announceReq
; /* NULL */
63 static int hf_h283_deviceListReq
; /* NULL */
64 static int hf_h283_announceResp
; /* NULL */
65 static int hf_h283_deviceListResp
; /* T_deviceListResp */
66 static int hf_h283_deviceChange
; /* NULL */
68 /* Initialize the subtree pointers */
70 static int ett_h283_H221NonStandard
;
71 static int ett_h283_NonStandardIdentifier
;
72 static int ett_h283_NonStandardParameter
;
73 static int ett_h283_LCTPDU
;
74 static int ett_h283_T_pduType
;
75 static int ett_h283_SEQUENCE_OF_NonStandardParameter
;
76 static int ett_h283_MTAddress
;
77 static int ett_h283_RDCData
;
78 static int ett_h283_T_dataType
;
79 static int ett_h283_LCTMessage
;
80 static int ett_h283_LCTRequest
;
81 static int ett_h283_LCTResponse
;
82 static int ett_h283_LCTIndication
;
83 static int ett_h283_NonStandardMessage
;
86 static dissector_handle_t rdc_pdu_handle
;
87 static dissector_handle_t rdc_device_list_handle
;
88 static dissector_handle_t data_handle
;
89 static dissector_handle_t h283_udp_handle
;
92 static bool info_is_set
;
97 dissect_h283_INTEGER_0_255(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
98 offset
= dissect_per_constrained_integer(tvb
, offset
, actx
, tree
, hf_index
,
99 0U, 255U, NULL
, false);
107 dissect_h283_INTEGER_0_65535(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
108 offset
= dissect_per_constrained_integer(tvb
, offset
, actx
, tree
, hf_index
,
109 0U, 65535U, NULL
, false);
115 static const per_sequence_t H221NonStandard_sequence
[] = {
116 { &hf_h283_t35CountryCode
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_255
},
117 { &hf_h283_t35Extension
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_255
},
118 { &hf_h283_manufacturerCode
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_65535
},
123 dissect_h283_H221NonStandard(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
124 offset
= dissect_per_sequence(tvb
, offset
, actx
, tree
, hf_index
,
125 ett_h283_H221NonStandard
, H221NonStandard_sequence
);
133 dissect_h283_OBJECT_IDENTIFIER(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
134 offset
= dissect_per_object_identifier(tvb
, offset
, actx
, tree
, hf_index
, NULL
);
140 static const value_string h283_NonStandardIdentifier_vals
[] = {
142 { 1, "h221NonStandard" },
146 static const per_choice_t NonStandardIdentifier_choice
[] = {
147 { 0, &hf_h283_object
, ASN1_EXTENSION_ROOT
, dissect_h283_OBJECT_IDENTIFIER
},
148 { 1, &hf_h283_h221NonStandard
, ASN1_EXTENSION_ROOT
, dissect_h283_H221NonStandard
},
153 dissect_h283_NonStandardIdentifier(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
154 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
155 ett_h283_NonStandardIdentifier
, NonStandardIdentifier_choice
,
164 dissect_h283_OCTET_STRING(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
165 offset
= dissect_per_octet_string(tvb
, offset
, actx
, tree
, hf_index
,
166 NO_BOUND
, NO_BOUND
, false, NULL
);
172 static const per_sequence_t NonStandardParameter_sequence
[] = {
173 { &hf_h283_nonStandardIdentifier
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_NonStandardIdentifier
},
174 { &hf_h283_data
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_OCTET_STRING
},
179 dissect_h283_NonStandardParameter(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
180 offset
= dissect_per_sequence(tvb
, offset
, actx
, tree
, hf_index
,
181 ett_h283_NonStandardParameter
, NonStandardParameter_sequence
);
187 static const per_sequence_t MTAddress_sequence
[] = {
188 { &hf_h283_mAddress
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_65535
},
189 { &hf_h283_tAddress
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_65535
},
194 dissect_h283_MTAddress(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
195 offset
= dissect_per_sequence(tvb
, offset
, actx
, tree
, hf_index
,
196 ett_h283_MTAddress
, MTAddress_sequence
);
204 dissect_h283_INTEGER_0_4294967295(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
205 offset
= dissect_per_constrained_integer(tvb
, offset
, actx
, tree
, hf_index
,
206 0U, 4294967295U, NULL
, false);
214 dissect_h283_NULL(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
215 offset
= dissect_per_null(tvb
, offset
, actx
, tree
, hf_index
);
223 dissect_h283_BOOLEAN(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
224 offset
= dissect_per_boolean(tvb
, offset
, actx
, tree
, hf_index
, NULL
);
230 static const value_string h283_LCTRequest_vals
[] = {
231 { 0, "announceReq" },
232 { 1, "deviceListReq" },
236 static const per_choice_t LCTRequest_choice
[] = {
237 { 0, &hf_h283_announceReq
, ASN1_EXTENSION_ROOT
, dissect_h283_NULL
},
238 { 1, &hf_h283_deviceListReq
, ASN1_EXTENSION_ROOT
, dissect_h283_NULL
},
243 dissect_h283_LCTRequest(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
244 int32_t msg_type
= -1;
245 const char *p
= NULL
;
246 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
247 ett_h283_LCTRequest
, LCTRequest_choice
,
250 p
= try_val_to_str(msg_type
, VALS(h283_LCTRequest_vals
));
251 if (!info_is_set
&& p
) {
252 col_add_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "LCTRequest/%s", p
);
261 dissect_h283_T_deviceListResp(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
262 tvbuff_t
*next_tvb
= NULL
;
264 offset
= dissect_per_octet_string(tvb
, offset
, actx
, tree
, hf_index
,
265 NO_BOUND
, NO_BOUND
, false, &next_tvb
);
267 if (next_tvb
&& tvb_reported_length(next_tvb
)) {
268 call_dissector((rdc_device_list_handle
)?rdc_device_list_handle
:data_handle
, next_tvb
, actx
->pinfo
, tree
);
275 static const value_string h283_LCTResponse_vals
[] = {
276 { 0, "announceResp" },
277 { 1, "deviceListResp" },
281 static const per_choice_t LCTResponse_choice
[] = {
282 { 0, &hf_h283_announceResp
, ASN1_EXTENSION_ROOT
, dissect_h283_NULL
},
283 { 1, &hf_h283_deviceListResp
, ASN1_EXTENSION_ROOT
, dissect_h283_T_deviceListResp
},
288 dissect_h283_LCTResponse(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
289 int32_t msg_type
= -1;
290 const char *p
= NULL
;
291 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
292 ett_h283_LCTResponse
, LCTResponse_choice
,
295 p
= try_val_to_str(msg_type
, VALS(h283_LCTResponse_vals
));
296 if (!info_is_set
&& p
) {
297 col_add_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "LCTResponse/%s", p
);
304 static const value_string h283_LCTIndication_vals
[] = {
305 { 0, "deviceChange" },
309 static const per_choice_t LCTIndication_choice
[] = {
310 { 0, &hf_h283_deviceChange
, ASN1_EXTENSION_ROOT
, dissect_h283_NULL
},
315 dissect_h283_LCTIndication(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
316 int32_t msg_type
= -1;
317 const char *p
= NULL
;
318 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
319 ett_h283_LCTIndication
, LCTIndication_choice
,
322 p
= try_val_to_str(msg_type
, VALS(h283_LCTIndication_vals
));
323 if (!info_is_set
&& p
) {
324 col_add_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "LCTIndication/%s", p
);
331 static const per_sequence_t SEQUENCE_OF_NonStandardParameter_sequence_of
[1] = {
332 { &hf_h283_nonStandardParameters_item
, ASN1_NO_EXTENSIONS
, ASN1_NOT_OPTIONAL
, dissect_h283_NonStandardParameter
},
336 dissect_h283_SEQUENCE_OF_NonStandardParameter(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
337 offset
= dissect_per_sequence_of(tvb
, offset
, actx
, tree
, hf_index
,
338 ett_h283_SEQUENCE_OF_NonStandardParameter
, SEQUENCE_OF_NonStandardParameter_sequence_of
);
344 static const per_sequence_t NonStandardMessage_sequence
[] = {
345 { &hf_h283_nonStandardParameters
, ASN1_EXTENSION_ROOT
, ASN1_OPTIONAL
, dissect_h283_SEQUENCE_OF_NonStandardParameter
},
350 dissect_h283_NonStandardMessage(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
351 offset
= dissect_per_sequence(tvb
, offset
, actx
, tree
, hf_index
,
352 ett_h283_NonStandardMessage
, NonStandardMessage_sequence
);
358 static const value_string h283_LCTMessage_vals
[] = {
360 { 1, "lctResponse" },
361 { 2, "lctIndication" },
362 { 3, "nonStandardMessage" },
366 static const per_choice_t LCTMessage_choice
[] = {
367 { 0, &hf_h283_lctRequest
, ASN1_EXTENSION_ROOT
, dissect_h283_LCTRequest
},
368 { 1, &hf_h283_lctResponse
, ASN1_EXTENSION_ROOT
, dissect_h283_LCTResponse
},
369 { 2, &hf_h283_lctIndication
, ASN1_EXTENSION_ROOT
, dissect_h283_LCTIndication
},
370 { 3, &hf_h283_nonStandardMessage
, ASN1_EXTENSION_ROOT
, dissect_h283_NonStandardMessage
},
375 dissect_h283_LCTMessage(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
376 int32_t msg_type
= -1;
377 const char *p
= NULL
;
378 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
379 ett_h283_LCTMessage
, LCTMessage_choice
,
382 p
= try_val_to_str(msg_type
, VALS(h283_LCTMessage_vals
));
383 if (!info_is_set
&& p
) {
384 col_add_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "LCTMessage/%s", p
);
393 dissect_h283_T_rdcPDU(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
394 tvbuff_t
*next_tvb
= NULL
;
396 offset
= dissect_per_octet_string(tvb
, offset
, actx
, tree
, hf_index
,
397 NO_BOUND
, NO_BOUND
, false, &next_tvb
);
399 if (next_tvb
&& tvb_reported_length(next_tvb
)) {
400 call_dissector((rdc_pdu_handle
)?rdc_pdu_handle
:data_handle
, next_tvb
, actx
->pinfo
, proto_tree_get_root(tree
));
408 static const value_string h283_T_dataType_vals
[] = {
414 static const per_choice_t T_dataType_choice
[] = {
415 { 0, &hf_h283_lctMessage
, ASN1_NO_EXTENSIONS
, dissect_h283_LCTMessage
},
416 { 1, &hf_h283_rdcPDU
, ASN1_NO_EXTENSIONS
, dissect_h283_T_rdcPDU
},
421 dissect_h283_T_dataType(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
422 int32_t data_type
= -1;
423 const char *p
= NULL
;
424 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
425 ett_h283_T_dataType
, T_dataType_choice
,
428 p
= try_val_to_str(data_type
, VALS(h283_T_dataType_vals
));
429 if (!info_is_set
&& p
) {
430 col_add_fstr(actx
->pinfo
->cinfo
, COL_INFO
, "RDCData/%s", p
);
437 static const per_sequence_t RDCData_sequence
[] = {
438 { &hf_h283_reliable
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_BOOLEAN
},
439 { &hf_h283_dataType
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_T_dataType
},
444 dissect_h283_RDCData(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
445 offset
= dissect_per_sequence(tvb
, offset
, actx
, tree
, hf_index
,
446 ett_h283_RDCData
, RDCData_sequence
);
452 static const value_string h283_T_pduType_vals
[] = {
458 static const per_choice_t T_pduType_choice
[] = {
459 { 0, &hf_h283_ack
, ASN1_NO_EXTENSIONS
, dissect_h283_NULL
},
460 { 1, &hf_h283_rdcData
, ASN1_NO_EXTENSIONS
, dissect_h283_RDCData
},
465 dissect_h283_T_pduType(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
466 int32_t pdu_type
= -1;
467 const char *p
= NULL
;
468 offset
= dissect_per_choice(tvb
, offset
, actx
, tree
, hf_index
,
469 ett_h283_T_pduType
, T_pduType_choice
,
472 p
= try_val_to_str(pdu_type
, VALS(h283_T_pduType_vals
));
473 if (!info_is_set
&& p
) {
474 col_set_str(actx
->pinfo
->cinfo
, COL_INFO
, p
);
481 static const per_sequence_t LCTPDU_sequence
[] = {
482 { &hf_h283_srcAddr
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_MTAddress
},
483 { &hf_h283_dstAddr
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_MTAddress
},
484 { &hf_h283_timestamp
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_4294967295
},
485 { &hf_h283_seqNumber
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_INTEGER_0_65535
},
486 { &hf_h283_pduType
, ASN1_EXTENSION_ROOT
, ASN1_NOT_OPTIONAL
, dissect_h283_T_pduType
},
487 { &hf_h283_nonStandardParameters
, ASN1_EXTENSION_ROOT
, ASN1_OPTIONAL
, dissect_h283_SEQUENCE_OF_NonStandardParameter
},
492 dissect_h283_LCTPDU(tvbuff_t
*tvb _U_
, int offset _U_
, asn1_ctx_t
*actx _U_
, proto_tree
*tree _U_
, int hf_index _U_
) {
493 offset
= dissect_per_sequence(tvb
, offset
, actx
, tree
, hf_index
,
494 ett_h283_LCTPDU
, LCTPDU_sequence
);
501 static int dissect_LCTPDU_PDU(tvbuff_t
*tvb _U_
, packet_info
*pinfo _U_
, proto_tree
*tree _U_
, void *data _U_
) {
504 asn1_ctx_init(&asn1_ctx
, ASN1_ENC_PER
, true, pinfo
);
505 offset
= dissect_h283_LCTPDU(tvb
, offset
, &asn1_ctx
, tree
, hf_h283_LCTPDU_PDU
);
506 offset
+= 7; offset
>>= 3;
512 dissect_h283_udp(tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, void *data _U_
)
514 proto_item
*ti
= NULL
;
515 proto_tree
*h283_tree
= NULL
;
517 col_set_str(pinfo
->cinfo
, COL_PROTOCOL
, PSNAME
);
521 ti
= proto_tree_add_item(tree
, proto_h283
, tvb
, 0, -1, ENC_NA
);
522 h283_tree
= proto_item_add_subtree(ti
, ett_h283
);
524 return dissect_LCTPDU_PDU(tvb
, pinfo
, h283_tree
, NULL
);
527 /*--- proto_register_h283 ----------------------------------------------*/
528 void proto_register_h283(void) {
531 static hf_register_info hf
[] = {
532 { &hf_h283_LCTPDU_PDU
,
533 { "LCTPDU", "h283.LCTPDU_element",
534 FT_NONE
, BASE_NONE
, NULL
, 0,
536 { &hf_h283_t35CountryCode
,
537 { "t35CountryCode", "h283.t35CountryCode",
538 FT_UINT32
, BASE_DEC
, NULL
, 0,
539 "INTEGER_0_255", HFILL
}},
540 { &hf_h283_t35Extension
,
541 { "t35Extension", "h283.t35Extension",
542 FT_UINT32
, BASE_DEC
, NULL
, 0,
543 "INTEGER_0_255", HFILL
}},
544 { &hf_h283_manufacturerCode
,
545 { "manufacturerCode", "h283.manufacturerCode",
546 FT_UINT32
, BASE_DEC
, NULL
, 0,
547 "INTEGER_0_65535", HFILL
}},
549 { "object", "h283.object",
550 FT_OID
, BASE_NONE
, NULL
, 0,
551 "OBJECT_IDENTIFIER", HFILL
}},
552 { &hf_h283_h221NonStandard
,
553 { "h221NonStandard", "h283.h221NonStandard_element",
554 FT_NONE
, BASE_NONE
, NULL
, 0,
556 { &hf_h283_nonStandardIdentifier
,
557 { "nonStandardIdentifier", "h283.nonStandardIdentifier",
558 FT_UINT32
, BASE_DEC
, VALS(h283_NonStandardIdentifier_vals
), 0,
561 { "data", "h283.data",
562 FT_BYTES
, BASE_NONE
, NULL
, 0,
563 "OCTET_STRING", HFILL
}},
565 { "srcAddr", "h283.srcAddr_element",
566 FT_NONE
, BASE_NONE
, NULL
, 0,
567 "MTAddress", HFILL
}},
569 { "dstAddr", "h283.dstAddr_element",
570 FT_NONE
, BASE_NONE
, NULL
, 0,
571 "MTAddress", HFILL
}},
572 { &hf_h283_timestamp
,
573 { "timestamp", "h283.timestamp",
574 FT_UINT32
, BASE_DEC
, NULL
, 0,
575 "INTEGER_0_4294967295", HFILL
}},
576 { &hf_h283_seqNumber
,
577 { "seqNumber", "h283.seqNumber",
578 FT_UINT32
, BASE_DEC
, NULL
, 0,
579 "INTEGER_0_65535", HFILL
}},
581 { "pduType", "h283.pduType",
582 FT_UINT32
, BASE_DEC
, VALS(h283_T_pduType_vals
), 0,
585 { "ack", "h283.ack_element",
586 FT_NONE
, BASE_NONE
, NULL
, 0,
589 { "rdcData", "h283.rdcData_element",
590 FT_NONE
, BASE_NONE
, NULL
, 0,
592 { &hf_h283_nonStandardParameters
,
593 { "nonStandardParameters", "h283.nonStandardParameters",
594 FT_UINT32
, BASE_DEC
, NULL
, 0,
595 "SEQUENCE_OF_NonStandardParameter", HFILL
}},
596 { &hf_h283_nonStandardParameters_item
,
597 { "NonStandardParameter", "h283.NonStandardParameter_element",
598 FT_NONE
, BASE_NONE
, NULL
, 0,
601 { "mAddress", "h283.mAddress",
602 FT_UINT32
, BASE_DEC
, NULL
, 0,
603 "INTEGER_0_65535", HFILL
}},
605 { "tAddress", "h283.tAddress",
606 FT_UINT32
, BASE_DEC
, NULL
, 0,
607 "INTEGER_0_65535", HFILL
}},
609 { "reliable", "h283.reliable",
610 FT_BOOLEAN
, BASE_NONE
, NULL
, 0,
613 { "dataType", "h283.dataType",
614 FT_UINT32
, BASE_DEC
, VALS(h283_T_dataType_vals
), 0,
616 { &hf_h283_lctMessage
,
617 { "lctMessage", "h283.lctMessage",
618 FT_UINT32
, BASE_DEC
, VALS(h283_LCTMessage_vals
), 0,
621 { "rdcPDU", "h283.rdcPDU",
622 FT_UINT32
, BASE_DEC
, NULL
, 0,
624 { &hf_h283_lctRequest
,
625 { "lctRequest", "h283.lctRequest",
626 FT_UINT32
, BASE_DEC
, VALS(h283_LCTRequest_vals
), 0,
628 { &hf_h283_lctResponse
,
629 { "lctResponse", "h283.lctResponse",
630 FT_UINT32
, BASE_DEC
, VALS(h283_LCTResponse_vals
), 0,
632 { &hf_h283_lctIndication
,
633 { "lctIndication", "h283.lctIndication",
634 FT_UINT32
, BASE_DEC
, VALS(h283_LCTIndication_vals
), 0,
636 { &hf_h283_nonStandardMessage
,
637 { "nonStandardMessage", "h283.nonStandardMessage_element",
638 FT_NONE
, BASE_NONE
, NULL
, 0,
640 { &hf_h283_announceReq
,
641 { "announceReq", "h283.announceReq_element",
642 FT_NONE
, BASE_NONE
, NULL
, 0,
644 { &hf_h283_deviceListReq
,
645 { "deviceListReq", "h283.deviceListReq_element",
646 FT_NONE
, BASE_NONE
, NULL
, 0,
648 { &hf_h283_announceResp
,
649 { "announceResp", "h283.announceResp_element",
650 FT_NONE
, BASE_NONE
, NULL
, 0,
652 { &hf_h283_deviceListResp
,
653 { "deviceListResp", "h283.deviceListResp",
654 FT_UINT32
, BASE_DEC
, NULL
, 0,
656 { &hf_h283_deviceChange
,
657 { "deviceChange", "h283.deviceChange_element",
658 FT_NONE
, BASE_NONE
, NULL
, 0,
662 /* List of subtrees */
663 static int *ett
[] = {
665 &ett_h283_H221NonStandard
,
666 &ett_h283_NonStandardIdentifier
,
667 &ett_h283_NonStandardParameter
,
670 &ett_h283_SEQUENCE_OF_NonStandardParameter
,
673 &ett_h283_T_dataType
,
674 &ett_h283_LCTMessage
,
675 &ett_h283_LCTRequest
,
676 &ett_h283_LCTResponse
,
677 &ett_h283_LCTIndication
,
678 &ett_h283_NonStandardMessage
,
681 /* Register protocol */
682 proto_h283
= proto_register_protocol(PNAME
, PSNAME
, PFNAME
);
684 /* Register fields and subtrees */
685 proto_register_field_array(proto_h283
, hf
, array_length(hf
));
686 proto_register_subtree_array(ett
, array_length(ett
));
688 h283_udp_handle
= register_dissector(PFNAME
, dissect_h283_udp
, proto_h283
);
692 /*--- proto_reg_handoff_h283 -------------------------------------------*/
693 void proto_reg_handoff_h283(void)
695 dissector_add_for_decode_as_with_preference("udp.port", h283_udp_handle
);
697 rdc_pdu_handle
= find_dissector_add_dependency("rdc", proto_h283
);
698 rdc_device_list_handle
= find_dissector_add_dependency("rdc.device_list", proto_h283
);
699 data_handle
= find_dissector("data");