158
158
#define UDP_PORT_3GA11 699
161
REGISTRATION_REQUEST = 1,
162
REGISTRATION_REPLY = 3,
163
REGISTRATION_UPDATE = 20,
164
REGISTRATION_ACK =21,
167
CAPABILITIES_INFO = 24,
161
REGISTRATION_REQUEST = 1,
162
REGISTRATION_REPLY = 3,
163
REGISTRATION_UPDATE = 20,
164
REGISTRATION_ACK = 21,
167
CAPABILITIES_INFO = 24,
168
168
CAPABILITIES_INFO_ACK = 25
169
169
} a11MessageTypes;
171
171
static const value_string a11_types[] = {
172
{REGISTRATION_REQUEST, "Registration Request"},
173
{REGISTRATION_REPLY, "Registration Reply"},
174
{REGISTRATION_UPDATE, "Registration Update"},
175
{REGISTRATION_ACK, "Registration Ack"},
176
{SESSION_UPDATE, "Session Update"},
177
{SESSION_ACK, "Session Update Ack"},
178
{CAPABILITIES_INFO, "Capabilities Info"},
179
{CAPABILITIES_INFO_ACK, "Capabilities Info Ack"},
172
{REGISTRATION_REQUEST, "Registration Request"},
173
{REGISTRATION_REPLY, "Registration Reply"},
174
{REGISTRATION_UPDATE, "Registration Update"},
175
{REGISTRATION_ACK, "Registration Ack"},
176
{SESSION_UPDATE, "Session Update"},
177
{SESSION_ACK, "Session Update Ack"},
178
{CAPABILITIES_INFO, "Capabilities Info"},
179
{CAPABILITIES_INFO_ACK, "Capabilities Info Ack"},
183
183
static const value_string a11_ses_ptype_vals[] = {
184
{0x8881, "Unstructured Byte Stream"},
185
{0x88D2, "3GPP2 Packet"},
184
{0x8881, "Unstructured Byte Stream"},
185
{0x88D2, "3GPP2 Packet"},
189
189
static const value_string a11_reply_codes[]= {
191
{9, "Connection Update"},
191
{9, "Connection Update"},
193
{1, "Reg Accepted, but Simultaneous Bindings Unsupported."},
194
{64, "Reg Deny (FA)- Unspecified Reason"},
195
{65, "Reg Deny (FA)- Administratively Prohibited"},
196
{66, "Reg Deny (FA)- Insufficient Resources"},
197
{67, "Reg Deny (FA)- MN failed Authentication"},
198
{68, "Reg Deny (FA)- HA failed Authentication"},
199
{69, "Reg Deny (FA)- Requested Lifetime too Long"},
200
{70, "Reg Deny (FA)- Poorly Formed Request"},
201
{71, "Reg Deny (FA)- Poorly Formed Reply"},
202
{72, "Reg Deny (FA)- Requested Encapsulation Unavailable"},
203
{73, "Reg Deny (FA)- VJ Compression Unavailable"},
204
{74, "Reg Deny (FA)- Requested Reverse Tunnel Unavailable"},
205
{75, "Reg Deny (FA)- Reverse Tunnel is Mandatory and 'T' Bit Not Set"},
206
{76, "Reg Deny (FA)- Mobile Node Too Distant"},
207
{79, "Reg Deny (FA)- Delivery Style Not Supported"},
208
{80, "Reg Deny (FA)- Home Network Unreachable"},
209
{81, "Reg Deny (FA)- HA Host Unreachable"},
210
{82, "Reg Deny (FA)- HA Port Unreachable"},
211
{88, "Reg Deny (FA)- HA Unreachable"},
212
{96, "Reg Deny (FA)(NAI) - Non Zero Home Address Required"},
213
{97, "Reg Deny (FA)(NAI) - Missing NAI"},
214
{98, "Reg Deny (FA)(NAI) - Missing Home Agent"},
215
{99, "Reg Deny (FA)(NAI) - Missing Home Address"},
193
{1, "Reg Accepted, but Simultaneous Bindings Unsupported."},
194
{64, "Reg Deny (FA)- Unspecified Reason"},
195
{65, "Reg Deny (FA)- Administratively Prohibited"},
196
{66, "Reg Deny (FA)- Insufficient Resources"},
197
{67, "Reg Deny (FA)- MN failed Authentication"},
198
{68, "Reg Deny (FA)- HA failed Authentication"},
199
{69, "Reg Deny (FA)- Requested Lifetime too Long"},
200
{70, "Reg Deny (FA)- Poorly Formed Request"},
201
{71, "Reg Deny (FA)- Poorly Formed Reply"},
202
{72, "Reg Deny (FA)- Requested Encapsulation Unavailable"},
203
{73, "Reg Deny (FA)- VJ Compression Unavailable"},
204
{74, "Reg Deny (FA)- Requested Reverse Tunnel Unavailable"},
205
{75, "Reg Deny (FA)- Reverse Tunnel is Mandatory and 'T' Bit Not Set"},
206
{76, "Reg Deny (FA)- Mobile Node Too Distant"},
207
{79, "Reg Deny (FA)- Delivery Style Not Supported"},
208
{80, "Reg Deny (FA)- Home Network Unreachable"},
209
{81, "Reg Deny (FA)- HA Host Unreachable"},
210
{82, "Reg Deny (FA)- HA Port Unreachable"},
211
{88, "Reg Deny (FA)- HA Unreachable"},
212
{96, "Reg Deny (FA)(NAI) - Non Zero Home Address Required"},
213
{97, "Reg Deny (FA)(NAI) - Missing NAI"},
214
{98, "Reg Deny (FA)(NAI) - Missing Home Agent"},
215
{99, "Reg Deny (FA)(NAI) - Missing Home Address"},
217
{128, "Reg Deny (HA)- Unspecified"},
218
{129, "Reg Deny (HA)- Administratively Prohibited"},
219
{130, "Reg Deny (HA)- Insufficient Resources"},
220
{131, "Reg Deny (HA)- PCF Failed Authentication"},
221
/* {132, "Reg Deny (HA)- FA Failed Authentication"}, */
222
{133, "Reg Deny (HA)- Identification Mismatch"},
223
{134, "Reg Deny (HA)- Poorly Formed Request"},
224
/* {135, "Reg Deny (HA)- Too Many Simultaneous Bindings"}, */
225
{136, "Reg Deny (HA)- Unknown PDSN Address"},
226
{137, "Reg Deny (HA)- Requested Reverse Tunnel Unavailable"},
227
{138, "Reg Deny (HA)- Reverse Tunnel is Mandatory and 'T' Bit Not Set"},
228
{139, "Reg Deny (HA)- Requested Encapsulation Unavailable"},
229
{140, "Registration Denied - no CID available"},
230
{141, "Reg Deny (HA)- unsupported Vendor ID / Application Type in CVSE"},
231
{142, "Registration Denied - nonexistent A10 or IP flow"},
217
{128, "Reg Deny (HA)- Unspecified"},
218
{129, "Reg Deny (HA)- Administratively Prohibited"},
219
{130, "Reg Deny (HA)- Insufficient Resources"},
220
{131, "Reg Deny (HA)- PCF Failed Authentication"},
221
/* {132, "Reg Deny (HA)- FA Failed Authentication"}, */
222
{133, "Reg Deny (HA)- Identification Mismatch"},
223
{134, "Reg Deny (HA)- Poorly Formed Request"},
224
/* {135, "Reg Deny (HA)- Too Many Simultaneous Bindings"}, */
225
{136, "Reg Deny (HA)- Unknown PDSN Address"},
226
{137, "Reg Deny (HA)- Requested Reverse Tunnel Unavailable"},
227
{138, "Reg Deny (HA)- Reverse Tunnel is Mandatory and 'T' Bit Not Set"},
228
{139, "Reg Deny (HA)- Requested Encapsulation Unavailable"},
229
{140, "Registration Denied - no CID available"},
230
{141, "Reg Deny (HA)- unsupported Vendor ID / Application Type in CVSE"},
231
{142, "Registration Denied - nonexistent A10 or IP flow"},
236
236
static const value_string a11_ack_status[]= {
237
{0, "Update Accepted"},
238
{1, "Partial QoS updated"},
239
{128, "Update Deny - Unspecified"},
240
{131, "Update Deny - Sending Node Failed Authentication"},
241
{133, "Update Deny - Registration ID Mismatch"},
242
{134, "Update Deny - Poorly Formed Request"},
243
{193, "Update Deny - Session Parameter Not Updated"},
244
{253, "Update Denied - QoS profileID not supported"},
245
{254, "Update Denied - insufficient resources"},
246
{255, "Update Denied - handoff in progress"},
237
{0, "Update Accepted"},
238
{1, "Partial QoS updated"},
239
{128, "Update Deny - Unspecified"},
240
{131, "Update Deny - Sending Node Failed Authentication"},
241
{133, "Update Deny - Registration ID Mismatch"},
242
{134, "Update Deny - Poorly Formed Request"},
243
{193, "Update Deny - Session Parameter Not Updated"},
244
{253, "Update Denied - QoS profileID not supported"},
245
{254, "Update Denied - insufficient resources"},
246
{255, "Update Denied - handoff in progress"},
254
GEN_AUTH_EXT = 36, /* RFC 3012 */
255
OLD_CVSE_EXT = 37, /* RFC 3115 */
256
CVSE_EXT = 38, /* RFC 3115 */
257
SS_EXT = 39, /* 3GPP2 IOS4.2 */
258
RU_AUTH_EXT = 40, /* 3GPP2 IOS4.2 */
260
MF_CHALLENGE_EXT = 132, /* RFC 3012 */
261
OLD_NVSE_EXT = 133, /* RFC 3115 */
262
NVSE_EXT = 134 /* RFC 3115 */
254
GEN_AUTH_EXT = 36, /* RFC 3012 */
255
OLD_CVSE_EXT = 37, /* RFC 3115 */
256
CVSE_EXT = 38, /* RFC 3115 */
257
SS_EXT = 39, /* 3GPP2 IOS4.2 */
258
RU_AUTH_EXT = 40, /* 3GPP2 IOS4.2 */
260
MF_CHALLENGE_EXT = 132, /* RFC 3012 */
261
OLD_NVSE_EXT = 133, /* RFC 3115 */
262
NVSE_EXT = 134 /* RFC 3115 */
266
266
static const value_string a11_ext_types[]= {
267
{MH_AUTH_EXT, "Mobile-Home Authentication Extension"},
268
{MF_AUTH_EXT, "Mobile-Foreign Authentication Extension"},
269
{FH_AUTH_EXT, "Foreign-Home Authentication Extension"},
270
{MN_NAI_EXT, "Mobile Node NAI Extension"},
271
{GEN_AUTH_EXT, "Generalized Mobile-IP Authentication Extension"},
272
{MF_CHALLENGE_EXT, "MN-FA Challenge Extension"},
273
{CVSE_EXT, "Critical Vendor/Organization Specific Extension"},
274
{SS_EXT, "Session Specific Extension"},
275
{RU_AUTH_EXT, "Registration Update Authentication Extension"},
276
{OLD_CVSE_EXT, "Critical Vendor/Organization Specific Extension (OLD)"},
277
{NVSE_EXT, "Normal Vendor/Organization Specific Extension"},
278
{OLD_NVSE_EXT, "Normal Vendor/Organization Specific Extension (OLD)"},
267
{MH_AUTH_EXT, "Mobile-Home Authentication Extension"},
268
{MF_AUTH_EXT, "Mobile-Foreign Authentication Extension"},
269
{FH_AUTH_EXT, "Foreign-Home Authentication Extension"},
270
{MN_NAI_EXT, "Mobile Node NAI Extension"},
271
{GEN_AUTH_EXT, "Generalized Mobile-IP Authentication Extension"},
272
{MF_CHALLENGE_EXT, "MN-FA Challenge Extension"},
273
{CVSE_EXT, "Critical Vendor/Organization Specific Extension"},
274
{SS_EXT, "Session Specific Extension"},
275
{RU_AUTH_EXT, "Registration Update Authentication Extension"},
276
{OLD_CVSE_EXT, "Critical Vendor/Organization Specific Extension (OLD)"},
277
{NVSE_EXT, "Normal Vendor/Organization Specific Extension"},
278
{OLD_NVSE_EXT, "Normal Vendor/Organization Specific Extension (OLD)"},
282
282
static const value_string a11_ext_stypes[]= {
283
{1, "MN AAA Extension"},
283
{1, "MN AAA Extension"},
287
287
static const value_string a11_ext_nvose_qosmode[]= {
288
{0x00, "QoS Disabled"},
289
{0x01, "QoS Enabled"},
288
{0x00, "QoS Disabled"},
289
{0x01, "QoS Enabled"},
293
293
static const value_string a11_ext_nvose_srvopt[]= {
294
{0x0021, "3G High Speed Packet Data"},
295
{0x003B, "HRPD Main Service Connection"},
296
{0x003C, "Link Layer Assisted Header Removal"},
297
{0x003D, "Link Layer Assisted Robust Header Compression"},
298
{0x0040, "HRPD Auxiliary Service Connection"},
294
{0x0021, "3G High Speed Packet Data"},
295
{0x003B, "HRPD Main Service Connection"},
296
{0x003C, "Link Layer Assisted Header Removal"},
297
{0x003D, "Link Layer Assisted Robust Header Compression"},
298
{0x0040, "HRPD Auxiliary Service Connection"},
302
302
static const value_string a11_ext_nvose_pdsn_code[]= {
303
{0xc1, "Connection Release - reason unspecified"},
304
{0xc2, "Connection Release - PPP time-out"},
305
{0xc3, "Connection Release - registration time-out"},
306
{0xc4, "Connection Release - PDSN error"},
307
{0xc5, "Connection Release - inter-PCF handoff"},
308
{0xc6, "Connection Release - inter-PDSN handoff"},
309
{0xc7, "Connection Release - PDSN OAM&P intervention"},
310
{0xc8, "Connection Release - accounting error"},
311
{0xca, "Connection Release - user (NAI) failed authentication"},
303
{0xc1, "Connection Release - reason unspecified"},
304
{0xc2, "Connection Release - PPP time-out"},
305
{0xc3, "Connection Release - registration time-out"},
306
{0xc4, "Connection Release - PDSN error"},
307
{0xc5, "Connection Release - inter-PCF handoff"},
308
{0xc6, "Connection Release - inter-PDSN handoff"},
309
{0xc7, "Connection Release - PDSN OAM&P intervention"},
310
{0xc8, "Connection Release - accounting error"},
311
{0xca, "Connection Release - user (NAI) failed authentication"},
315
315
static const value_string a11_ext_dormant[]= {
316
{0x0000, "all MS packet data service instances are dormant"},
316
{0x0000, "all MS packet data service instances are dormant"},
320
320
static const value_string a11_ext_app[]= {
321
{0x0101, "Accounting (RADIUS)"},
322
{0x0102, "Accounting (DIAMETER)"},
323
{0x0201, "Mobility Event Indicator (Mobility)"},
324
{0x0301, "Data Available Indicator (Data Ready to Send)"},
325
{0x0401, "Access Network Identifiers (ANID)"},
326
{0x0501, "PDSN Identifiers (Anchor P-P Address)"},
327
{0x0601, "Indicators (All Dormant Indicator)"},
328
{0x0701, "PDSN Code (PDSN Code)"},
329
{0x0801, "Session Parameter (RN-PDIT:Radio Network Packet Data Inactivity Timer)"},
330
{0x0802, "Session Parameter (Always On)"},
331
{0x0803, "Session Parameter (QoS Mode)"},
332
{0x0901, "Service Option (Service Option Value)"},
333
{0x0A01, "PDSN Enabled Features (Flow Control Enabled)"},
334
{0x0A02, "PDSN Enabled Features (Packet Boundary Enabled)"},
335
{0x0A03, "PDSN Enabled Features (GRE Segmentation Enabled)"},
336
{0x0B01, "PCF Enabled Features (Short Data Indication Supported)"},
337
{0x0B02, "PCF Enabled Features (GRE Segmentation Enabled)"},
338
{0x0C01, "Additional Session Info"},
339
{0x0D01, "QoS Information (Forward QoS Information)"},
340
{0x0D02, "QoS Information (Reverse QoS Information)"},
341
{0x0D03, "QoS Information (Subscriber QoS Profile)"},
342
{0x0DFE, "QoS Information (Forward QoS Update Information)"},
343
{0x0DFF, "QoS Information (Reverse QoS Update Information)"},
344
{0x0E01, "Header Compression (ROHC Configuration Parameters)"},
321
{0x0101, "Accounting (RADIUS)"},
322
{0x0102, "Accounting (DIAMETER)"},
323
{0x0201, "Mobility Event Indicator (Mobility)"},
324
{0x0301, "Data Available Indicator (Data Ready to Send)"},
325
{0x0401, "Access Network Identifiers (ANID)"},
326
{0x0501, "PDSN Identifiers (Anchor P-P Address)"},
327
{0x0601, "Indicators (All Dormant Indicator)"},
328
{0x0701, "PDSN Code (PDSN Code)"},
329
{0x0801, "Session Parameter (RN-PDIT:Radio Network Packet Data Inactivity Timer)"},
330
{0x0802, "Session Parameter (Always On)"},
331
{0x0803, "Session Parameter (QoS Mode)"},
332
{0x0901, "Service Option (Service Option Value)"},
333
{0x0A01, "PDSN Enabled Features (Flow Control Enabled)"},
334
{0x0A02, "PDSN Enabled Features (Packet Boundary Enabled)"},
335
{0x0A03, "PDSN Enabled Features (GRE Segmentation Enabled)"},
336
{0x0B01, "PCF Enabled Features (Short Data Indication Supported)"},
337
{0x0B02, "PCF Enabled Features (GRE Segmentation Enabled)"},
338
{0x0C01, "Additional Session Info"},
339
{0x0D01, "QoS Information (Forward QoS Information)"},
340
{0x0D02, "QoS Information (Reverse QoS Information)"},
341
{0x0D03, "QoS Information (Subscriber QoS Profile)"},
342
{0x0DFE, "QoS Information (Forward QoS Update Information)"},
343
{0x0DFF, "QoS Information (Reverse QoS Update Information)"},
344
{0x0E01, "Header Compression (ROHC Configuration Parameters)"},
348
348
static const value_string a11_airlink_types[]= {
349
{1, "Session Setup (Y=1)"},
350
{2, "Active Start (Y=2)"},
351
{3, "Active Stop (Y=3)"},
352
{4, "Short Data Burst (Y=4)"},
349
{1, "Session Setup (Y=1)"},
350
{2, "Active Start (Y=2)"},
351
{3, "Active Stop (Y=3)"},
352
{4, "Short Data Burst (Y=4)"},
356
356
#define ATTRIBUTE_NAME_LEN_MAX 128
367
367
struct radius_attribute {
368
char attrname[ATTRIBUTE_NAME_LEN_MAX];
368
char attrname[ATTRIBUTE_NAME_LEN_MAX];
375
375
static const struct radius_attribute attrs[]={
376
{"Airlink Record", 26, 40, 4, ATTR_TYPE_TYPE},
377
{"R-P Session ID", 26, 41, 4, ATTR_TYPE_INT},
378
{"Airlink Sequence Number", 26, 42, 4, ATTR_TYPE_INT},
376
{"Airlink Record", 26, 40, 4, ATTR_TYPE_TYPE},
377
{"R-P Session ID", 26, 41, 4, ATTR_TYPE_INT},
378
{"Airlink Sequence Number", 26, 42, 4, ATTR_TYPE_INT},
380
{"MSID", 31, -1, 15, ATTR_TYPE_MSID},
380
{"MSID", 31, -1, 15, ATTR_TYPE_MSID},
382
{"Serving PCF", 26, 9, 4, ATTR_TYPE_IPV4},
383
{"BSID", 26, 10, 12, ATTR_TYPE_STR},
384
{"ESN", 26, 52, 15, ATTR_TYPE_STR},
385
{"User Zone", 26, 11, 4, ATTR_TYPE_INT},
386
{"Forward FCH Mux Option", 26, 12, 4, ATTR_TYPE_INT},
387
{"Reverse FCH Mux Option", 26, 13, 4, ATTR_TYPE_INT},
388
{"Forward Fundamental Rate (IOS 4.1)",26, 14, 4, ATTR_TYPE_INT},
389
{"Reverse Fundamental Rate (IOS 4.1)",26, 15, 4, ATTR_TYPE_INT},
390
{"Service Option", 26, 16, 4, ATTR_TYPE_INT},
391
{"Forward Traffic Type", 26, 17, 4, ATTR_TYPE_INT},
392
{"Reverse Traffic Type", 26, 18, 4, ATTR_TYPE_INT},
393
{"FCH Frame Size", 26, 19, 4, ATTR_TYPE_INT},
394
{"Forward FCH RC", 26, 20, 4, ATTR_TYPE_INT},
395
{"Reverse FCH RC", 26, 21, 4, ATTR_TYPE_INT},
396
{"DCCH Frame Size 0/5/20", 26, 50, 4, ATTR_TYPE_INT},
397
{"Forward DCCH Mux Option", 26, 84, 4, ATTR_TYPE_INT},
398
{"Reverse DCCH Mux Option", 26, 85, 4, ATTR_TYPE_INT},
399
{"Forward DCCH RC", 26, 86, 4, ATTR_TYPE_INT},
400
{"Reverse DCCH RC", 26, 87, 4, ATTR_TYPE_INT},
401
{"Airlink Priority", 26, 39, 4, ATTR_TYPE_INT},
402
{"Active Connection Time", 26, 49, 4, ATTR_TYPE_INT},
403
{"Mobile Orig/Term Ind.", 26, 45, 4, ATTR_TYPE_INT},
404
{"SDB Octet Count (Term.)", 26, 31, 4, ATTR_TYPE_INT},
405
{"SDB Octet Count (Orig.)", 26, 32, 4, ATTR_TYPE_INT},
406
{"ESN (Integer)", 26, 48, 4, ATTR_TYPE_INT},
407
{"Sublink", 26, 108, 4, ATTR_TYPE_STR},
408
{"MEID", 26, 116, 14, ATTR_TYPE_STR},
409
{"Reverse PDCH RC", 26, 114, 2, ATTR_TYPE_INT},
410
{"Flow ID Parameter", 26, 144, 4, ATTR_TYPE_INT},
411
{"Granted QoS Parameters", 26, 132, 4, ATTR_TYPE_INT},
412
{"Flow Status", 26, 145, 4, ATTR_TYPE_INT},
413
{"Unknown", -1, -1, -1, ATTR_TYPE_NULL},
382
{"Serving PCF", 26, 9, 4, ATTR_TYPE_IPV4},
383
{"BSID", 26, 10, 12, ATTR_TYPE_STR},
384
{"ESN", 26, 52, 15, ATTR_TYPE_STR},
385
{"User Zone", 26, 11, 4, ATTR_TYPE_INT},
386
{"Forward FCH Mux Option", 26, 12, 4, ATTR_TYPE_INT},
387
{"Reverse FCH Mux Option", 26, 13, 4, ATTR_TYPE_INT},
388
{"Forward Fundamental Rate (IOS 4.1)",26, 14, 4, ATTR_TYPE_INT},
389
{"Reverse Fundamental Rate (IOS 4.1)",26, 15, 4, ATTR_TYPE_INT},
390
{"Service Option", 26, 16, 4, ATTR_TYPE_INT},
391
{"Forward Traffic Type", 26, 17, 4, ATTR_TYPE_INT},
392
{"Reverse Traffic Type", 26, 18, 4, ATTR_TYPE_INT},
393
{"FCH Frame Size", 26, 19, 4, ATTR_TYPE_INT},
394
{"Forward FCH RC", 26, 20, 4, ATTR_TYPE_INT},
395
{"Reverse FCH RC", 26, 21, 4, ATTR_TYPE_INT},
396
{"DCCH Frame Size 0/5/20", 26, 50, 4, ATTR_TYPE_INT},
397
{"Forward DCCH Mux Option", 26, 84, 4, ATTR_TYPE_INT},
398
{"Reverse DCCH Mux Option", 26, 85, 4, ATTR_TYPE_INT},
399
{"Forward DCCH RC", 26, 86, 4, ATTR_TYPE_INT},
400
{"Reverse DCCH RC", 26, 87, 4, ATTR_TYPE_INT},
401
{"Airlink Priority", 26, 39, 4, ATTR_TYPE_INT},
402
{"Active Connection Time", 26, 49, 4, ATTR_TYPE_INT},
403
{"Mobile Orig/Term Ind.", 26, 45, 4, ATTR_TYPE_INT},
404
{"SDB Octet Count (Term.)", 26, 31, 4, ATTR_TYPE_INT},
405
{"SDB Octet Count (Orig.)", 26, 32, 4, ATTR_TYPE_INT},
406
{"ESN (Integer)", 26, 48, 4, ATTR_TYPE_INT},
407
{"Sublink", 26, 108, 4, ATTR_TYPE_STR},
408
{"MEID", 26, 116, 14, ATTR_TYPE_STR},
409
{"Reverse PDCH RC", 26, 114, 2, ATTR_TYPE_INT},
410
{"Flow ID Parameter", 26, 144, 4, ATTR_TYPE_INT},
411
{"Granted QoS Parameters", 26, 132, 4, ATTR_TYPE_INT},
412
{"Flow Status", 26, 145, 4, ATTR_TYPE_INT},
413
{"Unknown", -1, -1, -1, ATTR_TYPE_NULL},
415
415
#define NUM_ATTR (sizeof(attrs)/sizeof(struct radius_attribute))
560
565
dissect_a11_radius( tvbuff_t *tvb, int offset, proto_tree *tree, int app_len)
563
proto_tree *radius_tree=NULL;
566
guint8 radius_subtype;
573
guint radius_vendor_id = 0;
575
/* None of this really matters if we don't have a tree */
580
/* return if length of extension is not valid */
581
if (tvb_reported_length_remaining(tvb, offset) < 12) {
585
ti = proto_tree_add_text(tree, tvb, offset - 2, app_len, "Airlink Record");
587
radius_tree = proto_item_add_subtree(ti, ett_a11_radiuses);
589
/* And, handle each record */
590
while (tvb_reported_length_remaining(tvb, offset) > 0
591
&& ((int)offset-(int)offset0) <app_len-2)
594
radius_type = tvb_get_guint8(tvb, offset);
595
radius_len = tvb_get_guint8(tvb, offset + 1);
598
proto_tree_add_text(radius_tree, tvb, offset, 2,
599
"Bogus RADIUS length %u, should be >= 2",
604
if (radius_type == RADIUS_VENDOR_SPECIFIC)
606
if (radius_len < SKIP_HDR_LEN)
608
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
609
"Bogus RADIUS length %u, should be >= %u",
610
radius_len, SKIP_HDR_LEN);
611
offset += radius_len;
614
radius_vendor_id = tvb_get_ntohl(tvb, offset +2);
616
if(radius_vendor_id != VENDOR_THE3GPP2)
618
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
619
"Unknown Vendor-specific Attribute (Vendor Id: %x)", radius_vendor_id);
620
offset += radius_len;
628
if(radius_type == 31)
630
str_val = tvb_get_ephemeral_string(tvb,offset+2,radius_len-2);
631
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
632
"MSID: %s", str_val);
634
else if (radius_type == 46)
636
if (radius_len < 2+4)
638
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
639
"Bogus RADIUS length %u, should be >= %u",
568
proto_tree *radius_tree;
571
guint8 radius_subtype;
578
guint radius_vendor_id;
580
/* None of this really matters if we don't have a tree */
585
/* return if length of extension is not valid */
586
if (tvb_reported_length_remaining(tvb, offset) < 12) {
590
ti = proto_tree_add_text(tree, tvb, offset - 2, app_len, "Airlink Record");
592
radius_tree = proto_item_add_subtree(ti, ett_a11_radiuses);
594
/* And, handle each record */
595
while ((tvb_reported_length_remaining(tvb, offset) > 0)
596
&& ((offset-offset0) < (app_len-2)))
599
radius_type = tvb_get_guint8(tvb, offset);
600
radius_len = tvb_get_guint8(tvb, offset + 1);
603
proto_tree_add_text(radius_tree, tvb, offset, 2,
604
"Bogus RADIUS length %u, should be >= 2",
609
if (radius_type == RADIUS_VENDOR_SPECIFIC)
611
if (radius_len < SKIP_HDR_LEN)
613
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
614
"Bogus RADIUS length %u, should be >= %u",
615
radius_len, SKIP_HDR_LEN);
616
offset += radius_len;
619
radius_vendor_id = tvb_get_ntohl(tvb, offset +2);
621
if(radius_vendor_id != VENDOR_THE3GPP2)
623
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
624
"Unknown Vendor-specific Attribute (Vendor Id: %x)", radius_vendor_id);
625
offset += radius_len;
644
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
645
"Acct Session Time: %d",tvb_get_ntohl(tvb,offset+2));
650
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
651
"Unknown RADIUS Attributes (Type: %d)", radius_type);
654
offset += radius_len;
658
offset += SKIP_HDR_LEN;
659
radius_len -= SKIP_HDR_LEN;
662
/* Detect Airlink Record Type */
664
while (radius_len > radius_offset)
666
if (radius_len < radius_offset + 2)
668
proto_tree_add_text(radius_tree, tvb, offset + radius_offset, 2,
669
"Bogus RADIUS length %u, should be >= %u",
670
radius_len + SKIP_HDR_LEN,
671
radius_offset + 2 + SKIP_HDR_LEN);
675
radius_subtype = tvb_get_guint8(tvb, offset + radius_offset);
676
attribute_len = tvb_get_guint8(tvb, offset + radius_offset + 1);
677
if (attribute_len < 2)
679
proto_tree_add_text(radius_tree, tvb, offset + radius_offset, 2,
680
"Bogus attribute length %u, should be >= 2", attribute_len);
683
if (attribute_len > radius_len - radius_offset)
685
proto_tree_add_text(radius_tree, tvb, offset + radius_offset, 2,
686
"Bogus attribute length %u, should be <= %u",
687
attribute_len, radius_len - radius_offset);
692
for(i = 0; i < NUM_ATTR; i++) {
693
if (attrs[i].subtype == radius_subtype) {
699
if ((radius_subtype == 48) &&
700
(attribute_len == 0x0a))
703
* trying to compensate for Spec. screwups where
704
* certain versions had subtype 48 being a 4 octet integer
705
* and others had it being a 15 octet string!
707
str_val = tvb_get_ephemeral_string(tvb,offset+radius_offset+2,attribute_len-2);
708
proto_tree_add_text(radius_tree, tvb, offset+radius_offset,
710
"3GPP2: ESN-48 (String) (%s)", str_val);
712
else if(attribute_type >= 0) {
713
switch(attrs[attribute_type].data_type) {
715
proto_tree_add_text(radius_tree, tvb, offset + radius_offset,
716
attribute_len, "3GPP2: %s (0x%04x)", attrs[attribute_type].attrname,
717
tvb_get_ntohl(tvb,offset + radius_offset + 2));
720
proto_tree_add_text(radius_tree, tvb, offset + radius_offset,
721
attribute_len, "3GPP2: %s (%s)", attrs[attribute_type].attrname,
722
ip_to_str(tvb_get_ptr(tvb,offset + radius_offset + 2,4)));
725
proto_tree_add_text(radius_tree, tvb, offset + radius_offset,
726
attribute_len, "3GPP2: %s (%s)", attrs[attribute_type].attrname,
727
val_to_str(tvb_get_ntohl(tvb,offset+radius_offset+2),
728
a11_airlink_types,"Unknown"));
731
str_val = tvb_get_ephemeral_string(tvb,offset+radius_offset+2,attribute_len-2);
732
proto_tree_add_text(radius_tree, tvb, offset+radius_offset,
734
"3GPP2: %s (%s)", attrs[attribute_type].attrname, str_val);
739
proto_tree_add_text(radius_tree, tvb, offset+radius_offset, attribute_len,
740
"RADIUS: %s", attrs[attribute_type].attrname);
745
proto_tree_add_text(radius_tree, tvb, offset+radius_offset, attribute_len,
746
"RADIUS: Unknown 3GPP2 Attribute (Type:%d, SubType:%d)",
747
radius_type,radius_subtype);
750
radius_offset += attribute_len;
752
offset += radius_len;
633
if(radius_type == 31)
635
str_val = tvb_get_ephemeral_string(tvb,offset+2,radius_len-2);
636
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
637
"MSID: %s", str_val);
639
else if (radius_type == 46)
641
if (radius_len < (2+4))
643
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
644
"Bogus RADIUS length %u, should be >= %u",
649
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
650
"Acct Session Time: %d",tvb_get_ntohl(tvb,offset+2));
655
proto_tree_add_text(radius_tree, tvb, offset, radius_len,
656
"Unknown RADIUS Attributes (Type: %d)", radius_type);
659
offset += radius_len;
663
offset += SKIP_HDR_LEN;
664
radius_len -= SKIP_HDR_LEN;
667
/* Detect Airlink Record Type */
669
while (radius_len > radius_offset)
671
if (radius_len < (radius_offset + 2))
673
proto_tree_add_text(radius_tree, tvb, offset + radius_offset, 2,
674
"Bogus RADIUS length %u, should be >= %u",
675
radius_len + SKIP_HDR_LEN,
676
radius_offset + 2 + SKIP_HDR_LEN);
680
radius_subtype = tvb_get_guint8(tvb, offset + radius_offset);
681
attribute_len = tvb_get_guint8(tvb, offset + radius_offset + 1);
682
if (attribute_len < 2)
684
proto_tree_add_text(radius_tree, tvb, offset + radius_offset, 2,
685
"Bogus attribute length %u, should be >= 2", attribute_len);
688
if (attribute_len > (radius_len - radius_offset))
690
proto_tree_add_text(radius_tree, tvb, offset + radius_offset, 2,
691
"Bogus attribute length %u, should be <= %u",
692
attribute_len, radius_len - radius_offset);
697
for(i = 0; i < NUM_ATTR; i++) {
698
if (attrs[i].subtype == radius_subtype) {
704
if ((radius_subtype == 48) &&
705
(attribute_len == 0x0a))
708
* trying to compensate for Spec. screwups where
709
* certain versions had subtype 48 being a 4 octet integer
710
* and others had it being a 15 octet string!
712
str_val = tvb_get_ephemeral_string(tvb,offset+radius_offset+2,attribute_len-2);
713
proto_tree_add_text(radius_tree, tvb, offset+radius_offset,
715
"3GPP2: ESN-48 (String) (%s)", str_val);
717
else if(attribute_type >= 0) {
718
switch(attrs[attribute_type].data_type) {
720
proto_tree_add_text(radius_tree, tvb, offset + radius_offset,
721
attribute_len, "3GPP2: %s (0x%04x)", attrs[attribute_type].attrname,
722
tvb_get_ntohl(tvb,offset + radius_offset + 2));
725
proto_tree_add_text(radius_tree, tvb, offset + radius_offset,
726
attribute_len, "3GPP2: %s (%s)", attrs[attribute_type].attrname,
727
ip_to_str(tvb_get_ptr(tvb,offset + radius_offset + 2,4)));
730
proto_tree_add_text(radius_tree, tvb, offset + radius_offset,
731
attribute_len, "3GPP2: %s (%s)", attrs[attribute_type].attrname,
732
val_to_str(tvb_get_ntohl(tvb,offset+radius_offset+2),
733
a11_airlink_types,"Unknown"));
736
str_val = tvb_get_ephemeral_string(tvb,offset+radius_offset+2,attribute_len-2);
737
proto_tree_add_text(radius_tree, tvb, offset+radius_offset,
739
"3GPP2: %s (%s)", attrs[attribute_type].attrname, str_val);
744
proto_tree_add_text(radius_tree, tvb, offset+radius_offset, attribute_len,
745
"RADIUS: %s", attrs[attribute_type].attrname);
750
proto_tree_add_text(radius_tree, tvb, offset+radius_offset, attribute_len,
751
"RADIUS: Unknown 3GPP2 Attribute (Type:%d, SubType:%d)",
752
radius_type,radius_subtype);
755
radius_offset += attribute_len;
757
offset += radius_len;
857
862
static void dissect_rqi_entry_flags
858
863
(tvbuff_t* tvb, int offset, proto_tree* ext_tree)
860
guint8 flags = tvb_get_guint8(tvb, offset);
861
guint8 nbits = sizeof(flags) * 8;
863
proto_item* ti = proto_tree_add_text(ext_tree, tvb, offset, sizeof(flags),
864
"Flags: %#02x", flags);
866
proto_tree* flags_tree = proto_item_add_subtree(ti, ett_a11_rqi_entry_flags);
868
proto_tree_add_text(flags_tree, tvb, offset, sizeof(flags), "%s",
869
decode_boolean_bitfield(flags, A11_RQI_FLOW_STATE, nbits,
870
"Flow State: Active", "Flow State: Inactive"));
865
guint8 flags = tvb_get_guint8(tvb, offset);
866
guint8 nbits = sizeof(flags) * 8;
868
proto_item* ti = proto_tree_add_text(ext_tree, tvb, offset, sizeof(flags),
869
"Flags: %#02x", flags);
871
proto_tree* flags_tree = proto_item_add_subtree(ti, ett_a11_rqi_entry_flags);
873
proto_tree_add_text(flags_tree, tvb, offset, sizeof(flags), "%s",
874
decode_boolean_bitfield(flags, A11_RQI_FLOW_STATE, nbits,
875
"Flow State: Active", "Flow State: Inactive"));
873
878
/* Code to dissect Forward QoS Info */
874
879
static void dissect_fwd_qosinfo(tvbuff_t* tvb, int offset, proto_tree* ext_tree)
876
int clen = 0; /* consumed length */
878
guint8 flow_count = 0;
879
guint8 flow_index = 0;
880
guint8 dscp_enabled = 0;
883
* Starts with a length field
884
* http://www.3gpp2.org/Public_html/specs/A.S0009-C_v1.0_070801.pdf
886
proto_tree_add_item(ext_tree, hf_a11_fqi_length, tvb, offset+clen, 2, FALSE);
890
srid = tvb_get_guint8(tvb, offset+clen);
891
proto_tree_add_item(ext_tree, hf_a11_fqi_srid, tvb, offset+clen, 1, FALSE);
895
dissect_fwd_qosinfo_flags(tvb, offset+clen, ext_tree, &dscp_enabled);
899
flow_count = tvb_get_guint8(tvb, offset+clen);
901
proto_tree_add_item(ext_tree, hf_a11_fqi_flowcount, tvb, offset+clen, 1, FALSE);
904
for(flow_index=0; flow_index<flow_count; flow_index++)
906
guint8 requested_qos_len = 0;
907
guint8 granted_qos_len = 0;
909
guint8 entry_len = tvb_get_guint8(tvb, offset+clen);
910
guint8 flow_id = tvb_get_guint8(tvb, offset+clen+1);
912
proto_item* ti = proto_tree_add_text
913
(ext_tree, tvb, offset+clen, entry_len+1, "Forward Flow Entry (Flow Id: %d)", flow_id);
915
proto_tree* exts_tree = proto_item_add_subtree(ti, ett_a11_fqi_flowentry);
918
proto_tree_add_item(exts_tree, hf_a11_fqi_entrylen, tvb, offset+clen, 1, FALSE);
922
proto_tree_add_item(exts_tree, hf_a11_fqi_flowid, tvb, offset+clen, 1, FALSE);
925
/* DSCP and Flow State*/
926
dissect_fqi_entry_flags(tvb, offset+clen, exts_tree, dscp_enabled);
930
/* Requested QoS Length */
931
requested_qos_len = tvb_get_guint8(tvb, offset+clen);
933
(exts_tree, hf_a11_fqi_requested_qoslen, tvb, offset+clen, 1, FALSE);
936
/* Requested QoS Blob */
937
if(requested_qos_len)
940
(exts_tree, hf_a11_fqi_requested_qos, tvb, offset+clen,
941
requested_qos_len, FALSE);
942
clen += requested_qos_len;
945
/* Granted QoS Length */
946
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
947
proto_tree_add_item(exts_tree, hf_a11_fqi_granted_qoslen, tvb, offset+clen, 1, FALSE);
950
/* Granted QoS Blob */
954
(exts_tree, hf_a11_fqi_granted_qos, tvb, offset+clen, granted_qos_len, FALSE);
955
clen += granted_qos_len;
881
int clen = 0; /* consumed length */
884
guint8 dscp_enabled = 0;
887
* Starts with a length field
888
* http://www.3gpp2.org/Public_html/specs/A.S0009-C_v1.0_070801.pdf
890
proto_tree_add_item(ext_tree, hf_a11_fqi_length, tvb, offset+clen, 2, FALSE);
894
proto_tree_add_item(ext_tree, hf_a11_fqi_srid, tvb, offset+clen, 1, FALSE);
898
dissect_fwd_qosinfo_flags(tvb, offset+clen, ext_tree, &dscp_enabled);
902
flow_count = tvb_get_guint8(tvb, offset+clen);
904
proto_tree_add_item(ext_tree, hf_a11_fqi_flowcount, tvb, offset+clen, 1, FALSE);
907
for(flow_index=0; flow_index<flow_count; flow_index++)
909
guint8 requested_qos_len = 0;
910
guint8 granted_qos_len = 0;
912
guint8 entry_len = tvb_get_guint8(tvb, offset+clen);
913
guint8 flow_id = tvb_get_guint8(tvb, offset+clen+1);
915
proto_item* ti = proto_tree_add_text
916
(ext_tree, tvb, offset+clen, entry_len+1, "Forward Flow Entry (Flow Id: %d)", flow_id);
918
proto_tree* exts_tree = proto_item_add_subtree(ti, ett_a11_fqi_flowentry);
921
proto_tree_add_item(exts_tree, hf_a11_fqi_entrylen, tvb, offset+clen, 1, FALSE);
925
proto_tree_add_item(exts_tree, hf_a11_fqi_flowid, tvb, offset+clen, 1, FALSE);
928
/* DSCP and Flow State*/
929
dissect_fqi_entry_flags(tvb, offset+clen, exts_tree, dscp_enabled);
933
/* Requested QoS Length */
934
requested_qos_len = tvb_get_guint8(tvb, offset+clen);
936
(exts_tree, hf_a11_fqi_requested_qoslen, tvb, offset+clen, 1, FALSE);
939
/* Requested QoS Blob */
940
if(requested_qos_len)
943
(exts_tree, hf_a11_fqi_requested_qos, tvb, offset+clen,
944
requested_qos_len, FALSE);
945
clen += requested_qos_len;
948
/* Granted QoS Length */
949
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
950
proto_tree_add_item(exts_tree, hf_a11_fqi_granted_qoslen, tvb, offset+clen, 1, FALSE);
953
/* Granted QoS Blob */
957
(exts_tree, hf_a11_fqi_granted_qos, tvb, offset+clen, granted_qos_len, FALSE);
958
clen += granted_qos_len;
960
963
/* Code to dissect Reverse QoS Info */
961
964
static void dissect_rev_qosinfo(tvbuff_t* tvb, int offset, proto_tree* ext_tree)
963
int clen = 0; /* consumed length */
965
guint8 flow_count = 0;
966
guint8 flow_index = 0;
969
* Starts with a length field
970
* http://www.3gpp2.org/Public_html/specs/A.S0009-C_v1.0_070801.pdf
972
proto_tree_add_item(ext_tree, hf_a11_fqi_length, tvb, offset+clen, 2, FALSE);
976
srid = tvb_get_guint8(tvb, offset+clen);
977
proto_tree_add_item(ext_tree, hf_a11_rqi_srid, tvb, offset+clen, 1, FALSE);
981
flow_count = tvb_get_guint8(tvb, offset+clen);
983
proto_tree_add_item(ext_tree, hf_a11_rqi_flowcount, tvb, offset+clen, 1, FALSE);
986
for(flow_index=0; flow_index<flow_count; flow_index++)
988
guint8 requested_qos_len = 0;
989
guint8 granted_qos_len = 0;
991
guint8 entry_len = tvb_get_guint8(tvb, offset+clen);
992
guint8 flow_id = tvb_get_guint8(tvb, offset+clen+1);
994
proto_item* ti = proto_tree_add_text
995
(ext_tree, tvb, offset+clen, entry_len+1, "Reverse Flow Entry (Flow Id: %d)", flow_id);
997
proto_tree* exts_tree = proto_item_add_subtree(ti, ett_a11_rqi_flowentry);
1000
proto_tree_add_item(exts_tree, hf_a11_rqi_entrylen, tvb, offset+clen, 1, FALSE);
1004
proto_tree_add_item(exts_tree, hf_a11_rqi_flowid, tvb, offset+clen, 1, FALSE);
1008
dissect_rqi_entry_flags(tvb, offset+clen, exts_tree);
1011
/* Requested QoS Length */
1012
requested_qos_len = tvb_get_guint8(tvb, offset+clen);
1013
proto_tree_add_item(exts_tree, hf_a11_rqi_requested_qoslen, tvb, offset+clen, 1, FALSE);
1016
/* Requested QoS Blob */
1017
if(requested_qos_len)
1020
(exts_tree, hf_a11_rqi_requested_qos, tvb, offset+clen, requested_qos_len, FALSE);
1021
clen += requested_qos_len;
1024
/* Granted QoS Length */
1025
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
1026
proto_tree_add_item(exts_tree, hf_a11_rqi_granted_qoslen, tvb, offset+clen, 1, FALSE);
1029
/* Granted QoS Blob */
1033
(exts_tree, hf_a11_rqi_granted_qos, tvb, offset+clen, granted_qos_len, FALSE);
1034
clen += granted_qos_len;
966
int clen = 0; /* consumed length */
971
* Starts with a length field
972
* http://www.3gpp2.org/Public_html/specs/A.S0009-C_v1.0_070801.pdf
974
proto_tree_add_item(ext_tree, hf_a11_fqi_length, tvb, offset+clen, 2, FALSE);
978
proto_tree_add_item(ext_tree, hf_a11_rqi_srid, tvb, offset+clen, 1, FALSE);
982
flow_count = tvb_get_guint8(tvb, offset+clen);
984
proto_tree_add_item(ext_tree, hf_a11_rqi_flowcount, tvb, offset+clen, 1, FALSE);
987
for(flow_index=0; flow_index<flow_count; flow_index++)
989
guint8 requested_qos_len;
990
guint8 granted_qos_len;
992
guint8 entry_len = tvb_get_guint8(tvb, offset+clen);
993
guint8 flow_id = tvb_get_guint8(tvb, offset+clen+1);
995
proto_item* ti = proto_tree_add_text
996
(ext_tree, tvb, offset+clen, entry_len+1, "Reverse Flow Entry (Flow Id: %d)", flow_id);
998
proto_tree* exts_tree = proto_item_add_subtree(ti, ett_a11_rqi_flowentry);
1001
proto_tree_add_item(exts_tree, hf_a11_rqi_entrylen, tvb, offset+clen, 1, FALSE);
1005
proto_tree_add_item(exts_tree, hf_a11_rqi_flowid, tvb, offset+clen, 1, FALSE);
1009
dissect_rqi_entry_flags(tvb, offset+clen, exts_tree);
1012
/* Requested QoS Length */
1013
requested_qos_len = tvb_get_guint8(tvb, offset+clen);
1014
proto_tree_add_item(exts_tree, hf_a11_rqi_requested_qoslen, tvb, offset+clen, 1, FALSE);
1017
/* Requested QoS Blob */
1018
if(requested_qos_len)
1021
(exts_tree, hf_a11_rqi_requested_qos, tvb, offset+clen, requested_qos_len, FALSE);
1022
clen += requested_qos_len;
1025
/* Granted QoS Length */
1026
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
1027
proto_tree_add_item(exts_tree, hf_a11_rqi_granted_qoslen, tvb, offset+clen, 1, FALSE);
1030
/* Granted QoS Blob */
1034
(exts_tree, hf_a11_rqi_granted_qos, tvb, offset+clen, granted_qos_len, FALSE);
1035
clen += granted_qos_len;
1040
1041
/* Code to dissect Subscriber QoS Profile */
1041
1042
static void dissect_subscriber_qos_profile(tvbuff_t* tvb, int offset, int ext_len, proto_tree* ext_tree)
1043
proto_tree* exts_tree = 0;
1044
proto_tree* exts_tree;
1045
1046
int qos_profile_len = ext_len;
1047
1048
proto_item* ti =
1048
proto_tree_add_text (ext_tree, tvb, offset, 0,
1049
"Subscriber Qos Profile (%d bytes)",
1049
proto_tree_add_text (ext_tree, tvb, offset, 0,
1050
"Subscriber Qos Profile (%d bytes)",
1052
1053
exts_tree = proto_item_add_subtree(ti, ett_a11_subscriber_profile);
1055
1056
if(qos_profile_len)
1057
1058
proto_tree_add_item
1058
(exts_tree, hf_a11_subsciber_profile, tvb, offset,
1059
qos_profile_len, FALSE);
1059
(exts_tree, hf_a11_subsciber_profile, tvb, offset,
1060
qos_profile_len, FALSE);
1063
1064
/* Code to dissect Forward QoS Update Info */
1064
1065
static void dissect_fwd_qosupdate_info(tvbuff_t* tvb, int offset, proto_tree* ext_tree)
1066
int clen = 0; /* consumed length */
1067
guint8 flow_count = 0;
1068
guint8 flow_index = 0;
1071
flow_count = tvb_get_guint8(tvb, offset+clen);
1072
proto_tree_add_item(ext_tree, hf_a11_fqui_flowcount, tvb, offset+clen, 1, FALSE);
1075
for(flow_index=0; flow_index<flow_count; flow_index++)
1077
proto_tree* exts_tree = 0;
1078
guint8 granted_qos_len = 0;
1080
guint8 flow_id = tvb_get_guint8(tvb, offset+clen);
1082
proto_item* ti = proto_tree_add_text
1083
(ext_tree, tvb, offset+clen, 1, "Forward Flow Entry (Flow Id: %d)", flow_id);
1086
exts_tree = proto_item_add_subtree(ti, ett_a11_fqui_flowentry);
1088
/* Forward QoS Sub Blob Length */
1089
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
1091
(exts_tree, hf_a11_fqui_updated_qoslen, tvb, offset+clen, 1, FALSE);
1094
/* Forward QoS Sub Blob */
1067
int clen = 0; /* consumed length */
1072
flow_count = tvb_get_guint8(tvb, offset+clen);
1073
proto_tree_add_item(ext_tree, hf_a11_fqui_flowcount, tvb, offset+clen, 1, FALSE);
1076
for(flow_index=0; flow_index<flow_count; flow_index++)
1078
proto_tree* exts_tree;
1079
guint8 granted_qos_len;
1081
guint8 flow_id = tvb_get_guint8(tvb, offset+clen);
1083
proto_item* ti = proto_tree_add_text
1084
(ext_tree, tvb, offset+clen, 1, "Forward Flow Entry (Flow Id: %d)", flow_id);
1087
exts_tree = proto_item_add_subtree(ti, ett_a11_fqui_flowentry);
1089
/* Forward QoS Sub Blob Length */
1090
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
1097
1091
proto_tree_add_item
1098
(exts_tree, hf_a11_fqui_updated_qos, tvb, offset+clen,
1099
granted_qos_len, FALSE);
1100
clen += granted_qos_len;
1092
(exts_tree, hf_a11_fqui_updated_qoslen, tvb, offset+clen, 1, FALSE);
1095
/* Forward QoS Sub Blob */
1099
(exts_tree, hf_a11_fqui_updated_qos, tvb, offset+clen,
1100
granted_qos_len, FALSE);
1101
clen += granted_qos_len;
1106
1107
/* Code to dissect Reverse QoS Update Info */
1107
1108
static void dissect_rev_qosupdate_info(tvbuff_t* tvb, int offset, proto_tree* ext_tree)
1109
int clen = 0; /* consumed length */
1110
guint8 flow_count = 0;
1111
guint8 flow_index = 0;
1114
flow_count = tvb_get_guint8(tvb, offset+clen);
1115
proto_tree_add_item(ext_tree, hf_a11_rqui_flowcount, tvb, offset+clen, 1, FALSE);
1118
for(flow_index=0; flow_index<flow_count; flow_index++)
1120
proto_tree* exts_tree = 0;
1121
guint8 granted_qos_len = 0;
1123
guint8 flow_id = tvb_get_guint8(tvb, offset+clen);
1125
proto_item* ti = proto_tree_add_text
1126
(ext_tree, tvb, offset+clen, 1, "Reverse Flow Entry (Flow Id: %d)", flow_id);
1128
exts_tree = proto_item_add_subtree(ti, ett_a11_rqui_flowentry);
1130
/* Reverse QoS Sub Blob Length */
1131
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
1133
(exts_tree, hf_a11_rqui_updated_qoslen, tvb, offset+clen, 1, FALSE);
1136
/* Reverse QoS Sub Blob */
1110
int clen = 0; /* consumed length */
1115
flow_count = tvb_get_guint8(tvb, offset+clen);
1116
proto_tree_add_item(ext_tree, hf_a11_rqui_flowcount, tvb, offset+clen, 1, FALSE);
1119
for(flow_index=0; flow_index<flow_count; flow_index++)
1121
proto_tree* exts_tree;
1122
guint8 granted_qos_len;
1124
guint8 flow_id = tvb_get_guint8(tvb, offset+clen);
1126
proto_item* ti = proto_tree_add_text
1127
(ext_tree, tvb, offset+clen, 1, "Reverse Flow Entry (Flow Id: %d)", flow_id);
1129
exts_tree = proto_item_add_subtree(ti, ett_a11_rqui_flowentry);
1131
/* Reverse QoS Sub Blob Length */
1132
granted_qos_len = tvb_get_guint8(tvb, offset+clen);
1139
1133
proto_tree_add_item
1140
(exts_tree, hf_a11_rqui_updated_qos, tvb, offset+clen,
1141
granted_qos_len, FALSE);
1142
clen += granted_qos_len;
1134
(exts_tree, hf_a11_rqui_updated_qoslen, tvb, offset+clen, 1, FALSE);
1137
/* Reverse QoS Sub Blob */
1141
(exts_tree, hf_a11_rqui_updated_qos, tvb, offset+clen,
1142
granted_qos_len, FALSE);
1143
clen += granted_qos_len;
1147
1148
/* Code to dissect extensions */
1149
1150
dissect_a11_extensions( tvbuff_t *tvb, int offset, proto_tree *tree)
1152
proto_tree *exts_tree=NULL;
1153
proto_tree *ext_tree;
1156
guint8 ext_subtype=0;
1159
gint16 apptype = -1;
1161
/* None of this really matters if we don't have a tree */
1164
/* Add our tree, if we have extensions */
1165
ti = proto_tree_add_text(tree, tvb, offset, -1, "Extensions");
1166
exts_tree = proto_item_add_subtree(ti, ett_a11_exts);
1168
/* And, handle each extension */
1169
while (tvb_reported_length_remaining(tvb, offset) > 0) {
1171
/* Get our extension info */
1172
ext_type = tvb_get_guint8(tvb, offset);
1173
if (ext_type == GEN_AUTH_EXT) {
1175
* Very nasty . . breaks normal extensions, since the length is
1176
* in the wrong place :(
1178
ext_subtype = tvb_get_guint8(tvb, offset + 1);
1179
ext_len = tvb_get_ntohs(tvb, offset + 2);
1181
} else if (ext_type == CVSE_EXT || ext_type == OLD_CVSE_EXT) {
1182
ext_len = tvb_get_ntohs(tvb, offset + 2);
1183
ext_subtype = tvb_get_guint8(tvb, offset + 8);
1186
ext_len = tvb_get_guint8(tvb, offset + 1);
1190
ti = proto_tree_add_text(exts_tree, tvb, offset, ext_len + hdrLen,
1192
val_to_str(ext_type, a11_ext_types,
1193
"Unknown Extension %u"));
1194
ext_tree = proto_item_add_subtree(ti, ett_a11_ext);
1196
proto_tree_add_item(ext_tree, hf_a11_ext_type, tvb, offset, 1, ext_type);
1199
if (ext_type == SS_EXT) {
1200
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 1, ext_len);
1203
else if(ext_type == CVSE_EXT || ext_type == OLD_CVSE_EXT) {
1205
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 2, ext_len);
1208
else if (ext_type != GEN_AUTH_EXT) {
1209
/* Another nasty hack since GEN_AUTH_EXT broke everything */
1210
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 1, ext_len);
1216
decode_sse(ext_tree, tvb, offset, ext_len);
1225
/* All these extensions look the same. 4 byte SPI followed by a key */
1228
proto_tree_add_item(ext_tree, hf_a11_aext_spi, tvb, offset, 4, FALSE);
1233
proto_tree_add_item(ext_tree, hf_a11_aext_auth, tvb, offset, ext_len,
1239
proto_tree_add_item(ext_tree, hf_a11_next_nai, tvb, offset,
1243
case GEN_AUTH_EXT: /* RFC 3012 */
1245
* Very nasty . . breaks normal extensions, since the length is
1246
* in the wrong place :(
1248
proto_tree_add_uint(ext_tree, hf_a11_ext_stype, tvb, offset, 1, ext_subtype);
1250
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 2, ext_len);
1255
proto_tree_add_item(ext_tree, hf_a11_aext_spi, tvb, offset, 4, FALSE);
1261
proto_tree_add_item(ext_tree, hf_a11_aext_auth, tvb, offset,
1265
case OLD_CVSE_EXT: /* RFC 3115 */
1266
case CVSE_EXT: /* RFC 3115 */
1269
proto_tree_add_item(ext_tree, hf_a11_vse_vid, tvb, offset, 4, FALSE);
1274
apptype = tvb_get_ntohs(tvb, offset);
1275
proto_tree_add_uint(ext_tree, hf_a11_vse_apptype, tvb, offset, 2, apptype);
1278
if(apptype == 0x0101) {
1279
if (tvb_reported_length_remaining(tvb, offset) > 0) {
1280
dissect_a11_radius(tvb, offset, ext_tree, ext_len + 2);
1284
case OLD_NVSE_EXT: /* RFC 3115 */
1285
case NVSE_EXT: /* RFC 3115 */
1288
proto_tree_add_item(ext_tree, hf_a11_vse_vid, tvb, offset+2, 4, FALSE);
1291
proto_tree_add_item(ext_tree, hf_a11_vse_apptype, tvb, offset, 2, FALSE);
1295
apptype = tvb_get_ntohs(tvb, offset);
1302
proto_tree_add_item(ext_tree, hf_a11_vse_panid, tvb, offset, 5, FALSE);
1307
proto_tree_add_item(ext_tree, hf_a11_vse_canid, tvb, offset, 5, FALSE);
1312
proto_tree_add_item(ext_tree, hf_a11_vse_ppaddr, tvb, offset, 4, FALSE);
1317
proto_tree_add_item(ext_tree, hf_a11_vse_dormant, tvb, offset, 2, FALSE);
1322
proto_tree_add_item(ext_tree, hf_a11_vse_code, tvb, offset, 1, FALSE);
1327
proto_tree_add_item(ext_tree, hf_a11_vse_pdit, tvb, offset, 1, FALSE);
1330
proto_tree_add_text(ext_tree, tvb, offset, -1, "Session Parameter - Always On");
1333
proto_tree_add_item(ext_tree, hf_a11_vse_qosmode, tvb, offset, 1, FALSE);
1338
proto_tree_add_item(ext_tree, hf_a11_vse_srvopt, tvb, offset, 2, FALSE);
1341
dissect_ase(tvb, offset, ext_len, ext_tree);
1344
dissect_fwd_qosinfo(tvb, offset, ext_tree);
1347
dissect_rev_qosinfo(tvb, offset, ext_tree);
1350
dissect_subscriber_qos_profile(tvb, offset, ext_len, ext_tree);
1353
dissect_fwd_qosupdate_info(tvb, offset, ext_tree);
1356
dissect_rev_qosupdate_info(tvb, offset, ext_tree);
1361
case MF_CHALLENGE_EXT: /* RFC 3012 */
1362
/* The default dissector is good here. The challenge is all hex anyway. */
1364
proto_tree_add_item(ext_tree, hf_a11_ext, tvb, offset, ext_len, FALSE);
1369
} /* while data remaining */
1153
proto_tree *exts_tree;
1154
proto_tree *ext_tree;
1157
guint8 ext_subtype = 0;
1160
gint16 apptype = -1;
1162
/* None of this really matters if we don't have a tree */
1165
/* Add our tree, if we have extensions */
1166
ti = proto_tree_add_text(tree, tvb, offset, -1, "Extensions");
1167
exts_tree = proto_item_add_subtree(ti, ett_a11_exts);
1169
/* And, handle each extension */
1170
while (tvb_reported_length_remaining(tvb, offset) > 0) {
1172
/* Get our extension info */
1173
ext_type = tvb_get_guint8(tvb, offset);
1174
if (ext_type == GEN_AUTH_EXT) {
1176
* Very nasty . . breaks normal extensions, since the length is
1177
* in the wrong place :(
1179
ext_subtype = tvb_get_guint8(tvb, offset + 1);
1180
ext_len = tvb_get_ntohs(tvb, offset + 2);
1182
} else if ((ext_type == CVSE_EXT) || (ext_type == OLD_CVSE_EXT)) {
1183
ext_len = tvb_get_ntohs(tvb, offset + 2);
1184
ext_subtype = tvb_get_guint8(tvb, offset + 8);
1187
ext_len = tvb_get_guint8(tvb, offset + 1);
1191
ti = proto_tree_add_text(exts_tree, tvb, offset, ext_len + hdrLen,
1193
val_to_str(ext_type, a11_ext_types,
1194
"Unknown Extension %u"));
1195
ext_tree = proto_item_add_subtree(ti, ett_a11_ext);
1197
proto_tree_add_item(ext_tree, hf_a11_ext_type, tvb, offset, 1, ext_type);
1200
if (ext_type == SS_EXT) {
1201
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 1, ext_len);
1204
else if((ext_type == CVSE_EXT) || (ext_type == OLD_CVSE_EXT)) {
1206
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 2, ext_len);
1209
else if (ext_type != GEN_AUTH_EXT) {
1210
/* Another nasty hack since GEN_AUTH_EXT broke everything */
1211
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 1, ext_len);
1217
decode_sse(ext_tree, tvb, offset, ext_len);
1226
/* All these extensions look the same. 4 byte SPI followed by a key */
1229
proto_tree_add_item(ext_tree, hf_a11_aext_spi, tvb, offset, 4, FALSE);
1234
proto_tree_add_item(ext_tree, hf_a11_aext_auth, tvb, offset, ext_len,
1240
proto_tree_add_item(ext_tree, hf_a11_next_nai, tvb, offset,
1244
case GEN_AUTH_EXT: /* RFC 3012 */
1246
* Very nasty . . breaks normal extensions, since the length is
1247
* in the wrong place :(
1249
proto_tree_add_uint(ext_tree, hf_a11_ext_stype, tvb, offset, 1, ext_subtype);
1251
proto_tree_add_uint(ext_tree, hf_a11_ext_len, tvb, offset, 2, ext_len);
1256
proto_tree_add_item(ext_tree, hf_a11_aext_spi, tvb, offset, 4, FALSE);
1262
proto_tree_add_item(ext_tree, hf_a11_aext_auth, tvb, offset,
1266
case OLD_CVSE_EXT: /* RFC 3115 */
1267
case CVSE_EXT: /* RFC 3115 */
1270
proto_tree_add_item(ext_tree, hf_a11_vse_vid, tvb, offset, 4, FALSE);
1275
apptype = tvb_get_ntohs(tvb, offset);
1276
proto_tree_add_uint(ext_tree, hf_a11_vse_apptype, tvb, offset, 2, apptype);
1279
if(apptype == 0x0101) {
1280
if (tvb_reported_length_remaining(tvb, offset) > 0) {
1281
dissect_a11_radius(tvb, offset, ext_tree, ext_len + 2);
1285
case OLD_NVSE_EXT: /* RFC 3115 */
1286
case NVSE_EXT: /* RFC 3115 */
1289
proto_tree_add_item(ext_tree, hf_a11_vse_vid, tvb, offset+2, 4, FALSE);
1292
proto_tree_add_item(ext_tree, hf_a11_vse_apptype, tvb, offset, 2, FALSE);
1296
apptype = tvb_get_ntohs(tvb, offset);
1303
proto_tree_add_item(ext_tree, hf_a11_vse_panid, tvb, offset, 5, FALSE);
1308
proto_tree_add_item(ext_tree, hf_a11_vse_canid, tvb, offset, 5, FALSE);
1313
proto_tree_add_item(ext_tree, hf_a11_vse_ppaddr, tvb, offset, 4, FALSE);
1318
proto_tree_add_item(ext_tree, hf_a11_vse_dormant, tvb, offset, 2, FALSE);
1323
proto_tree_add_item(ext_tree, hf_a11_vse_code, tvb, offset, 1, FALSE);
1328
proto_tree_add_item(ext_tree, hf_a11_vse_pdit, tvb, offset, 1, FALSE);
1331
proto_tree_add_text(ext_tree, tvb, offset, -1, "Session Parameter - Always On");
1334
proto_tree_add_item(ext_tree, hf_a11_vse_qosmode, tvb, offset, 1, FALSE);
1339
proto_tree_add_item(ext_tree, hf_a11_vse_srvopt, tvb, offset, 2, FALSE);
1342
dissect_ase(tvb, offset, ext_len, ext_tree);
1345
dissect_fwd_qosinfo(tvb, offset, ext_tree);
1348
dissect_rev_qosinfo(tvb, offset, ext_tree);
1351
dissect_subscriber_qos_profile(tvb, offset, ext_len, ext_tree);
1354
dissect_fwd_qosupdate_info(tvb, offset, ext_tree);
1357
dissect_rev_qosupdate_info(tvb, offset, ext_tree);
1362
case MF_CHALLENGE_EXT: /* RFC 3012 */
1363
/* The default dissector is good here. The challenge is all hex anyway. */
1365
proto_tree_add_item(ext_tree, hf_a11_ext, tvb, offset, ext_len, FALSE);
1370
} /* while data remaining */
1371
1372
} /* dissect_a11_extensions */
1375
1376
dissect_a11( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1377
/* Set up structures we will need to add the protocol subtree and manage it */
1379
proto_tree *a11_tree=NULL;
1381
proto_tree *flags_tree;
1385
const guint8 *reftime;
1387
if (!tvb_bytes_exist(tvb, offset, 1))
1388
return 0; /* not enough data to check message type */
1390
type = tvb_get_guint8(tvb, offset);
1391
if (match_strval(type, a11_types) == NULL)
1392
return 0; /* not a known message type */
1394
/* Make entries in Protocol column and Info column on summary display */
1396
if (check_col(pinfo->cinfo, COL_PROTOCOL))
1397
col_set_str(pinfo->cinfo, COL_PROTOCOL, "3GPP2 A11");
1398
if (check_col(pinfo->cinfo, COL_INFO))
1399
col_clear(pinfo->cinfo, COL_INFO);
1402
case REGISTRATION_REQUEST:
1403
if (check_col(pinfo->cinfo, COL_INFO))
1404
col_add_fstr(pinfo->cinfo, COL_INFO, "Reg Request: PDSN=%s PCF=%s",
1405
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1406
ip_to_str(tvb_get_ptr(tvb,12,4)));
1409
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1410
a11_tree = proto_item_add_subtree(ti, ett_a11);
1413
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1417
flags = tvb_get_guint8(tvb, offset);
1418
tf = proto_tree_add_uint(a11_tree, hf_a11_flags, tvb,
1420
flags_tree = proto_item_add_subtree(tf, ett_a11_flags);
1421
proto_tree_add_boolean(flags_tree, hf_a11_s, tvb, offset, 1, flags);
1422
proto_tree_add_boolean(flags_tree, hf_a11_b, tvb, offset, 1, flags);
1423
proto_tree_add_boolean(flags_tree, hf_a11_d, tvb, offset, 1, flags);
1424
proto_tree_add_boolean(flags_tree, hf_a11_m, tvb, offset, 1, flags);
1425
proto_tree_add_boolean(flags_tree, hf_a11_g, tvb, offset, 1, flags);
1426
proto_tree_add_boolean(flags_tree, hf_a11_v, tvb, offset, 1, flags);
1427
proto_tree_add_boolean(flags_tree, hf_a11_t, tvb, offset, 1, flags);
1431
proto_tree_add_item(a11_tree, hf_a11_life, tvb, offset, 2, FALSE);
1435
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1438
/* home agent address */
1439
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1442
/* Care of Address */
1443
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1446
/* Identifier - assumed to be an NTP time here */
1447
reftime = tvb_get_ptr(tvb, offset, 8);
1448
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1451
ntp_fmt_ts(reftime));
1456
case REGISTRATION_REPLY:
1457
if (check_col(pinfo->cinfo, COL_INFO))
1458
col_add_fstr(pinfo->cinfo, COL_INFO, "Reg Reply: PDSN=%s, Code=%u",
1459
ip_to_str(tvb_get_ptr(tvb,8,4)), tvb_get_guint8(tvb,1));
1463
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1464
a11_tree = proto_item_add_subtree(ti, ett_a11);
1467
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1471
proto_tree_add_item(a11_tree, hf_a11_code, tvb, offset, 1, FALSE);
1474
/* Registration Lifetime */
1475
proto_tree_add_item(a11_tree, hf_a11_life, tvb, offset, 2, FALSE);
1479
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1482
/* Home Agent Address */
1483
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1486
/* Identifier - assumed to be an NTP time here */
1487
reftime = tvb_get_ptr(tvb, offset, 8);
1488
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1492
ntp_fmt_ts(reftime));
1497
case REGISTRATION_UPDATE:
1498
if (check_col(pinfo->cinfo, COL_INFO))
1499
col_add_fstr(pinfo->cinfo, COL_INFO,"Reg Update: PDSN=%s",
1500
ip_to_str(tvb_get_ptr(tvb,8,4)));
1503
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1504
a11_tree = proto_item_add_subtree(ti, ett_a11);
1507
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1514
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1517
/* Home Agent Address */
1518
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1521
/* Identifier - assumed to be an NTP time here */
1522
reftime = tvb_get_ptr(tvb, offset, 8);
1523
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1527
ntp_fmt_ts(reftime));
1532
case REGISTRATION_ACK:
1533
if (check_col(pinfo->cinfo, COL_INFO))
1534
col_add_fstr(pinfo->cinfo, COL_INFO, "Reg Ack: PCF=%s Status=%u",
1535
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1536
tvb_get_guint8(tvb,3));
1539
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1540
a11_tree = proto_item_add_subtree(ti, ett_a11);
1543
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1550
proto_tree_add_item(a11_tree, hf_a11_status, tvb, offset, 1, FALSE);
1554
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1557
/* Care of Address */
1558
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1561
/* Identifier - assumed to be an NTP time here */
1562
reftime = tvb_get_ptr(tvb, offset, 8);
1563
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1567
ntp_fmt_ts(reftime));
1572
case SESSION_UPDATE: /* IOS4.3 */
1573
if (check_col(pinfo->cinfo, COL_INFO))
1574
col_add_fstr(pinfo->cinfo, COL_INFO,"Ses Update: PDSN=%s",
1575
ip_to_str(tvb_get_ptr(tvb,8,4)));
1578
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1579
a11_tree = proto_item_add_subtree(ti, ett_a11);
1582
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1589
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1592
/* Home Agent Address */
1593
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1596
/* Identifier - assumed to be an NTP time here */
1597
reftime = tvb_get_ptr(tvb, offset, 8);
1598
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1602
ntp_fmt_ts(reftime));
1607
case SESSION_ACK: /* IOS4.3 */
1608
if (check_col(pinfo->cinfo, COL_INFO))
1609
col_add_fstr(pinfo->cinfo, COL_INFO, "Ses Upd Ack: PCF=%s, Status=%u",
1610
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1611
tvb_get_guint8(tvb,3));
1614
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1615
a11_tree = proto_item_add_subtree(ti, ett_a11);
1618
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1625
proto_tree_add_item(a11_tree, hf_a11_status, tvb, offset, 1, FALSE);
1629
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1632
/* Care of Address */
1633
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1636
/* Identifier - assumed to be an NTP time here */
1637
reftime = tvb_get_ptr(tvb, offset, 8);
1638
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1642
ntp_fmt_ts(reftime));
1647
case CAPABILITIES_INFO: /* IOS5.1 */
1648
if (check_col(pinfo->cinfo, COL_INFO))
1649
col_add_fstr(pinfo->cinfo, COL_INFO, "Cap Info: PDSN=%s, PCF=%s",
1650
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1651
ip_to_str(tvb_get_ptr(tvb,12,4)));
1654
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1655
a11_tree = proto_item_add_subtree(ti, ett_a11);
1658
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1665
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1668
/* Home Agent Address */
1669
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1672
/* Care of Address */
1673
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1676
/* Identifier - assumed to be an NTP time here */
1677
reftime = tvb_get_ptr(tvb, offset, 8);
1678
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1682
ntp_fmt_ts(reftime));
1687
case CAPABILITIES_INFO_ACK: /* IOS5.1 */
1688
if (check_col(pinfo->cinfo, COL_INFO))
1689
col_add_fstr(pinfo->cinfo, COL_INFO, "Cap Info Ack: PCF=%s",
1690
ip_to_str(tvb_get_ptr(tvb, 8, 4)));
1693
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1694
a11_tree = proto_item_add_subtree(ti, ett_a11);
1697
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1704
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1707
/* Care of Address */
1708
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1711
/* Identifier - assumed to be an NTP time here */
1712
reftime = tvb_get_ptr(tvb, offset, 8);
1713
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1717
ntp_fmt_ts(reftime));
1725
if (tvb_reported_length_remaining(tvb, offset) > 0)
1726
dissect_a11_extensions(tvb, offset, a11_tree);
1728
return tvb_length(tvb);
1378
/* Set up structures we will need to add the protocol subtree and manage it */
1380
proto_tree *a11_tree;
1382
proto_tree *flags_tree;
1386
const guint8 *reftime;
1388
if (!tvb_bytes_exist(tvb, offset, 1))
1389
return 0; /* not enough data to check message type */
1391
type = tvb_get_guint8(tvb, offset);
1392
if (match_strval(type, a11_types) == NULL)
1393
return 0; /* not a known message type */
1395
/* Make entries in Protocol column and Info column on summary display */
1397
col_set_str(pinfo->cinfo, COL_PROTOCOL, "3GPP2 A11");
1398
col_clear(pinfo->cinfo, COL_INFO);
1401
case REGISTRATION_REQUEST:
1402
col_add_fstr(pinfo->cinfo, COL_INFO, "Reg Request: PDSN=%s PCF=%s",
1403
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1404
ip_to_str(tvb_get_ptr(tvb,12,4)));
1407
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1408
a11_tree = proto_item_add_subtree(ti, ett_a11);
1411
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1415
flags = tvb_get_guint8(tvb, offset);
1416
tf = proto_tree_add_uint(a11_tree, hf_a11_flags, tvb,
1418
flags_tree = proto_item_add_subtree(tf, ett_a11_flags);
1419
proto_tree_add_boolean(flags_tree, hf_a11_s, tvb, offset, 1, flags);
1420
proto_tree_add_boolean(flags_tree, hf_a11_b, tvb, offset, 1, flags);
1421
proto_tree_add_boolean(flags_tree, hf_a11_d, tvb, offset, 1, flags);
1422
proto_tree_add_boolean(flags_tree, hf_a11_m, tvb, offset, 1, flags);
1423
proto_tree_add_boolean(flags_tree, hf_a11_g, tvb, offset, 1, flags);
1424
proto_tree_add_boolean(flags_tree, hf_a11_v, tvb, offset, 1, flags);
1425
proto_tree_add_boolean(flags_tree, hf_a11_t, tvb, offset, 1, flags);
1429
proto_tree_add_item(a11_tree, hf_a11_life, tvb, offset, 2, FALSE);
1433
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1436
/* home agent address */
1437
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1440
/* Care of Address */
1441
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1444
/* Identifier - assumed to be an NTP time here */
1445
reftime = tvb_get_ptr(tvb, offset, 8);
1446
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1449
ntp_fmt_ts(reftime));
1454
case REGISTRATION_REPLY:
1455
col_add_fstr(pinfo->cinfo, COL_INFO, "Reg Reply: PDSN=%s, Code=%u",
1456
ip_to_str(tvb_get_ptr(tvb,8,4)), tvb_get_guint8(tvb,1));
1460
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1461
a11_tree = proto_item_add_subtree(ti, ett_a11);
1464
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1468
proto_tree_add_item(a11_tree, hf_a11_code, tvb, offset, 1, FALSE);
1471
/* Registration Lifetime */
1472
proto_tree_add_item(a11_tree, hf_a11_life, tvb, offset, 2, FALSE);
1476
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1479
/* Home Agent Address */
1480
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1483
/* Identifier - assumed to be an NTP time here */
1484
reftime = tvb_get_ptr(tvb, offset, 8);
1485
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1489
ntp_fmt_ts(reftime));
1494
case REGISTRATION_UPDATE:
1495
col_add_fstr(pinfo->cinfo, COL_INFO,"Reg Update: PDSN=%s",
1496
ip_to_str(tvb_get_ptr(tvb,8,4)));
1499
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1500
a11_tree = proto_item_add_subtree(ti, ett_a11);
1503
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1510
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1513
/* Home Agent Address */
1514
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1517
/* Identifier - assumed to be an NTP time here */
1518
reftime = tvb_get_ptr(tvb, offset, 8);
1519
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1523
ntp_fmt_ts(reftime));
1528
case REGISTRATION_ACK:
1529
col_add_fstr(pinfo->cinfo, COL_INFO, "Reg Ack: PCF=%s Status=%u",
1530
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1531
tvb_get_guint8(tvb,3));
1534
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1535
a11_tree = proto_item_add_subtree(ti, ett_a11);
1538
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1545
proto_tree_add_item(a11_tree, hf_a11_status, tvb, offset, 1, FALSE);
1549
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1552
/* Care of Address */
1553
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1556
/* Identifier - assumed to be an NTP time here */
1557
reftime = tvb_get_ptr(tvb, offset, 8);
1558
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1562
ntp_fmt_ts(reftime));
1567
case SESSION_UPDATE: /* IOS4.3 */
1568
col_add_fstr(pinfo->cinfo, COL_INFO,"Ses Update: PDSN=%s",
1569
ip_to_str(tvb_get_ptr(tvb,8,4)));
1572
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1573
a11_tree = proto_item_add_subtree(ti, ett_a11);
1576
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1583
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1586
/* Home Agent Address */
1587
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1590
/* Identifier - assumed to be an NTP time here */
1591
reftime = tvb_get_ptr(tvb, offset, 8);
1592
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1596
ntp_fmt_ts(reftime));
1601
case SESSION_ACK: /* IOS4.3 */
1602
col_add_fstr(pinfo->cinfo, COL_INFO, "Ses Upd Ack: PCF=%s, Status=%u",
1603
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1604
tvb_get_guint8(tvb,3));
1607
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1608
a11_tree = proto_item_add_subtree(ti, ett_a11);
1611
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1618
proto_tree_add_item(a11_tree, hf_a11_status, tvb, offset, 1, FALSE);
1622
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1625
/* Care of Address */
1626
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1629
/* Identifier - assumed to be an NTP time here */
1630
reftime = tvb_get_ptr(tvb, offset, 8);
1631
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1635
ntp_fmt_ts(reftime));
1640
case CAPABILITIES_INFO: /* IOS5.1 */
1641
col_add_fstr(pinfo->cinfo, COL_INFO, "Cap Info: PDSN=%s, PCF=%s",
1642
ip_to_str(tvb_get_ptr(tvb, 8, 4)),
1643
ip_to_str(tvb_get_ptr(tvb,12,4)));
1646
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1647
a11_tree = proto_item_add_subtree(ti, ett_a11);
1650
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1657
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1660
/* Home Agent Address */
1661
proto_tree_add_item(a11_tree, hf_a11_haaddr, tvb, offset, 4, FALSE);
1664
/* Care of Address */
1665
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1668
/* Identifier - assumed to be an NTP time here */
1669
reftime = tvb_get_ptr(tvb, offset, 8);
1670
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1674
ntp_fmt_ts(reftime));
1679
case CAPABILITIES_INFO_ACK: /* IOS5.1 */
1680
col_add_fstr(pinfo->cinfo, COL_INFO, "Cap Info Ack: PCF=%s",
1681
ip_to_str(tvb_get_ptr(tvb, 8, 4)));
1684
ti = proto_tree_add_item(tree, proto_a11, tvb, offset, -1, FALSE);
1685
a11_tree = proto_item_add_subtree(ti, ett_a11);
1688
proto_tree_add_uint(a11_tree, hf_a11_type, tvb, offset, 1, type);
1695
proto_tree_add_item(a11_tree, hf_a11_homeaddr, tvb, offset, 4, FALSE);
1698
/* Care of Address */
1699
proto_tree_add_item(a11_tree, hf_a11_coa, tvb, offset, 4, FALSE);
1702
/* Identifier - assumed to be an NTP time here */
1703
reftime = tvb_get_ptr(tvb, offset, 8);
1704
proto_tree_add_bytes_format_value(a11_tree, hf_a11_ident, tvb,
1708
ntp_fmt_ts(reftime));
1714
DISSECTOR_ASSERT_NOT_REACHED();
1719
if (tvb_reported_length_remaining(tvb, offset) > 0)
1720
dissect_a11_extensions(tvb, offset, a11_tree);
1722
return tvb_length(tvb);
1729
1723
} /* dissect_a11 */
1731
1725
/* Register the protocol with Wireshark */
1736
1730
/* Setup list of header fields */
1737
static hf_register_info hf[] = {
1739
{ "Message Type", "a11.type",
1740
FT_UINT8, BASE_DEC, VALS(a11_types), 0,
1741
"A11 Message type.", HFILL }
1744
{"Flags", "a11.flags",
1745
FT_UINT8, BASE_HEX, NULL, 0x0,
1749
{"Simultaneous Bindings", "a11.s",
1751
FT_BOOLEAN, 8, NULL, 128,
1752
"Simultaneous Bindings Allowed", HFILL }
1755
{"Broadcast Datagrams", "a11.b",
1756
FT_BOOLEAN, 8, NULL, 64,
1757
"Broadcast Datagrams requested", HFILL }
1760
{ "Co-located Care-of Address", "a11.d",
1761
FT_BOOLEAN, 8, NULL, 32,
1762
"MN using Co-located Care-of address", HFILL }
1765
{"Minimal Encapsulation", "a11.m",
1766
FT_BOOLEAN, 8, NULL, 16,
1767
"MN wants Minimal encapsulation", HFILL }
1771
FT_BOOLEAN, 8, NULL, 8,
1772
"MN wants GRE encapsulation", HFILL }
1775
{ "Van Jacobson", "a11.v",
1776
FT_BOOLEAN, 8, NULL, 4,
1777
"Van Jacobson", HFILL }
1780
{ "Reverse Tunneling", "a11.t",
1781
FT_BOOLEAN, 8, NULL, 2,
1782
"Reverse tunneling requested", HFILL }
1785
{ "Reply Code", "a11.code",
1786
FT_UINT8, BASE_DEC, VALS(a11_reply_codes), 0,
1787
"A11 Registration Reply code.", HFILL }
1790
{ "Reply Status", "a11.ackstat",
1791
FT_UINT8, BASE_DEC, VALS(a11_ack_status), 0,
1792
"A11 Registration Ack Status.", HFILL }
1795
{ "Lifetime", "a11.life",
1796
FT_UINT16, BASE_DEC, NULL, 0,
1797
"A11 Registration Lifetime.", HFILL }
1800
{ "Home Address", "a11.homeaddr",
1801
FT_IPv4, BASE_NONE, NULL, 0,
1802
"Mobile Node's home address.", HFILL }
1806
{ "Home Agent", "a11.haaddr",
1807
FT_IPv4, BASE_NONE, NULL, 0,
1808
"Home agent IP Address.", HFILL }
1811
{ "Care of Address", "a11.coa",
1812
FT_IPv4, BASE_NONE, NULL, 0,
1813
"Care of Address.", HFILL }
1816
{ "Identification", "a11.ident",
1817
FT_BYTES, BASE_NONE, NULL, 0,
1818
"MN Identification.", HFILL }
1821
{ "Extension Type", "a11.ext.type",
1822
FT_UINT8, BASE_DEC, VALS(a11_ext_types), 0,
1823
"Mobile IP Extension Type.", HFILL }
1825
{ &hf_a11_ext_stype,
1826
{ "Gen Auth Ext SubType", "a11.ext.auth.subtype",
1827
FT_UINT8, BASE_DEC, VALS(a11_ext_stypes), 0,
1828
"Mobile IP Auth Extension Sub Type.", HFILL }
1831
{ "Extension Length", "a11.ext.len",
1832
FT_UINT16, BASE_DEC, NULL, 0,
1833
"Mobile IP Extension Length.", HFILL }
1836
{ "Extension", "a11.extension",
1837
FT_BYTES, BASE_HEX, NULL, 0,
1838
"Extension", HFILL }
1841
{ "SPI", "a11.auth.spi",
1842
FT_UINT32, BASE_HEX, NULL, 0,
1843
"Authentication Header Security Parameter Index.", HFILL }
1845
{ &hf_a11_aext_auth,
1846
{ "Authenticator", "a11.auth.auth",
1847
FT_BYTES, BASE_NONE, NULL, 0,
1848
"Authenticator.", HFILL }
1852
FT_STRING, BASE_NONE, NULL, 0,
1856
{ "Key", "a11.ext.key",
1857
FT_UINT32, BASE_HEX, NULL, 0,
1858
"Session Key.", HFILL }
1860
{ &hf_a11_ses_sidver,
1861
{ "Session ID Version", "a11.ext.sidver",
1862
FT_UINT8, BASE_DEC, NULL, 3,
1863
"Session ID Version", HFILL}
1865
{ &hf_a11_ses_mnsrid,
1866
{ "MNSR-ID", "a11.ext.mnsrid",
1867
FT_UINT16, BASE_HEX, NULL, 0,
1870
{ &hf_a11_ses_msid_type,
1871
{ "MSID Type", "a11.ext.msid_type",
1872
FT_UINT16, BASE_DEC, NULL, 0,
1873
"MSID Type.", HFILL }
1875
{ &hf_a11_ses_msid_len,
1876
{ "MSID Length", "a11.ext.msid_len",
1877
FT_UINT8, BASE_DEC, NULL, 0,
1878
"MSID Length.", HFILL }
1881
{ "MSID(BCD)", "a11.ext.msid",
1882
FT_STRING, BASE_NONE, NULL, 0,
1883
"MSID(BCD).", HFILL }
1885
{ &hf_a11_ses_ptype,
1886
{ "Protocol Type", "a11.ext.ptype",
1887
FT_UINT16, BASE_HEX, VALS(a11_ses_ptype_vals), 0,
1888
"Protocol Type.", HFILL }
1891
{ "Vendor ID", "a11.ext.vid",
1892
FT_UINT32, BASE_HEX, VALS(sminmpec_values), 0,
1893
"Vendor ID.", HFILL }
1895
{ &hf_a11_vse_apptype,
1896
{ "Application Type", "a11.ext.apptype",
1897
FT_UINT8, BASE_HEX, VALS(a11_ext_app), 0,
1898
"Application Type.", HFILL }
1900
{ &hf_a11_vse_ppaddr,
1901
{ "Anchor P-P Address", "a11.ext.ppaddr",
1902
FT_IPv4, BASE_NONE, NULL, 0,
1903
"Anchor P-P Address.", HFILL }
1905
{ &hf_a11_vse_dormant,
1906
{ "All Dormant Indicator", "a11.ext.dormant",
1907
FT_UINT16, BASE_HEX, VALS(a11_ext_dormant), 0,
1908
"All Dormant Indicator.", HFILL }
1911
{ "Reply Code", "a11.ext.code",
1912
FT_UINT8, BASE_DEC, VALS(a11_reply_codes), 0,
1913
"PDSN Code.", HFILL }
1916
{ "PDSN Code", "a11.ext.code",
1917
FT_UINT8, BASE_HEX, VALS(a11_ext_nvose_pdsn_code), 0,
1918
"PDSN Code.", HFILL }
1920
{ &hf_a11_vse_srvopt,
1921
{ "Service Option", "a11.ext.srvopt",
1922
FT_UINT16, BASE_HEX, VALS(a11_ext_nvose_srvopt), 0,
1923
"Service Option.", HFILL }
1925
{ &hf_a11_vse_panid,
1926
{ "PANID", "a11.ext.panid",
1927
FT_BYTES, BASE_HEX, NULL, 0,
1930
{ &hf_a11_vse_canid,
1931
{ "CANID", "a11.ext.canid",
1932
FT_BYTES, BASE_HEX, NULL, 0,
1935
{ &hf_a11_vse_qosmode,
1936
{ "QoS Mode", "a11.ext.qosmode",
1937
FT_UINT8, BASE_HEX, VALS(a11_ext_nvose_qosmode), 0,
1938
"QoS Mode.", HFILL }
1940
{ &hf_a11_ase_len_type,
1941
{ "Entry Length", "a11.ext.ase.len",
1942
FT_UINT8, BASE_DEC, NULL, 0,
1943
"Entry Length.", HFILL }
1945
{ &hf_a11_ase_srid_type,
1946
{ "Service Reference ID (SRID)", "a11.ext.ase.srid",
1947
FT_UINT8, BASE_DEC, NULL, 0,
1948
"Service Reference ID (SRID).", HFILL }
1950
{ &hf_a11_ase_servopt_type,
1951
{ "Service Option", "a11.ext.ase.srvopt",
1952
FT_UINT16, BASE_HEX, VALS(a11_ext_nvose_srvopt), 0,
1953
"Service Option.", HFILL }
1955
{ &hf_a11_ase_gre_proto_type,
1956
{ "GRE Protocol Type", "a11.ext.ase.ptype",
1957
FT_UINT16, BASE_HEX, VALS(a11_ses_ptype_vals), 0,
1958
"GRE Protocol Type.", HFILL }
1960
{ &hf_a11_ase_gre_key,
1961
{ "GRE Key", "a11.ext.ase.key",
1962
FT_UINT32, BASE_HEX, NULL, 0,
1965
{ &hf_a11_ase_pcf_addr_key,
1966
{ "PCF IP Address", "a11.ext.ase.pcfip",
1967
FT_IPv4, BASE_NONE, NULL, 0,
1968
"PCF IP Address.", HFILL }
1970
{ &hf_a11_fqi_length,
1971
{ "Length", "a11.ext.fqi.length",
1972
FT_UINT16, BASE_DEC, NULL, 0,
1976
{ "SRID", "a11.ext.fqi.srid",
1977
FT_UINT8, BASE_DEC, NULL, 0,
1978
"Forward Flow Entry SRID.", HFILL }
1980
{ &hf_a11_fqi_flags,
1981
{ "Flags", "a11.ext.fqi.flags",
1982
FT_UINT8, BASE_HEX, NULL, 0,
1983
"Forward Flow Entry Flags.", HFILL }
1985
{ &hf_a11_fqi_flowcount,
1986
{ "Forward Flow Count", "a11.ext.fqi.flowcount",
1987
FT_UINT8, BASE_DEC, NULL, 0,
1988
"Forward Flow Count.", HFILL }
1990
{ &hf_a11_fqi_flowid,
1991
{ "Forward Flow Id", "a11.ext.fqi.flowid",
1992
FT_UINT8, BASE_DEC, NULL, 0,
1993
"Forward Flow Id.", HFILL }
1995
{ &hf_a11_fqi_entrylen,
1996
{ "Entry Length", "a11.ext.fqi.entrylen",
1997
FT_UINT8, BASE_DEC, NULL, 0,
1998
"Forward Entry Length.", HFILL }
2001
{ "Forward DSCP", "a11.ext.fqi.dscp",
2002
FT_UINT8, BASE_HEX, NULL, 0,
2003
"Forward Flow DSCP.", HFILL }
2005
{ &hf_a11_fqi_flowstate,
2006
{ "Forward Flow State", "a11.ext.fqi.flowstate",
2007
FT_UINT8, BASE_HEX, NULL, 0,
2008
"Forward Flow State.", HFILL }
2010
{ &hf_a11_fqi_requested_qoslen,
2011
{ "Requested QoS Length", "a11.ext.fqi.reqqoslen",
2012
FT_UINT8, BASE_DEC, NULL, 0,
2013
"Forward Requested QoS Length.", HFILL }
2015
{ &hf_a11_fqi_requested_qos,
2016
{ "Requested QoS", "a11.ext.fqi.reqqos",
2017
FT_BYTES, BASE_NONE, NULL, 0,
2018
"Forward Requested QoS.", HFILL }
2020
{ &hf_a11_fqi_granted_qoslen,
2021
{ "Granted QoS Length", "a11.ext.fqi.graqoslen",
2022
FT_UINT8, BASE_DEC, NULL, 0,
2023
"Forward Granted QoS Length.", HFILL }
2025
{ &hf_a11_fqi_granted_qos,
2026
{ "Granted QoS", "a11.ext.fqi.graqos",
2027
FT_BYTES, BASE_NONE, NULL, 0,
2028
"Forward Granted QoS.", HFILL }
2030
{ &hf_a11_rqi_length,
2031
{ "Length", "a11.ext.rqi.length",
2032
FT_UINT16, BASE_DEC, NULL, 0,
2036
{ "SRID", "a11.ext.rqi.srid",
2037
FT_UINT8, BASE_DEC, NULL, 0,
2038
"Reverse Flow Entry SRID.", HFILL }
2040
{ &hf_a11_rqi_flowcount,
2041
{ "Reverse Flow Count", "a11.ext.rqi.flowcount",
2042
FT_UINT8, BASE_DEC, NULL, 0,
2043
"Reverse Flow Count.", HFILL }
2045
{ &hf_a11_rqi_flowid,
2046
{ "Reverse Flow Id", "a11.ext.rqi.flowid",
2047
FT_UINT8, BASE_DEC, NULL, 0,
2048
"Reverse Flow Id.", HFILL }
2050
{ &hf_a11_rqi_entrylen,
2051
{ "Entry Length", "a11.ext.rqi.entrylen",
2052
FT_UINT8, BASE_DEC, NULL, 0,
2053
"Reverse Flow Entry Length.", HFILL }
2055
{ &hf_a11_rqi_flowstate,
2056
{ "Flow State", "a11.ext.rqi.flowstate",
2057
FT_UINT8, BASE_HEX, NULL, 0,
2058
"Reverse Flow State.", HFILL }
2060
{ &hf_a11_rqi_requested_qoslen,
2061
{ "Requested QoS Length", "a11.ext.rqi.reqqoslen",
2062
FT_UINT8, BASE_DEC, NULL, 0,
2063
"Reverse Requested QoS Length.", HFILL }
2065
{ &hf_a11_rqi_requested_qos,
2066
{ "Requested QoS", "a11.ext.rqi.reqqos",
2067
FT_BYTES, BASE_NONE, NULL, 0,
2068
"Reverse Requested QoS.", HFILL }
2070
{ &hf_a11_rqi_granted_qoslen,
2071
{ "Granted QoS Length", "a11.ext.rqi.graqoslen",
2072
FT_UINT8, BASE_DEC, NULL, 0,
2073
"Reverse Granted QoS Length.", HFILL }
2075
{ &hf_a11_rqi_granted_qos,
2076
{ "Granted QoS", "a11.ext.rqi.graqos",
2077
FT_BYTES, BASE_NONE, NULL, 0,
2078
"Reverse Granted QoS.", HFILL }
2080
{ &hf_a11_fqui_flowcount,
2081
{ "Forward QoS Update Flow Count", "a11.ext.fqui.flowcount",
2082
FT_UINT8, BASE_DEC, NULL, 0,
2083
"Forward QoS Update Flow Count.", HFILL }
2085
{ &hf_a11_rqui_flowcount,
2086
{ "Reverse QoS Update Flow Count", "a11.ext.rqui.flowcount",
2087
FT_UINT8, BASE_DEC, NULL, 0,
2088
"Reverse QoS Update Flow Count.", HFILL }
2090
{ &hf_a11_fqui_updated_qoslen,
2091
{ "Forward Updated QoS Sub-Blob Length", "a11.ext.fqui.updatedqoslen",
2092
FT_UINT8, BASE_DEC, NULL, 0,
2093
"Forward Updated QoS Sub-Blob Length.", HFILL }
2095
{ &hf_a11_fqui_updated_qos,
2096
{ "Forward Updated QoS Sub-Blob", "a11.ext.fqui.updatedqos",
2097
FT_BYTES, BASE_NONE, NULL, 0,
2098
"Forward Updated QoS Sub-Blob.", HFILL }
2100
{ &hf_a11_rqui_updated_qoslen,
2101
{ "Reverse Updated QoS Sub-Blob Length", "a11.ext.rqui.updatedqoslen",
2102
FT_UINT8, BASE_DEC, NULL, 0,
2103
"Reverse Updated QoS Sub-Blob Length.", HFILL }
2105
{ &hf_a11_rqui_updated_qos,
2106
{ "Reverse Updated QoS Sub-Blob", "a11.ext.rqui.updatedqos",
2107
FT_BYTES, BASE_NONE, NULL, 0,
2108
"Reverse Updated QoS Sub-Blob.", HFILL }
2110
{ & hf_a11_subsciber_profile_len,
2111
{ "Subscriber QoS Profile Length", "a11.ext.sqp.profilelen",
2112
FT_BYTES, BASE_NONE, NULL, 0,
2113
"Subscriber QoS Profile Length.", HFILL }
2115
{ & hf_a11_subsciber_profile,
2116
{ "Subscriber QoS Profile", "a11.ext.sqp.profile",
2117
FT_BYTES, BASE_NONE, NULL, 0,
2118
"Subscriber QoS Profile.", HFILL }
2122
/* Setup protocol subtree array */
2123
static gint *ett[] = {
2131
&ett_a11_fqi_flowentry,
2132
&ett_a11_rqi_flowentry,
2134
&ett_a11_fqi_entry_flags,
2135
&ett_a11_rqi_entry_flags,
2136
&ett_a11_fqui_flowentry,
2137
&ett_a11_rqui_flowentry,
2138
&ett_a11_subscriber_profile,
2141
/* Register the protocol name and description */
2142
proto_a11 = proto_register_protocol("3GPP2 A11", "3GPP2 A11", "a11");
2144
/* Register the dissector by name */
2145
new_register_dissector("a11", dissect_a11, proto_a11);
2147
/* Required function calls to register the header fields and subtrees used */
2148
proto_register_field_array(proto_a11, hf, array_length(hf));
2149
proto_register_subtree_array(ett, array_length(ett));
1731
static hf_register_info hf[] = {
1733
{ "Message Type", "a11.type",
1734
FT_UINT8, BASE_DEC, VALS(a11_types), 0,
1735
"A11 Message type.", HFILL }
1738
{"Flags", "a11.flags",
1739
FT_UINT8, BASE_HEX, NULL, 0x0,
1743
{"Simultaneous Bindings", "a11.s",
1744
FT_BOOLEAN, 8, NULL, 128,
1745
"Simultaneous Bindings Allowed", HFILL }
1748
{"Broadcast Datagrams", "a11.b",
1749
FT_BOOLEAN, 8, NULL, 64,
1750
"Broadcast Datagrams requested", HFILL }
1753
{ "Co-located Care-of Address", "a11.d",
1754
FT_BOOLEAN, 8, NULL, 32,
1755
"MN using Co-located Care-of address", HFILL }
1758
{"Minimal Encapsulation", "a11.m",
1759
FT_BOOLEAN, 8, NULL, 16,
1760
"MN wants Minimal encapsulation", HFILL }
1764
FT_BOOLEAN, 8, NULL, 8,
1765
"MN wants GRE encapsulation", HFILL }
1768
{ "Van Jacobson", "a11.v",
1769
FT_BOOLEAN, 8, NULL, 4,
1773
{ "Reverse Tunneling", "a11.t",
1774
FT_BOOLEAN, 8, NULL, 2,
1775
"Reverse tunneling requested", HFILL }
1778
{ "Reply Code", "a11.code",
1779
FT_UINT8, BASE_DEC, VALS(a11_reply_codes), 0,
1780
"A11 Registration Reply code.", HFILL }
1783
{ "Reply Status", "a11.ackstat",
1784
FT_UINT8, BASE_DEC, VALS(a11_ack_status), 0,
1785
"A11 Registration Ack Status.", HFILL }
1788
{ "Lifetime", "a11.life",
1789
FT_UINT16, BASE_DEC, NULL, 0,
1790
"A11 Registration Lifetime.", HFILL }
1793
{ "Home Address", "a11.homeaddr",
1794
FT_IPv4, BASE_NONE, NULL, 0,
1795
"Mobile Node's home address.", HFILL }
1799
{ "Home Agent", "a11.haaddr",
1800
FT_IPv4, BASE_NONE, NULL, 0,
1801
"Home agent IP Address.", HFILL }
1804
{ "Care of Address", "a11.coa",
1805
FT_IPv4, BASE_NONE, NULL, 0,
1806
"Care of Address.", HFILL }
1809
{ "Identification", "a11.ident",
1810
FT_BYTES, BASE_NONE, NULL, 0,
1811
"MN Identification.", HFILL }
1814
{ "Extension Type", "a11.ext.type",
1815
FT_UINT8, BASE_DEC, VALS(a11_ext_types), 0,
1816
"Mobile IP Extension Type.", HFILL }
1818
{ &hf_a11_ext_stype,
1819
{ "Gen Auth Ext SubType", "a11.ext.auth.subtype",
1820
FT_UINT8, BASE_DEC, VALS(a11_ext_stypes), 0,
1821
"Mobile IP Auth Extension Sub Type.", HFILL }
1824
{ "Extension Length", "a11.ext.len",
1825
FT_UINT16, BASE_DEC, NULL, 0,
1826
"Mobile IP Extension Length.", HFILL }
1829
{ "Extension", "a11.extension",
1830
FT_BYTES, BASE_NONE, NULL, 0,
1834
{ "SPI", "a11.auth.spi",
1835
FT_UINT32, BASE_HEX, NULL, 0,
1836
"Authentication Header Security Parameter Index.", HFILL }
1838
{ &hf_a11_aext_auth,
1839
{ "Authenticator", "a11.auth.auth",
1840
FT_BYTES, BASE_NONE, NULL, 0,
1841
"Authenticator.", HFILL }
1845
FT_STRING, BASE_NONE, NULL, 0,
1849
{ "Key", "a11.ext.key",
1850
FT_UINT32, BASE_HEX, NULL, 0,
1851
"Session Key.", HFILL }
1853
{ &hf_a11_ses_sidver,
1854
{ "Session ID Version", "a11.ext.sidver",
1855
FT_UINT8, BASE_DEC, NULL, 3,
1858
{ &hf_a11_ses_mnsrid,
1859
{ "MNSR-ID", "a11.ext.mnsrid",
1860
FT_UINT16, BASE_HEX, NULL, 0,
1863
{ &hf_a11_ses_msid_type,
1864
{ "MSID Type", "a11.ext.msid_type",
1865
FT_UINT16, BASE_DEC, NULL, 0,
1866
"MSID Type.", HFILL }
1868
{ &hf_a11_ses_msid_len,
1869
{ "MSID Length", "a11.ext.msid_len",
1870
FT_UINT8, BASE_DEC, NULL, 0,
1871
"MSID Length.", HFILL }
1874
{ "MSID(BCD)", "a11.ext.msid",
1875
FT_STRING, BASE_NONE, NULL, 0,
1876
"MSID(BCD).", HFILL }
1878
{ &hf_a11_ses_ptype,
1879
{ "Protocol Type", "a11.ext.ptype",
1880
FT_UINT16, BASE_HEX, VALS(a11_ses_ptype_vals), 0,
1881
"Protocol Type.", HFILL }
1884
{ "Vendor ID", "a11.ext.vid",
1885
FT_UINT32, BASE_HEX, VALS(sminmpec_values), 0,
1886
"Vendor ID.", HFILL }
1888
{ &hf_a11_vse_apptype,
1889
{ "Application Type", "a11.ext.apptype",
1890
FT_UINT8, BASE_HEX, VALS(a11_ext_app), 0,
1891
"Application Type.", HFILL }
1893
{ &hf_a11_vse_ppaddr,
1894
{ "Anchor P-P Address", "a11.ext.ppaddr",
1895
FT_IPv4, BASE_NONE, NULL, 0,
1896
"Anchor P-P Address.", HFILL }
1898
{ &hf_a11_vse_dormant,
1899
{ "All Dormant Indicator", "a11.ext.dormant",
1900
FT_UINT16, BASE_HEX, VALS(a11_ext_dormant), 0,
1901
"All Dormant Indicator.", HFILL }
1904
{ "Reply Code", "a11.ext.code",
1905
FT_UINT8, BASE_DEC, VALS(a11_reply_codes), 0,
1906
"PDSN Code.", HFILL }
1909
{ "PDSN Code", "a11.ext.code",
1910
FT_UINT8, BASE_HEX, VALS(a11_ext_nvose_pdsn_code), 0,
1911
"PDSN Code.", HFILL }
1913
{ &hf_a11_vse_srvopt,
1914
{ "Service Option", "a11.ext.srvopt",
1915
FT_UINT16, BASE_HEX, VALS(a11_ext_nvose_srvopt), 0,
1916
"Service Option.", HFILL }
1918
{ &hf_a11_vse_panid,
1919
{ "PANID", "a11.ext.panid",
1920
FT_BYTES, BASE_NONE, NULL, 0,
1923
{ &hf_a11_vse_canid,
1924
{ "CANID", "a11.ext.canid",
1925
FT_BYTES, BASE_NONE, NULL, 0,
1928
{ &hf_a11_vse_qosmode,
1929
{ "QoS Mode", "a11.ext.qosmode",
1930
FT_UINT8, BASE_HEX, VALS(a11_ext_nvose_qosmode), 0,
1931
"QoS Mode.", HFILL }
1933
{ &hf_a11_ase_len_type,
1934
{ "Entry Length", "a11.ext.ase.len",
1935
FT_UINT8, BASE_DEC, NULL, 0,
1936
"Entry Length.", HFILL }
1938
{ &hf_a11_ase_srid_type,
1939
{ "Service Reference ID (SRID)", "a11.ext.ase.srid",
1940
FT_UINT8, BASE_DEC, NULL, 0,
1941
"Service Reference ID (SRID).", HFILL }
1943
{ &hf_a11_ase_servopt_type,
1944
{ "Service Option", "a11.ext.ase.srvopt",
1945
FT_UINT16, BASE_HEX, VALS(a11_ext_nvose_srvopt), 0,
1946
"Service Option.", HFILL }
1948
{ &hf_a11_ase_gre_proto_type,
1949
{ "GRE Protocol Type", "a11.ext.ase.ptype",
1950
FT_UINT16, BASE_HEX, VALS(a11_ses_ptype_vals), 0,
1951
"GRE Protocol Type.", HFILL }
1953
{ &hf_a11_ase_gre_key,
1954
{ "GRE Key", "a11.ext.ase.key",
1955
FT_UINT32, BASE_HEX, NULL, 0,
1958
{ &hf_a11_ase_pcf_addr_key,
1959
{ "PCF IP Address", "a11.ext.ase.pcfip",
1960
FT_IPv4, BASE_NONE, NULL, 0,
1961
"PCF IP Address.", HFILL }
1963
{ &hf_a11_fqi_length,
1964
{ "Length", "a11.ext.fqi.length",
1965
FT_UINT16, BASE_DEC, NULL, 0,
1969
{ "SRID", "a11.ext.fqi.srid",
1970
FT_UINT8, BASE_DEC, NULL, 0,
1971
"Forward Flow Entry SRID.", HFILL }
1973
{ &hf_a11_fqi_flags,
1974
{ "Flags", "a11.ext.fqi.flags",
1975
FT_UINT8, BASE_HEX, NULL, 0,
1976
"Forward Flow Entry Flags.", HFILL }
1978
{ &hf_a11_fqi_flowcount,
1979
{ "Forward Flow Count", "a11.ext.fqi.flowcount",
1980
FT_UINT8, BASE_DEC, NULL, 0,
1981
"Forward Flow Count.", HFILL }
1983
{ &hf_a11_fqi_flowid,
1984
{ "Forward Flow Id", "a11.ext.fqi.flowid",
1985
FT_UINT8, BASE_DEC, NULL, 0,
1986
"Forward Flow Id.", HFILL }
1988
{ &hf_a11_fqi_entrylen,
1989
{ "Entry Length", "a11.ext.fqi.entrylen",
1990
FT_UINT8, BASE_DEC, NULL, 0,
1991
"Forward Entry Length.", HFILL }
1994
{ "Forward DSCP", "a11.ext.fqi.dscp",
1995
FT_UINT8, BASE_HEX, NULL, 0,
1996
"Forward Flow DSCP.", HFILL }
1998
{ &hf_a11_fqi_flowstate,
1999
{ "Forward Flow State", "a11.ext.fqi.flowstate",
2000
FT_UINT8, BASE_HEX, NULL, 0,
2001
"Forward Flow State.", HFILL }
2003
{ &hf_a11_fqi_requested_qoslen,
2004
{ "Requested QoS Length", "a11.ext.fqi.reqqoslen",
2005
FT_UINT8, BASE_DEC, NULL, 0,
2006
"Forward Requested QoS Length.", HFILL }
2008
{ &hf_a11_fqi_requested_qos,
2009
{ "Requested QoS", "a11.ext.fqi.reqqos",
2010
FT_BYTES, BASE_NONE, NULL, 0,
2011
"Forward Requested QoS.", HFILL }
2013
{ &hf_a11_fqi_granted_qoslen,
2014
{ "Granted QoS Length", "a11.ext.fqi.graqoslen",
2015
FT_UINT8, BASE_DEC, NULL, 0,
2016
"Forward Granted QoS Length.", HFILL }
2018
{ &hf_a11_fqi_granted_qos,
2019
{ "Granted QoS", "a11.ext.fqi.graqos",
2020
FT_BYTES, BASE_NONE, NULL, 0,
2021
"Forward Granted QoS.", HFILL }
2023
{ &hf_a11_rqi_length,
2024
{ "Length", "a11.ext.rqi.length",
2025
FT_UINT16, BASE_DEC, NULL, 0,
2029
{ "SRID", "a11.ext.rqi.srid",
2030
FT_UINT8, BASE_DEC, NULL, 0,
2031
"Reverse Flow Entry SRID.", HFILL }
2033
{ &hf_a11_rqi_flowcount,
2034
{ "Reverse Flow Count", "a11.ext.rqi.flowcount",
2035
FT_UINT8, BASE_DEC, NULL, 0,
2036
"Reverse Flow Count.", HFILL }
2038
{ &hf_a11_rqi_flowid,
2039
{ "Reverse Flow Id", "a11.ext.rqi.flowid",
2040
FT_UINT8, BASE_DEC, NULL, 0,
2041
"Reverse Flow Id.", HFILL }
2043
{ &hf_a11_rqi_entrylen,
2044
{ "Entry Length", "a11.ext.rqi.entrylen",
2045
FT_UINT8, BASE_DEC, NULL, 0,
2046
"Reverse Flow Entry Length.", HFILL }
2048
{ &hf_a11_rqi_flowstate,
2049
{ "Flow State", "a11.ext.rqi.flowstate",
2050
FT_UINT8, BASE_HEX, NULL, 0,
2051
"Reverse Flow State.", HFILL }
2053
{ &hf_a11_rqi_requested_qoslen,
2054
{ "Requested QoS Length", "a11.ext.rqi.reqqoslen",
2055
FT_UINT8, BASE_DEC, NULL, 0,
2056
"Reverse Requested QoS Length.", HFILL }
2058
{ &hf_a11_rqi_requested_qos,
2059
{ "Requested QoS", "a11.ext.rqi.reqqos",
2060
FT_BYTES, BASE_NONE, NULL, 0,
2061
"Reverse Requested QoS.", HFILL }
2063
{ &hf_a11_rqi_granted_qoslen,
2064
{ "Granted QoS Length", "a11.ext.rqi.graqoslen",
2065
FT_UINT8, BASE_DEC, NULL, 0,
2066
"Reverse Granted QoS Length.", HFILL }
2068
{ &hf_a11_rqi_granted_qos,
2069
{ "Granted QoS", "a11.ext.rqi.graqos",
2070
FT_BYTES, BASE_NONE, NULL, 0,
2071
"Reverse Granted QoS.", HFILL }
2073
{ &hf_a11_fqui_flowcount,
2074
{ "Forward QoS Update Flow Count", "a11.ext.fqui.flowcount",
2075
FT_UINT8, BASE_DEC, NULL, 0,
2076
"Forward QoS Update Flow Count.", HFILL }
2078
{ &hf_a11_rqui_flowcount,
2079
{ "Reverse QoS Update Flow Count", "a11.ext.rqui.flowcount",
2080
FT_UINT8, BASE_DEC, NULL, 0,
2081
"Reverse QoS Update Flow Count.", HFILL }
2083
{ &hf_a11_fqui_updated_qoslen,
2084
{ "Forward Updated QoS Sub-Blob Length", "a11.ext.fqui.updatedqoslen",
2085
FT_UINT8, BASE_DEC, NULL, 0,
2086
"Forward Updated QoS Sub-Blob Length.", HFILL }
2088
{ &hf_a11_fqui_updated_qos,
2089
{ "Forward Updated QoS Sub-Blob", "a11.ext.fqui.updatedqos",
2090
FT_BYTES, BASE_NONE, NULL, 0,
2091
"Forward Updated QoS Sub-Blob.", HFILL }
2093
{ &hf_a11_rqui_updated_qoslen,
2094
{ "Reverse Updated QoS Sub-Blob Length", "a11.ext.rqui.updatedqoslen",
2095
FT_UINT8, BASE_DEC, NULL, 0,
2096
"Reverse Updated QoS Sub-Blob Length.", HFILL }
2098
{ &hf_a11_rqui_updated_qos,
2099
{ "Reverse Updated QoS Sub-Blob", "a11.ext.rqui.updatedqos",
2100
FT_BYTES, BASE_NONE, NULL, 0,
2101
"Reverse Updated QoS Sub-Blob.", HFILL }
2103
{ & hf_a11_subsciber_profile_len,
2104
{ "Subscriber QoS Profile Length", "a11.ext.sqp.profilelen",
2105
FT_BYTES, BASE_NONE, NULL, 0,
2106
"Subscriber QoS Profile Length.", HFILL }
2108
{ & hf_a11_subsciber_profile,
2109
{ "Subscriber QoS Profile", "a11.ext.sqp.profile",
2110
FT_BYTES, BASE_NONE, NULL, 0,
2111
"Subscriber QoS Profile.", HFILL }
2115
/* Setup protocol subtree array */
2116
static gint *ett[] = {
2124
&ett_a11_fqi_flowentry,
2125
&ett_a11_rqi_flowentry,
2127
&ett_a11_fqi_entry_flags,
2128
&ett_a11_rqi_entry_flags,
2129
&ett_a11_fqui_flowentry,
2130
&ett_a11_rqui_flowentry,
2131
&ett_a11_subscriber_profile,
2134
/* Register the protocol name and description */
2135
proto_a11 = proto_register_protocol("3GPP2 A11", "3GPP2 A11", "a11");
2137
/* Register the dissector by name */
2138
new_register_dissector("a11", dissect_a11, proto_a11);
2140
/* Required function calls to register the header fields and subtrees used */
2141
proto_register_field_array(proto_a11, hf, array_length(hf));
2142
proto_register_subtree_array(ett, array_length(ett));
2153
2146
proto_reg_handoff_a11(void)
2155
dissector_handle_t a11_handle;
2148
dissector_handle_t a11_handle;
2157
a11_handle = find_dissector("a11");
2158
dissector_add("udp.port", UDP_PORT_3GA11, a11_handle);
2150
a11_handle = find_dissector("a11");
2151
dissector_add("udp.port", UDP_PORT_3GA11, a11_handle);