From Pascal Quantin.

The attached patch adds the LPPa (LTE Positioning Protocol A) dissector as
specified in 3GPP 36.455 release 9.4.1.
(Part 2)
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6478

svn path=/trunk/; revision=39516
This commit is contained in:
Anders Broman 2011-10-23 18:05:07 +00:00
parent 4dcd0ff1e3
commit a18ab9b870
11 changed files with 130 additions and 34 deletions

View File

@ -67,6 +67,7 @@ SUBDIRS = \
ldap \
logotypecertextn \
lpp \
lppa \
lte-rrc \
mms \
mpeg-audio \

View File

@ -121,6 +121,7 @@ PER_LIST= \
hnbap \
lcsap \
lpp \
lppa \
lte-rrc \
nbap \
mpeg-audio \

View File

@ -60,6 +60,34 @@ ProtocolIE-Field/value ie_field_value
#.FN_PARS ProtocolExtensionID VAL_PTR=&ProtocolExtensionID
#.FN_PARS ProtocolExtensionField/extensionValue FN_VARIANT=_pdu_new TYPE_REF_FN=dissect_ProtocolExtensionFieldExtensionValue
#.FN_PARS Payload-Type VAL_PTR=&PayloadType
#.FN_BODY APDU VAL_PTR = &parameter_tvb
tvbuff_t *parameter_tvb=NULL;
%(DEFAULT_BODY)s
if (parameter_tvb) {
switch (PayloadType) {
case 0:
/* LPP */
if (lpp_handle) {
call_dissector(lpp_handle, parameter_tvb, %(ACTX)s->pinfo, tree);
}
break;
case 1:
/* LPPa */
if (lppa_handle) {
call_dissector(lppa_handle, parameter_tvb, %(ACTX)s->pinfo, tree);
}
break;
default:
break;
}
}
PayloadType = -1;
#.FN_PARS ProcedureCode VAL_PTR = &ProcedureCode
#.FN_FTR ProcedureCode

View File

@ -55,6 +55,9 @@
#define PSNAME "LCSAP"
#define PFNAME "lcsap"
static dissector_handle_t lpp_handle;
static dissector_handle_t lppa_handle;
#define SCTP_PORT_LCSAP 9082
#include "packet-lcsap-val.h"
/* Strcture to hold ProcedureCode */
@ -75,6 +78,7 @@ static int ett_lcsap = -1;
static guint32 ProcedureCode;
static guint32 ProtocolIE_ID;
static guint32 ProtocolExtensionID;
static guint32 PayloadType = -1;
static guint gbl_lcsapSctpPort=SCTP_PORT_LCSAP;
/* Dissector tables */
@ -148,7 +152,8 @@ proto_reg_handoff_lcsap(void)
if (!Initialized) {
lcsap_handle = find_dissector("lcsap");
lpp_handle = find_dissector("lpp");
lppa_handle = find_dissector("lppa");
dissector_add_handle("sctp.port", lcsap_handle); /* for "decode-as" */
dissector_add_uint("sctp.ppi", LCS_AP_PAYLOAD_PROTOCOL_ID, lcsap_handle);
Initialized=TRUE;

View File

@ -59,6 +59,7 @@
#define SCTP_PORT_S1AP 36412
static dissector_handle_t nas_eps_handle;
static dissector_handle_t lppa_handle;
#include "packet-s1ap-val.h"
@ -186,6 +187,7 @@ proto_reg_handoff_s1ap(void)
if (!Initialized) {
nas_eps_handle = find_dissector("nas-eps");
lppa_handle = find_dissector("lppa");
dissector_add_handle("sctp.port", s1ap_handle); /* for "decode-as" */
dissector_add_uint("sctp.ppi", S1AP_PAYLOAD_PROTOCOL_ID, s1ap_handle);
Initialized=TRUE;

View File

@ -237,6 +237,15 @@ MAX_VAL = asn1_param_get_integer(%(ACTX)s,"upperBound")
if ((tvb_length(parameter_tvb)>0)&&(nas_eps_handle))
call_dissector(nas_eps_handle,parameter_tvb,%(ACTX)s->pinfo, tree);
#.FN_BODY LPPa-PDU VAL_PTR = &parameter_tvb
tvbuff_t *parameter_tvb=NULL;
%(DEFAULT_BODY)s
if ((tvb_length(parameter_tvb)>0)&&(lppa_handle))
call_dissector(lppa_handle, parameter_tvb, %(ACTX)s->pinfo, tree);
#.FN_BODY TransportLayerAddress VAL_PTR = &parameter_tvb
tvbuff_t *parameter_tvb=NULL;
proto_tree *subtree;

View File

@ -1930,6 +1930,7 @@ AC_OUTPUT(
asn1/ldap/Makefile
asn1/logotypecertextn/Makefile
asn1/lpp/Makefile
asn1/lppa/Makefile
asn1/lte-rrc/Makefile
asn1/mms/Makefile
asn1/mpeg-audio/Makefile

View File

@ -211,6 +211,7 @@ set(ASN1_DISSECTOR_SRC
dissectors/packet-h460.c
dissectors/packet-h501.c
dissectors/packet-idmp.c
dissectors/packet-lppa.c
dissectors/packet-logotypecertextn.c
dissectors/packet-mms.c
dissectors/packet-mpeg-audio.c
@ -261,6 +262,7 @@ set(DIRTY_ASN1_DISSECTOR_SRC
dissectors/packet-inap.c
dissectors/packet-lcsap.c
dissectors/packet-ldap.c
dissectors/packet-lpp.c
dissectors/packet-lte-rrc.c
dissectors/packet-nbap.c
dissectors/packet-p1.c
@ -413,6 +415,7 @@ set(DISSECTOR_SRC
dissectors/packet-cosine.c
dissectors/packet-cpfi.c
dissectors/packet-cpha.c
dissectors/packet-csg.c
dissectors/packet-csm-encaps.c
dissectors/packet-ctdb.c
dissectors/packet-cups.c

View File

@ -126,6 +126,7 @@ ASN1_DISSECTOR_SRC = \
packet-HI2Operations.c \
packet-hnbap.c \
packet-lcsap.c \
packet-lppa.c \
packet-idmp.c \
packet-inap.c \
packet-logotypecertextn.c \
@ -1047,7 +1048,7 @@ DISSECTOR_SRC = \
packet-zebra.c \
packet-zep.c \
packet-ziop.c \
packet-zrtp.c
packet-zrtp.c \
#
# Headers for dissectors.
@ -1094,6 +1095,7 @@ DISSECTOR_INCLUDES = \
packet-cms.h \
packet-credssp.h \
packet-crmf.h \
packet-csg.c \
packet-csn1.h \
packet-dap.h \
packet-data.h \

View File

@ -63,6 +63,9 @@
#define PSNAME "LCSAP"
#define PFNAME "lcsap"
static dissector_handle_t lpp_handle;
static dissector_handle_t lppa_handle;
#define SCTP_PORT_LCSAP 9082
/*--- Included file: packet-lcsap-val.h ---*/
@ -107,7 +110,7 @@ typedef enum _ProtocolIE_ID_enum {
} ProtocolIE_ID_enum;
/*--- End of included file: packet-lcsap-val.h ---*/
#line 60 "../../asn1/lcsap/packet-lcsap-template.c"
#line 63 "../../asn1/lcsap/packet-lcsap-template.c"
/* Strcture to hold ProcedureCode */
struct pro_code {
guint8 code;
@ -226,7 +229,7 @@ static int hf_lcsap_successfulOutcome_value = -1; /* SuccessfulOutcome_value */
static int hf_lcsap_unsuccessfulOutcome_value = -1; /* UnsuccessfulOutcome_value */
/*--- End of included file: packet-lcsap-hf.c ---*/
#line 68 "../../asn1/lcsap/packet-lcsap-template.c"
#line 71 "../../asn1/lcsap/packet-lcsap-template.c"
/* Initialize the subtree pointers */
static int ett_lcsap = -1;
@ -281,12 +284,13 @@ static gint ett_lcsap_SuccessfulOutcome = -1;
static gint ett_lcsap_UnsuccessfulOutcome = -1;
/*--- End of included file: packet-lcsap-ett.c ---*/
#line 73 "../../asn1/lcsap/packet-lcsap-template.c"
#line 76 "../../asn1/lcsap/packet-lcsap-template.c"
/* Global variables */
static guint32 ProcedureCode;
static guint32 ProtocolIE_ID;
static guint32 ProtocolExtensionID;
static guint32 PayloadType = -1;
static guint gbl_lcsapSctpPort=SCTP_PORT_LCSAP;
/* Dissector tables */
@ -340,7 +344,7 @@ dissect_lcsap_ProcedureCode(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
0U, 255U, &ProcedureCode, FALSE);
#line 65 "../../asn1/lcsap/lcsap.cnf"
#line 93 "../../asn1/lcsap/lcsap.cnf"
if (check_col(actx->pinfo->cinfo, COL_INFO))
{
@ -508,8 +512,35 @@ dissect_lcsap_ProtocolExtensionContainer(tvbuff_t *tvb _U_, int offset _U_, asn1
static int
dissect_lcsap_APDU(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 66 "../../asn1/lcsap/lcsap.cnf"
tvbuff_t *parameter_tvb=NULL;
offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
NO_BOUND, NO_BOUND, FALSE, NULL);
NO_BOUND, NO_BOUND, FALSE, &parameter_tvb);
if (parameter_tvb) {
switch (PayloadType) {
case 0:
/* LPP */
if (lpp_handle) {
call_dissector(lpp_handle, parameter_tvb, actx->pinfo, tree);
}
break;
case 1:
/* LPPa */
if (lppa_handle) {
call_dissector(lppa_handle, parameter_tvb, actx->pinfo, tree);
}
break;
default:
break;
}
}
PayloadType = -1;
return offset;
}
@ -646,7 +677,7 @@ dissect_lcsap_DegreesLongitude(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *ac
static int
dissect_lcsap_PLMN_ID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 136 "../../asn1/lcsap/lcsap.cnf"
#line 164 "../../asn1/lcsap/lcsap.cnf"
tvbuff_t *parameter_tvb=NULL;
offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
3, 3, FALSE, &parameter_tvb);
@ -1448,7 +1479,7 @@ static const value_string lcsap_Payload_Type_vals[] = {
static int
dissect_lcsap_Payload_Type(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
2, NULL, TRUE, 0, NULL);
2, &PayloadType, TRUE, 0, NULL);
return offset;
}
@ -2010,7 +2041,7 @@ static int dissect_LCS_AP_PDU_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, pro
/*--- End of included file: packet-lcsap-fn.c ---*/
#line 96 "../../asn1/lcsap/packet-lcsap-template.c"
#line 100 "../../asn1/lcsap/packet-lcsap-template.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@ -2066,7 +2097,8 @@ proto_reg_handoff_lcsap(void)
if (!Initialized) {
lcsap_handle = find_dissector("lcsap");
lpp_handle = find_dissector("lpp");
lppa_handle = find_dissector("lppa");
dissector_add_handle("sctp.port", lcsap_handle); /* for "decode-as" */
dissector_add_uint("sctp.ppi", LCS_AP_PAYLOAD_PROTOCOL_ID, lcsap_handle);
Initialized=TRUE;
@ -2107,7 +2139,7 @@ proto_reg_handoff_lcsap(void)
/*--- End of included file: packet-lcsap-dis-tab.c ---*/
#line 156 "../../asn1/lcsap/packet-lcsap-template.c"
#line 161 "../../asn1/lcsap/packet-lcsap-template.c"
} else {
if (SctpPort != 0) {
dissector_delete_uint("sctp.port", SctpPort, lcsap_handle);
@ -2554,7 +2586,7 @@ void proto_register_lcsap(void) {
"UnsuccessfulOutcome_value", HFILL }},
/*--- End of included file: packet-lcsap-hfarr.c ---*/
#line 174 "../../asn1/lcsap/packet-lcsap-template.c"
#line 179 "../../asn1/lcsap/packet-lcsap-template.c"
};
/* List of subtrees */
@ -2610,7 +2642,7 @@ void proto_register_lcsap(void) {
&ett_lcsap_UnsuccessfulOutcome,
/*--- End of included file: packet-lcsap-ettarr.c ---*/
#line 180 "../../asn1/lcsap/packet-lcsap-template.c"
#line 185 "../../asn1/lcsap/packet-lcsap-template.c"
};
module_t *lcsap_module;

View File

@ -67,6 +67,7 @@
#define SCTP_PORT_S1AP 36412
static dissector_handle_t nas_eps_handle;
static dissector_handle_t lppa_handle;
/*--- Included file: packet-s1ap-val.h ---*/
@ -305,7 +306,7 @@ typedef enum _ProtocolIE_ID_enum {
} ProtocolIE_ID_enum;
/*--- End of included file: packet-s1ap-val.h ---*/
#line 64 "../../asn1/s1ap/packet-s1ap-template.c"
#line 65 "../../asn1/s1ap/packet-s1ap-template.c"
/* Initialize the protocol and registered fields */
static int proto_s1ap = -1;
@ -748,7 +749,7 @@ static int hf_s1ap_candidateCellList = -1; /* CandidateCellList */
static int hf_s1ap_CandidateCellList_item = -1; /* IRAT_Cell_ID */
/*--- End of included file: packet-s1ap-hf.c ---*/
#line 71 "../../asn1/s1ap/packet-s1ap-template.c"
#line 72 "../../asn1/s1ap/packet-s1ap-template.c"
/* Initialize the subtree pointers */
static int ett_s1ap = -1;
@ -986,7 +987,7 @@ static gint ett_s1ap_HOReport = -1;
static gint ett_s1ap_CandidateCellList = -1;
/*--- End of included file: packet-s1ap-ett.c ---*/
#line 81 "../../asn1/s1ap/packet-s1ap-template.c"
#line 82 "../../asn1/s1ap/packet-s1ap-template.c"
enum{
INITIATING_MESSAGE,
@ -2905,7 +2906,7 @@ dissect_s1ap_ENBname(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, pr
static int
dissect_s1ap_TransportLayerAddress(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 241 "../../asn1/s1ap/s1ap.cnf"
#line 250 "../../asn1/s1ap/s1ap.cnf"
tvbuff_t *parameter_tvb=NULL;
proto_tree *subtree;
gint tvb_len;
@ -3309,7 +3310,7 @@ static const value_string s1ap_HandoverType_vals[] = {
static int
dissect_s1ap_HandoverType(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 276 "../../asn1/s1ap/s1ap.cnf"
#line 285 "../../asn1/s1ap/s1ap.cnf"
offset = dissect_per_enumerated(tvb, offset, actx, tree, hf_index,
5, &handover_type_value, TRUE, 0, NULL);
@ -3444,8 +3445,18 @@ dissect_s1ap_LastVisitedCell_Item(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t
static int
dissect_s1ap_LPPa_PDU(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 241 "../../asn1/s1ap/s1ap.cnf"
tvbuff_t *parameter_tvb=NULL;
offset = dissect_per_octet_string(tvb, offset, actx, tree, hf_index,
NO_BOUND, NO_BOUND, FALSE, NULL);
NO_BOUND, NO_BOUND, FALSE, &parameter_tvb);
if ((tvb_length(parameter_tvb)>0)&&(lppa_handle))
call_dissector(lppa_handle, parameter_tvb, actx->pinfo, tree);
return offset;
}
@ -3761,7 +3772,7 @@ dissect_s1ap_RepetitionPeriod(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *act
static int
dissect_s1ap_RRC_Container(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 406 "../../asn1/s1ap/s1ap.cnf"
#line 415 "../../asn1/s1ap/s1ap.cnf"
gint32 start_offset;
@ -3994,7 +4005,7 @@ dissect_s1ap_SONConfigurationTransfer(tvbuff_t *tvb _U_, int offset _U_, asn1_ct
static int
dissect_s1ap_Source_ToTarget_TransparentContainer(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 295 "../../asn1/s1ap/s1ap.cnf"
#line 304 "../../asn1/s1ap/s1ap.cnf"
gint32 start_offset;
tvbuff_t *parameter_tvb;
proto_tree *subtree;
@ -4365,7 +4376,7 @@ dissect_s1ap_TargeteNB_ToSourceeNB_TransparentContainer(tvbuff_t *tvb _U_, int o
static int
dissect_s1ap_Target_ToSource_TransparentContainer(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 349 "../../asn1/s1ap/s1ap.cnf"
#line 358 "../../asn1/s1ap/s1ap.cnf"
gint32 start_offset;
tvbuff_t *parameter_tvb;
@ -4619,7 +4630,7 @@ dissect_s1ap_UEPagingID(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_,
static int
dissect_s1ap_UERadioCapability(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 466 "../../asn1/s1ap/s1ap.cnf"
#line 475 "../../asn1/s1ap/s1ap.cnf"
gint32 start_offset;
tvbuff_t *parameter_tvb;
@ -4735,7 +4746,7 @@ static const per_sequence_t HandoverRequired_sequence[] = {
static int
dissect_s1ap_HandoverRequired(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 281 "../../asn1/s1ap/s1ap.cnf"
#line 290 "../../asn1/s1ap/s1ap.cnf"
handover_type_value = 0;
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
@ -4752,7 +4763,7 @@ static const per_sequence_t HandoverCommand_sequence[] = {
static int
dissect_s1ap_HandoverCommand(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 283 "../../asn1/s1ap/s1ap.cnf"
#line 292 "../../asn1/s1ap/s1ap.cnf"
handover_type_value = 0;
offset = dissect_per_sequence(tvb, offset, actx, tree, hf_index,
@ -4811,7 +4822,7 @@ static const per_sequence_t HandoverRequest_sequence[] = {
static int
dissect_s1ap_HandoverRequest(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 285 "../../asn1/s1ap/s1ap.cnf"
#line 294 "../../asn1/s1ap/s1ap.cnf"
handover_type_value = 0;
@ -5559,7 +5570,7 @@ static const per_sequence_t DownlinkNASTransport_sequence[] = {
static int
dissect_s1ap_DownlinkNASTransport(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 268 "../../asn1/s1ap/s1ap.cnf"
#line 277 "../../asn1/s1ap/s1ap.cnf"
/* Set the direction of the message */
actx->pinfo->link_dir=P2P_DIR_DL;
@ -5578,7 +5589,7 @@ static const per_sequence_t InitialUEMessage_sequence[] = {
static int
dissect_s1ap_InitialUEMessage(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 264 "../../asn1/s1ap/s1ap.cnf"
#line 273 "../../asn1/s1ap/s1ap.cnf"
/* Set the direction of the message */
actx->pinfo->link_dir=P2P_DIR_UL;
@ -5597,7 +5608,7 @@ static const per_sequence_t UplinkNASTransport_sequence[] = {
static int
dissect_s1ap_UplinkNASTransport(tvbuff_t *tvb _U_, int offset _U_, asn1_ctx_t *actx _U_, proto_tree *tree _U_, int hf_index _U_) {
#line 272 "../../asn1/s1ap/s1ap.cnf"
#line 281 "../../asn1/s1ap/s1ap.cnf"
/* Set the direction of the message */
actx->pinfo->link_dir=P2P_DIR_UL;
@ -8354,7 +8365,7 @@ int dissect_s1ap_SONtransferCause_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_,
/*--- End of included file: packet-s1ap-fn.c ---*/
#line 123 "../../asn1/s1ap/packet-s1ap-template.c"
#line 124 "../../asn1/s1ap/packet-s1ap-template.c"
static int dissect_ProtocolIEFieldValue(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@ -8421,6 +8432,7 @@ proto_reg_handoff_s1ap(void)
if (!Initialized) {
nas_eps_handle = find_dissector("nas-eps");
lppa_handle = find_dissector("lppa");
dissector_add_handle("sctp.port", s1ap_handle); /* for "decode-as" */
dissector_add_uint("sctp.ppi", S1AP_PAYLOAD_PROTOCOL_ID, s1ap_handle);
Initialized=TRUE;
@ -8628,7 +8640,7 @@ proto_reg_handoff_s1ap(void)
/*--- End of included file: packet-s1ap-dis-tab.c ---*/
#line 193 "../../asn1/s1ap/packet-s1ap-template.c"
#line 195 "../../asn1/s1ap/packet-s1ap-template.c"
} else {
if (SctpPort != 0) {
dissector_delete_uint("sctp.port", SctpPort, s1ap_handle);
@ -10385,7 +10397,7 @@ void proto_register_s1ap(void) {
NULL, HFILL }},
/*--- End of included file: packet-s1ap-hfarr.c ---*/
#line 221 "../../asn1/s1ap/packet-s1ap-template.c"
#line 223 "../../asn1/s1ap/packet-s1ap-template.c"
};
/* List of subtrees */
@ -10624,7 +10636,7 @@ void proto_register_s1ap(void) {
&ett_s1ap_CandidateCellList,
/*--- End of included file: packet-s1ap-ettarr.c ---*/
#line 232 "../../asn1/s1ap/packet-s1ap-template.c"
#line 234 "../../asn1/s1ap/packet-s1ap-template.c"
};
module_t *s1ap_module;