Coverage Report

Created: 2025-08-04 07:15

/src/wireshark/epan/dissectors/packet-sabp.c
Line
Count
Source (jump to first uncovered line)
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 */
5
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>
9
 *
10
 * Wireshark - Network traffic analyzer
11
 * By Gerald Combs <gerald@wireshark.org>
12
 * Copyright 1998 Gerald Combs
13
 *
14
 * SPDX-License-Identifier: GPL-2.0-or-later
15
 *
16
 * Ref: 3GPP TS 25.419 version  V9.0.0 (2009-12)
17
 */
18
19
#include "config.h"
20
21
#include <epan/packet.h>
22
23
#include <epan/asn1.h>
24
#include <wsutil/array.h>
25
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"
33
34
14
#define PNAME  "UTRAN IuBC interface SABP signaling"
35
141
#define PSNAME "SABP"
36
14
#define PFNAME "sabp"
37
38
18
#define maxNrOfErrors                  256
39
26
#define maxnoofSAI                     65535
40
45
#define maxProtocolExtensions          65535
41
102
#define maxProtocolIEs                 65535
42
0
#define maxNrOfLevels                  256
43
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;
54
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;
79
80
void proto_register_sabp(void);
81
void proto_reg_handoff_sabp(void);
82
83
/* Initialize the protocol and registered fields */
84
static int proto_sabp;
85
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 */
169
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;
179
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;
219
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;
225
226
28
#define SABP_PORT 3452
227
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;
234
235
static dissector_handle_t sabp_handle;
236
static dissector_handle_t sabp_tcp_handle;
237
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);
244
245
246
static const value_string sabp_Criticality_vals[] = {
247
  {   0, "reject" },
248
  {   1, "ignore" },
249
  {   2, "notify" },
250
  { 0, NULL }
251
};
252
253
254
static int
255
1.04k
dissect_sabp_Criticality(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
256
1.04k
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
257
1.04k
                                     3, NULL, false, 0, NULL);
258
259
1.04k
  return offset;
260
1.04k
}
261
262
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 }
273
};
274
275
static value_string_ext sabp_ProcedureCode_vals_ext = VALUE_STRING_EXT_INIT(sabp_ProcedureCode_vals);
276
277
278
static int
279
127
dissect_sabp_ProcedureCode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
280
127
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
281
127
                                                            0U, 255U, &ProcedureCode, false);
282
283
127
       col_add_fstr(actx->pinfo->cinfo, COL_INFO, "%s ",
284
127
                   val_to_str_ext_const(ProcedureCode, &sabp_ProcedureCode_vals_ext,
285
127
                                        "unknown message"));
286
127
  return offset;
287
127
}
288
289
290
291
static int
292
211
dissect_sabp_ProtocolExtensionID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
293
211
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
294
211
                                                            0U, 65535U, &ProtocolExtensionID, false);
295
296
211
  return offset;
297
211
}
298
299
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 }
324
};
325
326
static value_string_ext sabp_ProtocolIE_ID_vals_ext = VALUE_STRING_EXT_INIT(sabp_ProtocolIE_ID_vals);
327
328
329
static int
330
726
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
726
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
332
726
                                                            0U, 65535U, &ProtocolIE_ID, false);
333
334
726
  if (tree) {
335
715
    proto_item_append_text(proto_item_get_parent_nth(actx->created_item, 2), ": %s",
336
715
                           val_to_str_ext(ProtocolIE_ID, &sabp_ProtocolIE_ID_vals_ext, "unknown (%d)"));
337
715
  }
338
726
  return offset;
339
726
}
340
341
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 }
348
};
349
350
351
static int
352
17
dissect_sabp_TriggeringMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
353
17
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
354
17
                                     4, NULL, false, 0, NULL);
355
356
17
  return offset;
357
17
}
358
359
360
361
static int
362
598
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
598
  offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_ProtocolIEFieldValue);
364
365
598
  return offset;
366
598
}
367
368
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 }
374
};
375
376
static int
377
637
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
637
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
379
637
                                   ett_sabp_ProtocolIE_Field, ProtocolIE_Field_sequence);
380
381
637
  return offset;
382
637
}
383
384
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 },
387
};
388
389
static int
390
102
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
102
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
392
102
                                                  ett_sabp_ProtocolIE_Container, ProtocolIE_Container_sequence_of,
393
102
                                                  0, maxProtocolIEs, false);
394
395
102
  return offset;
396
102
}
397
398
399
400
static int
401
207
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
207
  offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_ProtocolExtensionFieldExtensionValue);
403
404
207
  return offset;
405
207
}
406
407
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 }
413
};
414
415
static int
416
233
dissect_sabp_ProtocolExtensionField(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
417
233
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
418
233
                                   ett_sabp_ProtocolExtensionField, ProtocolExtensionField_sequence);
419
420
233
  return offset;
421
233
}
422
423
424
static const per_sequence_t ProtocolExtensionContainer_sequence_of[1] = {
425
  { &hf_sabp_ProtocolExtensionContainer_item, ASN1_NO_EXTENSIONS     , ASN1_NOT_OPTIONAL, dissect_sabp_ProtocolExtensionField },
426
};
427
428
static int
429
45
dissect_sabp_ProtocolExtensionContainer(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
430
45
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
431
45
                                                  ett_sabp_ProtocolExtensionContainer, ProtocolExtensionContainer_sequence_of,
432
45
                                                  1, maxProtocolExtensions, false);
433
434
45
  return offset;
435
45
}
436
437
438
439
static int
440
0
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
0
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
442
0
                                                            0U, 20480U, NULL, false);
443
444
0
  return offset;
445
0
}
446
447
448
449
static int
450
51
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
51
 tvbuff_t *parameter_tvb=NULL;
452
453
51
  offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
454
51
                                     1, 9968, false, NULL, 0, &parameter_tvb, NULL);
455
456
51
  if (!parameter_tvb)
457
0
    return offset;
458
51
    dissect_sabp_cb_data(parameter_tvb, actx->pinfo, tree);
459
460
51
  return offset;
461
51
}
462
463
464
static const value_string sabp_Broadcast_Message_Content_Validity_Indicator_vals[] = {
465
  {   0, "broadcast-Message-Content-not-valid" },
466
  { 0, NULL }
467
};
468
469
470
static int
471
0
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
0
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
473
0
                                     1, NULL, true, 0, NULL);
474
475
0
  return offset;
476
0
}
477
478
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 }
485
};
486
487
488
static int
489
3
dissect_sabp_Category(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
490
3
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
491
3
                                     4, NULL, true, 0, NULL);
492
493
3
  return offset;
494
3
}
495
496
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 }
517
};
518
519
static value_string_ext sabp_Cause_vals_ext = VALUE_STRING_EXT_INIT(sabp_Cause_vals);
520
521
522
static int
523
15
dissect_sabp_Cause(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
524
15
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
525
15
                                                            0U, 255U, NULL, false);
526
527
15
  return offset;
528
15
}
529
530
531
532
static int
533
32
dissect_sabp_RepetitionNumber0(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
534
32
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
535
32
                                                            0U, 255U, NULL, false);
536
537
32
  return offset;
538
32
}
539
540
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 }
547
};
548
549
static int
550
121
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
121
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
552
121
                                   ett_sabp_CriticalityDiagnostics_IE_List_item, CriticalityDiagnostics_IE_List_item_sequence);
553
554
121
  return offset;
555
121
}
556
557
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 },
560
};
561
562
static int
563
18
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
18
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
565
18
                                                  ett_sabp_CriticalityDiagnostics_IE_List, CriticalityDiagnostics_IE_List_sequence_of,
566
18
                                                  1, maxNrOfErrors, false);
567
568
18
  return offset;
569
18
}
570
571
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 }
579
};
580
581
static int
582
23
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
23
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
584
23
                                   ett_sabp_Criticality_Diagnostics, Criticality_Diagnostics_sequence);
585
586
23
  return offset;
587
23
}
588
589
590
591
static int
592
0
dissect_sabp_RepetitionNumber1(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
593
0
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
594
0
                                                            1U, 256U, NULL, false);
595
596
0
  return offset;
597
0
}
598
599
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 }
605
};
606
607
static int
608
0
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
0
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
610
0
                                   ett_sabp_MessageStructure_item, MessageStructure_item_sequence);
611
612
0
  return offset;
613
0
}
614
615
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 },
618
};
619
620
static int
621
0
dissect_sabp_MessageStructure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
622
0
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
623
0
                                                  ett_sabp_MessageStructure, MessageStructure_sequence_of,
624
0
                                                  1, maxNrOfLevels, false);
625
626
0
  return offset;
627
0
}
628
629
630
631
static int
632
8
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
8
 tvbuff_t *parameter_tvb=NULL;
634
8
 proto_tree *subtree;
635
636
8
  offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
637
8
                                     8, 8, false, NULL, 0, &parameter_tvb, NULL);
638
639
640
8
  if (!parameter_tvb)
641
0
    return offset;
642
8
  subtree = proto_item_add_subtree(actx->created_item, ett_sabp_cbs_data_coding);
643
8
  sms_encoding = dissect_cbs_data_coding_scheme(parameter_tvb, actx->pinfo, subtree, 0);
644
645
646
8
  return offset;
647
8
}
648
649
650
651
static int
652
167
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
167
  tvbuff_t *parameter_tvb=NULL;
654
167
 proto_tree *subtree;
655
656
167
  offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
657
167
                                       3, 3, false, &parameter_tvb);
658
659
167
   if (!parameter_tvb)
660
0
    return offset;
661
167
  subtree = proto_item_add_subtree(actx->created_item, ett_sabp_e212);
662
167
  dissect_e212_mcc_mnc(parameter_tvb, actx->pinfo, subtree, 0, E212_SAI, false);
663
664
665
167
  return offset;
666
167
}
667
668
669
670
static int
671
313
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
313
  offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
673
313
                                       2, 2, false, NULL);
674
675
313
  return offset;
676
313
}
677
678
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 }
684
};
685
686
static int
687
167
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
167
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
689
167
                                   ett_sabp_Service_Area_Identifier, Service_Area_Identifier_sequence);
690
691
167
  return offset;
692
167
}
693
694
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 }
700
};
701
702
static int
703
11
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
11
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
705
11
                                   ett_sabp_Failure_List_Item, Failure_List_Item_sequence);
706
707
11
  return offset;
708
11
}
709
710
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 },
713
};
714
715
static int
716
5
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
5
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
718
5
                                                  ett_sabp_Failure_List, Failure_List_sequence_of,
719
5
                                                  1, maxnoofSAI, false);
720
721
5
  return offset;
722
5
}
723
724
725
726
static int
727
2
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
2
 tvbuff_t *parameter_tvb=NULL;
729
730
2
  offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
731
2
                                     16, 16, false, NULL, 0, &parameter_tvb, NULL);
732
733
2
  if (!parameter_tvb)
734
0
    return offset;
735
2
        dissect_cbs_message_identifier(parameter_tvb, tree, 0);
736
737
738
2
  return offset;
739
2
}
740
741
742
743
static int
744
2
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
2
 tvbuff_t *parameter_tvb=NULL;
746
2
 proto_tree *subtree;
747
748
2
  offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index,
749
2
                                     16, 16, false, NULL, 0, &parameter_tvb, NULL);
750
751
2
  if (!parameter_tvb)
752
0
    return offset;
753
2
  subtree = proto_item_add_subtree(actx->created_item, ett_sabp_cbs_serial_number);
754
2
        dissect_cbs_serial_number(parameter_tvb, subtree, 0);
755
756
757
2
  return offset;
758
2
}
759
760
761
762
static int
763
1
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
1
 tvbuff_t *parameter_tvb=NULL;
765
1
 proto_tree *subtree;
766
767
1
  offset = dissect_sabp_Serial_Number(tvb, offset, actx, tree, hf_index);
768
769
1
  if (!parameter_tvb)
770
1
    return offset;
771
0
  subtree = proto_item_add_subtree(actx->created_item, ett_sabp_cbs_new_serial_number);
772
0
        dissect_cbs_serial_number(parameter_tvb, subtree, 0);
773
774
775
0
  return offset;
776
1
}
777
778
779
780
static int
781
85
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
85
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
783
85
                                                            0U, 65535U, NULL, false);
784
785
85
  return offset;
786
85
}
787
788
789
static const value_string sabp_Number_Of_Broadcasts_Completed_Info_vals[] = {
790
  {   0, "overflow" },
791
  {   1, "unknown" },
792
  { 0, NULL }
793
};
794
795
796
static int
797
26
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
26
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
799
26
                                     2, NULL, true, 0, NULL);
800
801
26
  return offset;
802
26
}
803
804
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 }
811
};
812
813
static int
814
92
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
92
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
816
92
                                   ett_sabp_Number_of_Broadcasts_Completed_List_Item, Number_of_Broadcasts_Completed_List_Item_sequence);
817
818
92
  return offset;
819
92
}
820
821
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 },
824
};
825
826
static int
827
17
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
17
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
829
17
                                                  ett_sabp_Number_of_Broadcasts_Completed_List, Number_of_Broadcasts_Completed_List_sequence_of,
830
17
                                                  1, maxnoofSAI, false);
831
832
17
  return offset;
833
17
}
834
835
836
static const value_string sabp_Number_of_Broadcasts_Requested_vals[] = {
837
  {   0, "broadcast-indefinitely" },
838
  { 0, NULL }
839
};
840
841
842
static int
843
1
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
1
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
845
1
                                                            0U, 65535U, NULL, false);
846
847
1
  return offset;
848
1
}
849
850
851
852
static int
853
1
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
1
  offset = dissect_sabp_Serial_Number(tvb, offset, actx, tree, hf_index);
855
856
1
  return offset;
857
1
}
858
859
860
static const value_string sabp_Paging_ETWS_Indicator_vals[] = {
861
  {   0, "paging" },
862
  { 0, NULL }
863
};
864
865
866
static int
867
1
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
1
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
869
1
                                     1, NULL, true, 0, NULL);
870
871
1
  return offset;
872
1
}
873
874
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 }
880
};
881
882
static int
883
0
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
0
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
885
0
                                   ett_sabp_Radio_Resource_Loading_List_Item, Radio_Resource_Loading_List_Item_sequence);
886
887
0
  return offset;
888
0
}
889
890
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 },
893
};
894
895
static int
896
0
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
0
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
898
0
                                                  ett_sabp_Radio_Resource_Loading_List, Radio_Resource_Loading_List_sequence_of,
899
0
                                                  1, maxnoofSAI, false);
900
901
0
  return offset;
902
0
}
903
904
905
static const value_string sabp_Recovery_Indication_vals[] = {
906
  {   0, "data-lost" },
907
  {   1, "data-available" },
908
  { 0, NULL }
909
};
910
911
912
static int
913
2
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
2
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
915
2
                                     2, NULL, false, 0, NULL);
916
917
2
  return offset;
918
2
}
919
920
921
922
static int
923
2
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
2
  offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
925
2
                                                            1U, 4096U, NULL, false);
926
927
2
  return offset;
928
2
}
929
930
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 },
933
};
934
935
static int
936
4
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
4
  offset = dissect_per_constrained_sequence_of(tvb, offset, actx, tree, hf_index,
938
4
                                                  ett_sabp_Service_Areas_List, Service_Areas_List_sequence_of,
939
4
                                                  1, maxnoofSAI, false);
940
941
4
  return offset;
942
4
}
943
944
945
static const value_string sabp_TypeOfError_vals[] = {
946
  {   0, "not-understood" },
947
  {   1, "missing" },
948
  { 0, NULL }
949
};
950
951
952
static int
953
0
dissect_sabp_TypeOfError(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
954
0
  offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
955
0
                                     2, NULL, true, 0, NULL);
956
957
0
  return offset;
958
0
}
959
960
961
962
static int
963
4
dissect_sabp_WarningSecurityInfo(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
964
4
  offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
965
4
                                       50, 50, false, NULL);
966
967
4
  return offset;
968
4
}
969
970
971
972
static int
973
0
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
0
  offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
975
0
                                       2, 2, false, NULL);
976
977
0
  return offset;
978
0
}
979
980
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 }
985
};
986
987
static int
988
40
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
40
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
990
40
                                   ett_sabp_Write_Replace, Write_Replace_sequence);
991
992
40
  return offset;
993
40
}
994
995
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 }
1000
};
1001
1002
static int
1003
17
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
17
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1005
17
                                   ett_sabp_Write_Replace_Complete, Write_Replace_Complete_sequence);
1006
1007
17
  return offset;
1008
17
}
1009
1010
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 }
1015
};
1016
1017
static int
1018
7
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
7
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1020
7
                                   ett_sabp_Write_Replace_Failure, Write_Replace_Failure_sequence);
1021
1022
7
  return offset;
1023
7
}
1024
1025
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 }
1030
};
1031
1032
static int
1033
2
dissect_sabp_Kill(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1034
2
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1035
2
                                   ett_sabp_Kill, Kill_sequence);
1036
1037
2
  return offset;
1038
2
}
1039
1040
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 }
1045
};
1046
1047
static int
1048
3
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
3
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1050
3
                                   ett_sabp_Kill_Complete, Kill_Complete_sequence);
1051
1052
3
  return offset;
1053
3
}
1054
1055
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 }
1060
};
1061
1062
static int
1063
1
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
1
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1065
1
                                   ett_sabp_Kill_Failure, Kill_Failure_sequence);
1066
1067
1
  return offset;
1068
1
}
1069
1070
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 }
1075
};
1076
1077
static int
1078
5
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
5
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1080
5
                                   ett_sabp_Load_Query, Load_Query_sequence);
1081
1082
5
  return offset;
1083
5
}
1084
1085
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 }
1090
};
1091
1092
static int
1093
2
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
2
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1095
2
                                   ett_sabp_Load_Query_Complete, Load_Query_Complete_sequence);
1096
1097
2
  return offset;
1098
2
}
1099
1100
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 }
1105
};
1106
1107
static int
1108
0
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
0
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1110
0
                                   ett_sabp_Load_Query_Failure, Load_Query_Failure_sequence);
1111
1112
0
  return offset;
1113
0
}
1114
1115
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 }
1120
};
1121
1122
static int
1123
1
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
1
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1125
1
                                   ett_sabp_Message_Status_Query, Message_Status_Query_sequence);
1126
1127
1
  return offset;
1128
1
}
1129
1130
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 }
1135
};
1136
1137
static int
1138
3
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
3
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1140
3
                                   ett_sabp_Message_Status_Query_Complete, Message_Status_Query_Complete_sequence);
1141
1142
3
  return offset;
1143
3
}
1144
1145
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 }
1150
};
1151
1152
static int
1153
1
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
1
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1155
1
                                   ett_sabp_Message_Status_Query_Failure, Message_Status_Query_Failure_sequence);
1156
1157
1
  return offset;
1158
1
}
1159
1160
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 }
1165
};
1166
1167
static int
1168
3
dissect_sabp_Reset(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1169
3
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1170
3
                                   ett_sabp_Reset, Reset_sequence);
1171
1172
3
  return offset;
1173
3
}
1174
1175
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 }
1180
};
1181
1182
static int
1183
1
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
1
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1185
1
                                   ett_sabp_Reset_Complete, Reset_Complete_sequence);
1186
1187
1
  return offset;
1188
1
}
1189
1190
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 }
1195
};
1196
1197
static int
1198
1
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
1
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1200
1
                                   ett_sabp_Reset_Failure, Reset_Failure_sequence);
1201
1202
1
  return offset;
1203
1
}
1204
1205
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 }
1210
};
1211
1212
static int
1213
9
dissect_sabp_Restart(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1214
9
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1215
9
                                   ett_sabp_Restart, Restart_sequence);
1216
1217
9
  return offset;
1218
9
}
1219
1220
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 }
1225
};
1226
1227
static int
1228
5
dissect_sabp_Failure(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1229
5
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1230
5
                                   ett_sabp_Failure, Failure_sequence);
1231
1232
5
  return offset;
1233
5
}
1234
1235
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 }
1240
};
1241
1242
static int
1243
1
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
1
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1245
1
                                   ett_sabp_Error_Indication, Error_Indication_sequence);
1246
1247
1
  return offset;
1248
1
}
1249
1250
1251
1252
static int
1253
69
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
69
  offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_InitiatingMessageValue);
1255
1256
69
  return offset;
1257
69
}
1258
1259
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 }
1265
};
1266
1267
static int
1268
70
dissect_sabp_InitiatingMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1269
70
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1270
70
                                   ett_sabp_InitiatingMessage, InitiatingMessage_sequence);
1271
1272
70
  return offset;
1273
70
}
1274
1275
1276
1277
static int
1278
33
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
33
  offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_SuccessfulOutcomeValue);
1280
1281
33
  return offset;
1282
33
}
1283
1284
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 }
1290
};
1291
1292
static int
1293
33
dissect_sabp_SuccessfulOutcome(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1294
33
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1295
33
                                   ett_sabp_SuccessfulOutcome, SuccessfulOutcome_sequence);
1296
1297
33
  return offset;
1298
33
}
1299
1300
1301
1302
static int
1303
14
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
14
  offset = dissect_per_open_type_pdu_new(tvb, offset, actx, tree, hf_index, dissect_UnsuccessfulOutcomeValue);
1305
1306
14
  return offset;
1307
14
}
1308
1309
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 }
1315
};
1316
1317
static int
1318
14
dissect_sabp_UnsuccessfulOutcome(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
1319
14
  offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
1320
14
                                   ett_sabp_UnsuccessfulOutcome, UnsuccessfulOutcome_sequence);
1321
1322
14
  return offset;
1323
14
}
1324
1325
1326
static const value_string sabp_SABP_PDU_vals[] = {
1327
  {   0, "initiatingMessage" },
1328
  {   1, "successfulOutcome" },
1329
  {   2, "unsuccessfulOutcome" },
1330
  { 0, NULL }
1331
};
1332
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 }
1338
};
1339
1340
static int
1341
127
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
127
  offset = dissect_per_choice(tvb, offset, actx, tree, hf_index,
1343
127
                                 ett_sabp_SABP_PDU, SABP_PDU_choice,
1344
127
                                 NULL);
1345
1346
127
  return offset;
1347
127
}
1348
1349
/*--- PDUs ---*/
1350
1351
51
static int dissect_Broadcast_Message_Content_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1352
51
  int offset = 0;
1353
51
  asn1_ctx_t asn1_ctx;
1354
51
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1355
51
  offset = dissect_sabp_Broadcast_Message_Content(tvb, offset, &asn1_ctx, tree, hf_sabp_Broadcast_Message_Content_PDU);
1356
51
  offset += 7; offset >>= 3;
1357
51
  return offset;
1358
51
}
1359
0
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
0
  int offset = 0;
1361
0
  asn1_ctx_t asn1_ctx;
1362
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1363
0
  offset = dissect_sabp_Broadcast_Message_Content_Validity_Indicator(tvb, offset, &asn1_ctx, tree, hf_sabp_Broadcast_Message_Content_Validity_Indicator_PDU);
1364
0
  offset += 7; offset >>= 3;
1365
0
  return offset;
1366
0
}
1367
3
static int dissect_Category_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1368
3
  int offset = 0;
1369
3
  asn1_ctx_t asn1_ctx;
1370
3
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1371
3
  offset = dissect_sabp_Category(tvb, offset, &asn1_ctx, tree, hf_sabp_Category_PDU);
1372
3
  offset += 7; offset >>= 3;
1373
3
  return offset;
1374
3
}
1375
7
static int dissect_Cause_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1376
7
  int offset = 0;
1377
7
  asn1_ctx_t asn1_ctx;
1378
7
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1379
7
  offset = dissect_sabp_Cause(tvb, offset, &asn1_ctx, tree, hf_sabp_Cause_PDU);
1380
7
  offset += 7; offset >>= 3;
1381
7
  return offset;
1382
7
}
1383
23
static int dissect_Criticality_Diagnostics_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1384
23
  int offset = 0;
1385
23
  asn1_ctx_t asn1_ctx;
1386
23
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1387
23
  offset = dissect_sabp_Criticality_Diagnostics(tvb, offset, &asn1_ctx, tree, hf_sabp_Criticality_Diagnostics_PDU);
1388
23
  offset += 7; offset >>= 3;
1389
23
  return offset;
1390
23
}
1391
0
static int dissect_MessageStructure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1392
0
  int offset = 0;
1393
0
  asn1_ctx_t asn1_ctx;
1394
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1395
0
  offset = dissect_sabp_MessageStructure(tvb, offset, &asn1_ctx, tree, hf_sabp_MessageStructure_PDU);
1396
0
  offset += 7; offset >>= 3;
1397
0
  return offset;
1398
0
}
1399
8
static int dissect_Data_Coding_Scheme_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1400
8
  int offset = 0;
1401
8
  asn1_ctx_t asn1_ctx;
1402
8
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1403
8
  offset = dissect_sabp_Data_Coding_Scheme(tvb, offset, &asn1_ctx, tree, hf_sabp_Data_Coding_Scheme_PDU);
1404
8
  offset += 7; offset >>= 3;
1405
8
  return offset;
1406
8
}
1407
5
static int dissect_Failure_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1408
5
  int offset = 0;
1409
5
  asn1_ctx_t asn1_ctx;
1410
5
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1411
5
  offset = dissect_sabp_Failure_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Failure_List_PDU);
1412
5
  offset += 7; offset >>= 3;
1413
5
  return offset;
1414
5
}
1415
2
static int dissect_Message_Identifier_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1416
2
  int offset = 0;
1417
2
  asn1_ctx_t asn1_ctx;
1418
2
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1419
2
  offset = dissect_sabp_Message_Identifier(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Identifier_PDU);
1420
2
  offset += 7; offset >>= 3;
1421
2
  return offset;
1422
2
}
1423
1
static int dissect_New_Serial_Number_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1424
1
  int offset = 0;
1425
1
  asn1_ctx_t asn1_ctx;
1426
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1427
1
  offset = dissect_sabp_New_Serial_Number(tvb, offset, &asn1_ctx, tree, hf_sabp_New_Serial_Number_PDU);
1428
1
  offset += 7; offset >>= 3;
1429
1
  return offset;
1430
1
}
1431
17
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
17
  int offset = 0;
1433
17
  asn1_ctx_t asn1_ctx;
1434
17
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1435
17
  offset = dissect_sabp_Number_of_Broadcasts_Completed_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Number_of_Broadcasts_Completed_List_PDU);
1436
17
  offset += 7; offset >>= 3;
1437
17
  return offset;
1438
17
}
1439
1
static int dissect_Number_of_Broadcasts_Requested_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1440
1
  int offset = 0;
1441
1
  asn1_ctx_t asn1_ctx;
1442
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1443
1
  offset = dissect_sabp_Number_of_Broadcasts_Requested(tvb, offset, &asn1_ctx, tree, hf_sabp_Number_of_Broadcasts_Requested_PDU);
1444
1
  offset += 7; offset >>= 3;
1445
1
  return offset;
1446
1
}
1447
1
static int dissect_Old_Serial_Number_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1448
1
  int offset = 0;
1449
1
  asn1_ctx_t asn1_ctx;
1450
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1451
1
  offset = dissect_sabp_Old_Serial_Number(tvb, offset, &asn1_ctx, tree, hf_sabp_Old_Serial_Number_PDU);
1452
1
  offset += 7; offset >>= 3;
1453
1
  return offset;
1454
1
}
1455
1
static int dissect_Paging_ETWS_Indicator_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1456
1
  int offset = 0;
1457
1
  asn1_ctx_t asn1_ctx;
1458
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1459
1
  offset = dissect_sabp_Paging_ETWS_Indicator(tvb, offset, &asn1_ctx, tree, hf_sabp_Paging_ETWS_Indicator_PDU);
1460
1
  offset += 7; offset >>= 3;
1461
1
  return offset;
1462
1
}
1463
0
static int dissect_Radio_Resource_Loading_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1464
0
  int offset = 0;
1465
0
  asn1_ctx_t asn1_ctx;
1466
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1467
0
  offset = dissect_sabp_Radio_Resource_Loading_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Radio_Resource_Loading_List_PDU);
1468
0
  offset += 7; offset >>= 3;
1469
0
  return offset;
1470
0
}
1471
2
static int dissect_Recovery_Indication_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1472
2
  int offset = 0;
1473
2
  asn1_ctx_t asn1_ctx;
1474
2
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1475
2
  offset = dissect_sabp_Recovery_Indication(tvb, offset, &asn1_ctx, tree, hf_sabp_Recovery_Indication_PDU);
1476
2
  offset += 7; offset >>= 3;
1477
2
  return offset;
1478
2
}
1479
2
static int dissect_Repetition_Period_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1480
2
  int offset = 0;
1481
2
  asn1_ctx_t asn1_ctx;
1482
2
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1483
2
  offset = dissect_sabp_Repetition_Period(tvb, offset, &asn1_ctx, tree, hf_sabp_Repetition_Period_PDU);
1484
2
  offset += 7; offset >>= 3;
1485
2
  return offset;
1486
2
}
1487
0
static int dissect_Serial_Number_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1488
0
  int offset = 0;
1489
0
  asn1_ctx_t asn1_ctx;
1490
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1491
0
  offset = dissect_sabp_Serial_Number(tvb, offset, &asn1_ctx, tree, hf_sabp_Serial_Number_PDU);
1492
0
  offset += 7; offset >>= 3;
1493
0
  return offset;
1494
0
}
1495
4
static int dissect_Service_Areas_List_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1496
4
  int offset = 0;
1497
4
  asn1_ctx_t asn1_ctx;
1498
4
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1499
4
  offset = dissect_sabp_Service_Areas_List(tvb, offset, &asn1_ctx, tree, hf_sabp_Service_Areas_List_PDU);
1500
4
  offset += 7; offset >>= 3;
1501
4
  return offset;
1502
4
}
1503
0
static int dissect_TypeOfError_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1504
0
  int offset = 0;
1505
0
  asn1_ctx_t asn1_ctx;
1506
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1507
0
  offset = dissect_sabp_TypeOfError(tvb, offset, &asn1_ctx, tree, hf_sabp_TypeOfError_PDU);
1508
0
  offset += 7; offset >>= 3;
1509
0
  return offset;
1510
0
}
1511
4
static int dissect_WarningSecurityInfo_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1512
4
  int offset = 0;
1513
4
  asn1_ctx_t asn1_ctx;
1514
4
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1515
4
  offset = dissect_sabp_WarningSecurityInfo(tvb, offset, &asn1_ctx, tree, hf_sabp_WarningSecurityInfo_PDU);
1516
4
  offset += 7; offset >>= 3;
1517
4
  return offset;
1518
4
}
1519
0
static int dissect_Warning_Type_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1520
0
  int offset = 0;
1521
0
  asn1_ctx_t asn1_ctx;
1522
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1523
0
  offset = dissect_sabp_Warning_Type(tvb, offset, &asn1_ctx, tree, hf_sabp_Warning_Type_PDU);
1524
0
  offset += 7; offset >>= 3;
1525
0
  return offset;
1526
0
}
1527
40
static int dissect_Write_Replace_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1528
40
  int offset = 0;
1529
40
  asn1_ctx_t asn1_ctx;
1530
40
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1531
40
  offset = dissect_sabp_Write_Replace(tvb, offset, &asn1_ctx, tree, hf_sabp_Write_Replace_PDU);
1532
40
  offset += 7; offset >>= 3;
1533
40
  return offset;
1534
40
}
1535
17
static int dissect_Write_Replace_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1536
17
  int offset = 0;
1537
17
  asn1_ctx_t asn1_ctx;
1538
17
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1539
17
  offset = dissect_sabp_Write_Replace_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Write_Replace_Complete_PDU);
1540
17
  offset += 7; offset >>= 3;
1541
17
  return offset;
1542
17
}
1543
7
static int dissect_Write_Replace_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1544
7
  int offset = 0;
1545
7
  asn1_ctx_t asn1_ctx;
1546
7
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1547
7
  offset = dissect_sabp_Write_Replace_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Write_Replace_Failure_PDU);
1548
7
  offset += 7; offset >>= 3;
1549
7
  return offset;
1550
7
}
1551
2
static int dissect_Kill_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1552
2
  int offset = 0;
1553
2
  asn1_ctx_t asn1_ctx;
1554
2
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1555
2
  offset = dissect_sabp_Kill(tvb, offset, &asn1_ctx, tree, hf_sabp_Kill_PDU);
1556
2
  offset += 7; offset >>= 3;
1557
2
  return offset;
1558
2
}
1559
3
static int dissect_Kill_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1560
3
  int offset = 0;
1561
3
  asn1_ctx_t asn1_ctx;
1562
3
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1563
3
  offset = dissect_sabp_Kill_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Kill_Complete_PDU);
1564
3
  offset += 7; offset >>= 3;
1565
3
  return offset;
1566
3
}
1567
1
static int dissect_Kill_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1568
1
  int offset = 0;
1569
1
  asn1_ctx_t asn1_ctx;
1570
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1571
1
  offset = dissect_sabp_Kill_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Kill_Failure_PDU);
1572
1
  offset += 7; offset >>= 3;
1573
1
  return offset;
1574
1
}
1575
5
static int dissect_Load_Query_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1576
5
  int offset = 0;
1577
5
  asn1_ctx_t asn1_ctx;
1578
5
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1579
5
  offset = dissect_sabp_Load_Query(tvb, offset, &asn1_ctx, tree, hf_sabp_Load_Query_PDU);
1580
5
  offset += 7; offset >>= 3;
1581
5
  return offset;
1582
5
}
1583
2
static int dissect_Load_Query_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1584
2
  int offset = 0;
1585
2
  asn1_ctx_t asn1_ctx;
1586
2
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1587
2
  offset = dissect_sabp_Load_Query_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Load_Query_Complete_PDU);
1588
2
  offset += 7; offset >>= 3;
1589
2
  return offset;
1590
2
}
1591
0
static int dissect_Load_Query_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1592
0
  int offset = 0;
1593
0
  asn1_ctx_t asn1_ctx;
1594
0
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1595
0
  offset = dissect_sabp_Load_Query_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Load_Query_Failure_PDU);
1596
0
  offset += 7; offset >>= 3;
1597
0
  return offset;
1598
0
}
1599
1
static int dissect_Message_Status_Query_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1600
1
  int offset = 0;
1601
1
  asn1_ctx_t asn1_ctx;
1602
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1603
1
  offset = dissect_sabp_Message_Status_Query(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Status_Query_PDU);
1604
1
  offset += 7; offset >>= 3;
1605
1
  return offset;
1606
1
}
1607
3
static int dissect_Message_Status_Query_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1608
3
  int offset = 0;
1609
3
  asn1_ctx_t asn1_ctx;
1610
3
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1611
3
  offset = dissect_sabp_Message_Status_Query_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Status_Query_Complete_PDU);
1612
3
  offset += 7; offset >>= 3;
1613
3
  return offset;
1614
3
}
1615
1
static int dissect_Message_Status_Query_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1616
1
  int offset = 0;
1617
1
  asn1_ctx_t asn1_ctx;
1618
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1619
1
  offset = dissect_sabp_Message_Status_Query_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Message_Status_Query_Failure_PDU);
1620
1
  offset += 7; offset >>= 3;
1621
1
  return offset;
1622
1
}
1623
3
static int dissect_Reset_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1624
3
  int offset = 0;
1625
3
  asn1_ctx_t asn1_ctx;
1626
3
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1627
3
  offset = dissect_sabp_Reset(tvb, offset, &asn1_ctx, tree, hf_sabp_Reset_PDU);
1628
3
  offset += 7; offset >>= 3;
1629
3
  return offset;
1630
3
}
1631
1
static int dissect_Reset_Complete_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1632
1
  int offset = 0;
1633
1
  asn1_ctx_t asn1_ctx;
1634
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1635
1
  offset = dissect_sabp_Reset_Complete(tvb, offset, &asn1_ctx, tree, hf_sabp_Reset_Complete_PDU);
1636
1
  offset += 7; offset >>= 3;
1637
1
  return offset;
1638
1
}
1639
1
static int dissect_Reset_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1640
1
  int offset = 0;
1641
1
  asn1_ctx_t asn1_ctx;
1642
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1643
1
  offset = dissect_sabp_Reset_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Reset_Failure_PDU);
1644
1
  offset += 7; offset >>= 3;
1645
1
  return offset;
1646
1
}
1647
9
static int dissect_Restart_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1648
9
  int offset = 0;
1649
9
  asn1_ctx_t asn1_ctx;
1650
9
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1651
9
  offset = dissect_sabp_Restart(tvb, offset, &asn1_ctx, tree, hf_sabp_Restart_PDU);
1652
9
  offset += 7; offset >>= 3;
1653
9
  return offset;
1654
9
}
1655
5
static int dissect_Failure_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1656
5
  int offset = 0;
1657
5
  asn1_ctx_t asn1_ctx;
1658
5
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1659
5
  offset = dissect_sabp_Failure(tvb, offset, &asn1_ctx, tree, hf_sabp_Failure_PDU);
1660
5
  offset += 7; offset >>= 3;
1661
5
  return offset;
1662
5
}
1663
1
static int dissect_Error_Indication_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1664
1
  int offset = 0;
1665
1
  asn1_ctx_t asn1_ctx;
1666
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1667
1
  offset = dissect_sabp_Error_Indication(tvb, offset, &asn1_ctx, tree, hf_sabp_Error_Indication_PDU);
1668
1
  offset += 7; offset >>= 3;
1669
1
  return offset;
1670
1
}
1671
127
static int dissect_SABP_PDU_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, void *data _U_) {
1672
127
  int offset = 0;
1673
127
  asn1_ctx_t asn1_ctx;
1674
127
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1675
127
  offset = dissect_sabp_SABP_PDU(tvb, offset, &asn1_ctx, tree, hf_sabp_SABP_PDU_PDU);
1676
127
  offset += 7; offset >>= 3;
1677
127
  return offset;
1678
127
}
1679
1680
1681
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1682
244
{
1683
244
  return (dissector_try_uint(sabp_ies_dissector_table, ProtocolIE_ID, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1684
244
}
1685
1686
static int dissect_ProtocolExtensionFieldExtensionValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1687
106
{
1688
106
  return (dissector_try_uint(sabp_extension_dissector_table, ProtocolExtensionID, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1689
106
}
1690
1691
static int dissect_InitiatingMessageValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1692
68
{
1693
68
  return (dissector_try_uint(sabp_proc_imsg_dissector_table, ProcedureCode, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1694
68
}
1695
1696
static int dissect_SuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1697
31
{
1698
31
  return (dissector_try_uint(sabp_proc_sout_dissector_table, ProcedureCode, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1699
31
}
1700
1701
static int dissect_UnsuccessfulOutcomeValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_)
1702
13
{
1703
13
  return (dissector_try_uint(sabp_proc_uout_dissector_table, ProcedureCode, tvb, pinfo, tree)) ? tvb_captured_length(tvb) : 0;
1704
13
}
1705
1706
1707
/* 3GPP TS 23.041 version 11.4.0
1708
 * 9.4.2.2.5 CB Data
1709
 */
1710
static void
1711
dissect_sabp_cb_data(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1712
30
{
1713
30
  proto_item *cbs_page_item;
1714
30
  proto_tree *subtree;
1715
30
  tvbuff_t *page_tvb, *unpacked_tvb;
1716
30
  int offset = 0;
1717
30
  int n;
1718
30
  uint8_t nr_pages, len, cb_inf_msg_len;
1719
1720
1721
  /* Octet 1 Number-of-Pages */
1722
30
  nr_pages = tvb_get_uint8(tvb, offset);
1723
30
  proto_tree_add_item(tree, hf_sabp_no_of_pages, tvb, offset, 1, ENC_BIG_ENDIAN);
1724
30
  offset++;
1725
  /*
1726
   * NOTE: n equal to or less than 15
1727
   */
1728
30
  if(nr_pages > 15){
1729
    /* Error */
1730
10
    return;
1731
10
  }
1732
20
  for (n = 0; n < nr_pages; n++) {
1733
0
    subtree = proto_tree_add_subtree_format(tree, tvb, offset, 83, ett_sabp_cbs_page, NULL,
1734
0
                "CB page %u data",  n+1);
1735
    /* octet 2 - 83 CBS-Message-Information-Page 1  */
1736
0
    cbs_page_item = proto_tree_add_item(subtree, hf_sabp_cb_msg_inf_page, tvb, offset, 82, ENC_NA);
1737
0
    cb_inf_msg_len = tvb_get_uint8(tvb,offset+82);
1738
0
    page_tvb = tvb_new_subset_length(tvb, offset, cb_inf_msg_len);
1739
0
    unpacked_tvb = dissect_cbs_data(sms_encoding, page_tvb, subtree, pinfo, 0);
1740
0
    len = tvb_captured_length(unpacked_tvb);
1741
0
    if (unpacked_tvb != NULL){
1742
0
      if (tree != NULL){
1743
0
        proto_tree *cbs_page_subtree = proto_item_add_subtree(cbs_page_item, ett_sabp_cbs_page_content);
1744
0
        proto_tree_add_item(cbs_page_subtree, hf_sabp_cbs_page_content, unpacked_tvb, 0, len, ENC_UTF_8);
1745
0
      }
1746
0
    }
1747
1748
0
    offset = offset+82;
1749
    /* 84 CBS-Message-Information-Length 1 */
1750
0
    proto_tree_add_item(subtree, hf_sabp_cb_inf_len, tvb, offset, 1, ENC_BIG_ENDIAN);
1751
0
    offset++;
1752
0
  }
1753
20
}
1754
1755
static int
1756
dissect_sabp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
1757
127
{
1758
127
  proto_item  *sabp_item = NULL;
1759
127
  proto_tree  *sabp_tree = NULL;
1760
1761
  /* make entry in the Protocol column on summary display */
1762
127
  col_set_str(pinfo->cinfo, COL_PROTOCOL, PSNAME);
1763
1764
  /* create the sabp protocol tree */
1765
127
  sabp_item = proto_tree_add_item(tree, proto_sabp, tvb, 0, -1, ENC_NA);
1766
127
  sabp_tree = proto_item_add_subtree(sabp_item, ett_sabp);
1767
1768
127
  return dissect_SABP_PDU_PDU(tvb, pinfo, sabp_tree, NULL);
1769
127
}
1770
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)
1774
1
{
1775
1
  uint32_t type_length, msg_len;
1776
1
  unsigned tvb_length;
1777
1
  int bit_offset;
1778
1
  bool is_fragmented;
1779
1
  asn1_ctx_t asn1_ctx;
1780
1
  asn1_ctx_init(&asn1_ctx, ASN1_ENC_PER, true, pinfo);
1781
1782
1
  tvb_length = tvb_reported_length(tvb);
1783
1784
1
  if (tvb_length < 5) {
1785
0
    pinfo->desegment_offset = 0;
1786
0
    pinfo->desegment_len = DESEGMENT_ONE_MORE_SEGMENT;
1787
0
    return tvb_captured_length(tvb);
1788
0
  }
1789
1790
  /* Length should be in the 3:d octet */
1791
1
  bit_offset = 24;
1792
  /* Get the length of the sabp packet. Offset in bits */
1793
1
  do {
1794
1
    bit_offset = dissect_per_length_determinant(tvb, bit_offset, &asn1_ctx, NULL, -1, &type_length, &is_fragmented);
1795
1
    bit_offset += 8*type_length;
1796
1
    msg_len = (bit_offset + 7) >> 3;
1797
1
    if (is_fragmented) {
1798
      /* Next length field will take 1 or 2 bytes; let's ask for the maximum */
1799
0
      msg_len += 2;
1800
0
    }
1801
1
    if (msg_len > tvb_length) {
1802
1
      pinfo->desegment_offset = 0;
1803
1
      pinfo->desegment_len = msg_len - tvb_length;
1804
1
      return tvb_captured_length(tvb);
1805
1
    }
1806
1
  } while (is_fragmented);
1807
1808
0
  return dissect_sabp(tvb, pinfo, tree, data);
1809
1
}
1810
1811
/*--- proto_register_sabp -------------------------------------------*/
1812
14
void proto_register_sabp(void) {
1813
1814
  /* List of fields */
1815
1816
14
  static hf_register_info hf[] = {
1817
14
    { &hf_sabp_no_of_pages,
1818
14
      { "Number-of-Pages", "sabp.no_of_pages",
1819
14
        FT_UINT8, BASE_DEC, NULL, 0,
1820
14
        NULL, HFILL }},
1821
14
    { &hf_sabp_cb_msg_inf_page,
1822
14
      { "CBS-Message-Information-Page", "sabp.cb_msg_inf_page",
1823
14
        FT_BYTES, BASE_NONE, NULL, 0,
1824
14
        NULL, HFILL }},
1825
14
    { &hf_sabp_cbs_page_content,
1826
14
      { "CBS Page Content", "sabp.cb_page_content",
1827
14
        FT_STRING, BASE_NONE, NULL, 0,
1828
14
        NULL, HFILL }},
1829
14
    { &hf_sabp_cb_inf_len,
1830
14
      { "CBS-Message-Information-Length", "sabp.cb_inf_len",
1831
14
        FT_UINT8, BASE_DEC, NULL, 0,
1832
14
        NULL, HFILL }},
1833
1834
14
    { &hf_sabp_Broadcast_Message_Content_PDU,
1835
14
      { "Broadcast-Message-Content", "sabp.Broadcast_Message_Content",
1836
14
        FT_BYTES, BASE_NONE, NULL, 0,
1837
14
        NULL, HFILL }},
1838
14
    { &hf_sabp_Broadcast_Message_Content_Validity_Indicator_PDU,
1839
14
      { "Broadcast-Message-Content-Validity-Indicator", "sabp.Broadcast_Message_Content_Validity_Indicator",
1840
14
        FT_UINT32, BASE_DEC, VALS(sabp_Broadcast_Message_Content_Validity_Indicator_vals), 0,
1841
14
        NULL, HFILL }},
1842
14
    { &hf_sabp_Category_PDU,
1843
14
      { "Category", "sabp.Category",
1844
14
        FT_UINT32, BASE_DEC, VALS(sabp_Category_vals), 0,
1845
14
        NULL, HFILL }},
1846
14
    { &hf_sabp_Cause_PDU,
1847
14
      { "Cause", "sabp.Cause",
1848
14
        FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_Cause_vals_ext, 0,
1849
14
        NULL, HFILL }},
1850
14
    { &hf_sabp_Criticality_Diagnostics_PDU,
1851
14
      { "Criticality-Diagnostics", "sabp.Criticality_Diagnostics_element",
1852
14
        FT_NONE, BASE_NONE, NULL, 0,
1853
14
        NULL, HFILL }},
1854
14
    { &hf_sabp_MessageStructure_PDU,
1855
14
      { "MessageStructure", "sabp.MessageStructure",
1856
14
        FT_UINT32, BASE_DEC, NULL, 0,
1857
14
        NULL, HFILL }},
1858
14
    { &hf_sabp_Data_Coding_Scheme_PDU,
1859
14
      { "Data-Coding-Scheme", "sabp.Data_Coding_Scheme",
1860
14
        FT_BYTES, BASE_NONE, NULL, 0,
1861
14
        NULL, HFILL }},
1862
14
    { &hf_sabp_Failure_List_PDU,
1863
14
      { "Failure-List", "sabp.Failure_List",
1864
14
        FT_UINT32, BASE_DEC, NULL, 0,
1865
14
        NULL, HFILL }},
1866
14
    { &hf_sabp_Message_Identifier_PDU,
1867
14
      { "Message-Identifier", "sabp.Message_Identifier",
1868
14
        FT_BYTES, BASE_NONE, NULL, 0,
1869
14
        NULL, HFILL }},
1870
14
    { &hf_sabp_New_Serial_Number_PDU,
1871
14
      { "New-Serial-Number", "sabp.New_Serial_Number",
1872
14
        FT_BYTES, BASE_NONE, NULL, 0,
1873
14
        NULL, HFILL }},
1874
14
    { &hf_sabp_Number_of_Broadcasts_Completed_List_PDU,
1875
14
      { "Number-of-Broadcasts-Completed-List", "sabp.Number_of_Broadcasts_Completed_List",
1876
14
        FT_UINT32, BASE_DEC, NULL, 0,
1877
14
        NULL, HFILL }},
1878
14
    { &hf_sabp_Number_of_Broadcasts_Requested_PDU,
1879
14
      { "Number-of-Broadcasts-Requested", "sabp.Number_of_Broadcasts_Requested",
1880
14
        FT_UINT32, BASE_DEC, VALS(sabp_Number_of_Broadcasts_Requested_vals), 0,
1881
14
        NULL, HFILL }},
1882
14
    { &hf_sabp_Old_Serial_Number_PDU,
1883
14
      { "Old-Serial-Number", "sabp.Old_Serial_Number",
1884
14
        FT_BYTES, BASE_NONE, NULL, 0,
1885
14
        NULL, HFILL }},
1886
14
    { &hf_sabp_Paging_ETWS_Indicator_PDU,
1887
14
      { "Paging-ETWS-Indicator", "sabp.Paging_ETWS_Indicator",
1888
14
        FT_UINT32, BASE_DEC, VALS(sabp_Paging_ETWS_Indicator_vals), 0,
1889
14
        NULL, HFILL }},
1890
14
    { &hf_sabp_Radio_Resource_Loading_List_PDU,
1891
14
      { "Radio-Resource-Loading-List", "sabp.Radio_Resource_Loading_List",
1892
14
        FT_UINT32, BASE_DEC, NULL, 0,
1893
14
        NULL, HFILL }},
1894
14
    { &hf_sabp_Recovery_Indication_PDU,
1895
14
      { "Recovery-Indication", "sabp.Recovery_Indication",
1896
14
        FT_UINT32, BASE_DEC, VALS(sabp_Recovery_Indication_vals), 0,
1897
14
        NULL, HFILL }},
1898
14
    { &hf_sabp_Repetition_Period_PDU,
1899
14
      { "Repetition-Period", "sabp.Repetition_Period",
1900
14
        FT_UINT32, BASE_DEC, NULL, 0,
1901
14
        NULL, HFILL }},
1902
14
    { &hf_sabp_Serial_Number_PDU,
1903
14
      { "Serial-Number", "sabp.Serial_Number",
1904
14
        FT_BYTES, BASE_NONE, NULL, 0,
1905
14
        NULL, HFILL }},
1906
14
    { &hf_sabp_Service_Areas_List_PDU,
1907
14
      { "Service-Areas-List", "sabp.Service_Areas_List",
1908
14
        FT_UINT32, BASE_DEC, NULL, 0,
1909
14
        NULL, HFILL }},
1910
14
    { &hf_sabp_TypeOfError_PDU,
1911
14
      { "TypeOfError", "sabp.TypeOfError",
1912
14
        FT_UINT32, BASE_DEC, VALS(sabp_TypeOfError_vals), 0,
1913
14
        NULL, HFILL }},
1914
14
    { &hf_sabp_WarningSecurityInfo_PDU,
1915
14
      { "WarningSecurityInfo", "sabp.WarningSecurityInfo",
1916
14
        FT_BYTES, BASE_NONE, NULL, 0,
1917
14
        NULL, HFILL }},
1918
14
    { &hf_sabp_Warning_Type_PDU,
1919
14
      { "Warning-Type", "sabp.Warning_Type",
1920
14
        FT_BYTES, BASE_NONE, NULL, 0,
1921
14
        NULL, HFILL }},
1922
14
    { &hf_sabp_Write_Replace_PDU,
1923
14
      { "Write-Replace", "sabp.Write_Replace_element",
1924
14
        FT_NONE, BASE_NONE, NULL, 0,
1925
14
        NULL, HFILL }},
1926
14
    { &hf_sabp_Write_Replace_Complete_PDU,
1927
14
      { "Write-Replace-Complete", "sabp.Write_Replace_Complete_element",
1928
14
        FT_NONE, BASE_NONE, NULL, 0,
1929
14
        NULL, HFILL }},
1930
14
    { &hf_sabp_Write_Replace_Failure_PDU,
1931
14
      { "Write-Replace-Failure", "sabp.Write_Replace_Failure_element",
1932
14
        FT_NONE, BASE_NONE, NULL, 0,
1933
14
        NULL, HFILL }},
1934
14
    { &hf_sabp_Kill_PDU,
1935
14
      { "Kill", "sabp.Kill_element",
1936
14
        FT_NONE, BASE_NONE, NULL, 0,
1937
14
        NULL, HFILL }},
1938
14
    { &hf_sabp_Kill_Complete_PDU,
1939
14
      { "Kill-Complete", "sabp.Kill_Complete_element",
1940
14
        FT_NONE, BASE_NONE, NULL, 0,
1941
14
        NULL, HFILL }},
1942
14
    { &hf_sabp_Kill_Failure_PDU,
1943
14
      { "Kill-Failure", "sabp.Kill_Failure_element",
1944
14
        FT_NONE, BASE_NONE, NULL, 0,
1945
14
        NULL, HFILL }},
1946
14
    { &hf_sabp_Load_Query_PDU,
1947
14
      { "Load-Query", "sabp.Load_Query_element",
1948
14
        FT_NONE, BASE_NONE, NULL, 0,
1949
14
        NULL, HFILL }},
1950
14
    { &hf_sabp_Load_Query_Complete_PDU,
1951
14
      { "Load-Query-Complete", "sabp.Load_Query_Complete_element",
1952
14
        FT_NONE, BASE_NONE, NULL, 0,
1953
14
        NULL, HFILL }},
1954
14
    { &hf_sabp_Load_Query_Failure_PDU,
1955
14
      { "Load-Query-Failure", "sabp.Load_Query_Failure_element",
1956
14
        FT_NONE, BASE_NONE, NULL, 0,
1957
14
        NULL, HFILL }},
1958
14
    { &hf_sabp_Message_Status_Query_PDU,
1959
14
      { "Message-Status-Query", "sabp.Message_Status_Query_element",
1960
14
        FT_NONE, BASE_NONE, NULL, 0,
1961
14
        NULL, HFILL }},
1962
14
    { &hf_sabp_Message_Status_Query_Complete_PDU,
1963
14
      { "Message-Status-Query-Complete", "sabp.Message_Status_Query_Complete_element",
1964
14
        FT_NONE, BASE_NONE, NULL, 0,
1965
14
        NULL, HFILL }},
1966
14
    { &hf_sabp_Message_Status_Query_Failure_PDU,
1967
14
      { "Message-Status-Query-Failure", "sabp.Message_Status_Query_Failure_element",
1968
14
        FT_NONE, BASE_NONE, NULL, 0,
1969
14
        NULL, HFILL }},
1970
14
    { &hf_sabp_Reset_PDU,
1971
14
      { "Reset", "sabp.Reset_element",
1972
14
        FT_NONE, BASE_NONE, NULL, 0,
1973
14
        NULL, HFILL }},
1974
14
    { &hf_sabp_Reset_Complete_PDU,
1975
14
      { "Reset-Complete", "sabp.Reset_Complete_element",
1976
14
        FT_NONE, BASE_NONE, NULL, 0,
1977
14
        NULL, HFILL }},
1978
14
    { &hf_sabp_Reset_Failure_PDU,
1979
14
      { "Reset-Failure", "sabp.Reset_Failure_element",
1980
14
        FT_NONE, BASE_NONE, NULL, 0,
1981
14
        NULL, HFILL }},
1982
14
    { &hf_sabp_Restart_PDU,
1983
14
      { "Restart", "sabp.Restart_element",
1984
14
        FT_NONE, BASE_NONE, NULL, 0,
1985
14
        NULL, HFILL }},
1986
14
    { &hf_sabp_Failure_PDU,
1987
14
      { "Failure", "sabp.Failure_element",
1988
14
        FT_NONE, BASE_NONE, NULL, 0,
1989
14
        NULL, HFILL }},
1990
14
    { &hf_sabp_Error_Indication_PDU,
1991
14
      { "Error-Indication", "sabp.Error_Indication_element",
1992
14
        FT_NONE, BASE_NONE, NULL, 0,
1993
14
        NULL, HFILL }},
1994
14
    { &hf_sabp_SABP_PDU_PDU,
1995
14
      { "SABP-PDU", "sabp.SABP_PDU",
1996
14
        FT_UINT32, BASE_DEC, VALS(sabp_SABP_PDU_vals), 0,
1997
14
        NULL, HFILL }},
1998
14
    { &hf_sabp_ProtocolIE_Container_item,
1999
14
      { "ProtocolIE-Field", "sabp.ProtocolIE_Field_element",
2000
14
        FT_NONE, BASE_NONE, NULL, 0,
2001
14
        NULL, HFILL }},
2002
14
    { &hf_sabp_id,
2003
14
      { "id", "sabp.id",
2004
14
        FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_ProtocolIE_ID_vals_ext, 0,
2005
14
        "ProtocolIE_ID", HFILL }},
2006
14
    { &hf_sabp_criticality,
2007
14
      { "criticality", "sabp.criticality",
2008
14
        FT_UINT32, BASE_DEC, VALS(sabp_Criticality_vals), 0,
2009
14
        NULL, HFILL }},
2010
14
    { &hf_sabp_protocolIE_Field_value,
2011
14
      { "value", "sabp.protocolIE_Field_value_element",
2012
14
        FT_NONE, BASE_NONE, NULL, 0,
2013
14
        "ProtocolIE_Field_value", HFILL }},
2014
14
    { &hf_sabp_ProtocolExtensionContainer_item,
2015
14
      { "ProtocolExtensionField", "sabp.ProtocolExtensionField_element",
2016
14
        FT_NONE, BASE_NONE, NULL, 0,
2017
14
        NULL, HFILL }},
2018
14
    { &hf_sabp_ext_id,
2019
14
      { "id", "sabp.ext_id",
2020
14
        FT_UINT32, BASE_DEC, NULL, 0,
2021
14
        "ProtocolExtensionID", HFILL }},
2022
14
    { &hf_sabp_extensionValue,
2023
14
      { "extensionValue", "sabp.extensionValue_element",
2024
14
        FT_NONE, BASE_NONE, NULL, 0,
2025
14
        NULL, HFILL }},
2026
14
    { &hf_sabp_procedureCode,
2027
14
      { "procedureCode", "sabp.procedureCode",
2028
14
        FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_ProcedureCode_vals_ext, 0,
2029
14
        NULL, HFILL }},
2030
14
    { &hf_sabp_triggeringMessage,
2031
14
      { "triggeringMessage", "sabp.triggeringMessage",
2032
14
        FT_UINT32, BASE_DEC, VALS(sabp_TriggeringMessage_vals), 0,
2033
14
        NULL, HFILL }},
2034
14
    { &hf_sabp_procedureCriticality,
2035
14
      { "procedureCriticality", "sabp.procedureCriticality",
2036
14
        FT_UINT32, BASE_DEC, VALS(sabp_Criticality_vals), 0,
2037
14
        "Criticality", HFILL }},
2038
14
    { &hf_sabp_iEsCriticalityDiagnostics,
2039
14
      { "iEsCriticalityDiagnostics", "sabp.iEsCriticalityDiagnostics",
2040
14
        FT_UINT32, BASE_DEC, NULL, 0,
2041
14
        "CriticalityDiagnostics_IE_List", HFILL }},
2042
14
    { &hf_sabp_iE_Extensions,
2043
14
      { "iE-Extensions", "sabp.iE_Extensions",
2044
14
        FT_UINT32, BASE_DEC, NULL, 0,
2045
14
        "ProtocolExtensionContainer", HFILL }},
2046
14
    { &hf_sabp_CriticalityDiagnostics_IE_List_item,
2047
14
      { "CriticalityDiagnostics-IE-List item", "sabp.CriticalityDiagnostics_IE_List_item_element",
2048
14
        FT_NONE, BASE_NONE, NULL, 0,
2049
14
        NULL, HFILL }},
2050
14
    { &hf_sabp_iECriticality,
2051
14
      { "iECriticality", "sabp.iECriticality",
2052
14
        FT_UINT32, BASE_DEC, VALS(sabp_Criticality_vals), 0,
2053
14
        "Criticality", HFILL }},
2054
14
    { &hf_sabp_iE_ID,
2055
14
      { "iE-ID", "sabp.iE_ID",
2056
14
        FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_ProtocolIE_ID_vals_ext, 0,
2057
14
        "ProtocolIE_ID", HFILL }},
2058
14
    { &hf_sabp_repetitionNumber,
2059
14
      { "repetitionNumber", "sabp.repetitionNumber",
2060
14
        FT_UINT32, BASE_DEC, NULL, 0,
2061
14
        "RepetitionNumber0", HFILL }},
2062
14
    { &hf_sabp_MessageStructure_item,
2063
14
      { "MessageStructure item", "sabp.MessageStructure_item_element",
2064
14
        FT_NONE, BASE_NONE, NULL, 0,
2065
14
        NULL, HFILL }},
2066
14
    { &hf_sabp_repetitionNumber1,
2067
14
      { "repetitionNumber", "sabp.repetitionNumber1",
2068
14
        FT_UINT32, BASE_DEC, NULL, 0,
2069
14
        "RepetitionNumber1", HFILL }},
2070
14
    { &hf_sabp_Failure_List_item,
2071
14
      { "Failure-List-Item", "sabp.Failure_List_Item_element",
2072
14
        FT_NONE, BASE_NONE, NULL, 0,
2073
14
        NULL, HFILL }},
2074
14
    { &hf_sabp_service_area_identifier,
2075
14
      { "service-area-identifier", "sabp.service_area_identifier_element",
2076
14
        FT_NONE, BASE_NONE, NULL, 0,
2077
14
        NULL, HFILL }},
2078
14
    { &hf_sabp_cause,
2079
14
      { "cause", "sabp.cause",
2080
14
        FT_UINT32, BASE_DEC|BASE_EXT_STRING, &sabp_Cause_vals_ext, 0,
2081
14
        NULL, HFILL }},
2082
14
    { &hf_sabp_Number_of_Broadcasts_Completed_List_item,
2083
14
      { "Number-of-Broadcasts-Completed-List-Item", "sabp.Number_of_Broadcasts_Completed_List_Item_element",
2084
14
        FT_NONE, BASE_NONE, NULL, 0,
2085
14
        NULL, HFILL }},
2086
14
    { &hf_sabp_number_of_broadcasts_completed,
2087
14
      { "number-of-broadcasts-completed", "sabp.number_of_broadcasts_completed",
2088
14
        FT_UINT32, BASE_DEC, NULL, 0,
2089
14
        "INTEGER_0_65535", HFILL }},
2090
14
    { &hf_sabp_number_of_broadcasts_completed_info,
2091
14
      { "number-of-broadcasts-completed-info", "sabp.number_of_broadcasts_completed_info",
2092
14
        FT_UINT32, BASE_DEC, VALS(sabp_Number_Of_Broadcasts_Completed_Info_vals), 0,
2093
14
        NULL, HFILL }},
2094
14
    { &hf_sabp_Radio_Resource_Loading_List_item,
2095
14
      { "Radio-Resource-Loading-List-Item", "sabp.Radio_Resource_Loading_List_Item_element",
2096
14
        FT_NONE, BASE_NONE, NULL, 0,
2097
14
        NULL, HFILL }},
2098
14
    { &hf_sabp_available_bandwidth,
2099
14
      { "available-bandwidth", "sabp.available_bandwidth",
2100
14
        FT_UINT32, BASE_DEC, NULL, 0,
2101
14
        NULL, HFILL }},
2102
14
    { &hf_sabp_pLMNidentity,
2103
14
      { "pLMNidentity", "sabp.pLMNidentity",
2104
14
        FT_BYTES, BASE_NONE, NULL, 0,
2105
14
        NULL, HFILL }},
2106
14
    { &hf_sabp_lac,
2107
14
      { "lac", "sabp.lac",
2108
14
        FT_BYTES, BASE_NONE, NULL, 0,
2109
14
        "OCTET_STRING_SIZE_2", HFILL }},
2110
14
    { &hf_sabp_sac,
2111
14
      { "sac", "sabp.sac",
2112
14
        FT_BYTES, BASE_NONE, NULL, 0,
2113
14
        "OCTET_STRING_SIZE_2", HFILL }},
2114
14
    { &hf_sabp_Service_Areas_List_item,
2115
14
      { "Service-Area-Identifier", "sabp.Service_Area_Identifier_element",
2116
14
        FT_NONE, BASE_NONE, NULL, 0,
2117
14
        NULL, HFILL }},
2118
14
    { &hf_sabp_protocolIEs,
2119
14
      { "protocolIEs", "sabp.protocolIEs",
2120
14
        FT_UINT32, BASE_DEC, NULL, 0,
2121
14
        "ProtocolIE_Container", HFILL }},
2122
14
    { &hf_sabp_protocolExtensions,
2123
14
      { "protocolExtensions", "sabp.protocolExtensions",
2124
14
        FT_UINT32, BASE_DEC, NULL, 0,
2125
14
        "ProtocolExtensionContainer", HFILL }},
2126
14
    { &hf_sabp_initiatingMessage,
2127
14
      { "initiatingMessage", "sabp.initiatingMessage_element",
2128
14
        FT_NONE, BASE_NONE, NULL, 0,
2129
14
        NULL, HFILL }},
2130
14
    { &hf_sabp_successfulOutcome,
2131
14
      { "successfulOutcome", "sabp.successfulOutcome_element",
2132
14
        FT_NONE, BASE_NONE, NULL, 0,
2133
14
        NULL, HFILL }},
2134
14
    { &hf_sabp_unsuccessfulOutcome,
2135
14
      { "unsuccessfulOutcome", "sabp.unsuccessfulOutcome_element",
2136
14
        FT_NONE, BASE_NONE, NULL, 0,
2137
14
        NULL, HFILL }},
2138
14
    { &hf_sabp_initiatingMessage_value,
2139
14
      { "value", "sabp.initiatingMessage_value_element",
2140
14
        FT_NONE, BASE_NONE, NULL, 0,
2141
14
        "InitiatingMessage_value", HFILL }},
2142
14
    { &hf_sabp_successfulOutcome_value,
2143
14
      { "value", "sabp.successfulOutcome_value_element",
2144
14
        FT_NONE, BASE_NONE, NULL, 0,
2145
14
        "SuccessfulOutcome_value", HFILL }},
2146
14
    { &hf_sabp_unsuccessfulOutcome_value,
2147
14
      { "value", "sabp.unsuccessfulOutcome_value_element",
2148
14
        FT_NONE, BASE_NONE, NULL, 0,
2149
14
        "UnsuccessfulOutcome_value", HFILL }},
2150
14
  };
2151
2152
  /* List of subtrees */
2153
14
  static int *ett[] = {
2154
14
    &ett_sabp,
2155
14
    &ett_sabp_e212,
2156
14
    &ett_sabp_cbs_data_coding,
2157
14
    &ett_sabp_bcast_msg,
2158
14
    &ett_sabp_cbs_serial_number,
2159
14
    &ett_sabp_cbs_new_serial_number,
2160
14
    &ett_sabp_cbs_page,
2161
14
    &ett_sabp_cbs_page_content,
2162
14
    &ett_sabp_ProtocolIE_Container,
2163
14
    &ett_sabp_ProtocolIE_Field,
2164
14
    &ett_sabp_ProtocolExtensionContainer,
2165
14
    &ett_sabp_ProtocolExtensionField,
2166
14
    &ett_sabp_Criticality_Diagnostics,
2167
14
    &ett_sabp_CriticalityDiagnostics_IE_List,
2168
14
    &ett_sabp_CriticalityDiagnostics_IE_List_item,
2169
14
    &ett_sabp_MessageStructure,
2170
14
    &ett_sabp_MessageStructure_item,
2171
14
    &ett_sabp_Failure_List,
2172
14
    &ett_sabp_Failure_List_Item,
2173
14
    &ett_sabp_Number_of_Broadcasts_Completed_List,
2174
14
    &ett_sabp_Number_of_Broadcasts_Completed_List_Item,
2175
14
    &ett_sabp_Radio_Resource_Loading_List,
2176
14
    &ett_sabp_Radio_Resource_Loading_List_Item,
2177
14
    &ett_sabp_Service_Area_Identifier,
2178
14
    &ett_sabp_Service_Areas_List,
2179
14
    &ett_sabp_Write_Replace,
2180
14
    &ett_sabp_Write_Replace_Complete,
2181
14
    &ett_sabp_Write_Replace_Failure,
2182
14
    &ett_sabp_Kill,
2183
14
    &ett_sabp_Kill_Complete,
2184
14
    &ett_sabp_Kill_Failure,
2185
14
    &ett_sabp_Load_Query,
2186
14
    &ett_sabp_Load_Query_Complete,
2187
14
    &ett_sabp_Load_Query_Failure,
2188
14
    &ett_sabp_Message_Status_Query,
2189
14
    &ett_sabp_Message_Status_Query_Complete,
2190
14
    &ett_sabp_Message_Status_Query_Failure,
2191
14
    &ett_sabp_Reset,
2192
14
    &ett_sabp_Reset_Complete,
2193
14
    &ett_sabp_Reset_Failure,
2194
14
    &ett_sabp_Restart,
2195
14
    &ett_sabp_Failure,
2196
14
    &ett_sabp_Error_Indication,
2197
14
    &ett_sabp_SABP_PDU,
2198
14
    &ett_sabp_InitiatingMessage,
2199
14
    &ett_sabp_SuccessfulOutcome,
2200
14
    &ett_sabp_UnsuccessfulOutcome,
2201
14
  };
2202
2203
2204
  /* Register protocol */
2205
14
  proto_sabp = proto_register_protocol(PNAME, PSNAME, PFNAME);
2206
  /* Register fields and subtrees */
2207
14
  proto_register_field_array(proto_sabp, hf, array_length(hf));
2208
14
  proto_register_subtree_array(ett, array_length(ett));
2209
2210
  /* Register dissector */
2211
14
  sabp_handle = register_dissector("sabp", dissect_sabp, proto_sabp);
2212
14
  sabp_tcp_handle = register_dissector("sabp.tcp", dissect_sabp_tcp, proto_sabp);
2213
2214
  /* Register dissector tables */
2215
14
  sabp_ies_dissector_table = register_dissector_table("sabp.ies", "SABP-PROTOCOL-IES", proto_sabp, FT_UINT32, BASE_DEC);
2216
14
  sabp_extension_dissector_table = register_dissector_table("sabp.extension", "SABP-PROTOCOL-EXTENSION", proto_sabp, FT_UINT32, BASE_DEC);
2217
14
  sabp_proc_imsg_dissector_table = register_dissector_table("sabp.proc.imsg", "SABP-ELEMENTARY-PROCEDURE InitiatingMessage", proto_sabp, FT_UINT32, BASE_DEC);
2218
14
  sabp_proc_sout_dissector_table = register_dissector_table("sabp.proc.sout", "SABP-ELEMENTARY-PROCEDURE SuccessfulOutcome", proto_sabp, FT_UINT32, BASE_DEC);
2219
14
  sabp_proc_uout_dissector_table = register_dissector_table("sabp.proc.uout", "SABP-ELEMENTARY-PROCEDURE UnsuccessfulOutcome", proto_sabp, FT_UINT32, BASE_DEC);
2220
14
}
2221
2222
2223
/*--- proto_reg_handoff_sabp ---------------------------------------*/
2224
void
2225
proto_reg_handoff_sabp(void)
2226
14
{
2227
14
  dissector_add_uint_with_preference("udp.port", SABP_PORT, sabp_handle);
2228
14
  dissector_add_uint_with_preference("tcp.port", SABP_PORT, sabp_tcp_handle);
2229
14
  dissector_add_uint("sctp.ppi", SABP_PAYLOAD_PROTOCOL_ID, sabp_handle);
2230
2231
14
  dissector_add_uint("sabp.ies", id_Message_Identifier, create_dissector_handle(dissect_Message_Identifier_PDU, proto_sabp));
2232
14
  dissector_add_uint("sabp.ies", id_New_Serial_Number, create_dissector_handle(dissect_New_Serial_Number_PDU, proto_sabp));
2233
14
  dissector_add_uint("sabp.ies", id_Old_Serial_Number, create_dissector_handle(dissect_Old_Serial_Number_PDU, proto_sabp));
2234
14
  dissector_add_uint("sabp.ies", id_Service_Areas_List, create_dissector_handle(dissect_Service_Areas_List_PDU, proto_sabp));
2235
14
  dissector_add_uint("sabp.ies", id_Category, create_dissector_handle(dissect_Category_PDU, proto_sabp));
2236
14
  dissector_add_uint("sabp.ies", id_Repetition_Period, create_dissector_handle(dissect_Repetition_Period_PDU, proto_sabp));
2237
14
  dissector_add_uint("sabp.ies", id_Number_of_Broadcasts_Requested, create_dissector_handle(dissect_Number_of_Broadcasts_Requested_PDU, proto_sabp));
2238
14
  dissector_add_uint("sabp.ies", id_Data_Coding_Scheme, create_dissector_handle(dissect_Data_Coding_Scheme_PDU, proto_sabp));
2239
14
  dissector_add_uint("sabp.ies", id_Broadcast_Message_Content, create_dissector_handle(dissect_Broadcast_Message_Content_PDU, proto_sabp));
2240
14
  dissector_add_uint("sabp.ies", id_Number_of_Broadcasts_Completed_List, create_dissector_handle(dissect_Number_of_Broadcasts_Completed_List_PDU, proto_sabp));
2241
14
  dissector_add_uint("sabp.ies", id_Criticality_Diagnostics, create_dissector_handle(dissect_Criticality_Diagnostics_PDU, proto_sabp));
2242
14
  dissector_add_uint("sabp.ies", id_Failure_List, create_dissector_handle(dissect_Failure_List_PDU, proto_sabp));
2243
14
  dissector_add_uint("sabp.ies", id_Radio_Resource_Loading_List, create_dissector_handle(dissect_Radio_Resource_Loading_List_PDU, proto_sabp));
2244
14
  dissector_add_uint("sabp.ies", id_Recovery_Indication, create_dissector_handle(dissect_Recovery_Indication_PDU, proto_sabp));
2245
14
  dissector_add_uint("sabp.ies", id_Serial_Number, create_dissector_handle(dissect_Serial_Number_PDU, proto_sabp));
2246
14
  dissector_add_uint("sabp.ies", id_Cause, create_dissector_handle(dissect_Cause_PDU, proto_sabp));
2247
14
  dissector_add_uint("sabp.extension", id_MessageStructure, create_dissector_handle(dissect_MessageStructure_PDU, proto_sabp));
2248
14
  dissector_add_uint("sabp.extension", id_TypeOfError, create_dissector_handle(dissect_TypeOfError_PDU, proto_sabp));
2249
14
  dissector_add_uint("sabp.extension", id_Paging_ETWS_Indicator, create_dissector_handle(dissect_Paging_ETWS_Indicator_PDU, proto_sabp));
2250
14
  dissector_add_uint("sabp.extension", id_Warning_Type, create_dissector_handle(dissect_Warning_Type_PDU, proto_sabp));
2251
14
  dissector_add_uint("sabp.extension", id_WarningSecurityInfo, create_dissector_handle(dissect_WarningSecurityInfo_PDU, proto_sabp));
2252
14
  dissector_add_uint("sabp.extension", id_Broadcast_Message_Content_Validity_Indicator, create_dissector_handle(dissect_Broadcast_Message_Content_Validity_Indicator_PDU, proto_sabp));
2253
14
  dissector_add_uint("sabp.proc.imsg", id_Write_Replace, create_dissector_handle(dissect_Write_Replace_PDU, proto_sabp));
2254
14
  dissector_add_uint("sabp.proc.sout", id_Write_Replace, create_dissector_handle(dissect_Write_Replace_Complete_PDU, proto_sabp));
2255
14
  dissector_add_uint("sabp.proc.uout", id_Write_Replace, create_dissector_handle(dissect_Write_Replace_Failure_PDU, proto_sabp));
2256
14
  dissector_add_uint("sabp.proc.imsg", id_Kill, create_dissector_handle(dissect_Kill_PDU, proto_sabp));
2257
14
  dissector_add_uint("sabp.proc.sout", id_Kill, create_dissector_handle(dissect_Kill_Complete_PDU, proto_sabp));
2258
14
  dissector_add_uint("sabp.proc.uout", id_Kill, create_dissector_handle(dissect_Kill_Failure_PDU, proto_sabp));
2259
14
  dissector_add_uint("sabp.proc.imsg", id_Load_Status_Enquiry, create_dissector_handle(dissect_Load_Query_PDU, proto_sabp));
2260
14
  dissector_add_uint("sabp.proc.sout", id_Load_Status_Enquiry, create_dissector_handle(dissect_Load_Query_Complete_PDU, proto_sabp));
2261
14
  dissector_add_uint("sabp.proc.uout", id_Load_Status_Enquiry, create_dissector_handle(dissect_Load_Query_Failure_PDU, proto_sabp));
2262
14
  dissector_add_uint("sabp.proc.imsg", id_Message_Status_Query, create_dissector_handle(dissect_Message_Status_Query_PDU, proto_sabp));
2263
14
  dissector_add_uint("sabp.proc.sout", id_Message_Status_Query, create_dissector_handle(dissect_Message_Status_Query_Complete_PDU, proto_sabp));
2264
14
  dissector_add_uint("sabp.proc.uout", id_Message_Status_Query, create_dissector_handle(dissect_Message_Status_Query_Failure_PDU, proto_sabp));
2265
14
  dissector_add_uint("sabp.proc.imsg", id_Reset, create_dissector_handle(dissect_Reset_PDU, proto_sabp));
2266
14
  dissector_add_uint("sabp.proc.sout", id_Reset, create_dissector_handle(dissect_Reset_Complete_PDU, proto_sabp));
2267
14
  dissector_add_uint("sabp.proc.uout", id_Reset, create_dissector_handle(dissect_Reset_Failure_PDU, proto_sabp));
2268
14
  dissector_add_uint("sabp.proc.imsg", id_Restart_Indication, create_dissector_handle(dissect_Restart_PDU, proto_sabp));
2269
14
  dissector_add_uint("sabp.proc.imsg", id_Failure_Indication, create_dissector_handle(dissect_Failure_PDU, proto_sabp));
2270
14
  dissector_add_uint("sabp.proc.imsg", id_Error_Indication, create_dissector_handle(dissect_Error_Indication_PDU, proto_sabp));
2271
2272
14
}
2273
2274