Coverage Report

Created: 2026-01-02 06:13

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