forked from osmocom/wireshark
![Jörg Mayer](/assets/img/avatar_default.png)
winapi_cleanup tool written by Patrik Stridvall for the wine project. svn path=/trunk/; revision=6117
4797 lines
159 KiB
C
4797 lines
159 KiB
C
/* packet-ranap.c
|
|
* Routines for Radio Access Network Application Part Protocol dissection
|
|
* Based on 3GPP TS 25.413 V3.4.0
|
|
* Copyright 2001, Martin Held <Martin.Held@icn.siemens.de>
|
|
*
|
|
* $Id: packet-ranap.c,v 1.15 2002/08/28 21:00:28 jmayer Exp $
|
|
*
|
|
* Ethereal - Network traffic analyzer
|
|
* By Gerald Combs <gerald@ethereal.com>
|
|
* Copyright 1998 Gerald Combs
|
|
*
|
|
* Copied from README.developer
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
#include <string.h>
|
|
#include <glib.h>
|
|
|
|
#include <epan/packet.h>
|
|
|
|
|
|
#define SCCP_SSN_RANAP 0x8E
|
|
#define SCCP_SSN_RANAP_C 0x19
|
|
#define SCCP_SSN_RANAP_D 0x1A
|
|
|
|
/* description of PDU header */
|
|
#define PDU_NUMBER_OF_OCTETS_OFFSET 3
|
|
|
|
/* PDU Index Values */
|
|
#define InitiatingMessage 0
|
|
#define SuccessfulOutcome 1
|
|
#define UnsuccessfulOutcome 2
|
|
#define Outcome 3
|
|
|
|
static const value_string ranap_pdu_index_values[] = {
|
|
{InitiatingMessage, "InitiatingMessage"},
|
|
{SuccessfulOutcome, "SuccessfulOutcome"},
|
|
{UnsuccessfulOutcome, "UnsuccessfulOutcome"},
|
|
{Outcome, "Outcome"},
|
|
{ 0, NULL}
|
|
};
|
|
|
|
|
|
/* Procedure Code Values */
|
|
#define PC_RAB_Assignment 0
|
|
#define PC_Iu_Release 1
|
|
#define PC_RelocationPreparation 2
|
|
#define PC_RelocationResourceAllocation 3
|
|
#define PC_RelocationCancel 4
|
|
#define PC_SRNS_ContextTransfer 5
|
|
#define PC_SecurityModeControl 6
|
|
#define PC_DataVolumeReport 7
|
|
#define PC_CN_InformationBroadcast 8
|
|
#define PC_Reset 9
|
|
#define PC_RAB_ReleaseRequest 10
|
|
#define PC_Iu_ReleaseRequest 11
|
|
#define PC_RelocationDetect 12
|
|
#define PC_RelocationComplete 13
|
|
#define PC_Paging 14
|
|
#define PC_CommonID 15
|
|
#define PC_CN_InvokeTrace 16
|
|
#define PC_LocationReportingControl 17
|
|
#define PC_LocationReport 18
|
|
#define PC_InitialUE_Message 19
|
|
#define PC_DirectTransfer 20
|
|
#define PC_OverloadControl 21
|
|
#define PC_ErrorIndication 22
|
|
#define PC_SRNS_DataForward 23
|
|
#define PC_ForwardSRNS_Context 24
|
|
#define PC_privateMessage 25
|
|
#define PC_CN_DeactivateTrace 26
|
|
#define PC_ResetResource 27
|
|
#define PC_RANAP_Relocation 28
|
|
#define PC_max 28
|
|
|
|
static const value_string ranap_procedure_code_values[] = {
|
|
{PC_RAB_Assignment, "RAB-Assignment"},
|
|
{PC_Iu_Release, "IU-Release"},
|
|
{PC_RelocationPreparation, "RelocationPreparation"},
|
|
{PC_RelocationResourceAllocation, "RelocationResourceAllocation"},
|
|
{PC_RelocationCancel, "RelocationCancel"},
|
|
{PC_SRNS_ContextTransfer, "SRNS-ContextTransfer"},
|
|
{PC_SecurityModeControl, "SecurityModeControl"},
|
|
{PC_DataVolumeReport, "DataVolumeReport"},
|
|
{PC_CN_InformationBroadcast, "CN-InformationBroadcast"},
|
|
{PC_Reset, "Reset"},
|
|
{PC_RAB_ReleaseRequest, "RAB-ReleaseRequest"},
|
|
{PC_Iu_ReleaseRequest, "Iu-ReleaseRequest"},
|
|
{PC_RelocationDetect, "RelocationDetect"},
|
|
{PC_RelocationComplete, "RelocationComplete"},
|
|
{PC_Paging, "Paging"},
|
|
{PC_CommonID, "CommonID"},
|
|
{PC_CN_InvokeTrace, "CN-InvokeTrace"},
|
|
{PC_LocationReportingControl, "LocationReportingControl"},
|
|
{PC_LocationReport, "LocationReport"},
|
|
{PC_InitialUE_Message, "InitialUE_Message"},
|
|
{PC_DirectTransfer, "DirectTransfer"},
|
|
{PC_OverloadControl, "OverloadControl"},
|
|
{PC_ErrorIndication, "ErrorIndication"},
|
|
{PC_SRNS_DataForward, "SRNS-DataForward"},
|
|
{PC_ForwardSRNS_Context, "ForwardSRNS-Context"},
|
|
{PC_privateMessage, "privateMessage"},
|
|
{PC_CN_DeactivateTrace, "CN-DeactivateTrace"},
|
|
{PC_ResetResource, "ResetResource"},
|
|
{PC_RANAP_Relocation, "RANAP-Relocation"},
|
|
{0, NULL}
|
|
};
|
|
|
|
|
|
static const value_string ranap_message_names[][5] = {
|
|
{/* PC_RAB_Assignment */
|
|
{ InitiatingMessage, "RAB-AssignmentRequest"},
|
|
{ SuccessfulOutcome, "undefined message"},
|
|
{ UnsuccessfulOutcome, "undefined message"},
|
|
{ Outcome, "RAB-AssignmentResponse"},
|
|
{ 0, NULL}, },
|
|
{ /* PC_Iu_Release */
|
|
{ InitiatingMessage, "Iu-ReleaseCommand"},
|
|
{ SuccessfulOutcome, "Iu-ReleaseComplete"},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RelocationPreparation */
|
|
{ InitiatingMessage, "RelocationRequired"},
|
|
{ SuccessfulOutcome, "RelocationCommand"},
|
|
{ UnsuccessfulOutcome, "RelocationPreparationFailure"},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RelocationResourceAllocation */
|
|
{ InitiatingMessage, "RelocationRequest"},
|
|
{ SuccessfulOutcome, "RelocationRequestAcknowledge"},
|
|
{ UnsuccessfulOutcome, "RelocationFailure"},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RelocationCancel */
|
|
{ InitiatingMessage, "RelocationCancel"},
|
|
{ SuccessfulOutcome, "RelocationCancelAcknowledge"},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_SRNS_ContextTransfer */
|
|
{ InitiatingMessage, "SRNS-ContextRequest"},
|
|
{ SuccessfulOutcome, "SRNS-ContextResponse"},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_SecurityModeControl */
|
|
{ InitiatingMessage, "SecurityModeCommand"},
|
|
{ SuccessfulOutcome, "SecurityModeComplete"},
|
|
{ UnsuccessfulOutcome, "SecurityModeReject"},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_DataVolumeReport */
|
|
{ InitiatingMessage, "DataVolumeReportRequest"},
|
|
{ SuccessfulOutcome, "DataVolumeReport"},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_CN_InformationBroadcast */
|
|
{ InitiatingMessage, "CN-InformationBroadcastRequest"},
|
|
{ SuccessfulOutcome, "CN-InformationBroadcastConfirm"},
|
|
{ UnsuccessfulOutcome, "CN-InformationBroadcastReject"},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_Reset */
|
|
{ InitiatingMessage, "Reset"},
|
|
{ SuccessfulOutcome, "ResetAcknowledge"},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RAB_ReleaseRequest */
|
|
{ InitiatingMessage, "RAB-ReleaseRequest"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_Iu_ReleaseRequest */
|
|
{ InitiatingMessage, "Iu-ReleaseRequest"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RelocationDetect */
|
|
{ InitiatingMessage, "RelocationDetect"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RelocationComplete */
|
|
{ InitiatingMessage, "RelocationComplete"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_Paging */
|
|
{ InitiatingMessage, "Paging"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_CommonID */
|
|
{ InitiatingMessage, "CommonID"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_CN_InvokeTrace */
|
|
{ InitiatingMessage, "CN-InvokeTrace"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{/* PC_LocationReportingControl */
|
|
{ InitiatingMessage, "LocationReportingControl"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_LocationReport */
|
|
{ InitiatingMessage, "LocationReport"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_InitialUE_Message */
|
|
{ InitiatingMessage, "InitialUE-Message"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_DirectTransfer */
|
|
{ InitiatingMessage, "DirectTransfer"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_OverloadControl */
|
|
{ InitiatingMessage, "Overload"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_ErrorIndication */
|
|
{ InitiatingMessage, "ErrorIndication"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_SRNS_DataForward */
|
|
{ InitiatingMessage, "SRNS-DataForwardCommand"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_ForwardSRNS_Context */
|
|
{ InitiatingMessage, "ForwardSRNS-Context"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_privateMessage */
|
|
{ InitiatingMessage, "PrivateMessage"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_CN_DeactivateTrace */
|
|
{ InitiatingMessage, "CN-DeactivateTrace"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_ResetResource */
|
|
{ InitiatingMessage, "ResetResource"},
|
|
{ SuccessfulOutcome, "ResetResourceAcknowledge"},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, },
|
|
{ /* PC_RANAP_Relocation */
|
|
{ InitiatingMessage, "RANAP-RelocationInformation"},
|
|
{ SuccessfulOutcome, NULL},
|
|
{ UnsuccessfulOutcome, NULL},
|
|
{ Outcome, NULL},
|
|
{ 0, NULL}, }
|
|
};
|
|
|
|
|
|
/* Criticality Values */
|
|
#define CR_reject 0
|
|
#define CR_ignore 1
|
|
#define CR_notify 2
|
|
|
|
static const value_string ranap_criticality_values[] = {
|
|
{CR_reject, "reject"},
|
|
{CR_ignore, "ignore"},
|
|
{CR_notify, "notify"},
|
|
{0, NULL}};
|
|
|
|
|
|
/* presence values for optional components */
|
|
#define PR_not_present 0
|
|
#define PR_present 1
|
|
|
|
static const value_string ranap_presence_values[] = {
|
|
{PR_not_present, "not present"},
|
|
{PR_present, "present"},
|
|
{0, NULL}};
|
|
|
|
|
|
/* description of IE Header */
|
|
#define IE_ID_LENGTH 2
|
|
#define IE_CRITICALITY_LENGTH 1
|
|
|
|
|
|
/* description of IE-ID values */
|
|
#define IE_AreaIdentity 0
|
|
#define IE_CN_BroadcastInformationPiece 1
|
|
#define IE_CN_BroadcastInformationPieceList 2
|
|
#define IE_CN_DomainIndicator 3
|
|
#define IE_Cause 4
|
|
#define IE_ChosenEncryptionAlgorithm 5
|
|
#define IE_ChosenIntegrityProtectionAlgorithm 6
|
|
#define IE_ClassmarkInformation2 7
|
|
#define IE_ClassmarkInformation3 8
|
|
#define IE_CriticalityDiagnostics 9
|
|
#define IE_DL_GTP_PDU_SequenceNumber 10
|
|
#define IE_EncryptionInformation 11
|
|
#define IE_IntegrityProtectionInformation 12
|
|
#define IE_IuTransportAssociation 13
|
|
#define IE_L3_Information 14
|
|
#define IE_LAI 15
|
|
#define IE_NAS_PDU 16
|
|
#define IE_NonSearchingIndication 17
|
|
#define IE_NumberOfSteps 18
|
|
#define IE_OMC_ID 19
|
|
#define IE_OldBSS_ToNewBSS_Information 20
|
|
#define IE_PagingAreaID 21
|
|
#define IE_PagingCause 22
|
|
#define IE_PermanentNAS_UE_ID 23
|
|
#define IE_RAB_ContextItem 24
|
|
#define IE_RAB_ContextList 25
|
|
#define IE_RAB_DataForwardingItem 26
|
|
#define IE_RAB_DataForwardingItem_SRNS_CtxReq 27
|
|
#define IE_RAB_DataForwardingList 28
|
|
#define IE_RAB_DataForwardingList_SRNS_CtxReq 29
|
|
#define IE_RAB_DataVolumeReportItem 30
|
|
#define IE_RAB_DataVolumeReportList 31
|
|
#define IE_RAB_DataVolumeReportRequestItem 32
|
|
#define IE_RAB_DataVolumeReportRequestList 33
|
|
#define IE_RAB_FailedItem 34
|
|
#define IE_RAB_FailedList 35
|
|
#define IE_RAB_ID 36
|
|
#define IE_RAB_QueuedItem 37
|
|
#define IE_RAB_QueuedList 38
|
|
#define IE_RAB_ReleaseFailedList 39
|
|
#define IE_RAB_ReleaseItem 40
|
|
#define IE_RAB_ReleaseList 41
|
|
#define IE_RAB_ReleasedItem 42
|
|
#define IE_RAB_ReleasedList 43
|
|
#define IE_RAB_ReleasedList_IuRelComp 44
|
|
#define IE_RAB_RelocationReleaseItem 45
|
|
#define IE_RAB_RelocationReleaseList 46
|
|
#define IE_RAB_SetupItem_RelocReq 47
|
|
#define IE_RAB_SetupItem_RelocReqAck 48
|
|
#define IE_RAB_SetupList_RelocReq 49
|
|
#define IE_RAB_SetupList_RelocReqAck 50
|
|
#define IE_RAB_SetupOrModifiedItem 51
|
|
#define IE_RAB_SetupOrModifiedList 52
|
|
#define IE_RAB_SetupOrModifyItem 53
|
|
#define IE_RAB_SetupOrModifyList 54
|
|
#define IE_RAC 55
|
|
#define IE_RelocationType 56
|
|
#define IE_RequestType 57
|
|
#define IE_SAI 58
|
|
#define IE_SAPI 59
|
|
#define IE_SourceID 60
|
|
#define IE_SourceRNC_ToTargetRNC_TransparentContainer 61
|
|
#define IE_TargetID 62
|
|
#define IE_TargetRNC_ToSourceRNC_TransparentContainer 63
|
|
#define IE_TemporaryUE_ID 64
|
|
#define IE_TraceReference 65
|
|
#define IE_TraceType 66
|
|
#define IE_TransportLayerAddress 67
|
|
#define IE_TriggerID 68
|
|
#define IE_UE_ID 69
|
|
#define IE_UL_GTP_PDU_SequenceNumber 70
|
|
#define IE_RAB_FailedtoReportItem 71
|
|
#define IE_RAB_FailedtoReportList 72
|
|
#define IE_KeyStatus 75
|
|
#define IE_DRX_CycleLengthCoefficient 76
|
|
#define IE_IuSigConIdList 77
|
|
#define IE_IuSigConIdItem 78
|
|
#define IE_IuSigConId 79
|
|
#define IE_DirectTransferInformationItem_RANAP_RelocInf 80
|
|
#define IE_DirectTransferInformationList_RANAP_RelocInf 81
|
|
#define IE_RAB_ContextItem_RANAP_RelocInf 82
|
|
#define IE_RAB_ContextList_RANAP_RelocInf 83
|
|
#define IE_RAB_ContextFailedtoTransferItem 84
|
|
#define IE_RAB_ContextFailedtoTransferList 85
|
|
#define IE_GlobalRNC_ID 86
|
|
#define IE_RAB_ReleasedItem_IuRelComp 87
|
|
|
|
static const value_string ranap_ie_id_values[] = {
|
|
{IE_AreaIdentity, "AreaIdentity"},
|
|
{IE_CN_BroadcastInformationPiece, "CN_BroadcastInformationPiece"},
|
|
{IE_CN_BroadcastInformationPieceList, "CN_BroadcastInformationPieceList"},
|
|
{IE_CN_DomainIndicator, "CN_DomainIndicator"},
|
|
{IE_Cause, "Cause"},
|
|
{IE_ChosenEncryptionAlgorithm, "ChosenEncryptionAlgorithm"},
|
|
{IE_ChosenIntegrityProtectionAlgorithm, "ChosenIntegrityProtectionAlgorithm"},
|
|
{IE_ClassmarkInformation2, "ClassmarkInformation2"},
|
|
{IE_ClassmarkInformation3, "ClassmarkInformation3"},
|
|
{IE_CriticalityDiagnostics, "CriticalityDiagnostics"},
|
|
{IE_DL_GTP_PDU_SequenceNumber, "DL_GTP_PDU_SequenceNumber"},
|
|
{IE_EncryptionInformation, "EncryptionInformation"},
|
|
{IE_IntegrityProtectionInformation, "IntegrityProtectionInformation"},
|
|
{IE_IuTransportAssociation, "IuTransportAssociation"},
|
|
{IE_L3_Information, "L3_Information"},
|
|
{IE_LAI, "LAI"},
|
|
{IE_NAS_PDU, "NAS_PDU"},
|
|
{IE_NonSearchingIndication, "NonSearchingIndication"},
|
|
{IE_NumberOfSteps, "NumberOfSteps"},
|
|
{IE_OMC_ID, "OMC_ID"},
|
|
{IE_OldBSS_ToNewBSS_Information, "OldBSS_ToNewBSS_Information"},
|
|
{IE_PagingAreaID, "PagingAreaID"},
|
|
{IE_PagingCause, "PagingCause"},
|
|
{IE_PermanentNAS_UE_ID, "PermanentNAS_UE_ID"},
|
|
{IE_RAB_ContextItem, "RAB_ContextItem"},
|
|
{IE_RAB_ContextList, "RAB_ContextList"},
|
|
{IE_RAB_DataForwardingItem, "RAB_DataForwardingItem"},
|
|
{IE_RAB_DataForwardingItem_SRNS_CtxReq, "RAB_DataForwardingItem_SRNS_CtxReq"},
|
|
{IE_RAB_DataForwardingList, "RAB_DataForwardingList"},
|
|
{IE_RAB_DataForwardingList_SRNS_CtxReq, "RAB_DataForwardingList_SRNS_CtxReq"},
|
|
{IE_RAB_DataVolumeReportItem, "RAB_DataVolumeReportItem"},
|
|
{IE_RAB_DataVolumeReportList, "RAB_DataVolumeReportList"},
|
|
{IE_RAB_DataVolumeReportRequestItem, "RAB_DataVolumeReportRequestItem"},
|
|
{IE_RAB_DataVolumeReportRequestList, "RAB_DataVolumeReportRequestList"},
|
|
{IE_RAB_FailedItem, "RAB_FailedItem"},
|
|
{IE_RAB_FailedList, "RAB_FailedList"},
|
|
{IE_RAB_ID, "RAB_ID"},
|
|
{IE_RAB_QueuedItem, "RAB_QueuedItem"},
|
|
{IE_RAB_QueuedList, "RAB_QueuedList"},
|
|
{IE_RAB_ReleaseFailedList, "RAB_ReleaseFailedList"},
|
|
{IE_RAB_ReleaseItem, "RAB_ReleaseItem"},
|
|
{IE_RAB_ReleaseList, "RAB_ReleaseList"},
|
|
{IE_RAB_ReleasedItem, "RAB_ReleasedItem"},
|
|
{IE_RAB_ReleasedList, "RAB_ReleasedList"},
|
|
{IE_RAB_ReleasedList_IuRelComp, "RAB_ReleasedList_IuRelComp"},
|
|
{IE_RAB_RelocationReleaseItem, "RAB_RelocationReleaseItem"},
|
|
{IE_RAB_RelocationReleaseList, "RAB_RelocationReleaseList"},
|
|
{IE_RAB_SetupItem_RelocReq, "RAB_SetupItem_RelocReq"},
|
|
{IE_RAB_SetupItem_RelocReqAck, "RAB_SetupItem_RelocReqAck"},
|
|
{IE_RAB_SetupList_RelocReq, "RAB_SetupList_RelocReq"},
|
|
{IE_RAB_SetupList_RelocReqAck, "RAB_SetupList_RelocReqAck"},
|
|
{IE_RAB_SetupOrModifiedItem, "RAB_SetupOrModifiedItem"},
|
|
{IE_RAB_SetupOrModifiedList, "RAB_SetupOrModifiedList"},
|
|
{IE_RAB_SetupOrModifyItem, "RAB_SetupOrModifyItem"},
|
|
{IE_RAB_SetupOrModifyList, "RAB_SetupOrModifyList"},
|
|
{IE_RAC, "RAC"},
|
|
{IE_RelocationType, "RelocationType"},
|
|
{IE_RequestType, "RequestType"},
|
|
{IE_SAI, "SAI"},
|
|
{IE_SAPI, "SAPI"},
|
|
{IE_SourceID, "SourceID"},
|
|
{IE_SourceRNC_ToTargetRNC_TransparentContainer,
|
|
"SourceRNC_ToTargetRNC_TransparentContainer"},
|
|
{IE_TargetID, "TargetID"},
|
|
{IE_TargetRNC_ToSourceRNC_TransparentContainer,
|
|
"TargetRNC_ToSourceRNC_TransparentContainer"},
|
|
{IE_TemporaryUE_ID, "TemporaryUE_ID"},
|
|
{IE_TraceReference, "TraceReference"},
|
|
{IE_TraceType, "TraceType"},
|
|
{IE_TransportLayerAddress, "TransportLayerAddress"},
|
|
{IE_TriggerID, "TriggerID"},
|
|
{IE_UE_ID, "UE_ID"},
|
|
{IE_UL_GTP_PDU_SequenceNumber, "UL_GTP_PDU_SequenceNumber"},
|
|
{IE_RAB_FailedtoReportItem, "RAB_FailedtoReportItem"},
|
|
{IE_RAB_FailedtoReportList, "RAB_FailedtoReportList"},
|
|
{IE_KeyStatus, "KeyStatus"},
|
|
{IE_DRX_CycleLengthCoefficient, "DRX_CycleLengthCoefficient"},
|
|
{IE_IuSigConIdList, "IuSigConIdList"},
|
|
{IE_IuSigConIdItem, "IuSigConIdItem"},
|
|
{IE_IuSigConId, "IuSigConId"},
|
|
{IE_DirectTransferInformationItem_RANAP_RelocInf,
|
|
"DirectTransferInformationItem_RANAP_RelocInf"},
|
|
{IE_DirectTransferInformationList_RANAP_RelocInf,
|
|
"DirectTransferInformationList_RANAP_RelocInf"},
|
|
{IE_RAB_ContextItem_RANAP_RelocInf, "RAB_ContextItem_RANAP_RelocInf"},
|
|
{IE_RAB_ContextList_RANAP_RelocInf, "RAB_ContextList_RANAP_RelocInf"},
|
|
{IE_RAB_ContextFailedtoTransferItem, "RAB_ContextFailedtoTransferItem"},
|
|
{IE_RAB_ContextFailedtoTransferList, "RAB_ContextFailedtoTransferList"},
|
|
{IE_GlobalRNC_ID, "GlobalRNC_ID"},
|
|
{IE_RAB_ReleasedItem_IuRelComp, "RAB_ReleasedItem_IuRelComp"},
|
|
{0, NULL}
|
|
};
|
|
|
|
|
|
/* Description of IE-Contents */
|
|
|
|
/* Length of fields within IEs */
|
|
#define RAB_ID_LENGTH 1
|
|
#define PLMN_ID_LENGTH 3
|
|
#define LAC_LENGTH 2
|
|
#define IE_PROTOCOL_EXTENSION_LENGTH 1
|
|
#define RAC_LENGTH 1
|
|
#define SAC_LENGTH 2
|
|
#define NUM_RABS_LENGTH 1
|
|
|
|
|
|
/* Traffic Class values */
|
|
#define TC_conversational 0
|
|
#define TC_streaming 1
|
|
#define TC_interactive 2
|
|
#define TC_background 3
|
|
|
|
static const value_string ranap_trafficClass_values[] = {
|
|
{TC_conversational, "conversational"},
|
|
{TC_streaming, "streaming"},
|
|
{TC_interactive, "interactive"},
|
|
{TC_background, "background"},
|
|
{0, NULL}};
|
|
|
|
|
|
/* rAB-AsymmetryIndicator values */
|
|
#define AI_symmetric_bidirectional 0
|
|
#define AI_asymmetric_unidirectional_downlink 1
|
|
#define AI_asymmetric_unidirectional_uplink 2
|
|
#define AI_asymmetric_bidirectional 3
|
|
|
|
static const value_string ranap_rAB_AsymmetryIndicator_values[] = {
|
|
{AI_symmetric_bidirectional, "symmetric-bidirectional"},
|
|
{AI_asymmetric_unidirectional_downlink, "asymmetric-unidirectional-downlink"},
|
|
{AI_asymmetric_unidirectional_uplink, "asymmetric-unidirectional-uplink"},
|
|
{AI_asymmetric_bidirectional, "asymmetric-bidirectional"},
|
|
{0, NULL}};
|
|
|
|
|
|
/* DeliveryOrder values */
|
|
#define DO_delivery_order_requested 0
|
|
#define DO_delivery_order_not_requested 1
|
|
|
|
static const value_string ranap_DeliveryOrder_values[] = {
|
|
{DO_delivery_order_requested, "delivery-order-requested"},
|
|
{DO_delivery_order_not_requested, "delivery-order-not-requested"},
|
|
{0, NULL}};
|
|
|
|
#define maxSDU_Size_LENGTH 2
|
|
|
|
/* deliveryOfErroneousSDU values */
|
|
#define DOES_yes 0
|
|
#define DOES_no 1
|
|
#define DOES_no_error_detection_consideration 2
|
|
|
|
static const value_string ranap_deliveryOfErroneousSDU_values[] = {
|
|
{DOES_yes, "yes"},
|
|
{DOES_no, "no"},
|
|
{DOES_no_error_detection_consideration, "no-error-detection-consideration"},
|
|
{0, NULL}};
|
|
|
|
|
|
#define subflowSDU_Size_LENGTH 2
|
|
#define transferDelay_LENGTH 2
|
|
|
|
|
|
/* trafficHandlingPriority values */
|
|
static const value_string ranap_priority_values[] = {
|
|
{ 0, "spare"},
|
|
{ 1, "highest"},
|
|
{ 2, ""},
|
|
{ 3, ""},
|
|
{ 4, ""},
|
|
{ 5, ""},
|
|
{ 6, ""},
|
|
{ 7, ""},
|
|
{ 8, ""},
|
|
{ 9, ""},
|
|
{ 10, ""},
|
|
{ 11, ""},
|
|
{ 12, ""},
|
|
{ 13, ""},
|
|
{ 14, "lowest"},
|
|
{ 15, "no-priority-used"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* pre-emptionCapability values */
|
|
static const value_string ranap_pre_emptionCapability_values[] = {
|
|
{ 0, "shall-not-trigger-pre-emption"},
|
|
{ 1, "may-trigger-pre-emption"},
|
|
{ 0, NULL}};
|
|
|
|
/* pre-emptionVulnerability values */
|
|
static const value_string ranap_pre_emptionVulnerability_values[] = {
|
|
{ 0, "not-pre-emptable"},
|
|
{ 1, "pre-emptable"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* queuingAllowed values */
|
|
static const value_string ranap_queuingAllowed_values[] = {
|
|
{ 0, "queueing-not-allowed"},
|
|
{ 1, "queueing-allowed"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* sourceStatisticsDescriptor values */
|
|
static const value_string ranap_sourceStatisticsDescriptor_values[] = {
|
|
{ 0, "speech"},
|
|
{ 1, "unknown"},
|
|
{ 0, NULL}};
|
|
|
|
/* relocationRequirement values */
|
|
static const value_string ranap_relocationRequirement_values[] = {
|
|
{ 0, "lossless"},
|
|
{ 1, "none"},
|
|
{ 0, NULL}};
|
|
|
|
/* userPlaneMode values */
|
|
static const value_string ranap_userPlaneMode_values[] = {
|
|
{ 0, "transparent-mode"},
|
|
{ 1, "support-mode-for-predefined-SDU-sizes"},
|
|
{ 0, NULL}};
|
|
|
|
/* PDP_Type values */
|
|
static const value_string ranap_PDP_Type_values[] = {
|
|
{ 0, "empty"},
|
|
{ 1, "ppp"},
|
|
{ 2, "osp-ihoss"},
|
|
{ 3, "ipv4"},
|
|
{ 4, "ipv6"},
|
|
{ 0, NULL}};
|
|
|
|
/* dataVolumeReportingIndication values */
|
|
static const value_string ranap_dataVolumeReportingIndication_values[] = {
|
|
{ 0, "do-report"},
|
|
{ 1, "do-not-report"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* cause_choice values */
|
|
#define CC_CauseRadioNetwork 0
|
|
#define CC_CauseTransmissionNetwork 1
|
|
#define CC_CauseNAS 2
|
|
#define CC_CauseProtocol 3
|
|
#define CC_CauseMisc 4
|
|
#define CC_CauseNon_Standard 5
|
|
|
|
static const value_string ranap_cause_choice_values[] = {
|
|
{ CC_CauseRadioNetwork, "CauseRadioNetwork"},
|
|
{ CC_CauseTransmissionNetwork, "CauseTransmissionNetwork"},
|
|
{ CC_CauseNAS, "CauseNAS"},
|
|
{ CC_CauseProtocol, "CauseProtocol"},
|
|
{ CC_CauseMisc, "CauseMisc"},
|
|
{ CC_CauseNon_Standard, "CauseNon-Standard"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* cause values */
|
|
static const value_string ranap_cause_value_str[] = {
|
|
/* CauseRadioNetwork (1..64) */
|
|
{ 1, "rab-pre-empted"},
|
|
{ 2, "trelocoverall-expiry"},
|
|
{ 3, "trelocprep-expiry"},
|
|
{ 4, "treloccomplete-expiry"},
|
|
{ 5, "tqueing-expiry"},
|
|
{ 6, "relocation-triggered"},
|
|
{ 7, "trellocalloc-expiry"},
|
|
{ 8, "unable-to-establish-during-relocation"},
|
|
{ 9, "unknown-target-rnc"},
|
|
{ 10, "relocation-cancelled"},
|
|
{ 11, "successful-relocation"},
|
|
{ 12, "requested-ciphering-and-or-integrity-protection-algorithms-not-supported"},
|
|
{ 13, "change-of-ciphering-and-or-integrity-protection-is-not-supported"},
|
|
{ 14, "failure-in-the-radio-interface-procedure"},
|
|
{ 15, "release-due-to-utran-generated-reason"},
|
|
{ 16, "user-inactivity"},
|
|
{ 17, "time-critical-relocation"},
|
|
{ 18, "requested-traffic-class-not-available"},
|
|
{ 19, "invalid-rab-parameters-value"},
|
|
{ 20, "requested-maximum-bit-rate-not-available"},
|
|
{ 21, "requested-guaranteed-bit-rate-not-available"},
|
|
{ 22, "requested-transfer-delay-not-achievable"},
|
|
{ 23, "invalid-rab-parameters-combination"},
|
|
{ 24, "condition-violation-for-sdu-parameters"},
|
|
{ 25, "condition-violation-for-traffic-handling-priority"},
|
|
{ 26, "condition-violation-for-guaranteed-bit-rate"},
|
|
{ 27, "user-plane-versions-not-supported"},
|
|
{ 28, "iu-up-failure"},
|
|
{ 29, "relocation-failure-in-target-CN-RNC-or-target-system"},
|
|
{ 30, "invalid-RAB-ID"},
|
|
{ 31, "no-remaining-rab"},
|
|
{ 32, "interaction-with-other-procedure"},
|
|
{ 33, "requested-maximum-bit-rate-for-dl-not-available"},
|
|
{ 34, "requested-maximum-bit-rate-for-ul-not-available"},
|
|
{ 35, "requested-guaranteed-bit-rate-for-dl-not-available"},
|
|
{ 36, "requested-guaranteed-bit-rate-for-ul-not-available"},
|
|
{ 37, "repeated-integrity-checking-failure"},
|
|
{ 38, "requested-report-type-not-supported"},
|
|
{ 39, "request-superseded"},
|
|
{ 40, "release-due-to-UE-generated-signalling-connection-release"},
|
|
{ 41, "resource-optimisation-relocation"},
|
|
{ 42, "requested-information-not-available"},
|
|
{ 43, "relocation-desirable-for-radio-reasons"},
|
|
{ 44, "relocation-not-supported-in-target-RNC-or-target-system"},
|
|
{ 45, "directed-retry"},
|
|
{ 46, "radio-connection-with-UE-Lost"},
|
|
|
|
/* CauseTransmissionNetwork (65..80) */
|
|
{ 65, "logical-error-unknown-iu-transport-association"},
|
|
{ 66, "iu-transport-connection-failed-to-establish"},
|
|
|
|
/* CauseNAS (81..96) */
|
|
{ 81, "user-restriction-start-indication"},
|
|
{ 82, "user-restriction-end-indication"},
|
|
{ 83, "normal-release"},
|
|
|
|
/* CauseProtocol (97..112) */
|
|
{ 97, "transfer-syntax-error"},
|
|
{ 98, "semantic-error"},
|
|
{ 99, "message-not-compatible-with-receiver-state"},
|
|
{100, "abstract-syntax-error-reject"},
|
|
{101, "abstract-syntax-error-ignore-and-notify"},
|
|
{102, "abstract-syntax-error-falsely-constructed-message"},
|
|
|
|
/* CauseMisc (113..128) */
|
|
{113, "om-intervention"},
|
|
{114, "no-resource-available"},
|
|
{115, "unspecified-failure"},
|
|
{116, "network-optimisation"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* CN_DomainIndicator_values */
|
|
static const value_string ranap_CN_DomainIndicator_values[] = {
|
|
{ 0, "cs-domain"},
|
|
{ 1, "ps-domain"},
|
|
{ 0, NULL}};
|
|
|
|
|
|
/* SAPI_values */
|
|
static const value_string ranap_SAPI_values[] = {
|
|
{ 0, "sapi-0"},
|
|
{ 1, "sapi-3"},
|
|
{ 0, NULL}};
|
|
|
|
/* service_Handover_values */
|
|
static const value_string ranap_service_Handover_values[] = {
|
|
{ 0, "handover-to-GSM-should-be-performed"},
|
|
{ 1, "handover-to-GSM-should-not-be-performed"},
|
|
{ 2, "handover-to-GSM-shall-not-be-performed"},
|
|
{ 0, NULL}};
|
|
|
|
/* Initialize the protocol and registered fields */
|
|
/* protocol */
|
|
static int proto_ranap = -1;
|
|
|
|
/* pdu header fields */
|
|
static int hf_ranap_pdu_number_of_octets = -1;
|
|
static int hf_ranap_pdu_index = -1;
|
|
static int hf_ranap_procedure_code = -1;
|
|
static int hf_ranap_pdu_criticality = -1;
|
|
static int hf_ranap_number_of_ies = -1;
|
|
|
|
/* ie header fields */
|
|
static int hf_ranap_ie_ie_id = -1;
|
|
static int hf_ranap_ie_criticality = -1;
|
|
static int hf_ranap_ie_number_of_octets = -1;
|
|
static int hf_ranap_ie_protocol_extension = -1;
|
|
|
|
/*ie contents fields */
|
|
static int hf_ranap_number_of_ies_in_list = -1;
|
|
static int hf_ranap_ie_pair_first_criticality = -1;
|
|
static int hf_ranap_ie_pair_second_criticality = -1;
|
|
static int hf_ranap_first_value_number_of_octets = -1;
|
|
static int hf_ranap_second_value_number_of_octets = -1;
|
|
static int hf_ranap_rab_id = -1;
|
|
static int hf_ranap_nas_pdu = -1;
|
|
static int hf_ranap_plmn_id = -1;
|
|
static int hf_ranap_lac = -1;
|
|
static int hf_ranap_sac = -1;
|
|
static int hf_ranap_rac = -1;
|
|
static int hf_ranap_nAS_SynchronisationIndicator = -1;
|
|
static int hf_ranap_trafficClass = -1;
|
|
static int hf_ranap_deliveryOrder = -1;
|
|
static int hf_ranap_iE_Extensions_present = -1;
|
|
static int hf_ranap_num_rabs = -1;
|
|
static int hf_ranap_nAS_SynchronisationIndicator_present = -1;
|
|
static int hf_ranap_rAB_Parameters_present = -1;
|
|
static int hf_ranap_userPlaneInformation_present = -1;
|
|
static int hf_ranap_transportLayerInformation_present = -1;
|
|
static int hf_ranap_service_Handover_present = -1;
|
|
static int hf_ranap_guaranteedBitRate_present = -1;
|
|
static int hf_ranap_transferDelay_present = -1;
|
|
static int hf_ranap_trafficHandlingPriority_present = -1;
|
|
static int hf_ranap_allocationOrRetentionPriority_present = -1;
|
|
static int hf_ranap_sourceStatisticsDescriptor_present = -1;
|
|
static int hf_ranap_relocationRequirement_present = -1;
|
|
static int hf_ranap_rAB_AsymmetryIndicator = -1;
|
|
static int hf_ranap_maxBitrate = -1;
|
|
static int hf_ranap_guaranteedBitrate = -1;
|
|
static int hf_ranap_maxSDU_Size = -1;
|
|
static int hf_ranap_sDU_ErrorRatio_mantissa = -1;
|
|
static int hf_ranap_sDU_ErrorRatio_exponent = -1;
|
|
static int hf_ranap_residualBitErrorRatio_mantissa = -1;
|
|
static int hf_ranap_residualBitErrorRatio_exponent = -1;
|
|
static int hf_ranap_deliveryOfErroneousSDU = -1;
|
|
static int hf_ranap_subflowSDU_Size = -1;
|
|
static int hf_ranap_rAB_SubflowCombinationBitRate = -1;
|
|
static int hf_ranap_sDU_ErrorRatio_present = -1;
|
|
static int hf_ranap_sDU_FormatInformationParameters_present = -1;
|
|
static int hf_ranap_subflowSDU_Size_present = -1;
|
|
static int hf_ranap_rAB_SubflowCombinationBitRate_present = -1;
|
|
static int hf_ranap_transferDelay = -1;
|
|
static int hf_ranap_trafficHandlingPriority = -1;
|
|
static int hf_ranap_priorityLevel = -1;
|
|
static int hf_ranap_pre_emptionCapability = -1;
|
|
static int hf_ranap_pre_emptionVulnerability = -1;
|
|
static int hf_ranap_queuingAllowed = -1;
|
|
static int hf_ranap_sourceStatisticsDescriptor = -1;
|
|
static int hf_ranap_userPlaneMode = -1;
|
|
static int hf_ranap_uP_ModeVersions = -1;
|
|
static int hf_ranap_number_of_ProtocolExtensionFields = -1;
|
|
static int hf_ranap_ext_field_id = -1;
|
|
static int hf_ranap_ext_field_criticality = -1;
|
|
static int hf_ranap_ext_field_number_of_octets = -1;
|
|
static int hf_ranap_transportLayerAddress = -1;
|
|
static int hf_ranap_transportLayerAddress_length = -1;
|
|
static int hf_ranap_gTP_TEI = -1;
|
|
static int hf_ranap_bindingID = -1;
|
|
static int hf_ranap_pDP_TypeInformation_present = -1;
|
|
static int hf_ranap_dataVolumeReportingIndication_present = -1;
|
|
static int hf_ranap_dl_GTP_PDU_SequenceNumber_present = -1;
|
|
static int hf_ranap_ul_GTP_PDU_SequenceNumber_present = -1;
|
|
static int hf_ranap_dl_N_PDU_SequenceNumber_present = -1;
|
|
static int hf_ranap_ul_N_PDU_SequenceNumber_present = -1;
|
|
static int hf_ranap_PDP_Type = -1;
|
|
static int hf_ranap_dataVolumeReportingIndication = -1;
|
|
static int hf_ranap_dl_GTP_PDU_SequenceNumber = -1;
|
|
static int hf_ranap_ul_GTP_PDU_SequenceNumber = -1;
|
|
static int hf_ranap_dl_N_PDU_SequenceNumber = -1;
|
|
static int hf_ranap_ul_N_PDU_SequenceNumber = -1;
|
|
static int hf_ranap_cause_choice = -1;
|
|
static int hf_ranap_cause_value = -1;
|
|
static int hf_ranap_transportLayerAddress_present = -1;
|
|
static int hf_ranap_iuTransportAssociation_present = -1;
|
|
static int hf_ranap_dl_dataVolumes_present = -1;
|
|
static int hf_ranap_dataVolumeReference_present = -1;
|
|
static int hf_ranap_dl_UnsuccessfullyTransmittedDataVolume = -1;
|
|
static int hf_ranap_dataVolumeReference = -1;
|
|
static int hf_ranap_procedureCode_present = -1;
|
|
static int hf_ranap_triggeringMessage_present = -1;
|
|
static int hf_ranap_procedureCriticality_present = -1;
|
|
static int hf_ranap_iEsCriticalityDiagnostics_present = -1;
|
|
static int hf_ranap_triggeringMessage = -1;
|
|
static int hf_ranap_iECriticality = -1;
|
|
static int hf_ranap_procedureCriticality = -1;
|
|
static int hf_ranap_repetitionNumber = -1;
|
|
static int hf_ranap_num_of_CriticalityDiagnostics_IEs = -1;
|
|
static int hf_ranap_repetitionNumber_present = -1;
|
|
static int hf_ranap_dl_UnsuccessfullyTransmittedDataVolume_present = -1;
|
|
static int hf_ranap_CN_DomainIndicator = -1;
|
|
static int hf_ranap_IuSigConId = -1;
|
|
static int hf_ranap_SAPI = -1;
|
|
static int hf_ranap_msg_extension_present = -1;
|
|
static int hf_ranap_ProtocolExtensionContainer_present = -1;
|
|
static int hf_ranap_nas_pdu_length = -1;
|
|
static int hf_ranap_relocationRequirement = -1;
|
|
static int hf_ranap_service_Handover = -1;
|
|
static int hf_ranap_extension_field = -1;
|
|
|
|
|
|
/* subtrees */
|
|
static gint ett_ranap = -1;
|
|
static gint ett_ranap_optionals = -1;
|
|
static gint ett_ranap_iE_Extension = -1;
|
|
static gint ett_ranap_ie = -1;
|
|
static gint ett_ranap_ie_pair = -1;
|
|
static gint ett_ranap_rab = -1;
|
|
static gint ett_ranap_ie_pair_first_value = -1;
|
|
static gint ett_ranap_ie_pair_second_value = -1;
|
|
static gint ett_ranap_rAB_Parameters = -1;
|
|
static gint ett_ranap_sDU = -1;
|
|
static gint ett_ranap_allocationOrRetentionPriority = -1;
|
|
static gint ett_ranap_CriticalityDiagnostics_IE = -1;
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Utility Functions */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
/* sets *offset and *bitoffset n bits further */
|
|
static void
|
|
proceed_nbits(gint *offset, gint *bitoffset, gint n)
|
|
{
|
|
*bitoffset += n;
|
|
*offset += *bitoffset / 8;
|
|
*bitoffset %= 8;
|
|
}
|
|
|
|
/* sets *offset and *bitoffset to the next byte boundary */
|
|
static void allign(gint *offset, gint *bitoffset)
|
|
{
|
|
if ( *bitoffset != 0 )
|
|
{
|
|
(*offset)++;
|
|
*bitoffset=0;
|
|
}
|
|
}
|
|
|
|
/* sets *offset and *bitoffset behind the following integer */
|
|
static void
|
|
proceed_perint32(gint *offset, gint *bitoffset, gint length)
|
|
{
|
|
proceed_nbits(offset, bitoffset, 2);
|
|
allign(offset, bitoffset);
|
|
*offset += length;
|
|
}
|
|
|
|
|
|
/* extract length field found at offset */
|
|
/* if length field spans more than two bytes -1 is returned and the field is not decoded */
|
|
static guint8
|
|
extract_length(tvbuff_t *tvb, gint offset, gint *length, gint *length_size)
|
|
{
|
|
guint8 tmp_length8;
|
|
guint16 tmp_length16;
|
|
|
|
tmp_length8 = tvb_get_guint8(tvb, offset);
|
|
if ((tmp_length8 & 0x80) == 0)
|
|
{
|
|
/* length coded in one byte */
|
|
*length = tmp_length8;
|
|
*length_size = 1;
|
|
}
|
|
else
|
|
{
|
|
tmp_length16 = tvb_get_ntohs(tvb, offset);
|
|
if ( ((tmp_length16 & 0x8000) == 0x8000) && ((tmp_length16 & 0x4000) == 0) )
|
|
{
|
|
/* length coded in two bytes */
|
|
*length = tmp_length16 & 0x3FFF;
|
|
*length_size = 2;
|
|
}
|
|
else
|
|
{ /* length is coded in more than 2 bytes */
|
|
return (-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
/* extract the next n bits and return them alligned to the LSB */
|
|
static guint8
|
|
extract_nbits(tvbuff_t *tvb, gint offset, gint bitoffset, gint n)
|
|
{
|
|
guint8 uint_bits;
|
|
guint16 tmp_2bytes;
|
|
|
|
/* extract value */
|
|
if (bitoffset + n <= 8)
|
|
{
|
|
/* all bits contained in one byte */
|
|
uint_bits = tvb_get_guint8(tvb, offset);
|
|
uint_bits <<= bitoffset; /* remove bitoffset */
|
|
uint_bits >>= 8-n; /* allign to LSB */
|
|
}
|
|
else
|
|
{
|
|
/* bits contained within 2 bytes */
|
|
tmp_2bytes = tvb_get_ntohs(tvb, offset);
|
|
tmp_2bytes <<= bitoffset; /* remove bitoffset */
|
|
uint_bits = tmp_2bytes >> ( 8 + (8-n)); /* allign to LSB */
|
|
}
|
|
|
|
return(uint_bits);
|
|
}
|
|
|
|
|
|
/* extract an integer with 2bit length field and return the int value*/
|
|
static guint32
|
|
extract_int32(tvbuff_t *tvb, gint offset, gint bitoffset, gint *length)
|
|
{
|
|
guint16 tmp_2byte;
|
|
guint32 result = 0;
|
|
|
|
tmp_2byte = tvb_get_ntohs(tvb, offset);
|
|
|
|
tmp_2byte <<= bitoffset; /* remove bitoffset */
|
|
*length = tmp_2byte >> (6 + 8); /* allign 2bit length field to LSB */
|
|
(*length)++; /* now we have the length of the int value */
|
|
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
allign(&offset, &bitoffset);
|
|
|
|
switch (*length)
|
|
{
|
|
case 1:
|
|
result = tvb_get_guint8(tvb, offset);
|
|
break;
|
|
case 2:
|
|
result = tvb_get_ntohs(tvb, offset);
|
|
break;
|
|
case 3:
|
|
result = tvb_get_ntoh24(tvb, offset);
|
|
break;
|
|
case 4:
|
|
result = tvb_get_ntohl(tvb, offset);
|
|
break;
|
|
}
|
|
|
|
return(result);
|
|
}
|
|
|
|
|
|
/* return bitmask string looking like "..01 0..." */
|
|
static char *
|
|
bitmaskstr(guint bitoffset, guint bitlength, guint16 value, guint *length)
|
|
{
|
|
static char maskstr[20];
|
|
guint i;
|
|
|
|
|
|
strcpy(maskstr, " ");
|
|
|
|
for (i=0; i<16; i++)
|
|
{
|
|
if ( i < bitoffset || i > bitoffset+bitlength-1 )
|
|
{
|
|
/* i is outside extracted bitfield */
|
|
maskstr[i + i/4] = '.';
|
|
}
|
|
else
|
|
{ /* i is inside extracted bitfield */
|
|
if ( ((0x8000 >> i) & value) != 0x0000 )
|
|
{
|
|
/* bit is set */
|
|
maskstr[i + i/4] = '1';
|
|
}
|
|
else
|
|
{
|
|
/* bit is not set */
|
|
maskstr[i + i/4] = '0';
|
|
}
|
|
}
|
|
}
|
|
if (bitoffset + bitlength <= 8)
|
|
{
|
|
/* bitfield is located within first byte only */
|
|
maskstr[9] = '\0';
|
|
*length = 1;
|
|
}
|
|
else
|
|
{
|
|
/* bitfield is located within first & second byte */
|
|
maskstr[19] = '\0';
|
|
*length = 2;
|
|
}
|
|
|
|
return(maskstr);
|
|
}
|
|
|
|
/* add bitstring */
|
|
static proto_item *
|
|
proto_tree_add_bitstring(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint offset,
|
|
gint bitoffset, gint bitlength)
|
|
{
|
|
guint16 read_2bytes;
|
|
guint16 alligned_2bytes;
|
|
guint8 one_byte;
|
|
char *maskstr;
|
|
char maskstr_buf[56] = "\0";
|
|
guint length;
|
|
int i;
|
|
guint8 bitstr[128];
|
|
char buf[256] = "\0";
|
|
header_field_info *hf_info_p;
|
|
gint byte_span;
|
|
gint initial_offset = offset;
|
|
|
|
memset(bitstr, 0, 128);
|
|
|
|
/* create bitmask string for first byte */
|
|
read_2bytes = tvb_get_ntohs(tvb, offset);
|
|
maskstr = bitmaskstr(bitoffset, (bitoffset+bitlength >8) ? 8-bitoffset : bitlength, read_2bytes, &length);
|
|
if (bitoffset+bitlength > 8)
|
|
{
|
|
sprintf(maskstr_buf, "%s + %d Bits = ", maskstr, bitlength - (8-bitoffset));
|
|
}
|
|
else
|
|
{
|
|
sprintf(maskstr_buf, "%s = ", maskstr);
|
|
}
|
|
|
|
|
|
/* print all but the last byte to buf */
|
|
byte_span = (bitoffset + bitlength + 7) / 8;
|
|
for (i=0; i < byte_span - 1; i++, offset++)
|
|
{
|
|
read_2bytes = tvb_get_ntohs(tvb, offset);
|
|
alligned_2bytes = read_2bytes << bitoffset; /* remove bitoffset */
|
|
one_byte = alligned_2bytes >> 8; /* move to low byte */
|
|
|
|
bitstr[i]=one_byte;
|
|
sprintf(&(buf[2*i]), "%02X", one_byte);
|
|
}
|
|
|
|
/* add last byte if it contains bits which have not yet been shifted in */
|
|
if ( ((bitlength + 7) / 8 ) == byte_span )
|
|
{
|
|
read_2bytes = tvb_get_ntohs(tvb, offset);
|
|
alligned_2bytes = read_2bytes << bitoffset; /* remove bitoffset */
|
|
one_byte = alligned_2bytes >> 8; /* move to low byte */
|
|
one_byte >>= (8 - (bitlength%8)); /*cut off surplus bits */
|
|
one_byte <<= (8 - (bitlength%8)); /* allign to MSB in low byte*/
|
|
|
|
bitstr[i]=one_byte;
|
|
sprintf(&(buf[2*i]), "%02X", one_byte);
|
|
}
|
|
|
|
/* get header field info */
|
|
hf_info_p = proto_registrar_get_nth(hfindex);
|
|
|
|
|
|
return ( proto_tree_add_bytes_format(tree, hfindex, tvb, initial_offset,
|
|
byte_span , bitstr, "%s %s: %s", maskstr_buf, hf_info_p->name, buf) );
|
|
|
|
}
|
|
|
|
|
|
/* add unsigned int, 1-8 bits long */
|
|
static proto_item *
|
|
proto_tree_add_uint_bits(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint offset,
|
|
gint bitoffset, gint bitlength, gint min)
|
|
{
|
|
guint8 uint_bits;
|
|
guint16 read_2bytes, alligned_2bytes;
|
|
char *maskstr;
|
|
guint length;
|
|
header_field_info *hf_info_p;
|
|
|
|
|
|
/* extract value */
|
|
if (bitoffset + bitlength <= 8)
|
|
{
|
|
/* all bits contained in one byte */
|
|
uint_bits = tvb_get_guint8(tvb, offset);
|
|
read_2bytes = uint_bits;
|
|
read_2bytes <<= 8;
|
|
}
|
|
else
|
|
{
|
|
/* bits contained within 2 bytes */
|
|
read_2bytes = tvb_get_ntohs(tvb, offset);
|
|
}
|
|
alligned_2bytes = read_2bytes << bitoffset; /* remove bitoffset */
|
|
uint_bits = alligned_2bytes >> ( 8 + (8-bitlength)); /* allign to LSB */
|
|
|
|
uint_bits += min;
|
|
|
|
/* create bitmask string */
|
|
maskstr = bitmaskstr(bitoffset, bitlength, read_2bytes, &length);
|
|
|
|
/* get header field info */
|
|
hf_info_p = proto_registrar_get_nth(hfindex);
|
|
|
|
if (hf_info_p->strings != NULL)
|
|
{
|
|
/* string representation for decoded header field present */
|
|
return ( proto_tree_add_uint_format(tree, hfindex, tvb, offset,
|
|
length, uint_bits, "%s = %s: %s (%d)", maskstr, hf_info_p->name,
|
|
val_to_str(uint_bits, hf_info_p->strings, "%d"), uint_bits) );
|
|
}
|
|
else
|
|
{
|
|
/* no string representation */
|
|
return ( proto_tree_add_uint_format(tree, hfindex, tvb, offset,
|
|
length, uint_bits, "%s = %s: %d", maskstr, hf_info_p->name, uint_bits) );
|
|
}
|
|
}
|
|
|
|
/* add PER encoded integer (maximum length of value: 4 bytes) */
|
|
static proto_item *
|
|
proto_tree_add_PERint32(proto_tree *tree, int hfindex, tvbuff_t *tvb, gint offset,
|
|
gint bitoffset, gint *length, gint min)
|
|
{
|
|
guint32 value;
|
|
guint16 tmp_2bytes;
|
|
char *maskstr;
|
|
guint length_size;
|
|
header_field_info *hf_info_p;
|
|
|
|
/* get value */
|
|
value = extract_int32(tvb, offset, bitoffset, length);
|
|
value += min;
|
|
|
|
/* create bitmask string for 2 bit length field */
|
|
tmp_2bytes = tvb_get_ntohs(tvb, offset);
|
|
maskstr = bitmaskstr(bitoffset, 2, tmp_2bytes, &length_size);
|
|
|
|
/* get header field info */
|
|
hf_info_p = proto_registrar_get_nth(hfindex);
|
|
|
|
return ( proto_tree_add_uint_format(tree, hfindex, tvb, offset,
|
|
(*length) + length_size, value,
|
|
"%s + %d Bytes = %s: %d", maskstr, *length, hf_info_p->name, value) );
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Dissecting Functions for single parameters */
|
|
/* */
|
|
/*****************************************************************************/
|
|
static int
|
|
dissect_iE_Extension(tvbuff_t *tvb, proto_tree *tree, gint *offset, gint *bitoffset, char *description)
|
|
{
|
|
proto_item *ext_item = NULL;
|
|
proto_tree *ext_tree = NULL;
|
|
guint16 number_of_extFields;
|
|
gint number_of_octets = 0;
|
|
gint number_of_octets_size = 0;
|
|
int i;
|
|
|
|
allign(offset, bitoffset);
|
|
|
|
/* create subtree for iE_Extension */
|
|
if (tree)
|
|
{
|
|
ext_item = proto_tree_add_text(tree, tvb, *offset, 0, "%s iE-Extensions", description);
|
|
ext_tree = proto_item_add_subtree(ext_item, ett_ranap_iE_Extension);
|
|
}
|
|
|
|
/* number of extension fields */
|
|
number_of_extFields = tvb_get_ntohs(tvb, *offset) + 1;
|
|
if (ext_tree)
|
|
{
|
|
proto_tree_add_uint(ext_tree, hf_ranap_number_of_ProtocolExtensionFields,
|
|
tvb, *offset, 2, number_of_extFields);
|
|
}
|
|
|
|
*offset += 2;
|
|
|
|
/* for each extension field */
|
|
for (i=1; i <= number_of_extFields; i++)
|
|
{
|
|
/* add fields to ie subtee */
|
|
/* Extension Field ID */
|
|
if (ext_tree)
|
|
{
|
|
proto_tree_add_item(ext_tree, hf_ranap_ext_field_id, tvb,
|
|
*offset, IE_ID_LENGTH, FALSE);
|
|
}
|
|
*offset += IE_ID_LENGTH;
|
|
|
|
/* criticality */
|
|
if (ext_tree)
|
|
{
|
|
proto_tree_add_uint_bits(ext_tree, hf_ranap_ext_field_criticality, tvb,
|
|
*offset, *bitoffset, 2, 0);
|
|
}
|
|
proceed_nbits(offset, bitoffset, 2);
|
|
|
|
/* number of octets in the IE */
|
|
allign(offset, bitoffset);
|
|
if (0 == extract_length(tvb, *offset, &number_of_octets, &number_of_octets_size))
|
|
{
|
|
if (ext_tree)
|
|
{
|
|
proto_tree_add_uint(ext_tree, hf_ranap_ext_field_number_of_octets, tvb,
|
|
*offset, number_of_octets_size, number_of_octets);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
/* decoding is not supported */
|
|
if (ext_tree)
|
|
{
|
|
proto_tree_add_text(ext_tree, tvb, *offset, 0,
|
|
"Number of Octets greater than 0x3FFF, dissection not supported");
|
|
}
|
|
return(-1);
|
|
}
|
|
|
|
*offset += number_of_octets_size;
|
|
if (ext_tree)
|
|
{
|
|
proto_tree_add_item(ext_tree, hf_ranap_extension_field, tvb,
|
|
*offset, number_of_octets, FALSE);
|
|
|
|
}
|
|
|
|
*offset += number_of_octets;
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_userPlaneInformation(tvbuff_t *tvb, proto_tree *tree, gint *offset, gint *bitoffset)
|
|
{
|
|
int extension_present;
|
|
int iE_Extensions_present;
|
|
int tmp_extension_present;
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* userPlaneMode */
|
|
tmp_extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
proto_tree_add_uint_bits(tree, hf_ranap_userPlaneMode, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* uP-ModeVersions */
|
|
proto_tree_add_bitstring(tree, hf_ranap_uP_ModeVersions, tvb, *offset,
|
|
*bitoffset, 16);
|
|
proceed_nbits(offset, bitoffset, 16);
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
return(dissect_iE_Extension(tvb, tree, offset, bitoffset, "UserPlaneInformation"));
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
dissect_sDU_Parameters(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
proto_item *sDU_item = NULL;
|
|
proto_tree *sDU_tree = NULL;
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int sDU_ErrorRatio_present;
|
|
int sDU_FormatInformationParameters_present;
|
|
int iE_Extensions_present;
|
|
int sDU_ErrorRatio_iE_Extensions_present;
|
|
int residualBitErrorRatio_iE_Extensions_present;
|
|
gint length;
|
|
gint number_of_sDU_FormatInformationParameters;
|
|
int sDU_FormatInformationParameters_extension_present;
|
|
int subflowSDU_Size_present;
|
|
int rAB_SubflowCombinationBitRate_present;
|
|
int sDU_FormatInformationParameters_iE_Extensions_present;
|
|
gint i;
|
|
|
|
/* create subtree for sDU_Parameters */
|
|
sDU_item = proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"sDU Parameters");
|
|
sDU_tree = proto_item_add_subtree(sDU_item, ett_ranap_sDU);
|
|
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(sDU_tree, tvb, *offset, 1,
|
|
"sDU_Parameters Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* sDU_ErrorRatio present ? */
|
|
sDU_ErrorRatio_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_sDU_ErrorRatio_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* sDU_FormatInformationParameters present ? */
|
|
sDU_FormatInformationParameters_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_sDU_FormatInformationParameters_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
|
|
/* sDU_ErrorRatio */
|
|
if (sDU_ErrorRatio_present)
|
|
{
|
|
sDU_ErrorRatio_iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
proto_tree_add_uint_bits(sDU_tree, hf_ranap_sDU_ErrorRatio_mantissa, tvb, *offset,
|
|
*bitoffset, 4, 1);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
|
|
proto_tree_add_uint_bits(sDU_tree, hf_ranap_sDU_ErrorRatio_exponent, tvb, *offset,
|
|
*bitoffset, 3, 1);
|
|
proceed_nbits(offset, bitoffset, 3);
|
|
|
|
if (sDU_ErrorRatio_iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, sDU_tree, offset, bitoffset, "sDU_ErrorRatio")) != 0)
|
|
return (ret);
|
|
}
|
|
}
|
|
|
|
/* residualBitErrorRatio */
|
|
residualBitErrorRatio_iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
proto_tree_add_uint_bits(sDU_tree, hf_ranap_residualBitErrorRatio_mantissa, tvb, *offset,
|
|
*bitoffset, 4, 1);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
|
|
proto_tree_add_uint_bits(sDU_tree, hf_ranap_sDU_ErrorRatio_exponent, tvb, *offset,
|
|
*bitoffset, 3, 1);
|
|
proceed_nbits(offset, bitoffset, 3);
|
|
|
|
|
|
if (residualBitErrorRatio_iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, sDU_tree, offset, bitoffset, "residualBitErrorRatio")) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
|
|
/* deliveryOfErroneousSDU */
|
|
proto_tree_add_uint_bits(sDU_tree, hf_ranap_deliveryOfErroneousSDU, tvb, *offset,
|
|
*bitoffset, 2, 0);
|
|
proceed_nbits(offset, bitoffset, 2);
|
|
|
|
|
|
/* sDU_FormatInformationParameters */
|
|
if (sDU_FormatInformationParameters_present)
|
|
{
|
|
number_of_sDU_FormatInformationParameters = extract_nbits(tvb, *offset, *bitoffset, 6) + 1;
|
|
proceed_nbits(offset, bitoffset, 6);
|
|
|
|
for (i=1; i<= number_of_sDU_FormatInformationParameters; i++)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(sDU_tree, tvb, *offset, 1,
|
|
"sDU_FormatInformationParameters Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol extension present ? */
|
|
sDU_FormatInformationParameters_extension_present =
|
|
extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* subflowSDU_Size present ? */
|
|
subflowSDU_Size_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_subflowSDU_Size_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* rAB_SubflowCombinationBitRate present ? */
|
|
rAB_SubflowCombinationBitRate_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_rAB_SubflowCombinationBitRate_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* ie_Extension present ? */
|
|
sDU_FormatInformationParameters_iE_Extensions_present =
|
|
extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
if (subflowSDU_Size_present)
|
|
{
|
|
allign(offset, bitoffset);
|
|
proto_tree_add_item(sDU_tree, hf_ranap_subflowSDU_Size,
|
|
tvb, *offset, subflowSDU_Size_LENGTH, FALSE);
|
|
offset += subflowSDU_Size_LENGTH;
|
|
}
|
|
|
|
if (rAB_SubflowCombinationBitRate_present)
|
|
{
|
|
proto_tree_add_PERint32(sDU_tree, hf_ranap_rAB_SubflowCombinationBitRate,
|
|
tvb, *offset, *bitoffset, &length, 0);
|
|
proceed_perint32(offset, bitoffset, length);
|
|
}
|
|
|
|
if (sDU_FormatInformationParameters_iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, sDU_tree, offset, bitoffset,
|
|
"sDU_FormatInformationParameters" )) != 0)
|
|
return (ret);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for sDU_FormatInformationParameters present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_rAB_Parameters(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
guint8 tmp_byte;
|
|
proto_item *rab_item = NULL;
|
|
proto_tree *rab_tree = NULL;
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
proto_item *prio_item = NULL;
|
|
proto_tree *prio_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int tmp_extension_present;
|
|
int guaranteedBitRate_present;
|
|
int transferDelay_present;
|
|
int trafficHandlingPriority_present;
|
|
int allocationOrRetentionPriority_present;
|
|
int sourceStatisticsDescriptor_present;
|
|
int relocationRequirement_present;
|
|
int iE_Extensions_present;
|
|
int tmp_iE_Extensions_present;
|
|
int i;
|
|
gint length;
|
|
|
|
/* create subtree for rAB_Parameters */
|
|
rab_item = proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"rAB_Parameters");
|
|
rab_tree = proto_item_add_subtree(rab_item, ett_ranap_rAB_Parameters);
|
|
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(rab_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"rAB_Parameters Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* guaranteedBitRate present ? */
|
|
guaranteedBitRate_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_guaranteedBitRate_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* transferDelay present ? */
|
|
transferDelay_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_transferDelay_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* trafficHandlingPriority present ? */
|
|
trafficHandlingPriority_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_trafficHandlingPriority_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* allocationOrRetentionPriority present ? */
|
|
allocationOrRetentionPriority_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_allocationOrRetentionPriority_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* sourceStatisticsDescriptor present ? */
|
|
sourceStatisticsDescriptor_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_sourceStatisticsDescriptor_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* relocationRequirement present ? */
|
|
relocationRequirement_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_relocationRequirement_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE-Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
|
|
/* trafficClass */
|
|
tmp_extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
proto_tree_add_uint_bits(rab_tree, hf_ranap_trafficClass,
|
|
tvb, *offset, *bitoffset, 2, 0);
|
|
proceed_nbits(offset, bitoffset, 2);
|
|
|
|
if (tmp_extension_present)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(rab_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for trafficClass present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
|
|
/* rAB-AsymmetryIndicator */
|
|
tmp_extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
proto_tree_add_uint_bits(rab_tree, hf_ranap_rAB_AsymmetryIndicator,
|
|
tvb, *offset, *bitoffset, 2, 0);
|
|
proceed_nbits(offset, bitoffset, 2);
|
|
|
|
if (tmp_extension_present)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(rab_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for rAB-AsymmetryIndicator present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
|
|
/* maxBitrate */
|
|
tmp_byte = extract_nbits(tvb, *offset, *bitoffset, 1) +1 ; /*sequence 1..2 */
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
for (i=1; i<= tmp_byte; i++)
|
|
{
|
|
proto_tree_add_PERint32(rab_tree, hf_ranap_maxBitrate,
|
|
tvb, *offset, *bitoffset, &length, 1);
|
|
proceed_perint32(offset, bitoffset, length);
|
|
}
|
|
|
|
|
|
/* guaranteedBitRate */
|
|
if (guaranteedBitRate_present)
|
|
{
|
|
tmp_byte = extract_nbits(tvb, *offset, *bitoffset, 1) +1 ; /*sequence 1..2 */
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
for (i=1; i<= tmp_byte; i++)
|
|
{
|
|
proto_tree_add_PERint32(rab_tree, hf_ranap_guaranteedBitrate,
|
|
tvb, *offset, *bitoffset, &length, 0);
|
|
proceed_perint32(offset, bitoffset, length);
|
|
}
|
|
}
|
|
|
|
/* deliveryOrder */
|
|
proto_tree_add_uint_bits(rab_tree, hf_ranap_deliveryOrder, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
|
|
/* maxSDU-Size */
|
|
allign(offset, bitoffset);
|
|
proto_tree_add_item(rab_tree, hf_ranap_maxSDU_Size,
|
|
tvb, *offset, maxSDU_Size_LENGTH, FALSE);
|
|
*offset += maxSDU_Size_LENGTH;
|
|
|
|
/* sDU-Parameters */
|
|
tmp_byte = extract_nbits(tvb, *offset, *bitoffset, 3) + 1; /*sequence 1..7 */
|
|
proceed_nbits(offset, bitoffset, 3);
|
|
for (i=1; i<= tmp_byte; i++)
|
|
{
|
|
if ((ret=dissect_sDU_Parameters(tvb, rab_tree, offset, bitoffset))!=0) return(ret);
|
|
}
|
|
|
|
/* transferDelay */
|
|
if (transferDelay_present)
|
|
{
|
|
allign(offset, bitoffset);
|
|
proto_tree_add_item(rab_tree, hf_ranap_transferDelay,
|
|
tvb, *offset, transferDelay_LENGTH, FALSE);
|
|
*offset += transferDelay_LENGTH;
|
|
}
|
|
|
|
|
|
/* trafficHandlingPriority */
|
|
if (trafficHandlingPriority_present)
|
|
{
|
|
proto_tree_add_uint_bits(rab_tree, hf_ranap_trafficHandlingPriority, tvb, *offset,
|
|
*bitoffset, 4, 0);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
}
|
|
|
|
/* allocationOrRetentionPriority */
|
|
if (allocationOrRetentionPriority_present)
|
|
{
|
|
/* create subtree for */
|
|
prio_item = proto_tree_add_text(rab_tree, tvb, *offset, 0,
|
|
"allocationOrRetentionPriority");
|
|
prio_tree = proto_item_add_subtree(prio_item, ett_ranap_allocationOrRetentionPriority);
|
|
|
|
/* protocol extension present ? */
|
|
tmp_extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE Extension present ? */
|
|
tmp_iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* allocationOrRetentionPriority */
|
|
proto_tree_add_uint_bits(prio_tree, hf_ranap_priorityLevel, tvb, *offset,
|
|
*bitoffset, 4, 0);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
|
|
/* pre-emptionCapability */
|
|
proto_tree_add_uint_bits(prio_tree, hf_ranap_pre_emptionCapability, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* pre-emptionVulnerability */
|
|
proto_tree_add_uint_bits(prio_tree, hf_ranap_pre_emptionVulnerability, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* queuingAllowed */
|
|
proto_tree_add_uint_bits(prio_tree, hf_ranap_queuingAllowed, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
if (tmp_iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, prio_tree, offset, bitoffset,
|
|
"AllocationOrRetentionPriority")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
if (tmp_extension_present)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(prio_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for rAB-allocationOrRetentionPriority present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
/* sourceStatisticsDescriptor */
|
|
if (sourceStatisticsDescriptor_present)
|
|
{
|
|
/* protocol extension */
|
|
tmp_extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
if (tmp_extension_present)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(prio_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for sourceStatisticsDescriptor present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
proto_tree_add_uint_bits(rab_tree, hf_ranap_sourceStatisticsDescriptor, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
}
|
|
|
|
/* relocationRequirement */
|
|
if (relocationRequirement_present)
|
|
{
|
|
/* protocol extension */
|
|
tmp_extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
if (tmp_extension_present)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(prio_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for relocationRequirement present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
proto_tree_add_uint_bits(rab_tree, hf_ranap_relocationRequirement, tvb, *offset,
|
|
*bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
}
|
|
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, rab_tree, offset, bitoffset, "rAB_Parameters" )) != 0 )
|
|
return (ret);
|
|
}
|
|
|
|
/* extended */
|
|
if (extension_present)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(rab_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for rAB_Parameters present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
dissect_TransportLayerAddress(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
gint extension_present;
|
|
gint str_length;
|
|
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
if (extension_present)
|
|
{
|
|
/* extended integer */
|
|
proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"extension present for TransportLayerAddress, dissection not supported");
|
|
return (-1);
|
|
}
|
|
|
|
/* extract and add length of transportLayerAddress bitstring */
|
|
str_length = extract_nbits(tvb, *offset, *bitoffset, 8) + 1;
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_transportLayerAddress_length,
|
|
tvb, *offset, *bitoffset, 8, 1);
|
|
proceed_nbits(offset, bitoffset, 8);
|
|
allign(offset, bitoffset);
|
|
|
|
/* add transportLayerAddress */
|
|
proto_tree_add_bitstring(ie_tree, hf_ranap_transportLayerAddress, tvb, *offset,
|
|
*bitoffset, str_length);
|
|
proceed_nbits(offset, bitoffset, str_length);
|
|
|
|
return (0);
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
dissect_iuTransportAssociation(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
guint extension_present;
|
|
guint choice_value;
|
|
|
|
/* extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
if (extension_present)
|
|
{
|
|
/* extended choice */
|
|
proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"extension present for IuTransportAssociation, dissection not supported");
|
|
return (-1);
|
|
}
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* choice */
|
|
choice_value = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
allign(offset, bitoffset);
|
|
if (choice_value == 0)
|
|
{
|
|
/* gTP-TEI */
|
|
proto_tree_add_item(ie_tree, hf_ranap_gTP_TEI, tvb, *offset, 4, FALSE);
|
|
*offset += 4;
|
|
}
|
|
else
|
|
{
|
|
/* bindingID */
|
|
proto_tree_add_item(ie_tree, hf_ranap_bindingID, tvb, *offset, 4, FALSE);
|
|
*offset += 4;
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_transportLayerInformation(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int extension_present;
|
|
int iE_Extensions_present;
|
|
int ret;
|
|
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"TransportLayerInformation Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
|
|
/* protocol extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE-Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
|
|
/* transportLayerAddress */
|
|
if ((ret=dissect_TransportLayerAddress(tvb, ie_tree, offset, bitoffset)) != 0)
|
|
return (ret);
|
|
|
|
/* iuTransportAssociation */
|
|
if ((ret=dissect_iuTransportAssociation(tvb, ie_tree, offset, bitoffset)) != 0)
|
|
return (ret);
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, offset, bitoffset, "TransportLayerInformation" )) != 0 )
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extension */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"extension present for TransportLayerInformation, dissection not supported");
|
|
return (-1);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_dataVolumeList (tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset, char *parname)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
gint extension_present;
|
|
gint dataVolumeReference_present;
|
|
gint iE_Extensions_present;
|
|
gint number_vol;
|
|
gint length;
|
|
gint i;
|
|
int ret;
|
|
|
|
/* number of volumes */
|
|
number_vol = extract_nbits(tvb, *offset, *bitoffset, 1) + 1;
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
for (i=1; i<=number_vol; i++)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, *offset, 1,
|
|
"%d. %s Extension/Optional/Default bitmap",
|
|
i, parname);
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* dataVolumeReference present ? */
|
|
dataVolumeReference_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dataVolumeReference_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
|
|
/* UnsuccessfullyTransmittedDataVolume */
|
|
proto_tree_add_PERint32(ie_tree, hf_ranap_dl_UnsuccessfullyTransmittedDataVolume,
|
|
tvb, *offset, *bitoffset, &length, 0);
|
|
proceed_perint32(offset, bitoffset, length);
|
|
|
|
/* DataVolumeReference */
|
|
if (dataVolumeReference_present)
|
|
{
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_dataVolumeReference, tvb,
|
|
*offset, *bitoffset, 8, 0);
|
|
proceed_nbits(offset, bitoffset, 8);
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, offset, bitoffset, "dl-dataVolumes" )) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for dl-dataVolumes present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
static int
|
|
dissect_cause(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
gint extension_present;
|
|
int cause_choice;
|
|
|
|
/* protocol extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
if (extension_present)
|
|
{
|
|
/* choice extension present */
|
|
proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"extension present for cause, dissection not supported");
|
|
return (-1);
|
|
}
|
|
cause_choice = extract_nbits(tvb, *offset, *bitoffset, 3);
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_choice,
|
|
tvb, *offset, *bitoffset, 3, 0);
|
|
proceed_nbits(offset, bitoffset, 3);
|
|
|
|
switch (cause_choice)
|
|
{
|
|
case CC_CauseRadioNetwork:
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_value,
|
|
tvb, *offset, *bitoffset, 6, 1);
|
|
proceed_nbits(offset, bitoffset, 6);
|
|
break;
|
|
case CC_CauseTransmissionNetwork:
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_value,
|
|
tvb, *offset, *bitoffset, 4, 65);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
break;
|
|
case CC_CauseNAS:
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_value,
|
|
tvb, *offset, *bitoffset, 4, 81);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
break;
|
|
case CC_CauseProtocol:
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_value,
|
|
tvb, *offset, *bitoffset, 4, 97);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
case CC_CauseMisc:
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_value,
|
|
tvb, *offset, *bitoffset, 4, 113);
|
|
proceed_nbits(offset, bitoffset, 4);
|
|
break;
|
|
case CC_CauseNon_Standard:
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_cause_value,
|
|
tvb, *offset, *bitoffset, 7, 129);
|
|
proceed_nbits(offset, bitoffset, 7);
|
|
break;
|
|
default:
|
|
proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"unexpected cause choice value, dissection not supported");
|
|
return(-1);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_iEsCriticalityDiagnostics(tvbuff_t *tvb, proto_tree *ie_tree, gint *offset, gint *bitoffset)
|
|
{
|
|
proto_item *diag_item = NULL;
|
|
proto_tree *diag_tree = NULL;
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int extension_present;
|
|
int repetitionNumber_present;
|
|
int iE_Extensions_present;
|
|
int num_of_errors;
|
|
int i;
|
|
|
|
allign(offset, bitoffset);
|
|
num_of_errors = extract_nbits(tvb, *offset, *bitoffset, 8) + 1;
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_num_of_CriticalityDiagnostics_IEs, tvb,
|
|
*offset, *bitoffset, 8, 1);
|
|
proceed_nbits(offset, bitoffset, 8);
|
|
|
|
for ( i= 1; i <= num_of_errors; i++)
|
|
{
|
|
/* add subtree for CriticalityDiagnostics-IE */
|
|
diag_item = proto_tree_add_text(ie_tree, tvb, *offset, 0,
|
|
"%d. CriticalityDiagnostics-IE", i);
|
|
diag_tree = proto_item_add_subtree(diag_item, ett_ranap_CriticalityDiagnostics_IE);
|
|
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(diag_tree, tvb, *offset, 1,
|
|
"CriticalityDiagnostics-IE Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* repetitionNumber present ? */
|
|
repetitionNumber_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_repetitionNumber_present, tvb,
|
|
*offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, *offset, *bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, *offset, *bitoffset, 1, 0);
|
|
proceed_nbits(offset, bitoffset, 1);
|
|
|
|
/* iECriticality */
|
|
proto_tree_add_uint_bits(diag_tree, hf_ranap_iECriticality,
|
|
tvb, *offset, *bitoffset, 2, 0);
|
|
proceed_nbits(offset, bitoffset, 2);
|
|
|
|
/* iE-ID */
|
|
allign(offset, bitoffset);
|
|
proto_tree_add_item(diag_tree, hf_ranap_ie_ie_id, tvb,
|
|
*offset, IE_ID_LENGTH, FALSE);
|
|
*offset += IE_ID_LENGTH;
|
|
|
|
/* repetitionNumber */
|
|
if (repetitionNumber_present)
|
|
{
|
|
allign(offset, bitoffset);
|
|
proto_tree_add_uint_bits(diag_tree, hf_ranap_repetitionNumber,
|
|
tvb, *offset, *bitoffset, 8, 1);
|
|
proceed_nbits(offset, bitoffset, 8);
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
return(dissect_iE_Extension(tvb, diag_tree, offset, bitoffset, "CriticalityDiagnostics-IE"));
|
|
}
|
|
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(diag_tree, tvb, *offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for CriticalityDiagnostics-IE present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Dissecting Functions for IEs */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static int
|
|
dissect_IE_RAB_ID(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
if (ie_tree)
|
|
{
|
|
proto_tree_add_item(ie_tree, hf_ranap_rab_id, tvb,
|
|
0, RAB_ID_LENGTH, FALSE);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAC(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
if (ie_tree)
|
|
{
|
|
proto_tree_add_item(ie_tree, hf_ranap_rac, tvb,
|
|
0, RAC_LENGTH, FALSE);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_LAI(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
int ret;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"LAI Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* iE_Extensions_present present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* plmn_id */
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_plmn_id, tvb,
|
|
offset, PLMN_ID_LENGTH, FALSE);
|
|
offset += PLMN_ID_LENGTH;
|
|
|
|
/* lac */
|
|
proto_tree_add_item(ie_tree, hf_ranap_lac, tvb,
|
|
offset, LAC_LENGTH, FALSE);
|
|
offset += LAC_LENGTH;
|
|
|
|
/* iE_Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "LAI")) != 0)
|
|
return (ret);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_SAI(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
int ret;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"SAI Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* iE_Extensions_present present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* plmn_id */
|
|
proto_tree_add_item(ie_tree, hf_ranap_plmn_id, tvb,
|
|
offset, PLMN_ID_LENGTH, FALSE);
|
|
offset += PLMN_ID_LENGTH;
|
|
|
|
/* lac */
|
|
proto_tree_add_item(ie_tree, hf_ranap_lac, tvb,
|
|
offset, LAC_LENGTH, FALSE);
|
|
offset += LAC_LENGTH;
|
|
|
|
/* sac */
|
|
proto_tree_add_item(ie_tree, hf_ranap_sac, tvb,
|
|
offset, SAC_LENGTH, FALSE);
|
|
offset += SAC_LENGTH;
|
|
|
|
/* iE_Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "LAI")) != 0)
|
|
return (ret);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_NAS_PDU(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint length;
|
|
gint length_size;
|
|
|
|
if (extract_length(tvb, 0, &length, &length_size) != 0)
|
|
{
|
|
if (ie_tree)
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, 0,
|
|
2, "Number of Octets greater than 0x3FFF, dissection not supported");
|
|
}
|
|
return(-1);
|
|
}
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* NAS - PDU length */
|
|
proto_tree_add_item(ie_tree, hf_ranap_nas_pdu_length, tvb,
|
|
0, length_size, FALSE);
|
|
}
|
|
|
|
/* call NAS dissector (not implemented yet) */
|
|
/* ............. */
|
|
|
|
/* meanwhile display in hex */
|
|
if (ie_tree)
|
|
{
|
|
/* NAS - PDU */
|
|
proto_tree_add_item(ie_tree, hf_ranap_nas_pdu, tvb,
|
|
length_size, length, FALSE);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_CN_DomainIndicator(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
if (ie_tree)
|
|
{
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_CN_DomainIndicator, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_IuSigConId(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
if (ie_tree)
|
|
{
|
|
proto_tree_add_bitstring(ie_tree, hf_ranap_IuSigConId, tvb, 0, 0, 24);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_SAPI(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
int extension_present;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
if (extension_present)
|
|
{
|
|
/* extended enum */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for IE_SAPI present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
/* SAPI */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_SAPI, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_TransportLayerAddress(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
if (ie_tree)
|
|
{
|
|
return(dissect_TransportLayerAddress(tvb, ie_tree, &offset, &bitoffset));
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_IuTransportAssociation(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
if (ie_tree)
|
|
{
|
|
return(dissect_iuTransportAssociation(tvb, ie_tree, &offset, &bitoffset));
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_Cause(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
if (ie_tree)
|
|
{
|
|
return(dissect_cause(tvb, ie_tree, &offset, &bitoffset));
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_ReleasedItem_IuRelComp(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int extension_present;
|
|
int dl_GTP_PDU_SequenceNumber_present;
|
|
int ul_GTP_PDU_SequenceNumber_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
int ret;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"RAB_ReleasedItem_IuRelComp Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dl_GTP_PDU_SequenceNumber present ? */
|
|
dl_GTP_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_GTP_PDU_SequenceNumber_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* ul_GTP_PDU_SequenceNumber present ? */
|
|
ul_GTP_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ul_GTP_PDU_SequenceNumber_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions_present present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* rAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* dl-GTP-PDU-SequenceNumber */
|
|
if (dl_GTP_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_dl_GTP_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* ul-GTP-PDU-SequenceNumber */
|
|
if (ul_GTP_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_ul_GTP_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "RAB_ReleasedItem_IuRelComp")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for RAB_ReleasedItem_IuRelComp present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_DataVolumeReportItem(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int extension_present;
|
|
int dl_UnsuccessfullyTransmittedDataVolume_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
int ret;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"RAB_DataVolumeReportItem Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dl_UnsuccessfullyTransmittedDataVolume present ? */
|
|
dl_UnsuccessfullyTransmittedDataVolume_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_UnsuccessfullyTransmittedDataVolume_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions_present present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* rAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* dl_UnsuccessfullyTransmittedDataVolume */
|
|
if (dl_UnsuccessfullyTransmittedDataVolume_present)
|
|
{
|
|
|
|
if ((ret = dissect_dataVolumeList(tvb, ie_tree, &offset, &bitoffset,
|
|
"dl_UnsuccessfullyTransmittedDataVolume")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "IE_RAB_DataVolumeReportItem")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended enum */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for IE_RAB_DataVolumeReportItem present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_SetupOrModifyItemSecond(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int extension_present;
|
|
int tmp_extension;
|
|
int pDP_TypeInformation_present;
|
|
int dataVolumeReportingIndication_present;
|
|
int dl_GTP_PDU_SequenceNumber_present;
|
|
int ul_GTP_PDU_SequenceNumber_present;
|
|
int dl_N_PDU_SequenceNumber_present;
|
|
int ul_N_PDU_SequenceNumber_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
gint8 tmp_byte;
|
|
gint i;
|
|
int ret;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"SetupOrModifyItemSecond Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* pDP_TypeInformation present ? */
|
|
pDP_TypeInformation_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_pDP_TypeInformation_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dataVolumeReportingIndication present ? */
|
|
dataVolumeReportingIndication_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dataVolumeReportingIndication_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dl_GTP_PDU_SequenceNumber present present ? */
|
|
dl_GTP_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_GTP_PDU_SequenceNumber_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* ul_GTP_PDU_SequenceNumber present ? */
|
|
ul_GTP_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ul_GTP_PDU_SequenceNumber_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dl_N_PDU_SequenceNumber present ? */
|
|
dl_N_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_N_PDU_SequenceNumber_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* ul_N_PDU_SequenceNumber present ? */
|
|
ul_N_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ul_N_PDU_SequenceNumber_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* pDP-TypeInformation */
|
|
if (pDP_TypeInformation_present)
|
|
{
|
|
tmp_byte = extract_nbits(tvb, offset, bitoffset, 1) + 1; /* Sequence 1..2 */
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
for (i=1; i<=tmp_byte; i++)
|
|
{
|
|
tmp_extension = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
if (tmp_extension != 0)
|
|
{
|
|
/* extended enum */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for PDP-Type present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_PDP_Type, tvb,
|
|
offset, bitoffset, 3, 0);
|
|
proceed_nbits(&offset, &bitoffset, 3);
|
|
}
|
|
}
|
|
|
|
/* dataVolumeReportingIndication */
|
|
if (dataVolumeReportingIndication_present)
|
|
{
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_dataVolumeReportingIndication, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
}
|
|
|
|
/* dl-GTP-PDU-SequenceNumber */
|
|
if (dl_GTP_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_dl_GTP_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* ul-GTP-PDU-SequenceNumber */
|
|
if (ul_GTP_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_ul_GTP_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* dl-N-PDU-SequenceNumber */
|
|
if (dl_N_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_dl_N_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* ul-N-PDU-SequenceNumber */
|
|
if (ul_N_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_ul_N_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "SetupOrModifyItemSecond")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended enum */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for SetupOrModifyItemSecond present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_SetupOrModifiedItem (tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int transportLayerAddress_present;
|
|
int iuTransportAssociation_present;
|
|
int dl_dataVolumes_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"RAB-SetupOrModifiedItem Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* transportLayerAddress present ? */
|
|
transportLayerAddress_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_transportLayerAddress_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iuTransportAssociation present ? */
|
|
iuTransportAssociation_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iuTransportAssociation_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dl_dataVolumes present ? */
|
|
dl_dataVolumes_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_dataVolumes_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* rAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* transportLayerAddress */
|
|
if (transportLayerAddress_present)
|
|
{
|
|
if ((ret=dissect_TransportLayerAddress(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* iuTransportAssociation */
|
|
if (iuTransportAssociation_present)
|
|
{
|
|
if ((ret=dissect_iuTransportAssociation(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* dl-dataVolumes */
|
|
if (dl_dataVolumes_present)
|
|
{
|
|
if ((ret = dissect_dataVolumeList(tvb, ie_tree, &offset, &bitoffset,
|
|
"dl-dataVolumes")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "RAB_SetupOrModifiedItem")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for RAB_SetupOrModifiedItem present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
return (0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_SetupOrModifyItemFirst (tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
gint offset;
|
|
gint bitoffset;
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int extension_present;
|
|
int nAS_SynchronisationIndicator_present;
|
|
int rAB_Parameters_present;
|
|
int userPlaneInformation_present;
|
|
int transportLayerInformation_present;
|
|
int service_Handover_present;
|
|
int iE_Extensions_present;
|
|
int tmp_extension_present;
|
|
int ret;
|
|
|
|
if (ie_tree)
|
|
{
|
|
offset = 0; bitoffset = 0;
|
|
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset,IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"RAB_SetupOrModifyItemFirst Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* nAS_SynchronisationIndicator present ? */
|
|
nAS_SynchronisationIndicator_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_nAS_SynchronisationIndicator_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* rAB_Parameters present ? */
|
|
rAB_Parameters_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_rAB_Parameters_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* userPlaneInformation present ? */
|
|
userPlaneInformation_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_userPlaneInformation_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* transportLayerInformation present ? */
|
|
transportLayerInformation_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_transportLayerInformation_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* service_Handover present ? */
|
|
service_Handover_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_service_Handover_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* add RAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* nAS-SynchronisationIndicator */
|
|
if (nAS_SynchronisationIndicator_present)
|
|
{
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_nAS_SynchronisationIndicator,
|
|
tvb, offset, bitoffset, 4, 0);
|
|
proceed_nbits(&offset, &bitoffset, 4);
|
|
}
|
|
|
|
/* rAB-Parameters */
|
|
if (rAB_Parameters_present)
|
|
{
|
|
if ((ret=dissect_rAB_Parameters(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
/* userPlaneInformation */
|
|
if (userPlaneInformation_present)
|
|
{
|
|
if ((ret=dissect_userPlaneInformation(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
/* transportLayerInformation */
|
|
if (transportLayerInformation_present)
|
|
{
|
|
if ((ret=dissect_transportLayerInformation(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
/* service_Handover */
|
|
if (service_Handover_present)
|
|
{
|
|
tmp_extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
if (tmp_extension_present)
|
|
{
|
|
/* extended enum */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for service_Handover present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_service_Handover,
|
|
tvb, offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "SetupOrModifyItemFirst" )) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_ReleaseItem(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
int extension_present;
|
|
int iE_Extensions_present;
|
|
int ret;
|
|
|
|
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset,IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"RAB_ReleaseItem Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* add RAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
|
|
/* add cause */
|
|
if ((ret=dissect_cause(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return (ret);
|
|
|
|
/* iE Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "RAB_ReleasedItem")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for RAB_ReleasedItem present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_ReleasedItem (tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int dl_dataVolumes_present;
|
|
int dl_GTP_PDU_SequenceNumber_present;
|
|
int ul_GTP_PDU_SequenceNumber_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"RAB-ReleasedItem Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dl_dataVolumes present ? */
|
|
dl_dataVolumes_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_dataVolumes_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* dL_GTP_PDU_SequenceNumber present ? */
|
|
dl_GTP_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_dl_GTP_PDU_SequenceNumber_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* uL_GTP_PDU_SequenceNumber present ? */
|
|
ul_GTP_PDU_SequenceNumber_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ul_GTP_PDU_SequenceNumber_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* rAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* dl-dataVolumes */
|
|
if (dl_dataVolumes_present)
|
|
{
|
|
if ((ret=dissect_dataVolumeList(tvb, ie_tree, &offset, &bitoffset,
|
|
"dl-dataVolumes")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
/* dL-GTP-PDU-SequenceNumber */
|
|
if (dl_GTP_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_dl_GTP_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* uL-GTP-PDU-SequenceNumber */
|
|
if (ul_GTP_PDU_SequenceNumber_present)
|
|
{
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_ul_GTP_PDU_SequenceNumber, tvb, offset, 2, FALSE);
|
|
offset += 2;
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "UserPlaneInformation")) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for RAB_ReleasedItem present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_QueuedItem (tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"RAB-QueuedItem Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* rAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "RAB_QueuedItem" )) != 0 )
|
|
return (ret);
|
|
}
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for RAB_QueuedItem present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_RAB_FailedItem(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"RAB-FailedItem Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* rAB-ID */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_rab_id,
|
|
tvb, offset, bitoffset, 8, 0);
|
|
proceed_nbits(&offset, &bitoffset, 8);
|
|
|
|
/* cause */
|
|
if ((ret=dissect_cause(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return (ret);
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "RAB-FailedItem")) != 0)
|
|
return (ret);
|
|
}
|
|
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for RAB-FailedItem present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_IE_CriticalityDiagnostics(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
|
|
{
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
int ret;
|
|
int extension_present;
|
|
int procedureCode_present;
|
|
int triggeringMessage_present;
|
|
int procedureCriticality_present;
|
|
int iEsCriticalityDiagnostics_present;
|
|
int iE_Extensions_present;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* create subtree for extension/optional/default bitmap */
|
|
optionals_item = proto_tree_add_text(ie_tree, tvb, offset, 1,
|
|
"IE-CriticalityDiagnostics Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ie_protocol_extension, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* procedureCode present ? */
|
|
procedureCode_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_procedureCode_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* triggeringMessage present ? */
|
|
triggeringMessage_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_triggeringMessage_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* procedureCriticality present ? */
|
|
procedureCriticality_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_procedureCriticality_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iEsCriticalityDiagnostics present ? */
|
|
iEsCriticalityDiagnostics_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iEsCriticalityDiagnostics_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* iE_Extensions present ? */
|
|
iE_Extensions_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_iE_Extensions_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* procedureCode */
|
|
if (procedureCode_present)
|
|
{
|
|
allign (&offset, &bitoffset);
|
|
proto_tree_add_item(ie_tree, hf_ranap_procedure_code, tvb, offset, 1, FALSE);
|
|
offset += 1;
|
|
}
|
|
|
|
/* triggeringMessage */
|
|
if (triggeringMessage_present)
|
|
{
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_triggeringMessage,
|
|
tvb, offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
}
|
|
|
|
/* procedureCriticality */
|
|
if (procedureCriticality_present)
|
|
{
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_procedureCriticality,
|
|
tvb, offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
}
|
|
|
|
/* iEsCriticalityDiagnostics */
|
|
if (iEsCriticalityDiagnostics_present)
|
|
{
|
|
if ((ret=dissect_iEsCriticalityDiagnostics(tvb, ie_tree, &offset, &bitoffset)) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
/* iE-Extensions */
|
|
if (iE_Extensions_present)
|
|
{
|
|
if ((ret=dissect_iE_Extension(tvb, ie_tree, &offset, &bitoffset, "IE_CriticalityDiagnostics")) != 0)
|
|
return(ret);
|
|
}
|
|
|
|
|
|
/* protocol extended */
|
|
if (extension_present)
|
|
{
|
|
/* extended sequence */
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset, IE_PROTOCOL_EXTENSION_LENGTH,
|
|
"Protocol extension for IE CriticalityDiagnostics present, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_unknown_IE(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
if (ie_tree)
|
|
{
|
|
proto_tree_add_text(ie_tree, tvb, 0, -1,
|
|
"IE Contents (dissection not implemented)");
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Dissecting Functions for IE Lists / Containers */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
static int
|
|
dissect_RAB_IE_ContainerPairList(tvbuff_t *tvb, proto_tree *ie_tree)
|
|
{
|
|
proto_item *rab_item = NULL;
|
|
proto_tree *rab_tree = NULL;
|
|
proto_item *ie_pair_item = NULL;
|
|
proto_tree *ie_pair_tree = NULL;
|
|
proto_item *first_value_item = NULL;
|
|
proto_tree *first_value_tree = NULL;
|
|
proto_item *second_value_item = NULL;
|
|
proto_tree *second_value_tree = NULL;
|
|
guint number_of_RABs, currentRAB;
|
|
guint number_of_IEs, currentIE;
|
|
gint number_of_octets_first, number_of_octets_second;
|
|
gint number_of_octets_first_size, number_of_octets_second_size ;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
gint tmp_offset;
|
|
guint16 ie_id;
|
|
tvbuff_t *first_value_tvb;
|
|
tvbuff_t *second_value_tvb;
|
|
|
|
if (ie_tree)
|
|
{
|
|
/* number of RABs in the list */
|
|
number_of_RABs = 1 + tvb_get_guint8(tvb, offset);
|
|
proto_tree_add_uint(ie_tree, hf_ranap_num_rabs,
|
|
tvb, offset,
|
|
NUM_RABS_LENGTH, number_of_RABs);
|
|
|
|
offset += NUM_RABS_LENGTH;
|
|
|
|
/* do for each RAB */
|
|
for (currentRAB=1; currentRAB<=number_of_RABs; currentRAB++)
|
|
{
|
|
/* create subtree for RAB */
|
|
rab_item = proto_tree_add_text(ie_tree, tvb, offset, 0, "%d. RAB", currentRAB);
|
|
rab_tree = proto_item_add_subtree(rab_item, ett_ranap_rab);
|
|
|
|
/* number of IE pairs for this RAB */
|
|
number_of_IEs = tvb_get_ntohs(tvb, offset);
|
|
proto_tree_add_uint(rab_tree, hf_ranap_number_of_ies_in_list,
|
|
tvb, offset, 2, number_of_IEs);
|
|
|
|
offset += 2; /*points now to beginning of first IE pair */
|
|
|
|
/* do for each IE pair */
|
|
for (currentIE=1; currentIE<=number_of_IEs; currentIE++)
|
|
{
|
|
/* use tmp_offset to point to current field */
|
|
tmp_offset = offset;
|
|
/* IE pair ID */
|
|
ie_id = tvb_get_ntohs(tvb, tmp_offset);
|
|
tmp_offset += IE_ID_LENGTH;
|
|
|
|
tmp_offset += 1; /* skip first criticality byte */
|
|
/* number of octets in first value */
|
|
extract_length(tvb, tmp_offset, &number_of_octets_first, &number_of_octets_first_size);
|
|
tmp_offset += number_of_octets_first_size + number_of_octets_first;
|
|
|
|
tmp_offset += 1; /* skip second criticality byte */
|
|
/* number of octets in second value */
|
|
extract_length(tvb, tmp_offset, &number_of_octets_second, &number_of_octets_second_size);
|
|
tmp_offset += number_of_octets_second_size + number_of_octets_second;
|
|
|
|
/* create subtree for ie_pair */
|
|
ie_pair_item = proto_tree_add_text(rab_tree, tvb, offset,
|
|
tmp_offset - offset,
|
|
"%s IE Pair (%u)",
|
|
val_to_str(ie_id, ranap_ie_id_values, "Unknown"),
|
|
ie_id);
|
|
ie_pair_tree = proto_item_add_subtree(ie_pair_item, ett_ranap_ie_pair);
|
|
|
|
/* add fields to ie pair subtee */
|
|
/* use offset to point to current field */
|
|
/* IE ID */
|
|
proto_tree_add_item(ie_pair_tree, hf_ranap_ie_ie_id, tvb, offset, IE_ID_LENGTH, FALSE);
|
|
offset += IE_ID_LENGTH;
|
|
|
|
/* first criticality */
|
|
proto_tree_add_uint_bits(ie_pair_tree, hf_ranap_ie_pair_first_criticality, tvb,
|
|
offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
|
|
/* number of octets in first value */
|
|
allign(&offset, &bitoffset);
|
|
if (number_of_octets_first != 0)
|
|
{
|
|
proto_tree_add_uint(ie_pair_tree, hf_ranap_first_value_number_of_octets,
|
|
tvb, offset,
|
|
number_of_octets_first_size,
|
|
number_of_octets_first);
|
|
}
|
|
else
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_pair_tree, tvb, offset,
|
|
2, "Number of Octets greater than 0x3FFF, dissection not supported");
|
|
return(-1);
|
|
}
|
|
offset += number_of_octets_first_size;
|
|
|
|
/* add subtree for first value */
|
|
first_value_item = proto_tree_add_text(ie_pair_tree, tvb, offset,
|
|
number_of_octets_first,
|
|
"%sFirst",
|
|
val_to_str(ie_id, ranap_ie_id_values, "Unknown"));
|
|
first_value_tree = proto_item_add_subtree(first_value_item, ett_ranap_ie_pair_first_value);
|
|
|
|
/* create tvb containing first value */
|
|
first_value_tvb = tvb_new_subset(tvb, offset, number_of_octets_first, number_of_octets_first);
|
|
|
|
/* add fields of first value */
|
|
switch (ie_id)
|
|
{
|
|
case IE_RAB_SetupOrModifyItem:
|
|
dissect_IE_RAB_SetupOrModifyItemFirst (first_value_tvb, first_value_tree);
|
|
break;
|
|
|
|
default:
|
|
dissect_unknown_IE(first_value_tvb, first_value_tree);
|
|
break;
|
|
}
|
|
|
|
offset += number_of_octets_first;
|
|
|
|
|
|
/* second criticality */
|
|
proto_tree_add_uint_bits(ie_pair_tree, hf_ranap_ie_pair_second_criticality, tvb,
|
|
offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
|
|
/* number of octets of second value */
|
|
allign(&offset, &bitoffset);
|
|
if (number_of_octets_second != 0)
|
|
{
|
|
proto_tree_add_uint(ie_pair_tree, hf_ranap_second_value_number_of_octets,
|
|
tvb, offset,
|
|
number_of_octets_second_size,
|
|
number_of_octets_second);
|
|
}
|
|
else
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_pair_tree, tvb, offset,
|
|
2, "Number of Octets greater than 0x3FFF, dissection not supported");
|
|
return(-1);
|
|
}
|
|
offset += number_of_octets_second_size;
|
|
|
|
/* add subtree for second value */
|
|
second_value_item = proto_tree_add_text(ie_pair_tree, tvb, offset,
|
|
number_of_octets_second,
|
|
"%sSecond",
|
|
val_to_str(ie_id, ranap_ie_id_values, "Unknown"));
|
|
second_value_tree = proto_item_add_subtree(second_value_item, ett_ranap_ie_pair_second_value);
|
|
|
|
/* create tvb containing first value */
|
|
second_value_tvb = tvb_new_subset(tvb, offset, number_of_octets_second, number_of_octets_second);
|
|
|
|
/* add fields of second value */
|
|
switch (ie_id)
|
|
{
|
|
case IE_RAB_SetupOrModifyItem:
|
|
dissect_IE_RAB_SetupOrModifyItemSecond (second_value_tvb, second_value_tree);
|
|
break;
|
|
|
|
default:
|
|
dissect_unknown_IE(second_value_tvb, second_value_tree);
|
|
break;
|
|
}
|
|
|
|
offset += number_of_octets_second;
|
|
|
|
}/* for each IE ... */
|
|
}/* for each RAB ... */
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_RAB_IE_ContainerList(tvbuff_t *tvb, proto_tree *list_tree)
|
|
{
|
|
proto_item *rab_item = NULL;
|
|
proto_tree *rab_tree = NULL;
|
|
proto_item *ie_item = NULL;
|
|
proto_tree *ie_tree = NULL;
|
|
|
|
guint number_of_RABs, currentRAB;
|
|
guint number_of_IEs, currentIE;
|
|
gint ie_number_of_octets = 0;
|
|
gint ie_number_of_octets_size = 0;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
gint ie_offset = 0;
|
|
gint ie_header_length;
|
|
guint16 ie_id;
|
|
tvbuff_t *ie_tvb;
|
|
|
|
|
|
if (list_tree)
|
|
{
|
|
/* number of RABs in the list */
|
|
number_of_RABs = 1 + tvb_get_guint8(tvb, offset);
|
|
proto_tree_add_uint(list_tree, hf_ranap_num_rabs,
|
|
tvb, offset,
|
|
NUM_RABS_LENGTH, number_of_RABs);
|
|
|
|
offset += NUM_RABS_LENGTH;
|
|
|
|
/* do for each RAB */
|
|
for (currentRAB=1; currentRAB<=number_of_RABs; currentRAB++)
|
|
{
|
|
/* create subtree for RAB */
|
|
rab_item = proto_tree_add_text(list_tree, tvb, offset, 0, "%d. RAB", currentRAB);
|
|
rab_tree = proto_item_add_subtree(rab_item, ett_ranap_rab);
|
|
|
|
/* number of IEs for this RAB */
|
|
number_of_IEs = tvb_get_ntohs(tvb, offset);
|
|
proto_tree_add_uint(rab_tree, hf_ranap_number_of_ies_in_list,
|
|
tvb, offset, 2, number_of_IEs);
|
|
|
|
offset += 2; /*points now to beginning of first IE in list */
|
|
ie_offset = offset;
|
|
|
|
/* do for each IE */
|
|
for (currentIE=1; currentIE<=number_of_IEs; currentIE++)
|
|
{
|
|
/* extract IE ID */
|
|
ie_id = tvb_get_ntohs(tvb, offset);
|
|
offset += IE_ID_LENGTH;
|
|
|
|
offset += IE_CRITICALITY_LENGTH; /* skip criticality byte */
|
|
|
|
/* number of octets */
|
|
extract_length(tvb, offset, &ie_number_of_octets, &ie_number_of_octets_size);
|
|
ie_header_length = IE_ID_LENGTH + IE_CRITICALITY_LENGTH + ie_number_of_octets_size;
|
|
|
|
/* reset offset to beginning of ie */
|
|
offset = ie_offset;
|
|
|
|
/* create subtree for ie */
|
|
ie_item = proto_tree_add_text(rab_tree, tvb, offset,
|
|
ie_header_length + ie_number_of_octets,
|
|
"%s IE (%u)",
|
|
val_to_str(ie_id, ranap_ie_id_values, "Unknown"),
|
|
ie_id);
|
|
ie_tree = proto_item_add_subtree(ie_item, ett_ranap_ie);
|
|
|
|
/* IE ID */
|
|
proto_tree_add_item(ie_tree, hf_ranap_ie_ie_id, tvb,
|
|
offset, IE_ID_LENGTH, FALSE);
|
|
offset += IE_ID_LENGTH;
|
|
|
|
/* criticality */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_ie_criticality, tvb,
|
|
offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
|
|
allign(&offset, &bitoffset);
|
|
if (ie_number_of_octets != 0)
|
|
{
|
|
proto_tree_add_uint(ie_tree, hf_ranap_ie_number_of_octets, tvb,
|
|
offset, ie_number_of_octets_size, ie_number_of_octets);
|
|
}
|
|
else
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ie_tree, tvb, offset,
|
|
0, "Number of Octets greater than 0x3FFF, dissection not supported");
|
|
return(-1);
|
|
}
|
|
offset += ie_number_of_octets_size;
|
|
|
|
|
|
/* create tvb containing ie */
|
|
ie_tvb = tvb_new_subset(tvb, offset, ie_number_of_octets, ie_number_of_octets);
|
|
|
|
/* add fields of ie */
|
|
switch (ie_id)
|
|
{
|
|
case IE_RAB_SetupOrModifiedItem:
|
|
dissect_IE_RAB_SetupOrModifiedItem(ie_tvb, ie_tree);
|
|
break;
|
|
case IE_RAB_ReleaseItem:
|
|
dissect_IE_RAB_ReleaseItem(ie_tvb, ie_tree);
|
|
break;
|
|
case IE_RAB_ReleasedItem:
|
|
dissect_IE_RAB_ReleasedItem(ie_tvb, ie_tree);
|
|
break;
|
|
case IE_RAB_ReleasedItem_IuRelComp:
|
|
dissect_IE_RAB_ReleasedItem_IuRelComp(ie_tvb, ie_tree);
|
|
break;
|
|
case IE_RAB_QueuedItem:
|
|
dissect_IE_RAB_QueuedItem(ie_tvb, ie_tree);
|
|
break;
|
|
case IE_RAB_FailedItem:
|
|
dissect_IE_RAB_FailedItem(ie_tvb, ie_tree);
|
|
break;
|
|
case IE_RAB_DataVolumeReportItem:
|
|
dissect_IE_RAB_DataVolumeReportItem(ie_tvb, ie_tree);
|
|
break;
|
|
default:
|
|
dissect_unknown_IE(ie_tvb, ie_tree);
|
|
break;
|
|
}
|
|
|
|
ie_offset += (ie_header_length + ie_number_of_octets);
|
|
offset = ie_offset;
|
|
} /* for each IE */
|
|
} /* for each RAB */
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_ranap_ie(guint16 ie_id, tvbuff_t *ie_contents_tvb, proto_tree *ie_tree)
|
|
{
|
|
/* call specific dissection function for ie contents */
|
|
switch(ie_id)
|
|
{
|
|
case IE_RAB_ID:
|
|
return(dissect_IE_RAB_ID(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_NAS_PDU:
|
|
return(dissect_IE_NAS_PDU(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_LAI:
|
|
return(dissect_IE_LAI(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_RAC:
|
|
return(dissect_IE_RAC(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_SAI:
|
|
return(dissect_IE_SAI(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_CN_DomainIndicator:
|
|
return(dissect_IE_CN_DomainIndicator(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_IuSigConId:
|
|
return(dissect_IE_IuSigConId(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_SAPI:
|
|
return(dissect_IE_SAPI(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_TransportLayerAddress:
|
|
return(dissect_IE_TransportLayerAddress(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_IuTransportAssociation:
|
|
return(dissect_IE_IuTransportAssociation(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_RAB_SetupOrModifyList:
|
|
return(dissect_RAB_IE_ContainerPairList(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_RAB_SetupOrModifiedList:
|
|
case IE_RAB_ReleaseList:
|
|
case IE_RAB_ReleasedList:
|
|
case IE_RAB_QueuedList:
|
|
case IE_RAB_FailedList:
|
|
case IE_RAB_ReleaseFailedList:
|
|
case IE_RAB_DataVolumeReportList:
|
|
case IE_RAB_ReleasedList_IuRelComp:
|
|
case IE_RAB_RelocationReleaseList:
|
|
case IE_RAB_DataForwardingList:
|
|
case IE_RAB_SetupList_RelocReq:
|
|
case IE_RAB_SetupList_RelocReqAck:
|
|
case IE_RAB_DataForwardingList_SRNS_CtxReq:
|
|
case IE_RAB_ContextList:
|
|
case IE_RAB_ContextFailedtoTransferList:
|
|
case IE_RAB_DataVolumeReportRequestList:
|
|
case IE_RAB_FailedtoReportList:
|
|
case IE_RAB_ContextList_RANAP_RelocInf:
|
|
return(dissect_RAB_IE_ContainerList(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_CriticalityDiagnostics:
|
|
return(dissect_IE_CriticalityDiagnostics(ie_contents_tvb, ie_tree));
|
|
break;
|
|
case IE_Cause:
|
|
return(dissect_IE_Cause(ie_contents_tvb, ie_tree));
|
|
break;
|
|
default:
|
|
return(dissect_unknown_IE(ie_contents_tvb, ie_tree));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
static int
|
|
dissect_ranap_ie_container(tvbuff_t *tvb, proto_tree *ranap_tree)
|
|
{
|
|
proto_item *ie_item = NULL;
|
|
proto_tree *ie_tree = NULL;
|
|
proto_item *optionals_item = NULL;
|
|
proto_tree *optionals_tree = NULL;
|
|
|
|
int msg_extension_present;
|
|
int ProtocolExtensionContainer_present;
|
|
|
|
guint16 number_of_ies;
|
|
guint16 ie_id;
|
|
gint ie_number_of_octets = 0;
|
|
gint ie_number_of_octets_size = 0;
|
|
guint16 ie_header_length;
|
|
gint offset = 0;
|
|
gint bitoffset = 0;
|
|
gint i, ie_offset;
|
|
tvbuff_t *ie_contents_tvb;
|
|
|
|
if (ranap_tree)
|
|
{
|
|
/* create subtree for extension/optional bitmap of message */
|
|
optionals_item = proto_tree_add_text(ranap_tree, tvb, offset, 1,
|
|
"Message Extension/Optional/Default bitmap");
|
|
optionals_tree = proto_item_add_subtree(optionals_item, ett_ranap_optionals);
|
|
}
|
|
|
|
/* msg_extension present ? */
|
|
msg_extension_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
|
|
if (ranap_tree)
|
|
{
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_msg_extension_present, tvb,
|
|
offset, bitoffset, 1, 0);
|
|
}
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
/* ProtocolExtensionContainer present ? */
|
|
ProtocolExtensionContainer_present = extract_nbits(tvb, offset, bitoffset, 1);
|
|
if (ranap_tree)
|
|
{
|
|
proto_tree_add_uint_bits(optionals_tree, hf_ranap_ProtocolExtensionContainer_present,
|
|
tvb, offset, bitoffset, 1, 0);
|
|
}
|
|
proceed_nbits(&offset, &bitoffset, 1);
|
|
|
|
|
|
/* extract ie container data */
|
|
/* number of ies */
|
|
allign(&offset, &bitoffset);
|
|
number_of_ies = tvb_get_ntohs(tvb, offset);
|
|
if (ranap_tree)
|
|
{
|
|
proto_tree_add_uint(ranap_tree, hf_ranap_number_of_ies,
|
|
tvb, offset, 2, number_of_ies);
|
|
}
|
|
offset += 2;
|
|
|
|
ie_offset = offset; /* ie_offset marks beginning of IE-Header */
|
|
|
|
/* do the following for each IE in the PDU */
|
|
for (i=1; i <= number_of_ies; i++)
|
|
{
|
|
/* extract IE header fields which are needed even if no ranap tree exists*/
|
|
/* IE-ID */
|
|
ie_id = tvb_get_ntohs(tvb, offset);
|
|
offset += IE_ID_LENGTH;
|
|
|
|
/* number of octets in the IE */
|
|
offset += IE_CRITICALITY_LENGTH; /* skip criticality byte */
|
|
ie_number_of_octets = 0;
|
|
extract_length(tvb, offset, &ie_number_of_octets, &ie_number_of_octets_size);
|
|
ie_header_length = IE_ID_LENGTH + IE_CRITICALITY_LENGTH + ie_number_of_octets_size;
|
|
|
|
if (ranap_tree)
|
|
{
|
|
offset = ie_offset; /* start from beginning of IE */
|
|
/* create subtree for ie */
|
|
ie_item = proto_tree_add_text(ranap_tree, tvb, offset,
|
|
ie_header_length + ie_number_of_octets,
|
|
"%s IE (%u)",
|
|
val_to_str(ie_id, ranap_ie_id_values, "Unknown"),
|
|
ie_id);
|
|
ie_tree = proto_item_add_subtree(ie_item, ett_ranap_ie);
|
|
|
|
/* add fields to ie subtee */
|
|
/* IE ID */
|
|
proto_tree_add_item(ie_tree, hf_ranap_ie_ie_id, tvb,
|
|
offset, IE_ID_LENGTH, FALSE);
|
|
offset += IE_ID_LENGTH;
|
|
|
|
/* criticality */
|
|
proto_tree_add_uint_bits(ie_tree, hf_ranap_ie_criticality, tvb,
|
|
offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
|
|
/* number of octets */
|
|
allign(&offset, &bitoffset);
|
|
if (ie_number_of_octets != 0)
|
|
{
|
|
proto_tree_add_uint(ie_tree, hf_ranap_ie_number_of_octets, tvb,
|
|
offset, ie_number_of_octets_size, ie_number_of_octets);
|
|
offset += ie_number_of_octets_size;
|
|
}
|
|
else
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ranap_tree, tvb, offset,
|
|
2, "Number of Octets greater than 0x3FFF, dissection not supported");
|
|
return(-1);
|
|
}
|
|
}
|
|
|
|
/* check if number_of_octets could be decoded */
|
|
/* in case we skipped if (ranap_tree) {....} */
|
|
if (ie_number_of_octets == 0) return (-1);
|
|
|
|
/* create tvb containing the ie contents */
|
|
ie_contents_tvb = tvb_new_subset(tvb, ie_offset + ie_header_length,
|
|
ie_number_of_octets, ie_number_of_octets);
|
|
|
|
/* call specific dissection function for ie contents */
|
|
dissect_ranap_ie(ie_id, ie_contents_tvb, ie_tree);
|
|
|
|
/* set ie_offset to beginning of next ie */
|
|
ie_offset += (ie_header_length + ie_number_of_octets);
|
|
offset = ie_offset;
|
|
}
|
|
|
|
/* protocol Extensions */
|
|
if (ProtocolExtensionContainer_present)
|
|
{
|
|
return(dissect_iE_Extension(tvb, ranap_tree, &offset, &bitoffset, "PDU"));
|
|
}
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
|
|
static void
|
|
dissect_ranap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
{
|
|
proto_item *ranap_item = NULL;
|
|
proto_tree *ranap_tree = NULL;
|
|
|
|
guint procedure_code;
|
|
guint pdu_index;
|
|
gint number_of_octets = 0;
|
|
gint number_of_octets_size = 0;
|
|
gint offset = 0;
|
|
gint tmp_offset = 0;
|
|
gint bitoffset = 0;
|
|
gint tmp_bitoffset = 0;
|
|
guint extension_present;
|
|
|
|
tvbuff_t *ie_tvb;
|
|
|
|
|
|
/* make entry in the Protocol column on summary display */
|
|
if (check_col(pinfo->cinfo, COL_PROTOCOL))
|
|
col_set_str(pinfo->cinfo, COL_PROTOCOL, "RANAP");
|
|
|
|
/* extract header fields which are needed even if no tree exists */
|
|
|
|
/* protocol_extension present ? */
|
|
extension_present = extract_nbits(tvb, tmp_offset, tmp_bitoffset, 1);
|
|
proceed_nbits(&tmp_offset, &tmp_bitoffset, 1);
|
|
if (extension_present)
|
|
{
|
|
/* extended choice */
|
|
/* decoding is not supported */
|
|
col_append_str(pinfo->cinfo, COL_INFO, "RANAP-PDU Protocol extension present, dissection not supported");
|
|
return;
|
|
}
|
|
|
|
/* pdu_index choice 0..3 */
|
|
pdu_index = extract_nbits(tvb, tmp_offset, tmp_bitoffset, 2);
|
|
proceed_nbits(&tmp_offset, &tmp_bitoffset, 2);
|
|
|
|
/* procedure code */
|
|
allign(&tmp_offset, &tmp_bitoffset);
|
|
procedure_code = tvb_get_guint8(tvb, tmp_offset);
|
|
tmp_offset += 1;
|
|
|
|
/* add Procedure Code to Info Column */
|
|
if (check_col(pinfo->cinfo, COL_INFO))
|
|
{
|
|
if (procedure_code <= PC_max)
|
|
{
|
|
col_append_str(pinfo->cinfo, COL_INFO,
|
|
val_to_str(pdu_index, ranap_message_names[procedure_code],
|
|
"unknown message"));
|
|
col_append_str(pinfo->cinfo, COL_INFO, " ");
|
|
}
|
|
}
|
|
|
|
/* extract number of octets */
|
|
tmp_offset += 1; /* leave out criticality byte */
|
|
extract_length(tvb, tmp_offset, &number_of_octets, &number_of_octets_size);
|
|
|
|
/* In the interest of speed, if "tree" is NULL, don't do any work not
|
|
necessary to generate protocol tree items. */
|
|
if (tree)
|
|
{
|
|
/* create the ranap protocol tree */
|
|
ranap_item = proto_tree_add_item(tree, proto_ranap, tvb, 0, -1, FALSE);
|
|
ranap_tree = proto_item_add_subtree(ranap_item, ett_ranap);
|
|
|
|
/* Add fields to ranap protocol tree */
|
|
/* PDU Index */
|
|
proceed_nbits(&offset, &bitoffset, 1); /* leave out extension bit, checked above */
|
|
proto_tree_add_uint_bits(ranap_tree, hf_ranap_pdu_index, tvb,
|
|
offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
|
|
|
|
/* Procedure Code */
|
|
allign(&offset, &bitoffset);
|
|
proto_tree_add_item(ranap_tree, hf_ranap_procedure_code, tvb, offset, 1, FALSE);
|
|
offset += 1;
|
|
|
|
/* PDU Criticality */
|
|
proto_tree_add_uint_bits(ranap_tree, hf_ranap_pdu_criticality, tvb,
|
|
offset, bitoffset, 2, 0);
|
|
proceed_nbits(&offset, &bitoffset, 2);
|
|
|
|
/* number of octets */
|
|
allign(&offset, &bitoffset);
|
|
if (number_of_octets != 0)
|
|
{
|
|
proto_tree_add_uint(ranap_tree, hf_ranap_pdu_number_of_octets,
|
|
tvb, offset,
|
|
number_of_octets_size, number_of_octets);
|
|
offset += number_of_octets_size;
|
|
}
|
|
else
|
|
{
|
|
/* decoding is not supported */
|
|
proto_tree_add_text(ranap_tree, tvb, offset,
|
|
2, "Number of Octets greater than 0x3FFF, dissection not supported");
|
|
return;
|
|
}
|
|
}
|
|
|
|
/* set offset to the beginning of ProtocolIE-Container */
|
|
/* in case we skipped "if(tree){...}" above */
|
|
offset = PDU_NUMBER_OF_OCTETS_OFFSET + number_of_octets_size;
|
|
|
|
/* create a tvb containing the remainder of the PDU */
|
|
ie_tvb = tvb_new_subset(tvb, offset, -1, -1);
|
|
|
|
/* dissect the ies */
|
|
dissect_ranap_ie_container(ie_tvb, ranap_tree);
|
|
}
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* */
|
|
/* Protocol Registration Functions */
|
|
/* */
|
|
/*****************************************************************************/
|
|
|
|
void
|
|
proto_register_ranap(void)
|
|
{
|
|
/* Setup list of header fields */
|
|
static hf_register_info hf[] = {
|
|
{ &hf_ranap_pdu_index,
|
|
{ "RANAP-PDU Index",
|
|
"ranap.ranap_pdu_index",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_pdu_index_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_procedure_code,
|
|
{ "Procedure Code",
|
|
"ranap.procedure_code",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_procedure_code_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_pdu_criticality,
|
|
{ "Criticality of PDU",
|
|
"ranap.pdu.criticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_pdu_number_of_octets,
|
|
{ "Number of Octets in PDU",
|
|
"ranap.pdu.num_of_octets",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ie_protocol_extension,
|
|
{ "Protocol Extension",
|
|
"ranap.ie.protocol_extension_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_number_of_ies,
|
|
{ "Number of IEs in PDU",
|
|
"ranap.pdu.number_of_ies",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_number_of_ProtocolExtensionFields,
|
|
{ "Number of Protocol Extension Fields",
|
|
"ranap.ie.number_of_ProtocolExtensionFields",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_number_of_ies_in_list,
|
|
{ "Number of IEs in list",
|
|
"ranap.number_of_ies",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ie_ie_id,
|
|
{ "IE-ID",
|
|
"ranap.ie.ie_id",
|
|
FT_UINT16, BASE_DEC, VALS(&ranap_ie_id_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ext_field_id,
|
|
{ "ProtocolExtensionField ID",
|
|
"ranap.ie.ProtocolExtensionFields.Id",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ie_criticality,
|
|
{ "Criticality of IE",
|
|
"ranap.ie.criticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ext_field_criticality,
|
|
{ "Criticality of ProtocolExtensionField",
|
|
"ranap.ie.ProtocolExtensionFields.criticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ie_pair_first_criticality,
|
|
{ "First Criticality",
|
|
"ranap.ie_pair.first_criticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ie_pair_second_criticality,
|
|
{ "Second Criticality",
|
|
"ranap.ie_pair.second_criticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ie_number_of_octets,
|
|
{ "Number of Octets in IE",
|
|
"ranap.ie.number_of_octets",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_first_value_number_of_octets,
|
|
{ "Number of Octets in first value",
|
|
"ranap.ie_pair.first_value.number_of_octets",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_second_value_number_of_octets,
|
|
{ "Number of Octets in second value",
|
|
"ranap.ie_pair.second_value.number_of_octets",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_rab_id,
|
|
{ "RAB-ID",
|
|
"ranap.RAB_ID",
|
|
FT_UINT8, BASE_HEX, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_nas_pdu,
|
|
{ "NAS-PDU",
|
|
"ranap.NAS_PDU",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_extension_field,
|
|
{ "Extension Field Value",
|
|
"ranap.Extension_Field_Value",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_plmn_id,
|
|
{ "PLMN-ID",
|
|
"ranap.PLMN_ID",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_lac,
|
|
{ "LAC",
|
|
"ranap.PLMN_ID",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_plmn_id,
|
|
{ "PLMN-ID",
|
|
"ranap.PLMN_ID",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_lac,
|
|
{ "LAC",
|
|
"ranap.PLMN_ID",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sac,
|
|
{ "SAC",
|
|
"ranap.SAC",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_rac,
|
|
{ "RAC",
|
|
"ranap.RAC",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_num_rabs,
|
|
{ "Number of RABs",
|
|
"ranap.number_of_RABs",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_nAS_SynchronisationIndicator_present,
|
|
{ "nAS-SynchronisationIndicator",
|
|
"ranap.nAS-SynchronisationIndicator_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_rAB_Parameters_present,
|
|
{ "rAB-Parameters",
|
|
"ranap.rAB_Parameters_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_userPlaneInformation_present,
|
|
{ "userPlaneInformation",
|
|
"ranap.userPlaneInformation_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_transportLayerInformation_present,
|
|
{ "transportLayerInformation",
|
|
"ranap.transportLayerInformation_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_service_Handover_present,
|
|
{ "service-Handover",
|
|
"ranap.service_Handover_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_iE_Extensions_present,
|
|
{ "iE-Extensions",
|
|
"ranap.ie.iE-Extensions_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_nAS_SynchronisationIndicator,
|
|
{ "nAS-SynchronisationIndicator",
|
|
"ranap.nAS-SynchronisationIndicator",
|
|
FT_UINT8, BASE_HEX, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_guaranteedBitRate_present,
|
|
{ "guaranteedBitRate",
|
|
"ranap.guaranteedBitRate_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_transferDelay_present,
|
|
{ "transferDelay",
|
|
"ranap.transferDelay_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_trafficHandlingPriority_present,
|
|
{ "trafficHandlingPriority",
|
|
"ranap.trafficHandlingPriority_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_allocationOrRetentionPriority_present,
|
|
{ "allocationOrRetentionPriority",
|
|
"ranap.allocationOrRetentionPriority_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sourceStatisticsDescriptor_present,
|
|
{ "sourceStatisticsDescriptor",
|
|
"ranap.sourceStatisticsDescriptor_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_relocationRequirement_present,
|
|
{ "relocationRequirement",
|
|
"ranap.relocationRequirement_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_trafficClass,
|
|
{ "Traffic Class",
|
|
"ranap.rab_Parameters.trafficClass",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_trafficClass_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_rAB_AsymmetryIndicator,
|
|
{ "rAB_AsymmetryIndicator",
|
|
"ranap.rab_Parameters.rAB_AsymmetryIndicator",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_rAB_AsymmetryIndicator_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_maxBitrate,
|
|
{ "maxBitrate",
|
|
"ranap.rab_Parameters.maxBitrate",
|
|
FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_guaranteedBitrate,
|
|
{ "guaranteedBitrate",
|
|
"ranap.rab_Parameters.guaranteedBitrate",
|
|
FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_deliveryOrder,
|
|
{ "deliveryOrder",
|
|
"ranap.rab_Parameters.deliveryOrder",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_DeliveryOrder_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_maxSDU_Size,
|
|
{ "maxSDU_Size",
|
|
"ranap.rab_Parameters.maxSDU_Size",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sDU_ErrorRatio_mantissa,
|
|
{ "sDU_ErrorRatio: mantissa",
|
|
"ranap.rab_Parameters.sDU_ErrorRatio.mantissa",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sDU_ErrorRatio_exponent,
|
|
{ "sDU_ErrorRatio: exponent",
|
|
"ranap.rab_Parameters.sDU_ErrorRatio.exponent",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_residualBitErrorRatio_mantissa,
|
|
{ "residualBitErrorRatio: mantissa",
|
|
"ranap.rab_Parameters.residualBitErrorRatio.mantissa",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_residualBitErrorRatio_exponent,
|
|
{ "residualBitErrorRatio: exponent",
|
|
"ranap.rab_Parameters.residualBitErrorRatio.exponent",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_deliveryOfErroneousSDU,
|
|
{ "deliveryOfErroneousSDU",
|
|
"ranap.rab_Parameters.ranap_deliveryOfErroneousSDU",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_deliveryOfErroneousSDU_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_subflowSDU_Size,
|
|
{ "subflowSDU_Size",
|
|
"ranap.rab_Parameters.subflowSDU_Size",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_rAB_SubflowCombinationBitRate,
|
|
{ "rAB_SubflowCombinationBitRate",
|
|
"ranap.rab_Parameters.rAB_SubflowCombinationBitRate",
|
|
FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sDU_ErrorRatio_present,
|
|
{ "sDU_ErrorRatio",
|
|
"ranap.sDU_ErrorRatio_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sDU_FormatInformationParameters_present,
|
|
{ "sDU_FormatInformationParameters",
|
|
"ranap.sDU_FormatInformationParameters_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_subflowSDU_Size_present,
|
|
{ "subflowSDU_Size",
|
|
"ranap.subflowSDU_Size_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_rAB_SubflowCombinationBitRate_present,
|
|
{ "subflowSDU_Size",
|
|
"ranap.rAB_SubflowCombinationBitRate_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_transferDelay,
|
|
{ "transferDelay",
|
|
"ranap.rab_Parameters.transferDelay",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_trafficHandlingPriority,
|
|
{ "trafficHandlingPriority",
|
|
"ranap.rab_Parameters.trafficHandlingPriority",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_priority_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_priorityLevel,
|
|
{ "priorityLevel",
|
|
"ranap.rab_Parameters.allocationOrRetentionPriority.priorityLevel",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_priority_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_pre_emptionCapability,
|
|
{ "pre-emptionCapability",
|
|
"ranap.rab_Parameters.allocationOrRetentionPriority.pre_emptionCapability",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_pre_emptionCapability_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_pre_emptionVulnerability,
|
|
{ "pre-emptionVulnerability",
|
|
"ranap.rab_Parameters.allocationOrRetentionPriority.pre_emptionVulnerability",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_pre_emptionVulnerability_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_queuingAllowed,
|
|
{ "queuingAllowed",
|
|
"ranap.rab_Parameters.allocationOrRetentionPriority.queuingAllowed",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_queuingAllowed_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_sourceStatisticsDescriptor,
|
|
{ "sourceStatisticsDescriptor",
|
|
"ranap.rab_Parameters.sourceStatisticsDescriptor",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_sourceStatisticsDescriptor_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_relocationRequirement,
|
|
{ "relocationRequirement",
|
|
"ranap.rab_Parameters.relocationRequirement",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_relocationRequirement_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_userPlaneMode,
|
|
{ "userPlaneMode",
|
|
"ranap.userPlaneMode",
|
|
FT_UINT8, BASE_DEC, VALS(&ranap_userPlaneMode_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_uP_ModeVersions,
|
|
{ "uP_ModeVersions",
|
|
"ranap.uP_ModeVersions",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_number_of_ProtocolExtensionFields,
|
|
{ "Number of ProtocolExtensionFields",
|
|
"ranap.number_of_ProtocolExtensionFields",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ext_field_number_of_octets,
|
|
{ "Number of octets",
|
|
"ranap.ProtocolExtensionFields.octets",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_transportLayerAddress_length,
|
|
{ "bit length of transportLayerAddress",
|
|
"ranap.transportLayerAddress_length",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_transportLayerAddress,
|
|
{ "transportLayerAddress",
|
|
"ranap.transportLayerAddress",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_gTP_TEI,
|
|
{ "gTP_TEI",
|
|
"ranap.gTP_TEI",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_bindingID,
|
|
{ "bindingID",
|
|
"ranap.bindingID",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_pDP_TypeInformation_present,
|
|
{ "pDP_TypeInformation",
|
|
"ranap.pDP_TypeInformation_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dataVolumeReportingIndication_present,
|
|
{ "dataVolumeReportingIndication",
|
|
"ranap.dataVolumeReportingIndication_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_GTP_PDU_SequenceNumber_present,
|
|
{ "dl_GTP_PDU_SequenceNumber",
|
|
"ranap.dl_GTP_PDU_SequenceNumber_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ul_GTP_PDU_SequenceNumber_present,
|
|
{ "ul_GTP_PDU_SequenceNumber",
|
|
"ranap.ul_GTP_PDU_SequenceNumber_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_N_PDU_SequenceNumber_present,
|
|
{ "dl_N_PDU_SequenceNumber",
|
|
"ranap.dl_N_PDU_SequenceNumber_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ul_N_PDU_SequenceNumber_present,
|
|
{ "ul_N_PDU_SequenceNumber",
|
|
"ranap.ul_N_PDU_SequenceNumber_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_PDP_Type,
|
|
{ "PDP-Type",
|
|
"ranap.RAB_SetupOrModifyItemSecond.PDP_Type",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_PDP_Type_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dataVolumeReportingIndication,
|
|
{ "dataVolumeReportingIndication",
|
|
"ranap.RAB_SetupOrModifyItemSecond.dataVolumeReportingIndication",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_dataVolumeReportingIndication_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_GTP_PDU_SequenceNumber,
|
|
{ "dl_GTP_PDU_SequenceNumber",
|
|
"ranap.RAB_SetupOrModifyItemSecond.dl_GTP_PDU_SequenceNumber",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ul_GTP_PDU_SequenceNumber,
|
|
{ "ul_GTP_PDU_SequenceNumber",
|
|
"ranap.RAB_SetupOrModifyItemSecond.ul_GTP_PDU_SequenceNumber",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_N_PDU_SequenceNumber,
|
|
{ "ul_GTP_PDU_SequenceNumber",
|
|
"ranap.RAB_SetupOrModifyItemSecond.ul_GTP_PDU_SequenceNumber",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ul_N_PDU_SequenceNumber,
|
|
{ "ul_GTP_PDU_SequenceNumber",
|
|
"ranap.RAB_SetupOrModifyItemSecond.ul_GTP_PDU_SequenceNumber",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_cause_choice,
|
|
{ "cause choice",
|
|
"ranap.cause_choice",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_cause_choice_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_cause_value,
|
|
{ "cause value",
|
|
"ranap.cause_value",
|
|
FT_UINT8, BASE_DEC,VALS(&ranap_cause_value_str), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_transportLayerAddress_present,
|
|
{ "transportLayerAddress",
|
|
"ranap.transportLayerAddress_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_iuTransportAssociation_present,
|
|
{ "iuTransportAssociation",
|
|
"ranap.iuTransportAssociation_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_dataVolumes_present,
|
|
{ "dl_dataVolumes",
|
|
"ranap.dl_dataVolumes_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dataVolumeReference_present,
|
|
{ "dataVolumeReference",
|
|
"ranap.dataVolumeReference_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_UnsuccessfullyTransmittedDataVolume,
|
|
{ "dl-UnsuccessfullyTransmittedDataVolume",
|
|
"ranap.dl-UnsuccessfullyTransmittedDataVolume",
|
|
FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dataVolumeReference,
|
|
{ "dataVolumeReference",
|
|
"ranap.dataVolumeReference",
|
|
FT_UINT8, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_procedureCode_present,
|
|
{ "procedureCode",
|
|
"ranap.procedureCode_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_triggeringMessage_present,
|
|
{ "triggeringMessage",
|
|
"ranap.triggeringMessage_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_procedureCriticality_present,
|
|
{ "procedureCriticality",
|
|
"ranap.procedureCriticality_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_iEsCriticalityDiagnostics_present,
|
|
{ "iEsCriticalityDiagnostics",
|
|
"ranap.iEsCriticalityDiagnostics_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_triggeringMessage,
|
|
{ "triggeringMessage",
|
|
"ranap.triggeringMessage",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_pdu_index_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_procedureCriticality,
|
|
{ "procedureCriticality",
|
|
"ranap.procedureCriticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_iECriticality,
|
|
{ "iECriticality",
|
|
"ranap.iECriticality",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_criticality_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_repetitionNumber,
|
|
{ "repetitionNumber",
|
|
"ranap.repetitionNumber",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_num_of_CriticalityDiagnostics_IEs,
|
|
{ "Number of CriticalityDiagnostics-IEs",
|
|
"ranap.num_of_CriticalityDiagnostics_IEs",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_repetitionNumber_present,
|
|
{ "repetitionNumber",
|
|
"ranap.repetitionNumber_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_dl_UnsuccessfullyTransmittedDataVolume_present,
|
|
{ "dl-UnsuccessfullyTransmittedDataVolume",
|
|
"ranap.dl_UnsuccessfullyTransmittedDataVolume_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_CN_DomainIndicator,
|
|
{ "CN-DomainIndicator",
|
|
"ranap.CN_DomainIndicator",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_CN_DomainIndicator_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_service_Handover,
|
|
{ "service-Handover",
|
|
"ranap.service_Handover",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_service_Handover_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_IuSigConId,
|
|
{ "IuSigConId",
|
|
"ranap.IuSigConId",
|
|
FT_BYTES, BASE_NONE, NULL, 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_SAPI,
|
|
{ "SAPI",
|
|
"ranap.IuSigConId",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_SAPI_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_msg_extension_present,
|
|
{ "Message Extension",
|
|
"ranap.msg_extension_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_ProtocolExtensionContainer_present,
|
|
{ "ProtocolExtensionContainer",
|
|
"ranap.ProtocolExtensionContainer_present",
|
|
FT_UINT8, BASE_HEX, VALS(&ranap_presence_values), 0x0,
|
|
"", HFILL }
|
|
},
|
|
{ &hf_ranap_nas_pdu_length,
|
|
{ "length of NAS-PDU",
|
|
"ranap.nas_pdu_length",
|
|
FT_UINT16, BASE_DEC, NULL, 0x0,
|
|
"", HFILL }
|
|
}
|
|
};
|
|
|
|
/* Setup protocol subtree array */
|
|
static gint *ett[] = {
|
|
&ett_ranap,
|
|
&ett_ranap_optionals,
|
|
&ett_ranap_iE_Extension,
|
|
&ett_ranap_ie,
|
|
&ett_ranap_ie_pair,
|
|
&ett_ranap_rab,
|
|
&ett_ranap_ie_pair_first_value,
|
|
&ett_ranap_ie_pair_second_value,
|
|
&ett_ranap_sDU,
|
|
&ett_ranap_rAB_Parameters,
|
|
&ett_ranap_allocationOrRetentionPriority ,
|
|
&ett_ranap_CriticalityDiagnostics_IE
|
|
};
|
|
|
|
|
|
/* Register the protocol name and description */
|
|
proto_ranap = proto_register_protocol("Radio Access Network Application Part",
|
|
"RANAP", "ranap");
|
|
|
|
/* Register the header fields and subtrees */
|
|
proto_register_field_array(proto_ranap, hf, array_length(hf));
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
|
|
};
|
|
|
|
|
|
void
|
|
proto_reg_handoff_ranap(void)
|
|
{
|
|
dissector_handle_t ranap_handle;
|
|
|
|
ranap_handle = create_dissector_handle(dissect_ranap, proto_ranap);
|
|
dissector_add("sual.subsystem_number", SCCP_SSN_RANAP, ranap_handle);
|
|
dissector_add("sual.subsystem_number", SCCP_SSN_RANAP_C, ranap_handle);
|
|
dissector_add("sual.subsystem_number", SCCP_SSN_RANAP_D, ranap_handle);
|
|
}
|