Revert "TODO epan/dissectors/asn1/kerberos/packet-kerberos-template.c new GSS flags"
[wireshark-sm.git] / epan / dissectors / packet-sabp.c
blobe5a26a64992bc1198a9c072e8f5ee883edfe9b4e
1 /* Do not modify this file. Changes will be overwritten. */
2 /* Generated automatically by the ASN.1 to Wireshark dissector compiler */
3 /* packet-sabp.c */
4 /* asn2wrs.py -q -L -p sabp -c ./sabp.cnf -s ./packet-sabp-template -D . -O ../.. SABP-CommonDataTypes.asn SABP-Constants.asn SABP-Containers.asn SABP-IEs.asn SABP-PDU-Contents.asn SABP-PDU-Descriptions.asn */
6 /* packet-sabp-template.c
7 * Routines for UTRAN Iu-BC Interface: Service Area Broadcast Protocol (SABP) packet dissection
8 * Copyright 2007, Tomas Kukosa <tomas.kukosa@siemens.com>
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
16 * Ref: 3GPP TS 25.419 version V9.0.0 (2009-12)
19 #include "config.h"
21 #include <epan/packet.h>
23 #include <epan/asn1.h>
24 #include <wsutil/array.h>
26 #include "packet-tcp.h"
27 #include "packet-per.h"
28 #include "packet-e212.h"
29 #include "packet-gsm_map.h"
30 #include "packet-gsm_sms.h"
31 #include <epan/sctpppids.h>
32 #include "packet-cell_broadcast.h"
34 #define PNAME "UTRAN IuBC interface SABP signaling"
35 #define PSNAME "SABP"
36 #define PFNAME "sabp"
38 #define maxNrOfErrors 256
39 #define maxnoofSAI 65535
40 #define maxProtocolExtensions 65535
41 #define maxProtocolIEs 65535
42 #define maxNrOfLevels 256
44 typedef enum _ProcedureCode_enum {
45 id_Write_Replace = 0,
46 id_Kill = 1,
47 id_Load_Status_Enquiry = 2,
48 id_Message_Status_Query = 3,
49 id_Restart_Indication = 4,
50 id_Reset = 5,
51 id_Failure_Indication = 6,
52 id_Error_Indication = 7
53 } ProcedureCode_enum;
55 typedef enum _ProtocolIE_ID_enum {
56 id_Broadcast_Message_Content = 0,
57 id_Category = 1,
58 id_Cause = 2,
59 id_Criticality_Diagnostics = 3,
60 id_Data_Coding_Scheme = 4,
61 id_Failure_List = 5,
62 id_Message_Identifier = 6,
63 id_New_Serial_Number = 7,
64 id_Number_of_Broadcasts_Completed_List = 8,
65 id_Number_of_Broadcasts_Requested = 9,
66 id_Old_Serial_Number = 10,
67 id_Radio_Resource_Loading_List = 11,
68 id_Recovery_Indication = 12,
69 id_Repetition_Period = 13,
70 id_Serial_Number = 14,
71 id_Service_Areas_List = 15,
72 id_MessageStructure = 16,
73 id_TypeOfError = 17,
74 id_Paging_ETWS_Indicator = 18,
75 id_Warning_Type = 19,
76 id_WarningSecurityInfo = 20,
77 id_Broadcast_Message_Content_Validity_Indicator = 21
78 } ProtocolIE_ID_enum;
80 void proto_register_sabp(void);
81 void proto_reg_handoff_sabp(void);
83 /* Initialize the protocol and registered fields */
84 static int proto_sabp;
86 static int hf_sabp_no_of_pages;
87 static int hf_sabp_cb_inf_len;
88 static int hf_sabp_cb_msg_inf_page;
89 static int hf_sabp_cbs_page_content;
90 static int hf_sabp_Broadcast_Message_Content_PDU; /* Broadcast_Message_Content */
91 static int hf_sabp_Broadcast_Message_Content_Validity_Indicator_PDU; /* Broadcast_Message_Content_Validity_Indicator */
92 static int hf_sabp_Category_PDU; /* Category */
93 static int hf_sabp_Cause_PDU; /* Cause */
94 static int hf_sabp_Criticality_Diagnostics_PDU; /* Criticality_Diagnostics */
95 static int hf_sabp_MessageStructure_PDU; /* MessageStructure */
96 static int hf_sabp_Data_Coding_Scheme_PDU; /* Data_Coding_Scheme */
97 static int hf_sabp_Failure_List_PDU; /* Failure_List */
98 static int hf_sabp_Message_Identifier_PDU; /* Message_Identifier */
99 static int hf_sabp_New_Serial_Number_PDU; /* New_Serial_Number */
100 static int hf_sabp_Number_of_Broadcasts_Completed_List_PDU; /* Number_of_Broadcasts_Completed_List */
101 static int hf_sabp_Number_of_Broadcasts_Requested_PDU; /* Number_of_Broadcasts_Requested */
102 static int hf_sabp_Old_Serial_Number_PDU; /* Old_Serial_Number */
103 static int hf_sabp_Paging_ETWS_Indicator_PDU; /* Paging_ETWS_Indicator */
104 static int hf_sabp_Radio_Resource_Loading_List_PDU; /* Radio_Resource_Loading_List */
105 static int hf_sabp_Recovery_Indication_PDU; /* Recovery_Indication */
106 static int hf_sabp_Repetition_Period_PDU; /* Repetition_Period */
107 static int hf_sabp_Serial_Number_PDU; /* Serial_Number */
108 static int hf_sabp_Service_Areas_List_PDU; /* Service_Areas_List */
109 static int hf_sabp_TypeOfError_PDU; /* TypeOfError */
110 static int hf_sabp_WarningSecurityInfo_PDU; /* WarningSecurityInfo */
111 static int hf_sabp_Warning_Type_PDU; /* Warning_Type */
112 static int hf_sabp_Write_Replace_PDU; /* Write_Replace */
113 static int hf_sabp_Write_Replace_Complete_PDU; /* Write_Replace_Complete */
114 static int hf_sabp_Write_Replace_Failure_PDU; /* Write_Replace_Failure */
115 static int hf_sabp_Kill_PDU; /* Kill */
116 static int hf_sabp_Kill_Complete_PDU; /* Kill_Complete */
117 static int hf_sabp_Kill_Failure_PDU; /* Kill_Failure */
118 static int hf_sabp_Load_Query_PDU; /* Load_Query */
119 static int hf_sabp_Load_Query_Complete_PDU; /* Load_Query_Complete */
120 static int hf_sabp_Load_Query_Failure_PDU; /* Load_Query_Failure */
121 static int hf_sabp_Message_Status_Query_PDU; /* Message_Status_Query */
122 static int hf_sabp_Message_Status_Query_Complete_PDU; /* Message_Status_Query_Complete */
123 static int hf_sabp_Message_Status_Query_Failure_PDU; /* Message_Status_Query_Failure */
124 static int hf_sabp_Reset_PDU; /* Reset */
125 static int hf_sabp_Reset_Complete_PDU; /* Reset_Complete */
126 static int hf_sabp_Reset_Failure_PDU; /* Reset_Failure */
127 static int hf_sabp_Restart_PDU; /* Restart */
128 static int hf_sabp_Failure_PDU; /* Failure */
129 static int hf_sabp_Error_Indication_PDU; /* Error_Indication */
130 static int hf_sabp_SABP_PDU_PDU; /* SABP_PDU */
131 static int hf_sabp_ProtocolIE_Container_item; /* ProtocolIE_Field */
132 static int hf_sabp_id; /* ProtocolIE_ID */
133 static int hf_sabp_criticality; /* Criticality */
134 static int hf_sabp_protocolIE_Field_value; /* ProtocolIE_Field_value */
135 static int hf_sabp_ProtocolExtensionContainer_item; /* ProtocolExtensionField */
136 static int hf_sabp_ext_id; /* ProtocolExtensionID */
137 static int hf_sabp_extensionValue; /* T_extensionValue */
138 static int hf_sabp_procedureCode; /* ProcedureCode */
139 static int hf_sabp_triggeringMessage; /* TriggeringMessage */
140 static int hf_sabp_procedureCriticality; /* Criticality */
141 static int hf_sabp_iEsCriticalityDiagnostics; /* CriticalityDiagnostics_IE_List */
142 static int hf_sabp_iE_Extensions; /* ProtocolExtensionContainer */
143 static int hf_sabp_CriticalityDiagnostics_IE_List_item; /* CriticalityDiagnostics_IE_List_item */
144 static int hf_sabp_iECriticality; /* Criticality */
145 static int hf_sabp_iE_ID; /* ProtocolIE_ID */
146 static int hf_sabp_repetitionNumber; /* RepetitionNumber0 */
147 static int hf_sabp_MessageStructure_item; /* MessageStructure_item */
148 static int hf_sabp_repetitionNumber1; /* RepetitionNumber1 */
149 static int hf_sabp_Failure_List_item; /* Failure_List_Item */
150 static int hf_sabp_service_area_identifier; /* Service_Area_Identifier */
151 static int hf_sabp_cause; /* Cause */
152 static int hf_sabp_Number_of_Broadcasts_Completed_List_item; /* Number_of_Broadcasts_Completed_List_Item */
153 static int hf_sabp_number_of_broadcasts_completed; /* INTEGER_0_65535 */
154 static int hf_sabp_number_of_broadcasts_completed_info; /* Number_Of_Broadcasts_Completed_Info */
155 static int hf_sabp_Radio_Resource_Loading_List_item; /* Radio_Resource_Loading_List_Item */
156 static int hf_sabp_available_bandwidth; /* Available_Bandwidth */
157 static int hf_sabp_pLMNidentity; /* T_pLMNidentity */
158 static int hf_sabp_lac; /* OCTET_STRING_SIZE_2 */
159 static int hf_sabp_sac; /* OCTET_STRING_SIZE_2 */
160 static int hf_sabp_Service_Areas_List_item; /* Service_Area_Identifier */
161 static int hf_sabp_protocolIEs; /* ProtocolIE_Container */
162 static int hf_sabp_protocolExtensions; /* ProtocolExtensionContainer */
163 static int hf_sabp_initiatingMessage; /* InitiatingMessage */
164 static int hf_sabp_successfulOutcome; /* SuccessfulOutcome */
165 static int hf_sabp_unsuccessfulOutcome; /* UnsuccessfulOutcome */
166 static int hf_sabp_initiatingMessage_value; /* InitiatingMessage_value */
167 static int hf_sabp_successfulOutcome_value; /* SuccessfulOutcome_value */
168 static int hf_sabp_unsuccessfulOutcome_value; /* UnsuccessfulOutcome_value */
170 /* Initialize the subtree pointers */
171 static int ett_sabp;
172 static int ett_sabp_e212;
173 static int ett_sabp_cbs_data_coding;
174 static int ett_sabp_bcast_msg;
175 static int ett_sabp_cbs_serial_number;
176 static int ett_sabp_cbs_new_serial_number;
177 static int ett_sabp_cbs_page;
178 static int ett_sabp_cbs_page_content;
180 static int ett_sabp_ProtocolIE_Container;
181 static int ett_sabp_ProtocolIE_Field;
182 static int ett_sabp_ProtocolExtensionContainer;
183 static int ett_sabp_ProtocolExtensionField;
184 static int ett_sabp_Criticality_Diagnostics;
185 static int ett_sabp_CriticalityDiagnostics_IE_List;
186 static int ett_sabp_CriticalityDiagnostics_IE_List_item;
187 static int ett_sabp_MessageStructure;
188 static int ett_sabp_MessageStructure_item;
189 static int ett_sabp_Failure_List;
190 static int ett_sabp_Failure_List_Item;
191 static int ett_sabp_Number_of_Broadcasts_Completed_List;
192 static int ett_sabp_Number_of_Broadcasts_Completed_List_Item;
193 static int ett_sabp_Radio_Resource_Loading_List;
194 static int ett_sabp_Radio_Resource_Loading_List_Item;
195 static int ett_sabp_Service_Area_Identifier;
196 static int ett_sabp_Service_Areas_List;
197 static int ett_sabp_Write_Replace;
198 static int ett_sabp_Write_Replace_Complete;
199 static int ett_sabp_Write_Replace_Failure;
200 static int ett_sabp_Kill;
201 static int ett_sabp_Kill_Complete;
202 static int ett_sabp_Kill_Failure;
203 static int ett_sabp_Load_Query;
204 static int ett_sabp_Load_Query_Complete;
205 static int ett_sabp_Load_Query_Failure;
206 static int ett_sabp_Message_Status_Query;
207 static int ett_sabp_Message_Status_Query_Complete;
208 static int ett_sabp_Message_Status_Query_Failure;
209 static int ett_sabp_Reset;
210 static int ett_sabp_Reset_Complete;
211 static int ett_sabp_Reset_Failure;
212 static int ett_sabp_Restart;
213 static int ett_sabp_Failure;
214 static int ett_sabp_Error_Indication;
215 static int ett_sabp_SABP_PDU;
216 static int ett_sabp_InitiatingMessage;
217 static int ett_sabp_SuccessfulOutcome;
218 static int ett_sabp_UnsuccessfulOutcome;
220 /* Global variables */
221 static uint32_t ProcedureCode;
222 static uint32_t ProtocolIE_ID;
223 static uint32_t ProtocolExtensionID;
224 static uint8_t sms_encoding;
226 #define SABP_PORT 3452
228 /* Dissector tables */
229 static dissector_table_t sabp_ies_dissector_table;
230 static dissector_table_t sabp_extension_dissector_table;
231 static dissector_table_t sabp_proc_imsg_dissector_table;
232 static dissector_table_t sabp_proc_sout_dissector_table;
233 static dissector_table_t sabp_proc_uout_dissector_table;
235 static dissector_handle_t sabp_handle;
236 static dissector_handle_t sabp_tcp_handle;
238 static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
239 static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
240 static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
241 static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
242 static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *);
243 static void dissect_sabp_cb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
246 static const value_string sabp_Criticality_vals[] = {
247 { 0, "reject" },
248 { 1, "ignore" },
249 { 2, "notify" },
250 { 0, NULL }
254 static int
255 dissect_sabp_Criticality(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
256 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
257 3, NULL, false, 0, NULL);
259 return offset;
263 static const value_string sabp_ProcedureCode_vals[] = {
264 { id_Write_Replace, "id-Write-Replace" },
265 { id_Kill, "id-Kill" },
266 { id_Load_Status_Enquiry, "id-Load-Status-Enquiry" },
267 { id_Message_Status_Query, "id-Message-Status-Query" },
268 { id_Restart_Indication, "id-Restart-Indication" },
269 { id_Reset, "id-Reset" },
270 { id_Failure_Indication, "id-Failure-Indication" },
271 { id_Error_Indication, "id-Error-Indication" },
272 { 0, NULL }
275 static value_string_ext sabp_ProcedureCode_vals_ext = VALUE_STRING_EXT_INIT(sabp_ProcedureCode_vals);
278 static int
279 dissect_sabp_ProcedureCode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
280 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
281 0U, 255U, &ProcedureCode, false);
283 col_add_fstr(actx->pinfo->cinfo, COL_INFO, "%s ",
284 val_to_str_ext_const(ProcedureCode, &sabp_ProcedureCode_vals_ext,
285 "unknown message"));
286 return offset;
291 static int
292 dissect_sabp_ProtocolExtensionID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
293 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
294 0U, 65535U, &ProtocolExtensionID, false);
296 return offset;
300 static const value_string sabp_ProtocolIE_ID_vals[] = {
301 { id_Broadcast_Message_Content, "id-Broadcast-Message-Content" },
302 { id_Category, "id-Category" },
303 { id_Cause, "id-Cause" },
304 { id_Criticality_Diagnostics, "id-Criticality-Diagnostics" },
305 { id_Data_Coding_Scheme, "id-Data-Coding-Scheme" },
306 { id_Failure_List, "id-Failure-List" },
307 { id_Message_Identifier, "id-Message-Identifier" },
308 { id_New_Serial_Number, "id-New-Serial-Number" },
309 { id_Number_of_Broadcasts_Completed_List, "id-Number-of-Broadcasts-Completed-List" },
310 { id_Number_of_Broadcasts_Requested, "id-Number-of-Broadcasts-Requested" },
311 { id_Old_Serial_Number, "id-Old-Serial-Number" },
312 { id_Radio_Resource_Loading_List, "id-Radio-Resource-Loading-List" },
313 { id_Recovery_Indication, "id-Recovery-Indication" },
314 { id_Repetition_Period, "id-Repetition-Period" },
315 { id_Serial_Number, "id-Serial-Number" },
316 { id_Service_Areas_List, "id-Service-Areas-List" },
317 { id_MessageStructure, "id-MessageStructure" },
318 { id_TypeOfError, "id-TypeOfError" },
319 { id_Paging_ETWS_Indicator, "id-Paging-ETWS-Indicator" },
320 { id_Warning_Type, "id-Warning-Type" },
321 { id_WarningSecurityInfo, "id-WarningSecurityInfo" },
322 { id_Broadcast_Message_Content_Validity_Indicator, "id-Broadcast-Message-Content-Validity-Indicator" },
323 { 0, NULL }
326 static value_string_ext sabp_ProtocolIE_ID_vals_ext = VALUE_STRING_EXT_INIT(sabp_ProtocolIE_ID_vals);
329 static int
330 dissect_sabp_ProtocolIE_ID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
331 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
332 0U, 65535U, &ProtocolIE_ID, false);
334 if (tree) {
335 proto_item_append_text(proto_item_get_parent_nth(actx->created_item, 2), ": %s",
336 val_to_str_ext(ProtocolIE_ID, &sabp_ProtocolIE_ID_vals_ext, "unknown (%d)"));
338 return offset;
342 static const value_string sabp_TriggeringMessage_vals[] = {
343 { 0, "initiating-message" },
344 { 1, "successful-outcome" },
345 { 2, "unsuccessful-outcome" },
346 { 3, "outcome" },
347 { 0, NULL }
351 static int
352 dissect_sabp_TriggeringMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
353 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
354 4, NULL, false, 0, NULL);
356 return offset;
361 static int
362 dissect_sabp_ProtocolIE_Field_value(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
363 offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_ProtocolIEFieldValue);
365 return offset;
369 static const per_sequence_t ProtocolIE_Field_sequence[] = {
370 { &hf_sabp_id , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_ID },
371 { &hf_sabp_criticality , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Criticality },
372 { &hf_sabp_protocolIE_Field_value, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Field_value },
373 { NULL, 0, 0, NULL }
376 static int
377 dissect_sabp_ProtocolIE_Field(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
378 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
379 ett_sabp_ProtocolIE_Field, ProtocolIE_Field_sequence);
381 return offset;
385 static const per_sequence_t ProtocolIE_Container_sequence_of[1] = {
386 { &hf_sabp_ProtocolIE_Container_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Field },
389 static int
390 dissect_sabp_ProtocolIE_Container(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
391 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
392 ett_sabp_ProtocolIE_Container, ProtocolIE_Container_sequence_of,
393 0, maxProtocolIEs, false);
395 return offset;
400 static int
401 dissect_sabp_T_extensionValue(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
402 offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_ProtocolExtensionFieldExtensionValue);
404 return offset;
408 static const per_sequence_t ProtocolExtensionField_sequence[] = {
409 { &hf_sabp_ext_id , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolExtensionID },
410 { &hf_sabp_criticality , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Criticality },
411 { &hf_sabp_extensionValue , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_T_extensionValue },
412 { NULL, 0, 0, NULL }
415 static int
416 dissect_sabp_ProtocolExtensionField(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
417 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
418 ett_sabp_ProtocolExtensionField, ProtocolExtensionField_sequence);
420 return offset;
424 static const per_sequence_t ProtocolExtensionContainer_sequence_of[1] = {
425 { &hf_sabp_ProtocolExtensionContainer_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolExtensionField },
428 static int
429 dissect_sabp_ProtocolExtensionContainer(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
430 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
431 ett_sabp_ProtocolExtensionContainer, ProtocolExtensionContainer_sequence_of,
432 1, maxProtocolExtensions, false);
434 return offset;
439 static int
440 dissect_sabp_Available_Bandwidth(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
441 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
442 0U, 20480U, NULL, false);
444 return offset;
449 static int
450 dissect_sabp_Broadcast_Message_Content(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
451 tvbuff_t *parameter_tvb=NULL;
453 offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
454 1, 9968, false, NULL, 0, &parameter_tvb, NULL);
456 if (!parameter_tvb)
457 return offset;
458 dissect_sabp_cb_data(parameter_tvb, actx->pinfo, tree);
460 return offset;
464 static const value_string sabp_Broadcast_Message_Content_Validity_Indicator_vals[] = {
465 { 0, "broadcast-Message-Content-not-valid" },
466 { 0, NULL }
470 static int
471 dissect_sabp_Broadcast_Message_Content_Validity_Indicator(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
472 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
473 1, NULL, true, 0, NULL);
475 return offset;
479 static const value_string sabp_Category_vals[] = {
480 { 0, "high-priority" },
481 { 1, "background-priority" },
482 { 2, "normal-priority" },
483 { 3, "default-priority" },
484 { 0, NULL }
488 static int
489 dissect_sabp_Category(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
490 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
491 4, NULL, true, 0, NULL);
493 return offset;
497 static const value_string sabp_Cause_vals[] = {
498 { 0, "parameter-not-recognised" },
499 { 1, "parameter-value-invalid" },
500 { 2, "valid-CN-message-not-identified" },
501 { 3, "service-area-identity-not-valid" },
502 { 4, "unrecognised-message" },
503 { 5, "missing-mandatory-element" },
504 { 6, "rNC-capacity-exceeded" },
505 { 7, "rNC-memory-exceeded" },
506 { 8, "service-area-broadcast-not-supported" },
507 { 9, "service-area-broadcast-not-operational" },
508 { 10, "message-reference-already-used" },
509 { 11, "unspecifed-error" },
510 { 12, "transfer-syntax-error" },
511 { 13, "semantic-error" },
512 { 14, "message-not-compatible-with-receiver-state" },
513 { 15, "abstract-syntax-error-reject" },
514 { 16, "abstract-syntax-error-ignore-and-notify" },
515 { 17, "abstract-syntax-error-falsely-constructed-message" },
516 { 0, NULL }
519 static value_string_ext sabp_Cause_vals_ext = VALUE_STRING_EXT_INIT(sabp_Cause_vals);
522 static int
523 dissect_sabp_Cause(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
524 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
525 0U, 255U, NULL, false);
527 return offset;
532 static int
533 dissect_sabp_RepetitionNumber0(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
534 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
535 0U, 255U, NULL, false);
537 return offset;
541 static const per_sequence_t CriticalityDiagnostics_IE_List_item_sequence[] = {
542 { &hf_sabp_iECriticality , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_Criticality },
543 { &hf_sabp_iE_ID , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_ID },
544 { &hf_sabp_repetitionNumber, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_RepetitionNumber0 },
545 { &hf_sabp_iE_Extensions , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
546 { NULL, 0, 0, NULL }
549 static int
550 dissect_sabp_CriticalityDiagnostics_IE_List_item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
551 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
552 ett_sabp_CriticalityDiagnostics_IE_List_item, CriticalityDiagnostics_IE_List_item_sequence);
554 return offset;
558 static const per_sequence_t CriticalityDiagnostics_IE_List_sequence_of[1] = {
559 { &hf_sabp_CriticalityDiagnostics_IE_List_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_CriticalityDiagnostics_IE_List_item },
562 static int
563 dissect_sabp_CriticalityDiagnostics_IE_List(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
564 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
565 ett_sabp_CriticalityDiagnostics_IE_List, CriticalityDiagnostics_IE_List_sequence_of,
566 1, maxNrOfErrors, false);
568 return offset;
572 static const per_sequence_t Criticality_Diagnostics_sequence[] = {
573 { &hf_sabp_procedureCode , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProcedureCode },
574 { &hf_sabp_triggeringMessage, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_TriggeringMessage },
575 { &hf_sabp_procedureCriticality, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_Criticality },
576 { &hf_sabp_iEsCriticalityDiagnostics, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_CriticalityDiagnostics_IE_List },
577 { &hf_sabp_iE_Extensions , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
578 { NULL, 0, 0, NULL }
581 static int
582 dissect_sabp_Criticality_Diagnostics(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
583 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
584 ett_sabp_Criticality_Diagnostics, Criticality_Diagnostics_sequence);
586 return offset;
591 static int
592 dissect_sabp_RepetitionNumber1(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
593 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
594 1U, 256U, NULL, false);
596 return offset;
600 static const per_sequence_t MessageStructure_item_sequence[] = {
601 { &hf_sabp_iE_ID , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_ID },
602 { &hf_sabp_repetitionNumber1, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_RepetitionNumber1 },
603 { &hf_sabp_iE_Extensions , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
604 { NULL, 0, 0, NULL }
607 static int
608 dissect_sabp_MessageStructure_item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
609 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
610 ett_sabp_MessageStructure_item, MessageStructure_item_sequence);
612 return offset;
616 static const per_sequence_t MessageStructure_sequence_of[1] = {
617 { &hf_sabp_MessageStructure_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_MessageStructure_item },
620 static int
621 dissect_sabp_MessageStructure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
622 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
623 ett_sabp_MessageStructure, MessageStructure_sequence_of,
624 1, maxNrOfLevels, false);
626 return offset;
631 static int
632 dissect_sabp_Data_Coding_Scheme(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
633 tvbuff_t *parameter_tvb=NULL;
634 proto_tree *subtree;
636 offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
637 8, 8, false, NULL, 0, &parameter_tvb, NULL);
640 if (!parameter_tvb)
641 return offset;
642 subtree = proto_item_add_subtree(actx->created_item, ett_sabp_cbs_data_coding);
643 sms_encoding = dissect_cbs_data_coding_scheme(parameter_tvb, actx->pinfo, subtree, 0);
646 return offset;
651 static int
652 dissect_sabp_T_pLMNidentity(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
653 tvbuff_t *parameter_tvb=NULL;
654 proto_tree *subtree;
656 offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
657 3, 3, false, &parameter_tvb);
659 if (!parameter_tvb)
660 return offset;
661 subtree = proto_item_add_subtree(actx->created_item, ett_sabp_e212);
662 dissect_e212_mcc_mnc(parameter_tvb, actx->pinfo, subtree, 0, E212_SAI, false);
665 return offset;
670 static int
671 dissect_sabp_OCTET_STRING_SIZE_2(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
672 offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
673 2, 2, false, NULL);
675 return offset;
679 static const per_sequence_t Service_Area_Identifier_sequence[] = {
680 { &hf_sabp_pLMNidentity , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_T_pLMNidentity },
681 { &hf_sabp_lac , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_OCTET_STRING_SIZE_2 },
682 { &hf_sabp_sac , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_OCTET_STRING_SIZE_2 },
683 { NULL, 0, 0, NULL }
686 static int
687 dissect_sabp_Service_Area_Identifier(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
688 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
689 ett_sabp_Service_Area_Identifier, Service_Area_Identifier_sequence);
691 return offset;
695 static const per_sequence_t Failure_List_Item_sequence[] = {
696 { &hf_sabp_service_area_identifier, ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_Service_Area_Identifier },
697 { &hf_sabp_cause , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_Cause },
698 { &hf_sabp_iE_Extensions , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
699 { NULL, 0, 0, NULL }
702 static int
703 dissect_sabp_Failure_List_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
704 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
705 ett_sabp_Failure_List_Item, Failure_List_Item_sequence);
707 return offset;
711 static const per_sequence_t Failure_List_sequence_of[1] = {
712 { &hf_sabp_Failure_List_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Failure_List_Item },
715 static int
716 dissect_sabp_Failure_List(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
717 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
718 ett_sabp_Failure_List, Failure_List_sequence_of,
719 1, maxnoofSAI, false);
721 return offset;
726 static int
727 dissect_sabp_Message_Identifier(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
728 tvbuff_t *parameter_tvb=NULL;
730 offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
731 16, 16, false, NULL, 0, &parameter_tvb, NULL);
733 if (!parameter_tvb)
734 return offset;
735 dissect_cbs_message_identifier(parameter_tvb, tree, 0);
738 return offset;
743 static int
744 dissect_sabp_Serial_Number(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
745 tvbuff_t *parameter_tvb=NULL;
746 proto_tree *subtree;
748 offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
749 16, 16, false, NULL, 0, &parameter_tvb, NULL);
751 if (!parameter_tvb)
752 return offset;
753 subtree = proto_item_add_subtree(actx->created_item, ett_sabp_cbs_serial_number);
754 dissect_cbs_serial_number(parameter_tvb, subtree, 0);
757 return offset;
762 static int
763 dissect_sabp_New_Serial_Number(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
764 tvbuff_t *parameter_tvb=NULL;
765 proto_tree *subtree;
767 offset = dissect_sabp_Serial_Number(tvb, offset, actx, tree, hf_index);
769 if (!parameter_tvb)
770 return offset;
771 subtree = proto_item_add_subtree(actx->created_item, ett_sabp_cbs_new_serial_number);
772 dissect_cbs_serial_number(parameter_tvb, subtree, 0);
775 return offset;
780 static int
781 dissect_sabp_INTEGER_0_65535(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
782 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
783 0U, 65535U, NULL, false);
785 return offset;
789 static const value_string sabp_Number_Of_Broadcasts_Completed_Info_vals[] = {
790 { 0, "overflow" },
791 { 1, "unknown" },
792 { 0, NULL }
796 static int
797 dissect_sabp_Number_Of_Broadcasts_Completed_Info(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
798 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
799 2, NULL, true, 0, NULL);
801 return offset;
805 static const per_sequence_t Number_of_Broadcasts_Completed_List_Item_sequence[] = {
806 { &hf_sabp_service_area_identifier, ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_Service_Area_Identifier },
807 { &hf_sabp_number_of_broadcasts_completed, ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_INTEGER_0_65535 },
808 { &hf_sabp_number_of_broadcasts_completed_info, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_Number_Of_Broadcasts_Completed_Info },
809 { &hf_sabp_iE_Extensions , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
810 { NULL, 0, 0, NULL }
813 static int
814 dissect_sabp_Number_of_Broadcasts_Completed_List_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
815 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
816 ett_sabp_Number_of_Broadcasts_Completed_List_Item, Number_of_Broadcasts_Completed_List_Item_sequence);
818 return offset;
822 static const per_sequence_t Number_of_Broadcasts_Completed_List_sequence_of[1] = {
823 { &hf_sabp_Number_of_Broadcasts_Completed_List_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Number_of_Broadcasts_Completed_List_Item },
826 static int
827 dissect_sabp_Number_of_Broadcasts_Completed_List(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
828 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
829 ett_sabp_Number_of_Broadcasts_Completed_List, Number_of_Broadcasts_Completed_List_sequence_of,
830 1, maxnoofSAI, false);
832 return offset;
836 static const value_string sabp_Number_of_Broadcasts_Requested_vals[] = {
837 { 0, "broadcast-indefinitely" },
838 { 0, NULL }
842 static int
843 dissect_sabp_Number_of_Broadcasts_Requested(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
844 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
845 0U, 65535U, NULL, false);
847 return offset;
852 static int
853 dissect_sabp_Old_Serial_Number(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
854 offset = dissect_sabp_Serial_Number(tvb, offset, actx, tree, hf_index);
856 return offset;
860 static const value_string sabp_Paging_ETWS_Indicator_vals[] = {
861 { 0, "paging" },
862 { 0, NULL }
866 static int
867 dissect_sabp_Paging_ETWS_Indicator(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
868 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
869 1, NULL, true, 0, NULL);
871 return offset;
875 static const per_sequence_t Radio_Resource_Loading_List_Item_sequence[] = {
876 { &hf_sabp_service_area_identifier, ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_Service_Area_Identifier },
877 { &hf_sabp_available_bandwidth, ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_Available_Bandwidth },
878 { &hf_sabp_iE_Extensions , ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
879 { NULL, 0, 0, NULL }
882 static int
883 dissect_sabp_Radio_Resource_Loading_List_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
884 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
885 ett_sabp_Radio_Resource_Loading_List_Item, Radio_Resource_Loading_List_Item_sequence);
887 return offset;
891 static const per_sequence_t Radio_Resource_Loading_List_sequence_of[1] = {
892 { &hf_sabp_Radio_Resource_Loading_List_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Radio_Resource_Loading_List_Item },
895 static int
896 dissect_sabp_Radio_Resource_Loading_List(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
897 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
898 ett_sabp_Radio_Resource_Loading_List, Radio_Resource_Loading_List_sequence_of,
899 1, maxnoofSAI, false);
901 return offset;
905 static const value_string sabp_Recovery_Indication_vals[] = {
906 { 0, "data-lost" },
907 { 1, "data-available" },
908 { 0, NULL }
912 static int
913 dissect_sabp_Recovery_Indication(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
914 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
915 2, NULL, false, 0, NULL);
917 return offset;
922 static int
923 dissect_sabp_Repetition_Period(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
924 offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
925 1U, 4096U, NULL, false);
927 return offset;
931 static const per_sequence_t Service_Areas_List_sequence_of[1] = {
932 { &hf_sabp_Service_Areas_List_item, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Service_Area_Identifier },
935 static int
936 dissect_sabp_Service_Areas_List(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
937 offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
938 ett_sabp_Service_Areas_List, Service_Areas_List_sequence_of,
939 1, maxnoofSAI, false);
941 return offset;
945 static const value_string sabp_TypeOfError_vals[] = {
946 { 0, "not-understood" },
947 { 1, "missing" },
948 { 0, NULL }
952 static int
953 dissect_sabp_TypeOfError(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
954 offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
955 2, NULL, true, 0, NULL);
957 return offset;
962 static int
963 dissect_sabp_WarningSecurityInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
964 offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
965 50, 50, false, NULL);
967 return offset;
972 static int
973 dissect_sabp_Warning_Type(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
974 offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
975 2, 2, false, NULL);
977 return offset;
981 static const per_sequence_t Write_Replace_sequence[] = {
982 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
983 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
984 { NULL, 0, 0, NULL }
987 static int
988 dissect_sabp_Write_Replace(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
989 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
990 ett_sabp_Write_Replace, Write_Replace_sequence);
992 return offset;
996 static const per_sequence_t Write_Replace_Complete_sequence[] = {
997 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
998 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
999 { NULL, 0, 0, NULL }
1002 static int
1003 dissect_sabp_Write_Replace_Complete(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1004 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1005 ett_sabp_Write_Replace_Complete, Write_Replace_Complete_sequence);
1007 return offset;
1011 static const per_sequence_t Write_Replace_Failure_sequence[] = {
1012 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1013 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1014 { NULL, 0, 0, NULL }
1017 static int
1018 dissect_sabp_Write_Replace_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1019 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1020 ett_sabp_Write_Replace_Failure, Write_Replace_Failure_sequence);
1022 return offset;
1026 static const per_sequence_t Kill_sequence[] = {
1027 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1028 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1029 { NULL, 0, 0, NULL }
1032 static int
1033 dissect_sabp_Kill(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1034 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1035 ett_sabp_Kill, Kill_sequence);
1037 return offset;
1041 static const per_sequence_t Kill_Complete_sequence[] = {
1042 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1043 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1044 { NULL, 0, 0, NULL }
1047 static int
1048 dissect_sabp_Kill_Complete(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1049 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1050 ett_sabp_Kill_Complete, Kill_Complete_sequence);
1052 return offset;
1056 static const per_sequence_t Kill_Failure_sequence[] = {
1057 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1058 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1059 { NULL, 0, 0, NULL }
1062 static int
1063 dissect_sabp_Kill_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1064 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1065 ett_sabp_Kill_Failure, Kill_Failure_sequence);
1067 return offset;
1071 static const per_sequence_t Load_Query_sequence[] = {
1072 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1073 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1074 { NULL, 0, 0, NULL }
1077 static int
1078 dissect_sabp_Load_Query(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1079 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1080 ett_sabp_Load_Query, Load_Query_sequence);
1082 return offset;
1086 static const per_sequence_t Load_Query_Complete_sequence[] = {
1087 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1088 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1089 { NULL, 0, 0, NULL }
1092 static int
1093 dissect_sabp_Load_Query_Complete(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1094 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1095 ett_sabp_Load_Query_Complete, Load_Query_Complete_sequence);
1097 return offset;
1101 static const per_sequence_t Load_Query_Failure_sequence[] = {
1102 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1103 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1104 { NULL, 0, 0, NULL }
1107 static int
1108 dissect_sabp_Load_Query_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1109 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1110 ett_sabp_Load_Query_Failure, Load_Query_Failure_sequence);
1112 return offset;
1116 static const per_sequence_t Message_Status_Query_sequence[] = {
1117 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1118 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1119 { NULL, 0, 0, NULL }
1122 static int
1123 dissect_sabp_Message_Status_Query(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1124 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1125 ett_sabp_Message_Status_Query, Message_Status_Query_sequence);
1127 return offset;
1131 static const per_sequence_t Message_Status_Query_Complete_sequence[] = {
1132 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1133 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1134 { NULL, 0, 0, NULL }
1137 static int
1138 dissect_sabp_Message_Status_Query_Complete(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1139 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1140 ett_sabp_Message_Status_Query_Complete, Message_Status_Query_Complete_sequence);
1142 return offset;
1146 static const per_sequence_t Message_Status_Query_Failure_sequence[] = {
1147 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1148 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1149 { NULL, 0, 0, NULL }
1152 static int
1153 dissect_sabp_Message_Status_Query_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1154 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1155 ett_sabp_Message_Status_Query_Failure, Message_Status_Query_Failure_sequence);
1157 return offset;
1161 static const per_sequence_t Reset_sequence[] = {
1162 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1163 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1164 { NULL, 0, 0, NULL }
1167 static int
1168 dissect_sabp_Reset(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1169 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1170 ett_sabp_Reset, Reset_sequence);
1172 return offset;
1176 static const per_sequence_t Reset_Complete_sequence[] = {
1177 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1178 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1179 { NULL, 0, 0, NULL }
1182 static int
1183 dissect_sabp_Reset_Complete(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1184 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1185 ett_sabp_Reset_Complete, Reset_Complete_sequence);
1187 return offset;
1191 static const per_sequence_t Reset_Failure_sequence[] = {
1192 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1193 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1194 { NULL, 0, 0, NULL }
1197 static int
1198 dissect_sabp_Reset_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1199 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1200 ett_sabp_Reset_Failure, Reset_Failure_sequence);
1202 return offset;
1206 static const per_sequence_t Restart_sequence[] = {
1207 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1208 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1209 { NULL, 0, 0, NULL }
1212 static int
1213 dissect_sabp_Restart(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1214 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1215 ett_sabp_Restart, Restart_sequence);
1217 return offset;
1221 static const per_sequence_t Failure_sequence[] = {
1222 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1223 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1224 { NULL, 0, 0, NULL }
1227 static int
1228 dissect_sabp_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1229 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1230 ett_sabp_Failure, Failure_sequence);
1232 return offset;
1236 static const per_sequence_t Error_Indication_sequence[] = {
1237 { &hf_sabp_protocolIEs , ASN1_EXTENSION_ROOT , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolIE_Container },
1238 { &hf_sabp_protocolExtensions, ASN1_EXTENSION_ROOT , ASN1_OPTIONAL , dissect_sabp_ProtocolExtensionContainer },
1239 { NULL, 0, 0, NULL }
1242 static int
1243 dissect_sabp_Error_Indication(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1244 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1245 ett_sabp_Error_Indication, Error_Indication_sequence);
1247 return offset;
1252 static int
1253 dissect_sabp_InitiatingMessage_value(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1254 offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_InitiatingMessageValue);
1256 return offset;
1260 static const per_sequence_t InitiatingMessage_sequence[] = {
1261 { &hf_sabp_procedureCode , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProcedureCode },
1262 { &hf_sabp_criticality , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Criticality },
1263 { &hf_sabp_initiatingMessage_value, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_InitiatingMessage_value },
1264 { NULL, 0, 0, NULL }
1267 static int
1268 dissect_sabp_InitiatingMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1269 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1270 ett_sabp_InitiatingMessage, InitiatingMessage_sequence);
1272 return offset;
1277 static int
1278 dissect_sabp_SuccessfulOutcome_value(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1279 offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_SuccessfulOutcomeValue);
1281 return offset;
1285 static const per_sequence_t SuccessfulOutcome_sequence[] = {
1286 { &hf_sabp_procedureCode , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProcedureCode },
1287 { &hf_sabp_criticality , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Criticality },
1288 { &hf_sabp_successfulOutcome_value, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_SuccessfulOutcome_value },
1289 { NULL, 0, 0, NULL }
1292 static int
1293 dissect_sabp_SuccessfulOutcome(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1294 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1295 ett_sabp_SuccessfulOutcome, SuccessfulOutcome_sequence);
1297 return offset;
1302 static int
1303 dissect_sabp_UnsuccessfulOutcome_value(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1304 offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_UnsuccessfulOutcomeValue);
1306 return offset;
1310 static const per_sequence_t UnsuccessfulOutcome_sequence[] = {
1311 { &hf_sabp_procedureCode , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_ProcedureCode },
1312 { &hf_sabp_criticality , ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_Criticality },
1313 { &hf_sabp_unsuccessfulOutcome_value, ASN1_NO_EXTENSIONS , ASN1_NOT_OPTIONAL, dissect_sabp_UnsuccessfulOutcome_value },
1314 { NULL, 0, 0, NULL }
1317 static int
1318 dissect_sabp_UnsuccessfulOutcome(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1319 offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1320 ett_sabp_UnsuccessfulOutcome, UnsuccessfulOutcome_sequence);
1322 return offset;
1326 static const value_string sabp_SABP_PDU_vals[] = {
1327 { 0, "initiatingMessage" },
1328 { 1, "successfulOutcome" },
1329 { 2, "unsuccessfulOutcome" },
1330 { 0, NULL }
1333 static const per_choice_t SABP_PDU_choice[] = {
1334 { 0, &hf_sabp_initiatingMessage, ASN1_EXTENSION_ROOT , dissect_sabp_InitiatingMessage },
1335 { 1, &hf_sabp_successfulOutcome, ASN1_EXTENSION_ROOT , dissect_sabp_SuccessfulOutcome },
1336 { 2, &hf_sabp_unsuccessfulOutcome, ASN1_EXTENSION_ROOT , dissect_sabp_UnsuccessfulOutcome },
1337 { 0, NULL, 0, NULL }
1340 static int
1341 dissect_sabp_SABP_PDU(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1342 offset = dissect_per_choice(tvb, offset, actx, tree, hf_index,
1343 ett_sabp_SABP_PDU, SABP_PDU_choice,
1344 NULL);
1346 return offset;
1349 /*--- PDUs ---*/
1351 static int dissect_Broadcast_Message_Content_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1352 int offset = 0;
1353 asn1_ctx_t asn1_ctx;
1354 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1355 offset = dissect_sabp_Broadcast_Message_Content(tvb, offset, &asn1_ctx, tree, hf_sabp_Broadcast_Message_Content_PDU);
1356 offset += 7; offset >>= 3;
1357 return offset;
1359 static int dissect_Broadcast_Message_Content_Validity_Indicator_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1360 int offset = 0;
1361 asn1_ctx_t asn1_ctx;
1362 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1363 offset = dissect_sabp_Broadcast_Message_Content_Validity_Indicator(tvb, offset, &asn1_ctx, tree, hf_sabp_Broadcast_Message_Content_Validity_Indicator_PDU);
1364 offset += 7; offset >>= 3;
1365 return offset;
1367 static int dissect_Category_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1368 int offset = 0;
1369 asn1_ctx_t asn1_ctx;
1370 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1371 offset = dissect_sabp_Category(tvb, offset, &asn1_ctx, tree, hf_sabp_Category_PDU);
1372 offset += 7; offset >>= 3;
1373 return offset;
1375 static int dissect_Cause_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1376 int offset = 0;
1377 asn1_ctx_t asn1_ctx;
1378 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1379 offset = dissect_sabp_Cause(tvb, offset, &asn1_ctx, tree, hf_sabp_Cause_PDU);
1380 offset += 7; offset >>= 3;
1381 return offset;
1383 static int dissect_Criticality_Diagnostics_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1384 int offset = 0;
1385 asn1_ctx_t asn1_ctx;
1386 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1387 offset = dissect_sabp_Criticality_Diagnostics(tvb, offset, &asn1_ctx, tree, hf_sabp_Criticality_Diagnostics_PDU);
1388 offset += 7; offset >>= 3;
1389 return offset;
1391 static int dissect_MessageStructure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1392 int offset = 0;
1393 asn1_ctx_t asn1_ctx;
1394 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1395 offset = dissect_sabp_MessageStructure(tvb, offset, &asn1_ctx, tree, hf_sabp_MessageStructure_PDU);
1396 offset += 7; offset >>= 3;
1397 return offset;
1399 static int dissect_Data_Coding_Scheme_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1400 int offset = 0;
1401 asn1_ctx_t asn1_ctx;
1402 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1403 offset = dissect_sabp_Data_Coding_Scheme(tvb, offset, &asn1_ctx, tree, hf_sabp_Data_Coding_Scheme_PDU);
1404 offset += 7; offset >>= 3;
1405 return offset;
1407 static int dissect_Failure_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1408 int offset = 0;
1409 asn1_ctx_t asn1_ctx;
1410 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1411 offset = dissect_sabp_Failure_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Failure_List_PDU);
1412 offset += 7; offset >>= 3;
1413 return offset;
1415 static int dissect_Message_Identifier_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1416 int offset = 0;
1417 asn1_ctx_t asn1_ctx;
1418 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1419 offset = dissect_sabp_Message_Identifier(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Identifier_PDU);
1420 offset += 7; offset >>= 3;
1421 return offset;
1423 static int dissect_New_Serial_Number_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1424 int offset = 0;
1425 asn1_ctx_t asn1_ctx;
1426 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1427 offset = dissect_sabp_New_Serial_Number(tvb, offset, &asn1_ctx, tree, hf_sabp_New_Serial_Number_PDU);
1428 offset += 7; offset >>= 3;
1429 return offset;
1431 static int dissect_Number_of_Broadcasts_Completed_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1432 int offset = 0;
1433 asn1_ctx_t asn1_ctx;
1434 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1435 offset = dissect_sabp_Number_of_Broadcasts_Completed_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Number_of_Broadcasts_Completed_List_PDU);
1436 offset += 7; offset >>= 3;
1437 return offset;
1439 static int dissect_Number_of_Broadcasts_Requested_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1440 int offset = 0;
1441 asn1_ctx_t asn1_ctx;
1442 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1443 offset = dissect_sabp_Number_of_Broadcasts_Requested(tvb, offset, &asn1_ctx, tree, hf_sabp_Number_of_Broadcasts_Requested_PDU);
1444 offset += 7; offset >>= 3;
1445 return offset;
1447 static int dissect_Old_Serial_Number_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1448 int offset = 0;
1449 asn1_ctx_t asn1_ctx;
1450 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1451 offset = dissect_sabp_Old_Serial_Number(tvb, offset, &asn1_ctx, tree, hf_sabp_Old_Serial_Number_PDU);
1452 offset += 7; offset >>= 3;
1453 return offset;
1455 static int dissect_Paging_ETWS_Indicator_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1456 int offset = 0;
1457 asn1_ctx_t asn1_ctx;
1458 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1459 offset = dissect_sabp_Paging_ETWS_Indicator(tvb, offset, &asn1_ctx, tree, hf_sabp_Paging_ETWS_Indicator_PDU);
1460 offset += 7; offset >>= 3;
1461 return offset;
1463 static int dissect_Radio_Resource_Loading_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1464 int offset = 0;
1465 asn1_ctx_t asn1_ctx;
1466 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1467 offset = dissect_sabp_Radio_Resource_Loading_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Radio_Resource_Loading_List_PDU);
1468 offset += 7; offset >>= 3;
1469 return offset;
1471 static int dissect_Recovery_Indication_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1472 int offset = 0;
1473 asn1_ctx_t asn1_ctx;
1474 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1475 offset = dissect_sabp_Recovery_Indication(tvb, offset, &asn1_ctx, tree, hf_sabp_Recovery_Indication_PDU);
1476 offset += 7; offset >>= 3;
1477 return offset;
1479 static int dissect_Repetition_Period_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1480 int offset = 0;
1481 asn1_ctx_t asn1_ctx;
1482 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1483 offset = dissect_sabp_Repetition_Period(tvb, offset, &asn1_ctx, tree, hf_sabp_Repetition_Period_PDU);
1484 offset += 7; offset >>= 3;
1485 return offset;
1487 static int dissect_Serial_Number_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1488 int offset = 0;
1489 asn1_ctx_t asn1_ctx;
1490 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1491 offset = dissect_sabp_Serial_Number(tvb, offset, &asn1_ctx, tree, hf_sabp_Serial_Number_PDU);
1492 offset += 7; offset >>= 3;
1493 return offset;
1495 static int dissect_Service_Areas_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1496 int offset = 0;
1497 asn1_ctx_t asn1_ctx;
1498 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1499 offset = dissect_sabp_Service_Areas_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Service_Areas_List_PDU);
1500 offset += 7; offset >>= 3;
1501 return offset;
1503 static int dissect_TypeOfError_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1504 int offset = 0;
1505 asn1_ctx_t asn1_ctx;
1506 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1507 offset = dissect_sabp_TypeOfError(tvb, offset, &asn1_ctx, tree, hf_sabp_TypeOfError_PDU);
1508 offset += 7; offset >>= 3;
1509 return offset;
1511 static int dissect_WarningSecurityInfo_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1512 int offset = 0;
1513 asn1_ctx_t asn1_ctx;
1514 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1515 offset = dissect_sabp_WarningSecurityInfo(tvb, offset, &asn1_ctx, tree, hf_sabp_WarningSecurityInfo_PDU);
1516 offset += 7; offset >>= 3;
1517 return offset;
1519 static int dissect_Warning_Type_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1520 int offset = 0;
1521 asn1_ctx_t asn1_ctx;
1522 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1523 offset = dissect_sabp_Warning_Type(tvb, offset, &asn1_ctx, tree, hf_sabp_Warning_Type_PDU);
1524 offset += 7; offset >>= 3;
1525 return offset;
1527 static int dissect_Write_Replace_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1528 int offset = 0;
1529 asn1_ctx_t asn1_ctx;
1530 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1531 offset = dissect_sabp_Write_Replace(tvb, offset, &asn1_ctx, tree, hf_sabp_Write_Replace_PDU);
1532 offset += 7; offset >>= 3;
1533 return offset;
1535 static int dissect_Write_Replace_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1536 int offset = 0;
1537 asn1_ctx_t asn1_ctx;
1538 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1539 offset = dissect_sabp_Write_Replace_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Write_Replace_Complete_PDU);
1540 offset += 7; offset >>= 3;
1541 return offset;
1543 static int dissect_Write_Replace_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1544 int offset = 0;
1545 asn1_ctx_t asn1_ctx;
1546 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1547 offset = dissect_sabp_Write_Replace_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Write_Replace_Failure_PDU);
1548 offset += 7; offset >>= 3;
1549 return offset;
1551 static int dissect_Kill_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1552 int offset = 0;
1553 asn1_ctx_t asn1_ctx;
1554 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1555 offset = dissect_sabp_Kill(tvb, offset, &asn1_ctx, tree, hf_sabp_Kill_PDU);
1556 offset += 7; offset >>= 3;
1557 return offset;
1559 static int dissect_Kill_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1560 int offset = 0;
1561 asn1_ctx_t asn1_ctx;
1562 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1563 offset = dissect_sabp_Kill_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Kill_Complete_PDU);
1564 offset += 7; offset >>= 3;
1565 return offset;
1567 static int dissect_Kill_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1568 int offset = 0;
1569 asn1_ctx_t asn1_ctx;
1570 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1571 offset = dissect_sabp_Kill_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Kill_Failure_PDU);
1572 offset += 7; offset >>= 3;
1573 return offset;
1575 static int dissect_Load_Query_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1576 int offset = 0;
1577 asn1_ctx_t asn1_ctx;
1578 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1579 offset = dissect_sabp_Load_Query(tvb, offset, &asn1_ctx, tree, hf_sabp_Load_Query_PDU);
1580 offset += 7; offset >>= 3;
1581 return offset;
1583 static int dissect_Load_Query_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1584 int offset = 0;
1585 asn1_ctx_t asn1_ctx;
1586 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1587 offset = dissect_sabp_Load_Query_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Load_Query_Complete_PDU);
1588 offset += 7; offset >>= 3;
1589 return offset;
1591 static int dissect_Load_Query_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1592 int offset = 0;
1593 asn1_ctx_t asn1_ctx;
1594 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1595 offset = dissect_sabp_Load_Query_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Load_Query_Failure_PDU);
1596 offset += 7; offset >>= 3;
1597 return offset;
1599 static int dissect_Message_Status_Query_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1600 int offset = 0;
1601 asn1_ctx_t asn1_ctx;
1602 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1603 offset = dissect_sabp_Message_Status_Query(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Status_Query_PDU);
1604 offset += 7; offset >>= 3;
1605 return offset;
1607 static int dissect_Message_Status_Query_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1608 int offset = 0;
1609 asn1_ctx_t asn1_ctx;
1610 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1611 offset = dissect_sabp_Message_Status_Query_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Status_Query_Complete_PDU);
1612 offset += 7; offset >>= 3;
1613 return offset;
1615 static int dissect_Message_Status_Query_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1616 int offset = 0;
1617 asn1_ctx_t asn1_ctx;
1618 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1619 offset = dissect_sabp_Message_Status_Query_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Status_Query_Failure_PDU);
1620 offset += 7; offset >>= 3;
1621 return offset;
1623 static int dissect_Reset_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1624 int offset = 0;
1625 asn1_ctx_t asn1_ctx;
1626 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1627 offset = dissect_sabp_Reset(tvb, offset, &asn1_ctx, tree, hf_sabp_Reset_PDU);
1628 offset += 7; offset >>= 3;
1629 return offset;
1631 static int dissect_Reset_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1632 int offset = 0;
1633 asn1_ctx_t asn1_ctx;
1634 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1635 offset = dissect_sabp_Reset_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Reset_Complete_PDU);
1636 offset += 7; offset >>= 3;
1637 return offset;
1639 static int dissect_Reset_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1640 int offset = 0;
1641 asn1_ctx_t asn1_ctx;
1642 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1643 offset = dissect_sabp_Reset_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Reset_Failure_PDU);
1644 offset += 7; offset >>= 3;
1645 return offset;
1647 static int dissect_Restart_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1648 int offset = 0;
1649 asn1_ctx_t asn1_ctx;
1650 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1651 offset = dissect_sabp_Restart(tvb, offset, &asn1_ctx, tree, hf_sabp_Restart_PDU);
1652 offset += 7; offset >>= 3;
1653 return offset;
1655 static int dissect_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1656 int offset = 0;
1657 asn1_ctx_t asn1_ctx;
1658 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1659 offset = dissect_sabp_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Failure_PDU);
1660 offset += 7; offset >>= 3;
1661 return offset;
1663 static int dissect_Error_Indication_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1664 int offset = 0;
1665 asn1_ctx_t asn1_ctx;
1666 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1667 offset = dissect_sabp_Error_Indication(tvb, offset, &asn1_ctx, tree, hf_sabp_Error_Indication_PDU);
1668 offset += 7; offset >>= 3;
1669 return offset;
1671 static int dissect_SABP_PDU_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1672 int offset = 0;
1673 asn1_ctx_t asn1_ctx;
1674 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1675 offset = dissect_sabp_SABP_PDU(tvb, offset, &asn1_ctx, tree, hf_sabp_SABP_PDU_PDU);
1676 offset += 7; offset >>= 3;
1677 return offset;
1681 static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1683 return (dissector_try_uint(sabp_ies_dissector_table, ProtocolIE_ID, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1686 static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1688 return (dissector_try_uint(sabp_extension_dissector_table, ProtocolExtensionID, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1691 static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1693 return (dissector_try_uint(sabp_proc_imsg_dissector_table, ProcedureCode, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1696 static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1698 return (dissector_try_uint(sabp_proc_sout_dissector_table, ProcedureCode, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1701 static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1703 return (dissector_try_uint(sabp_proc_uout_dissector_table, ProcedureCode, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1707 /* 3GPP TS 23.041 version 11.4.0
1708 * 9.4.2.2.5 CB Data
1710 static void
1711 dissect_sabp_cb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1713 proto_item *cbs_page_item;
1714 proto_tree *subtree;
1715 tvbuff_t *page_tvb, *unpacked_tvb;
1716 int offset = 0;
1717 int n;
1718 uint8_t nr_pages, len, cb_inf_msg_len;
1721 /* Octet 1 Number-of-Pages */
1722 nr_pages = tvb_get_uint8(tvb, offset);
1723 proto_tree_add_item(tree, hf_sabp_no_of_pages, tvb, offset, 1, ENC_BIG_ENDIAN);
1724 offset++;
1726 * NOTE: n equal to or less than 15
1728 if(nr_pages > 15){
1729 /* Error */
1730 return;
1732 for (n = 0; n < nr_pages; n++) {
1733 subtree = proto_tree_add_subtree_format(tree, tvb, offset, 83, ett_sabp_cbs_page, NULL,
1734 "CB page %u data", n+1);
1735 /* octet 2 - 83 CBS-Message-Information-Page 1 */
1736 cbs_page_item = proto_tree_add_item(subtree, hf_sabp_cb_msg_inf_page, tvb, offset, 82, ENC_NA);
1737 cb_inf_msg_len = tvb_get_uint8(tvb,offset+82);
1738 page_tvb = tvb_new_subset_length(tvb, offset, cb_inf_msg_len);
1739 unpacked_tvb = dissect_cbs_data(sms_encoding, page_tvb, subtree, pinfo, 0);
1740 len = tvb_captured_length(unpacked_tvb);
1741 if (unpacked_tvb != NULL){
1742 if (tree != NULL){
1743 proto_tree *cbs_page_subtree = proto_item_add_subtree(cbs_page_item, ett_sabp_cbs_page_content);
1744 proto_tree_add_item(cbs_page_subtree, hf_sabp_cbs_page_content, unpacked_tvb, 0, len, ENC_UTF_8);
1748 offset = offset+82;
1749 /* 84 CBS-Message-Information-Length 1 */
1750 proto_tree_add_item(subtree, hf_sabp_cb_inf_len, tvb, offset, 1, ENC_BIG_ENDIAN);
1751 offset++;
1755 static int
1756 dissect_sabp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
1758 proto_item *sabp_item = NULL;
1759 proto_tree *sabp_tree = NULL;
1761 /* make entry in the Protocol column on summary display */
1762 col_set_str(pinfo->cinfo, COL_PROTOCOL, PSNAME);
1764 /* create the sabp protocol tree */
1765 sabp_item = proto_tree_add_item(tree, proto_sabp, tvb, 0, -1, ENC_NA);
1766 sabp_tree = proto_item_add_subtree(sabp_item, ett_sabp);
1768 return dissect_SABP_PDU_PDU(tvb, pinfo, sabp_tree, NULL);
1771 /* Note a little bit of a hack assumes length max takes two bytes and that the length starts at byte 4 */
1772 static int
1773 dissect_sabp_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data)
1775 uint32_t type_length, msg_len;
1776 unsigned tvb_length;
1777 int bit_offset;
1778 bool is_fragmented;
1779 asn1_ctx_t asn1_ctx;
1780 asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1782 tvb_length = tvb_reported_length(tvb);
1784 if (tvb_length < 5) {
1785 pinfo->desegment_offset = 0;
1786 pinfo->desegment_len = DESEGMENT_ONE_MORE_SEGMENT;
1787 return tvb_captured_length(tvb);
1790 /* Length should be in the 3:d octet */
1791 bit_offset = 24;
1792 /* Get the length of the sabp packet. Offset in bits */
1793 do {
1794 bit_offset = dissect_per_length_determinant(tvb, bit_offset, &asn1_ctx, NULL, -1, &type_length, &is_fragmented);
1795 bit_offset += 8*type_length;
1796 msg_len = (bit_offset + 7) >> 3;
1797 if (is_fragmented) {
1798 /* Next length field will take 1 or 2 bytes; let's ask for the maximum */
1799 msg_len += 2;
1801 if (msg_len > tvb_length) {
1802 pinfo->desegment_offset = 0;
1803 pinfo->desegment_len = msg_len - tvb_length;
1804 return tvb_captured_length(tvb);
1806 } while (is_fragmented);
1808 return dissect_sabp(tvb, pinfo, tree, data);
1811 /*--- proto_register_sabp -------------------------------------------*/
1812 void proto_register_sabp(void) {
1814 /* List of fields */
1816 static hf_register_info hf[] = {
1817 { &hf_sabp_no_of_pages,
1818 { "Number-of-Pages", "sabp.no_of_pages",
1819 FT_UINT8, BASE_DEC, NULL, 0,
1820 NULL, HFILL }},
1821 { &hf_sabp_cb_msg_inf_page,
1822 { "CBS-Message-Information-Page", "sabp.cb_msg_inf_page",
1823 FT_BYTES, BASE_NONE, NULL, 0,
1824 NULL, HFILL }},
1825 { &hf_sabp_cbs_page_content,
1826 { "CBS Page Content", "sabp.cb_page_content",
1827 FT_STRING, BASE_NONE, NULL, 0,
1828 NULL, HFILL }},
1829 { &hf_sabp_cb_inf_len,
1830 { "CBS-Message-Information-Length", "sabp.cb_inf_len",
1831 FT_UINT8, BASE_DEC, NULL, 0,
1832 NULL, HFILL }},
1834 { &hf_sabp_Broadcast_Message_Content_PDU,
1835 { "Broadcast-Message-Content", "sabp.Broadcast_Message_Content",
1836 FT_BYTES, BASE_NONE, NULL, 0,
1837 NULL, HFILL }},
1838 { &hf_sabp_Broadcast_Message_Content_Validity_Indicator_PDU,
1839 { "Broadcast-Message-Content-Validity-Indicator", "sabp.Broadcast_Message_Content_Validity_Indicator",
1840 FT_UINT32, BASE_DEC, VALS(sabp_Broadcast_Message_Content_Validity_Indicator_vals), 0,
1841 NULL, HFILL }},
1842 { &hf_sabp_Category_PDU,
1843 { "Category", "sabp.Category",
1844 FT_UINT32, BASE_DEC, VALS(sabp_Category_vals), 0,
1845 NULL, HFILL }},
1846 { &hf_sabp_Cause_PDU,
1847 { "Cause", "sabp.Cause",
1848 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_Cause_vals_ext, 0,
1849 NULL, HFILL }},
1850 { &hf_sabp_Criticality_Diagnostics_PDU,
1851 { "Criticality-Diagnostics", "sabp.Criticality_Diagnostics_element",
1852 FT_NONE, BASE_NONE, NULL, 0,
1853 NULL, HFILL }},
1854 { &hf_sabp_MessageStructure_PDU,
1855 { "MessageStructure", "sabp.MessageStructure",
1856 FT_UINT32, BASE_DEC, NULL, 0,
1857 NULL, HFILL }},
1858 { &hf_sabp_Data_Coding_Scheme_PDU,
1859 { "Data-Coding-Scheme", "sabp.Data_Coding_Scheme",
1860 FT_BYTES, BASE_NONE, NULL, 0,
1861 NULL, HFILL }},
1862 { &hf_sabp_Failure_List_PDU,
1863 { "Failure-List", "sabp.Failure_List",
1864 FT_UINT32, BASE_DEC, NULL, 0,
1865 NULL, HFILL }},
1866 { &hf_sabp_Message_Identifier_PDU,
1867 { "Message-Identifier", "sabp.Message_Identifier",
1868 FT_BYTES, BASE_NONE, NULL, 0,
1869 NULL, HFILL }},
1870 { &hf_sabp_New_Serial_Number_PDU,
1871 { "New-Serial-Number", "sabp.New_Serial_Number",
1872 FT_BYTES, BASE_NONE, NULL, 0,
1873 NULL, HFILL }},
1874 { &hf_sabp_Number_of_Broadcasts_Completed_List_PDU,
1875 { "Number-of-Broadcasts-Completed-List", "sabp.Number_of_Broadcasts_Completed_List",
1876 FT_UINT32, BASE_DEC, NULL, 0,
1877 NULL, HFILL }},
1878 { &hf_sabp_Number_of_Broadcasts_Requested_PDU,
1879 { "Number-of-Broadcasts-Requested", "sabp.Number_of_Broadcasts_Requested",
1880 FT_UINT32, BASE_DEC, VALS(sabp_Number_of_Broadcasts_Requested_vals), 0,
1881 NULL, HFILL }},
1882 { &hf_sabp_Old_Serial_Number_PDU,
1883 { "Old-Serial-Number", "sabp.Old_Serial_Number",
1884 FT_BYTES, BASE_NONE, NULL, 0,
1885 NULL, HFILL }},
1886 { &hf_sabp_Paging_ETWS_Indicator_PDU,
1887 { "Paging-ETWS-Indicator", "sabp.Paging_ETWS_Indicator",
1888 FT_UINT32, BASE_DEC, VALS(sabp_Paging_ETWS_Indicator_vals), 0,
1889 NULL, HFILL }},
1890 { &hf_sabp_Radio_Resource_Loading_List_PDU,
1891 { "Radio-Resource-Loading-List", "sabp.Radio_Resource_Loading_List",
1892 FT_UINT32, BASE_DEC, NULL, 0,
1893 NULL, HFILL }},
1894 { &hf_sabp_Recovery_Indication_PDU,
1895 { "Recovery-Indication", "sabp.Recovery_Indication",
1896 FT_UINT32, BASE_DEC, VALS(sabp_Recovery_Indication_vals), 0,
1897 NULL, HFILL }},
1898 { &hf_sabp_Repetition_Period_PDU,
1899 { "Repetition-Period", "sabp.Repetition_Period",
1900 FT_UINT32, BASE_DEC, NULL, 0,
1901 NULL, HFILL }},
1902 { &hf_sabp_Serial_Number_PDU,
1903 { "Serial-Number", "sabp.Serial_Number",
1904 FT_BYTES, BASE_NONE, NULL, 0,
1905 NULL, HFILL }},
1906 { &hf_sabp_Service_Areas_List_PDU,
1907 { "Service-Areas-List", "sabp.Service_Areas_List",
1908 FT_UINT32, BASE_DEC, NULL, 0,
1909 NULL, HFILL }},
1910 { &hf_sabp_TypeOfError_PDU,
1911 { "TypeOfError", "sabp.TypeOfError",
1912 FT_UINT32, BASE_DEC, VALS(sabp_TypeOfError_vals), 0,
1913 NULL, HFILL }},
1914 { &hf_sabp_WarningSecurityInfo_PDU,
1915 { "WarningSecurityInfo", "sabp.WarningSecurityInfo",
1916 FT_BYTES, BASE_NONE, NULL, 0,
1917 NULL, HFILL }},
1918 { &hf_sabp_Warning_Type_PDU,
1919 { "Warning-Type", "sabp.Warning_Type",
1920 FT_BYTES, BASE_NONE, NULL, 0,
1921 NULL, HFILL }},
1922 { &hf_sabp_Write_Replace_PDU,
1923 { "Write-Replace", "sabp.Write_Replace_element",
1924 FT_NONE, BASE_NONE, NULL, 0,
1925 NULL, HFILL }},
1926 { &hf_sabp_Write_Replace_Complete_PDU,
1927 { "Write-Replace-Complete", "sabp.Write_Replace_Complete_element",
1928 FT_NONE, BASE_NONE, NULL, 0,
1929 NULL, HFILL }},
1930 { &hf_sabp_Write_Replace_Failure_PDU,
1931 { "Write-Replace-Failure", "sabp.Write_Replace_Failure_element",
1932 FT_NONE, BASE_NONE, NULL, 0,
1933 NULL, HFILL }},
1934 { &hf_sabp_Kill_PDU,
1935 { "Kill", "sabp.Kill_element",
1936 FT_NONE, BASE_NONE, NULL, 0,
1937 NULL, HFILL }},
1938 { &hf_sabp_Kill_Complete_PDU,
1939 { "Kill-Complete", "sabp.Kill_Complete_element",
1940 FT_NONE, BASE_NONE, NULL, 0,
1941 NULL, HFILL }},
1942 { &hf_sabp_Kill_Failure_PDU,
1943 { "Kill-Failure", "sabp.Kill_Failure_element",
1944 FT_NONE, BASE_NONE, NULL, 0,
1945 NULL, HFILL }},
1946 { &hf_sabp_Load_Query_PDU,
1947 { "Load-Query", "sabp.Load_Query_element",
1948 FT_NONE, BASE_NONE, NULL, 0,
1949 NULL, HFILL }},
1950 { &hf_sabp_Load_Query_Complete_PDU,
1951 { "Load-Query-Complete", "sabp.Load_Query_Complete_element",
1952 FT_NONE, BASE_NONE, NULL, 0,
1953 NULL, HFILL }},
1954 { &hf_sabp_Load_Query_Failure_PDU,
1955 { "Load-Query-Failure", "sabp.Load_Query_Failure_element",
1956 FT_NONE, BASE_NONE, NULL, 0,
1957 NULL, HFILL }},
1958 { &hf_sabp_Message_Status_Query_PDU,
1959 { "Message-Status-Query", "sabp.Message_Status_Query_element",
1960 FT_NONE, BASE_NONE, NULL, 0,
1961 NULL, HFILL }},
1962 { &hf_sabp_Message_Status_Query_Complete_PDU,
1963 { "Message-Status-Query-Complete", "sabp.Message_Status_Query_Complete_element",
1964 FT_NONE, BASE_NONE, NULL, 0,
1965 NULL, HFILL }},
1966 { &hf_sabp_Message_Status_Query_Failure_PDU,
1967 { "Message-Status-Query-Failure", "sabp.Message_Status_Query_Failure_element",
1968 FT_NONE, BASE_NONE, NULL, 0,
1969 NULL, HFILL }},
1970 { &hf_sabp_Reset_PDU,
1971 { "Reset", "sabp.Reset_element",
1972 FT_NONE, BASE_NONE, NULL, 0,
1973 NULL, HFILL }},
1974 { &hf_sabp_Reset_Complete_PDU,
1975 { "Reset-Complete", "sabp.Reset_Complete_element",
1976 FT_NONE, BASE_NONE, NULL, 0,
1977 NULL, HFILL }},
1978 { &hf_sabp_Reset_Failure_PDU,
1979 { "Reset-Failure", "sabp.Reset_Failure_element",
1980 FT_NONE, BASE_NONE, NULL, 0,
1981 NULL, HFILL }},
1982 { &hf_sabp_Restart_PDU,
1983 { "Restart", "sabp.Restart_element",
1984 FT_NONE, BASE_NONE, NULL, 0,
1985 NULL, HFILL }},
1986 { &hf_sabp_Failure_PDU,
1987 { "Failure", "sabp.Failure_element",
1988 FT_NONE, BASE_NONE, NULL, 0,
1989 NULL, HFILL }},
1990 { &hf_sabp_Error_Indication_PDU,
1991 { "Error-Indication", "sabp.Error_Indication_element",
1992 FT_NONE, BASE_NONE, NULL, 0,
1993 NULL, HFILL }},
1994 { &hf_sabp_SABP_PDU_PDU,
1995 { "SABP-PDU", "sabp.SABP_PDU",
1996 FT_UINT32, BASE_DEC, VALS(sabp_SABP_PDU_vals), 0,
1997 NULL, HFILL }},
1998 { &hf_sabp_ProtocolIE_Container_item,
1999 { "ProtocolIE-Field", "sabp.ProtocolIE_Field_element",
2000 FT_NONE, BASE_NONE, NULL, 0,
2001 NULL, HFILL }},
2002 { &hf_sabp_id,
2003 { "id", "sabp.id",
2004 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_ProtocolIE_ID_vals_ext, 0,
2005 "ProtocolIE_ID", HFILL }},
2006 { &hf_sabp_criticality,
2007 { "criticality", "sabp.criticality",
2008 FT_UINT32, BASE_DEC, VALS(sabp_Criticality_vals), 0,
2009 NULL, HFILL }},
2010 { &hf_sabp_protocolIE_Field_value,
2011 { "value", "sabp.protocolIE_Field_value_element",
2012 FT_NONE, BASE_NONE, NULL, 0,
2013 "ProtocolIE_Field_value", HFILL }},
2014 { &hf_sabp_ProtocolExtensionContainer_item,
2015 { "ProtocolExtensionField", "sabp.ProtocolExtensionField_element",
2016 FT_NONE, BASE_NONE, NULL, 0,
2017 NULL, HFILL }},
2018 { &hf_sabp_ext_id,
2019 { "id", "sabp.ext_id",
2020 FT_UINT32, BASE_DEC, NULL, 0,
2021 "ProtocolExtensionID", HFILL }},
2022 { &hf_sabp_extensionValue,
2023 { "extensionValue", "sabp.extensionValue_element",
2024 FT_NONE, BASE_NONE, NULL, 0,
2025 NULL, HFILL }},
2026 { &hf_sabp_procedureCode,
2027 { "procedureCode", "sabp.procedureCode",
2028 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_ProcedureCode_vals_ext, 0,
2029 NULL, HFILL }},
2030 { &hf_sabp_triggeringMessage,
2031 { "triggeringMessage", "sabp.triggeringMessage",
2032 FT_UINT32, BASE_DEC, VALS(sabp_TriggeringMessage_vals), 0,
2033 NULL, HFILL }},
2034 { &hf_sabp_procedureCriticality,
2035 { "procedureCriticality", "sabp.procedureCriticality",
2036 FT_UINT32, BASE_DEC, VALS(sabp_Criticality_vals), 0,
2037 "Criticality", HFILL }},
2038 { &hf_sabp_iEsCriticalityDiagnostics,
2039 { "iEsCriticalityDiagnostics", "sabp.iEsCriticalityDiagnostics",
2040 FT_UINT32, BASE_DEC, NULL, 0,
2041 "CriticalityDiagnostics_IE_List", HFILL }},
2042 { &hf_sabp_iE_Extensions,
2043 { "iE-Extensions", "sabp.iE_Extensions",
2044 FT_UINT32, BASE_DEC, NULL, 0,
2045 "ProtocolExtensionContainer", HFILL }},
2046 { &hf_sabp_CriticalityDiagnostics_IE_List_item,
2047 { "CriticalityDiagnostics-IE-List item", "sabp.CriticalityDiagnostics_IE_List_item_element",
2048 FT_NONE, BASE_NONE, NULL, 0,
2049 NULL, HFILL }},
2050 { &hf_sabp_iECriticality,
2051 { "iECriticality", "sabp.iECriticality",
2052 FT_UINT32, BASE_DEC, VALS(sabp_Criticality_vals), 0,
2053 "Criticality", HFILL }},
2054 { &hf_sabp_iE_ID,
2055 { "iE-ID", "sabp.iE_ID",
2056 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_ProtocolIE_ID_vals_ext, 0,
2057 "ProtocolIE_ID", HFILL }},
2058 { &hf_sabp_repetitionNumber,
2059 { "repetitionNumber", "sabp.repetitionNumber",
2060 FT_UINT32, BASE_DEC, NULL, 0,
2061 "RepetitionNumber0", HFILL }},
2062 { &hf_sabp_MessageStructure_item,
2063 { "MessageStructure item", "sabp.MessageStructure_item_element",
2064 FT_NONE, BASE_NONE, NULL, 0,
2065 NULL, HFILL }},
2066 { &hf_sabp_repetitionNumber1,
2067 { "repetitionNumber", "sabp.repetitionNumber1",
2068 FT_UINT32, BASE_DEC, NULL, 0,
2069 "RepetitionNumber1", HFILL }},
2070 { &hf_sabp_Failure_List_item,
2071 { "Failure-List-Item", "sabp.Failure_List_Item_element",
2072 FT_NONE, BASE_NONE, NULL, 0,
2073 NULL, HFILL }},
2074 { &hf_sabp_service_area_identifier,
2075 { "service-area-identifier", "sabp.service_area_identifier_element",
2076 FT_NONE, BASE_NONE, NULL, 0,
2077 NULL, HFILL }},
2078 { &hf_sabp_cause,
2079 { "cause", "sabp.cause",
2080 FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_Cause_vals_ext, 0,
2081 NULL, HFILL }},
2082 { &hf_sabp_Number_of_Broadcasts_Completed_List_item,
2083 { "Number-of-Broadcasts-Completed-List-Item", "sabp.Number_of_Broadcasts_Completed_List_Item_element",
2084 FT_NONE, BASE_NONE, NULL, 0,
2085 NULL, HFILL }},
2086 { &hf_sabp_number_of_broadcasts_completed,
2087 { "number-of-broadcasts-completed", "sabp.number_of_broadcasts_completed",
2088 FT_UINT32, BASE_DEC, NULL, 0,
2089 "INTEGER_0_65535", HFILL }},
2090 { &hf_sabp_number_of_broadcasts_completed_info,
2091 { "number-of-broadcasts-completed-info", "sabp.number_of_broadcasts_completed_info",
2092 FT_UINT32, BASE_DEC, VALS(sabp_Number_Of_Broadcasts_Completed_Info_vals), 0,
2093 NULL, HFILL }},
2094 { &hf_sabp_Radio_Resource_Loading_List_item,
2095 { "Radio-Resource-Loading-List-Item", "sabp.Radio_Resource_Loading_List_Item_element",
2096 FT_NONE, BASE_NONE, NULL, 0,
2097 NULL, HFILL }},
2098 { &hf_sabp_available_bandwidth,
2099 { "available-bandwidth", "sabp.available_bandwidth",
2100 FT_UINT32, BASE_DEC, NULL, 0,
2101 NULL, HFILL }},
2102 { &hf_sabp_pLMNidentity,
2103 { "pLMNidentity", "sabp.pLMNidentity",
2104 FT_BYTES, BASE_NONE, NULL, 0,
2105 NULL, HFILL }},
2106 { &hf_sabp_lac,
2107 { "lac", "sabp.lac",
2108 FT_BYTES, BASE_NONE, NULL, 0,
2109 "OCTET_STRING_SIZE_2", HFILL }},
2110 { &hf_sabp_sac,
2111 { "sac", "sabp.sac",
2112 FT_BYTES, BASE_NONE, NULL, 0,
2113 "OCTET_STRING_SIZE_2", HFILL }},
2114 { &hf_sabp_Service_Areas_List_item,
2115 { "Service-Area-Identifier", "sabp.Service_Area_Identifier_element",
2116 FT_NONE, BASE_NONE, NULL, 0,
2117 NULL, HFILL }},
2118 { &hf_sabp_protocolIEs,
2119 { "protocolIEs", "sabp.protocolIEs",
2120 FT_UINT32, BASE_DEC, NULL, 0,
2121 "ProtocolIE_Container", HFILL }},
2122 { &hf_sabp_protocolExtensions,
2123 { "protocolExtensions", "sabp.protocolExtensions",
2124 FT_UINT32, BASE_DEC, NULL, 0,
2125 "ProtocolExtensionContainer", HFILL }},
2126 { &hf_sabp_initiatingMessage,
2127 { "initiatingMessage", "sabp.initiatingMessage_element",
2128 FT_NONE, BASE_NONE, NULL, 0,
2129 NULL, HFILL }},
2130 { &hf_sabp_successfulOutcome,
2131 { "successfulOutcome", "sabp.successfulOutcome_element",
2132 FT_NONE, BASE_NONE, NULL, 0,
2133 NULL, HFILL }},
2134 { &hf_sabp_unsuccessfulOutcome,
2135 { "unsuccessfulOutcome", "sabp.unsuccessfulOutcome_element",
2136 FT_NONE, BASE_NONE, NULL, 0,
2137 NULL, HFILL }},
2138 { &hf_sabp_initiatingMessage_value,
2139 { "value", "sabp.initiatingMessage_value_element",
2140 FT_NONE, BASE_NONE, NULL, 0,
2141 "InitiatingMessage_value", HFILL }},
2142 { &hf_sabp_successfulOutcome_value,
2143 { "value", "sabp.successfulOutcome_value_element",
2144 FT_NONE, BASE_NONE, NULL, 0,
2145 "SuccessfulOutcome_value", HFILL }},
2146 { &hf_sabp_unsuccessfulOutcome_value,
2147 { "value", "sabp.unsuccessfulOutcome_value_element",
2148 FT_NONE, BASE_NONE, NULL, 0,
2149 "UnsuccessfulOutcome_value", HFILL }},
2152 /* List of subtrees */
2153 static int *ett[] = {
2154 &ett_sabp,
2155 &ett_sabp_e212,
2156 &ett_sabp_cbs_data_coding,
2157 &ett_sabp_bcast_msg,
2158 &ett_sabp_cbs_serial_number,
2159 &ett_sabp_cbs_new_serial_number,
2160 &ett_sabp_cbs_page,
2161 &ett_sabp_cbs_page_content,
2162 &ett_sabp_ProtocolIE_Container,
2163 &ett_sabp_ProtocolIE_Field,
2164 &ett_sabp_ProtocolExtensionContainer,
2165 &ett_sabp_ProtocolExtensionField,
2166 &ett_sabp_Criticality_Diagnostics,
2167 &ett_sabp_CriticalityDiagnostics_IE_List,
2168 &ett_sabp_CriticalityDiagnostics_IE_List_item,
2169 &ett_sabp_MessageStructure,
2170 &ett_sabp_MessageStructure_item,
2171 &ett_sabp_Failure_List,
2172 &ett_sabp_Failure_List_Item,
2173 &ett_sabp_Number_of_Broadcasts_Completed_List,
2174 &ett_sabp_Number_of_Broadcasts_Completed_List_Item,
2175 &ett_sabp_Radio_Resource_Loading_List,
2176 &ett_sabp_Radio_Resource_Loading_List_Item,
2177 &ett_sabp_Service_Area_Identifier,
2178 &ett_sabp_Service_Areas_List,
2179 &ett_sabp_Write_Replace,
2180 &ett_sabp_Write_Replace_Complete,
2181 &ett_sabp_Write_Replace_Failure,
2182 &ett_sabp_Kill,
2183 &ett_sabp_Kill_Complete,
2184 &ett_sabp_Kill_Failure,
2185 &ett_sabp_Load_Query,
2186 &ett_sabp_Load_Query_Complete,
2187 &ett_sabp_Load_Query_Failure,
2188 &ett_sabp_Message_Status_Query,
2189 &ett_sabp_Message_Status_Query_Complete,
2190 &ett_sabp_Message_Status_Query_Failure,
2191 &ett_sabp_Reset,
2192 &ett_sabp_Reset_Complete,
2193 &ett_sabp_Reset_Failure,
2194 &ett_sabp_Restart,
2195 &ett_sabp_Failure,
2196 &ett_sabp_Error_Indication,
2197 &ett_sabp_SABP_PDU,
2198 &ett_sabp_InitiatingMessage,
2199 &ett_sabp_SuccessfulOutcome,
2200 &ett_sabp_UnsuccessfulOutcome,
2204 /* Register protocol */
2205 proto_sabp = proto_register_protocol(PNAME, PSNAME, PFNAME);
2206 /* Register fields and subtrees */
2207 proto_register_field_array(proto_sabp, hf, array_length(hf));
2208 proto_register_subtree_array(ett, array_length(ett));
2210 /* Register dissector */
2211 sabp_handle = register_dissector("sabp", dissect_sabp, proto_sabp);
2212 sabp_tcp_handle = register_dissector("sabp.tcp", dissect_sabp_tcp, proto_sabp);
2214 /* Register dissector tables */
2215 sabp_ies_dissector_table = register_dissector_table("sabp.ies", "SABP-PROTOCOL-IES", proto_sabp, FT_UINT32, BASE_DEC);
2216 sabp_extension_dissector_table = register_dissector_table("sabp.extension", "SABP-PROTOCOL-EXTENSION", proto_sabp, FT_UINT32, BASE_DEC);
2217 sabp_proc_imsg_dissector_table = register_dissector_table("sabp.proc.imsg", "SABP-ELEMENTARY-PROCEDURE InitiatingMessage", proto_sabp, FT_UINT32, BASE_DEC);
2218 sabp_proc_sout_dissector_table = register_dissector_table("sabp.proc.sout", "SABP-ELEMENTARY-PROCEDURE SuccessfulOutcome", proto_sabp, FT_UINT32, BASE_DEC);
2219 sabp_proc_uout_dissector_table = register_dissector_table("sabp.proc.uout", "SABP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", proto_sabp, FT_UINT32, BASE_DEC);
2223 /*--- proto_reg_handoff_sabp ---------------------------------------*/
2224 void
2225 proto_reg_handoff_sabp(void)
2227 dissector_add_uint_with_preference("udp.port", SABP_PORT, sabp_handle);
2228 dissector_add_uint_with_preference("tcp.port", SABP_PORT, sabp_tcp_handle);
2229 dissector_add_uint("sctp.ppi", SABP_PAYLOAD_PROTOCOL_ID, sabp_handle);
2231 dissector_add_uint("sabp.ies", id_Message_Identifier, create_dissector_handle(dissect_Message_Identifier_PDU, proto_sabp));
2232 dissector_add_uint("sabp.ies", id_New_Serial_Number, create_dissector_handle(dissect_New_Serial_Number_PDU, proto_sabp));
2233 dissector_add_uint("sabp.ies", id_Old_Serial_Number, create_dissector_handle(dissect_Old_Serial_Number_PDU, proto_sabp));
2234 dissector_add_uint("sabp.ies", id_Service_Areas_List, create_dissector_handle(dissect_Service_Areas_List_PDU, proto_sabp));
2235 dissector_add_uint("sabp.ies", id_Category, create_dissector_handle(dissect_Category_PDU, proto_sabp));
2236 dissector_add_uint("sabp.ies", id_Repetition_Period, create_dissector_handle(dissect_Repetition_Period_PDU, proto_sabp));
2237 dissector_add_uint("sabp.ies", id_Number_of_Broadcasts_Requested, create_dissector_handle(dissect_Number_of_Broadcasts_Requested_PDU, proto_sabp));
2238 dissector_add_uint("sabp.ies", id_Data_Coding_Scheme, create_dissector_handle(dissect_Data_Coding_Scheme_PDU, proto_sabp));
2239 dissector_add_uint("sabp.ies", id_Broadcast_Message_Content, create_dissector_handle(dissect_Broadcast_Message_Content_PDU, proto_sabp));
2240 dissector_add_uint("sabp.ies", id_Number_of_Broadcasts_Completed_List, create_dissector_handle(dissect_Number_of_Broadcasts_Completed_List_PDU, proto_sabp));
2241 dissector_add_uint("sabp.ies", id_Criticality_Diagnostics, create_dissector_handle(dissect_Criticality_Diagnostics_PDU, proto_sabp));
2242 dissector_add_uint("sabp.ies", id_Failure_List, create_dissector_handle(dissect_Failure_List_PDU, proto_sabp));
2243 dissector_add_uint("sabp.ies", id_Radio_Resource_Loading_List, create_dissector_handle(dissect_Radio_Resource_Loading_List_PDU, proto_sabp));
2244 dissector_add_uint("sabp.ies", id_Recovery_Indication, create_dissector_handle(dissect_Recovery_Indication_PDU, proto_sabp));
2245 dissector_add_uint("sabp.ies", id_Serial_Number, create_dissector_handle(dissect_Serial_Number_PDU, proto_sabp));
2246 dissector_add_uint("sabp.ies", id_Cause, create_dissector_handle(dissect_Cause_PDU, proto_sabp));
2247 dissector_add_uint("sabp.extension", id_MessageStructure, create_dissector_handle(dissect_MessageStructure_PDU, proto_sabp));
2248 dissector_add_uint("sabp.extension", id_TypeOfError, create_dissector_handle(dissect_TypeOfError_PDU, proto_sabp));
2249 dissector_add_uint("sabp.extension", id_Paging_ETWS_Indicator, create_dissector_handle(dissect_Paging_ETWS_Indicator_PDU, proto_sabp));
2250 dissector_add_uint("sabp.extension", id_Warning_Type, create_dissector_handle(dissect_Warning_Type_PDU, proto_sabp));
2251 dissector_add_uint("sabp.extension", id_WarningSecurityInfo, create_dissector_handle(dissect_WarningSecurityInfo_PDU, proto_sabp));
2252 dissector_add_uint("sabp.extension", id_Broadcast_Message_Content_Validity_Indicator, create_dissector_handle(dissect_Broadcast_Message_Content_Validity_Indicator_PDU, proto_sabp));
2253 dissector_add_uint("sabp.proc.imsg", id_Write_Replace, create_dissector_handle(dissect_Write_Replace_PDU, proto_sabp));
2254 dissector_add_uint("sabp.proc.sout", id_Write_Replace, create_dissector_handle(dissect_Write_Replace_Complete_PDU, proto_sabp));
2255 dissector_add_uint("sabp.proc.uout", id_Write_Replace, create_dissector_handle(dissect_Write_Replace_Failure_PDU, proto_sabp));
2256 dissector_add_uint("sabp.proc.imsg", id_Kill, create_dissector_handle(dissect_Kill_PDU, proto_sabp));
2257 dissector_add_uint("sabp.proc.sout", id_Kill, create_dissector_handle(dissect_Kill_Complete_PDU, proto_sabp));
2258 dissector_add_uint("sabp.proc.uout", id_Kill, create_dissector_handle(dissect_Kill_Failure_PDU, proto_sabp));
2259 dissector_add_uint("sabp.proc.imsg", id_Load_Status_Enquiry, create_dissector_handle(dissect_Load_Query_PDU, proto_sabp));
2260 dissector_add_uint("sabp.proc.sout", id_Load_Status_Enquiry, create_dissector_handle(dissect_Load_Query_Complete_PDU, proto_sabp));
2261 dissector_add_uint("sabp.proc.uout", id_Load_Status_Enquiry, create_dissector_handle(dissect_Load_Query_Failure_PDU, proto_sabp));
2262 dissector_add_uint("sabp.proc.imsg", id_Message_Status_Query, create_dissector_handle(dissect_Message_Status_Query_PDU, proto_sabp));
2263 dissector_add_uint("sabp.proc.sout", id_Message_Status_Query, create_dissector_handle(dissect_Message_Status_Query_Complete_PDU, proto_sabp));
2264 dissector_add_uint("sabp.proc.uout", id_Message_Status_Query, create_dissector_handle(dissect_Message_Status_Query_Failure_PDU, proto_sabp));
2265 dissector_add_uint("sabp.proc.imsg", id_Reset, create_dissector_handle(dissect_Reset_PDU, proto_sabp));
2266 dissector_add_uint("sabp.proc.sout", id_Reset, create_dissector_handle(dissect_Reset_Complete_PDU, proto_sabp));
2267 dissector_add_uint("sabp.proc.uout", id_Reset, create_dissector_handle(dissect_Reset_Failure_PDU, proto_sabp));
2268 dissector_add_uint("sabp.proc.imsg", id_Restart_Indication, create_dissector_handle(dissect_Restart_PDU, proto_sabp));
2269 dissector_add_uint("sabp.proc.imsg", id_Failure_Indication, create_dissector_handle(dissect_Failure_PDU, proto_sabp));
2270 dissector_add_uint("sabp.proc.imsg", id_Error_Indication, create_dissector_handle(dissect_Error_Indication_PDU, proto_sabp));