--/////////////////////////////////////////////////////////////////////////////
--                                                                           //
-- Copyright Test Competence Center (TCC) ETH 2016                           //
--                                                                           //
-- The copyright to the computer  program(s) herein  is the property of TCC. //
-- The program(s) may be used and/or copied only with the written permission //
-- of TCC or in accordance with  the terms and conditions  stipulated in the //
-- agreement/contract under which the program(s) has been supplied.          //
--                                                                           //
--/////////////////////////////////////////////////////////////////////////////
--
--  File:               SS_DataTypes.asn
--  Rev:                R1B
--  Prodnr:             CNL 113 832
--  Contact:            http://ttcn.ericsson.se
--  Reference:          3GPP TS 24.080 v13.0.0

SS-DataTypes {
   itu-t identified-organization (4) etsi (0) mobileDomain (0) gsm-Access (2) modules (3)
   ss-DataTypes (2) version12 (12)}

DEFINITIONS

IMPLICIT TAGS ::=

BEGIN

-- exports all data types defined in this module

IMPORTS

SS-Code
FROM MAP-SS-Code {
   itu-t identified-organization (4) etsi (0) mobileDomain (0) gsm-Network (1) modules (3)
   map-SS-Code (15) version12 (12)}

-- imports MAP-SS-DataTypes
SS-Status, USSD-DataCodingScheme, USSD-String, CCBS-Feature
-- USSD-DataCodingScheme, USSD-String were introduced because of CNAP.
FROM MAP-SS-DataTypes {
   itu-t identified-organization (4) etsi (0) mobileDomain (0) gsm-Network (1) modules (3)
   map-SS-DataTypes (14) version12 (12)}

GSN-Address,
CUG-Index,
NotificationToMSUser
FROM MAP-MS-DataTypes {
   itu-t identified-organization (4) etsi (0) mobileDomain (0) gsm-Network (1) modules (3)
   map-MS-DataTypes (11) version12 (12)}

maxSignalInfoLength,
ISDN-AddressString,
ISDN-SubaddressString,
AlertingPattern,
LCSClientExternalID,
AddressString,
LCSServiceTypeID,
AgeOfLocationInformation
FROM MAP-CommonDataTypes {
   itu-t identified-organization (4) etsi (0) mobileDomain (0) gsm-Network (1) modules (3)
   map-CommonDataTypes (18) version12 (12)}

LocationType,
DeferredLocationEventType,
LCSClientName,
LCS-QoS,
Horizontal-Accuracy,
ResponseTime,
Ext-GeographicalInformation, 
VelocityEstimate,
SupportedGADShapes,
Add-GeographicalInformation,
LCSRequestorID,
LCS-ReferenceNumber,
LCSCodeword,
AreaEventInfo,
ReportingPLMNList,
PeriodicLDRInfo,
SequenceNumber

FROM MAP-LCS-DataTypes {
   itu-t identified-organization (4) etsi (0) mobileDomain (0)
   gsm-Network (1) modules (3) map-LCS-DataTypes (25) version12 (12)}

;

-- data types definition

SS-UserData ::= IA5String (SIZE (1.. maxSignalInfoLength))

NotifySS-Arg ::= SEQUENCE{
	ss-Code						[1]		SS-Code OPTIONAL,
	ss-Status					[4]		SS-Status OPTIONAL,
	ss-Notification				[5]		SS-Notification OPTIONAL,
	callIsWaiting-Indicator		[14]	NULL OPTIONAL,
	callOnHold-Indicator		[15]	CallOnHold-Indicator OPTIONAL,
	mpty-Indicator				[16]	NULL OPTIONAL,
	cug-Index					[17]	CUG-Index OPTIONAL,
	clirSuppressionRejected		[18]	NULL OPTIONAL,
	... ,
	ect-Indicator				[19]	ECT-Indicator OPTIONAL,
	nameIndicator				[20]	NameIndicator OPTIONAL,
	ccbs-Feature				[21]	CCBS-Feature OPTIONAL,
	alertingPattern				[22]	AlertingPattern OPTIONAL,
	multicall-Indicator			[23]	Multicall-Indicator OPTIONAL}

--  The nameIndicator is defined because of CNAP.

Multicall-Indicator	::= ENUMERATED {
		nbr-SNexceeded (0),
		nbr-Userexceeded (1)}

ForwardChargeAdviceArg ::= SEQUENCE{
	ss-Code						[0]		SS-Code,
	chargingInformation			[1]		ChargingInformation,
	...}

SS-Notification ::= OCTET STRING (SIZE (1))

--	  Bit 8 7 6 5 4	00000 (Unused)

--	Bit 3	Call is forwarded indication to A-subscriber
--		(calling subscriber)
--	0	No information content
--	1	Outgoing call has been forwarded to C

--	Bit 2	Call is forwarded indication to B-subscriber
--		(forwarding subscriber)
--	0	No information content
--	1	Incoming call has been forwarded to C

--	Bit 1	Call is forwarded indication to C-subscriber
--		(forwarded-to subscriber)
--	0	No information content
--	1	Incoming call is a forwarded call

ChargingInformation ::= SEQUENCE{
	e1	[1] E1 OPTIONAL,
	e2	[2] E2 OPTIONAL,
	e3	[3] E3 OPTIONAL,
	e4	[4] E4 OPTIONAL,
	e5	[5] E5 OPTIONAL,
	e6	[6] E6 OPTIONAL,
	e7	[7] E7 OPTIONAL,
	...}

E1 ::= INTEGER (0..max10TimesUnitsPerTime)
max10TimesUnitsPerTime INTEGER ::= 8191

E2 ::= INTEGER (0..max10TimesTimeInterval)
max10TimesTimeInterval INTEGER ::= 8191

E3 ::= INTEGER (0..max100TimesScalingFactor)
max100TimesScalingFactor INTEGER ::= 8191

E4 ::= INTEGER (0..max10TimesIncrement)
max10TimesIncrement INTEGER ::= 8191

E5 ::= INTEGER (0..max10TimesIncrementPerDataInterval)
max10TimesIncrementPerDataInterval INTEGER ::= 8191

E6 ::= INTEGER (0..maxNumberOfSegmentsPerDataInterval)
maxNumberOfSegmentsPerDataInterval INTEGER ::= 8191

E7 ::= INTEGER (0..max10TimesInitialTime)
max10TimesInitialTime INTEGER ::= 8191

CallOnHold-Indicator	::= ENUMERATED {
			callRetrieved (0),
			callOnHold (1)}

ForwardCUG-InfoArg ::= SEQUENCE {
	cug-Index			[0]	CUG-Index OPTIONAL,
	suppressPrefCUG		[1]	NULL OPTIONAL,
	suppressOA			[2]	NULL OPTIONAL,
	...}

ECT-Indicator	::= SEQUENCE {
	ect-CallState		[0]	ECT-CallState,
	rdn	[1]	RDN OPTIONAL,
	...}

ECT-CallState	::= ENUMERATED {
		alerting (0),
		active (1)}

	NameIndicator ::= SEQUENCE {
		callingName		[0] Name OPTIONAL,
		...}

	Name ::= CHOICE {
		namePresentationAllowed		[0] NameSet,
		presentationRestricted		[1] NULL,
		nameUnavailable				[2] NULL,
		namePresentationRestricted	[3] NameSet}

	NameSet ::= SEQUENCE {
		dataCodingScheme 		[0] USSD-DataCodingScheme,
		lengthInCharacters 		[1] INTEGER,
		nameString				[2] USSD-String,
		...}

-- NameIndicator, Name and NameSet are defined because of CNAP.
-- The USSD-DataCodingScheme shall indicate use of the default alphabet through the
-- following encoding:
--    bit  7   6   5   4   3   2   1   0
--       | 0   0   0   0 | 1   1   1   1|

RDN	::= CHOICE {
	presentationAllowedAddress				[0]	RemotePartyNumber,
	presentationRestricted					[1]	NULL,
	numberNotAvailableDueToInterworking		[2]	NULL,
	presentationRestrictedAddress			[3]	RemotePartyNumber}

RemotePartyNumber	::= SEQUENCE {
	partyNumber				[0]	ISDN-AddressString,
	partyNumberSubaddress	[1]	ISDN-SubaddressString OPTIONAL,
	...}

AccessRegisterCCEntryArg	::= SEQUENCE {
	...}

CallDeflectionArg	::= SEQUENCE {
	deflectedToNumber		[0]	AddressString,
	deflectedToSubaddress	[1]	ISDN-SubaddressString OPTIONAL,
	...}

UserUserServiceArg ::= SEQUENCE {
	uUS-Service		[0]	UUS-Service,
	uUS-Required	[1]	BOOLEAN,
	... }

UUS-Service ::= ENUMERATED {
	uUS1 (1),
	uUS2 (2),
	uUS3 (3),
	... }

-- exception handling:
-- In case of UUS-Service with any other value, indicated as "UUS required",
-- but not understood by the MS, the call will be cleared.

LocationNotificationArg	::= SEQUENCE {
	notificationType	[0]	NotificationToMSUser,
	locationType		[1]	LocationType,
	lcsClientExternalID	[2] LCSClientExternalID		OPTIONAL,
	lcsClientName		[3]	LCSClientName			OPTIONAL,
	... ,
	lcsRequestorID		[4] LCSRequestorID			OPTIONAL,
	lcsCodeword			[5]	LCSCodeword				OPTIONAL,
	lcsServiceTypeID	[6]	LCSServiceTypeID		OPTIONAL }
	
-- The notificationType may only be set to notifyLocationAllowed, 
-- notifyAndVerify-LocationAllowedIfNoResponse, 
-- or notifyAndVerify-LocationNotAllowedIfNoResponse.
-- The locationEstimateType field of the locationType may only be set to 
-- currentLocation, currentOrLastKnownLocation, 
-- notificationVerificationOnly, or activateDeferredLocation.
-- The deferredLocationEventType field of the locationType may only be set to 
-- enteringIntoArea, and/or leavingFromArea, and/or beingInsideArea, 
-- and/or periodicLDR.
-- For LCS location notification of MT-LR for current location, the 
-- locationEstimateType field of the locationType shall be set to currentLocation.
-- For LCS location notification of MT-LR for current or last known location, the 
-- locationEstimateType field of the locationType shall be set to currentOrLastKnownLocation.
-- For the LCS location notification for the LDR of MS available event, 
-- the locationEstimateType field of the locationType shall be set to currentLocation.
-- For LCS location notification for the LDR of change of area event, 
-- the locationEstimateType field of the locationType shall be set to
-- activateDeferredLocation, and the deferredLocationEventType shall be 
-- set to enteringIntoArea, and/or leavingFromArea, and/or beingInsideArea.
-- For the post positioning LCS location notification, the locationEstimateType 
-- field of the locationType shall be set to notificationVerificationOnly.
-- For LCS location notification for the LDR of periodic location event, 
-- the locationEstimateType field of the locationType shall be set to
-- activateDeferredLocation, and the 
-- deferredLocationEventType shall be set to periodicLDR.

-- exception handling:
-- At reception of an unrecognised notificationType value the receiver shall reject the 
-- operation with a return error cause of unexpected data value.
-- At reception of an unrecognised locationType value the receiver shall reject the
-- operation with a return error cause of unexpected data value.
-- At reception of an unallowed notificationType value the receiver shall either ignore the
-- received operation or reject the operation with a return error cause of unexpected 
-- data value.
-- At reception of an unallowed locationType value the receiver shall either ignore the
-- received operation or reject the operation with a return error cause of unexpected 
-- data value.



LocationNotificationRes	::= SEQUENCE {
	verificationResponse		[0]	VerificationResponse OPTIONAL,
	...}

VerificationResponse::= ENUMERATED {
	permissionDenied	(0),
	permissionGranted	(1),
	... }

-- exception handling:
-- an unrecognized value shall be treated the same as value 0 (permissionDenied)

LCS-MOLRArg	::= SEQUENCE {
	molr-Type			[0]	MOLR-Type,
	locationMethod		[1]	LocationMethod			OPTIONAL,
	lcs-QoS				[2]	LCS-QoS					OPTIONAL,
	lcsClientExternalID	[3] LCSClientExternalID		OPTIONAL,
	mlc-Number			[4]	ISDN-AddressString		OPTIONAL,
	gpsAssistanceData	[5]	GPSAssistanceData		OPTIONAL,
	...,
	supportedGADShapes	[6]	SupportedGADShapes		OPTIONAL,
	lcsServiceTypeID	[7]	LCSServiceTypeID		OPTIONAL,
	ageOfLocationInfo	[8]	AgeOfLocationInformation	OPTIONAL,
	locationType		[9]	LocationType			OPTIONAL,
	pseudonymIndicator	[10]	NULL					OPTIONAL,
	h-gmlc-address 		[11] GSN-Address			OPTIONAL,
	locationEstimate	[12] Ext-GeographicalInformation		OPTIONAL,
	velocityEstimate	[13] VelocityEstimate		OPTIONAL,
	referenceNumber 	[14] LCS-ReferenceNumber 	OPTIONAL,
	periodicLDRInfo		[15] PeriodicLDRInfo		OPTIONAL,
	locationUpdateRequest	[16]	NULL				OPTIONAL,
	sequenceNumber 		[17] SequenceNumber 		OPTIONAL,
	terminationCause 	[18] TerminationCause 		OPTIONAL,
	mo-lrShortCircuit	[19]	NULL				OPTIONAL,
	ganssAssistanceData	[20] GANSSAssistanceData	OPTIONAL,
	multiplePositioningProtocolPDUs	[21] MultiplePositioningProtocolPDUs	OPTIONAL }
-- The parameter locationMethod shall be included if and only if the molr-Type is set to value 
-- deCipheringKeys or assistanceData.
-- The parameter gpsAssistanceData shall be included if and only if the molr-Type is set to value 
-- assistanceData and locationMethod is set to value assistedGPS or assistedGPSandGANSS.
-- The parameter ganssAssistanceData shall be included if and only if the molr-Type is set to value 
-- assistanceData and locationMethod is set to value assistedGANSS or assistedGPSandGANSS.
-- supportedGADShapes shall not be included for deferred MO-LR initiation or deferred MO-LR or MT-LR
-- responses 
-- multiplePositioningProtocolPDUs may only be included for E-UTRAN access.
-- locationMethod shall not be included for E-UTRAN access.
-- gpsAssistanceData shall not be included for E-UTRAN access.
-- h-gmlc-address shall not be included for E-UTRAN access.
-- locationEstimate shall not be included for E-UTRAN access.
-- velocityEstimate shall not be included for E-UTRAN access.
-- referenceNumber shall not be included for E-UTRAN access.
-- periodicLDRInfo shall not be included for E-UTRAN access.
-- locationUpdateRequest shall not be included for E-UTRAN access.
-- sequenceNumber shall not be included for E-UTRAN access.
-- terminationCause shall not be included for E-UTRAN access.
-- mo-lrShortCircuit shall not be included for E-UTRAN access.
-- ganssAssistanceData shall not be included for E-UTRAN access.



MOLR-Type::= ENUMERATED {
	locationEstimate			(0),
	assistanceData				(1),
	deCipheringKeys				(2),
	... ,
	deferredMo-lrTTTPInitiation	(3),
	deferredMo-lrSelfLocationInitiation (4),
	deferredMt-lrOrmo-lrTTTPLocationEstimate (5),
	deferredMt-lrOrmo-lrCancellation (6)}
-- exception handling:
-- an unrecognized value shall be rejected by the receiver with a return error cause of
-- unexpected data value.
-- For E-UTRAN access, only locationEstimate or assistanceData shall be included

LocationMethod::= ENUMERATED {
	msBasedEOTD			(0),
	msAssistedEOTD		(1),
	assistedGPS			(2),
	...,
	msBasedOTDOA		(3),
	assistedGANSS		(4),
	assistedGPSandGANSS (5)
	}
-- exception handling:
-- When this parameter is received with value msBasedEOTD or msAssistedEOTD and the MS 
-- is camped on an UMTS Service Area then the receiver shall reject it 
-- with a return error cause of unexpected data value.
-- When this parameter is received with value msBasedOTDOA and the MS 
-- is camped on a GSM Cell then the receiver shall reject it with a return error cause of
-- unexpected data value.
-- an unrecognized value shall be rejected by the receiver with a return error cause of
-- unexpected data value.

GPSAssistanceData::= OCTET STRING (SIZE (1..38))
-- Octets 1 to 38 are coded in the same way as the octets 3 to 7+2n of Requested GPS Data IE
-- in 3GPP TS 49.031 [14].

GANSSAssistanceData::= OCTET STRING (SIZE (1..40))
-- Octets 1 to 40 are coded in the same way as the octets 3 to 9+2n of Requested GANSS Data IE
-- in 3GPP TS 49.031 [14] .

TerminationCause ::= ENUMERATED {
	subscriberTermination  (0),
	uETermination     (1),
	...} 
	
MultiplePositioningProtocolPDUs ::= SEQUENCE (SIZE (1..maxNumLPPMsg)) OF PositioningProtocolPDU

PositioningProtocolPDU ::= OCTET STRING
-- PositioningProtocolPDU contains a LPP message defined in 3GPP TS 36.355 [17].

maxNumLPPMsg INTEGER ::= 3



LCS-MOLRRes::= SEQUENCE {
	locationEstimate		[0]	Ext-GeographicalInformation		OPTIONAL,
	decipheringKeys			[1] DecipheringKeys					OPTIONAL,
	...,
	add-LocationEstimate	[2]	Add-GeographicalInformation 		OPTIONAL,
	velocityEstimate		[3] VelocityEstimate		OPTIONAL,
	referenceNumber 		[4] LCS-ReferenceNumber 	OPTIONAL,
	h-gmlc-address			[5]	GSN-Address				OPTIONAL,
	mo-lrShortCircuit		[6]	NULL					OPTIONAL,
	reportingPLMNList		[7]	ReportingPLMNList		OPTIONAL
	 }
-- Parameters locationEstimate or add-LocationEstimate (one but not both) 
-- shall be included if and only if the 
-- molr-Type in LocationRequestArg was set to value locationEstimate.
-- Parameter add-LocationEstimate shall not be included if the supportedGADShapes 
-- parameter was not received in the LCS-MOLRArg.
-- The locationEstimate and the add-locationEstimate parameters shall not be sent if
-- the supportedGADShapes parameter has been received in LCS-MOLRArg
-- and the shape encoded in locationEstimate or add-LocationEstimate is not marked
-- as supported in supportedGADShapes. In such a case LCS-MOLRArg
-- shall be rejected with error FacilityNotSupported with additional indication
-- shapeOfLocationEstimateNotSupported.
-- Parameter decipheringKeys shall be included if and only if the molr-Type
-- in LocationRequestArg was set to value deCipheringKeys.
-- Parameter velocityEstimate may only be included if the lcs-QoS in LCS-MOLRarg includes
-- velocityRequest
-- decipheringKeys shall not be included for E-UTRAN access.
-- referenceNumber shall not be included for E-UTRAN access.
-- h-gmlc-address shall not be included for E-UTRAN access.
-- mo-lrShortCircuit shall not be included for E-UTRAN access.
-- reportingPLMNList shall not be included for E-UTRAN access.



DecipheringKeys::= OCTET STRING (SIZE (15))
-- Octets in DecipheringKeys are coded in the same way as the octets 3 to 17 of Deciphering Key IE
-- in 3GPP TS 49.031 [14]. I.e. these octets contain Current Deciphering Key, Next Deciphering Key and 
-- Ciphering Key Flag.
LCS-AreaEventRequestArg	::= SEQUENCE {
	referenceNumber				[0]	LCS-ReferenceNumber,
	h-gmlc-address				[1]	GSN-Address,
	deferredLocationEventType	[3] DeferredLocationEventType,
	areaEventInfo				[4]	AreaEventInfo,
	... }

-- the msAvailableValue in the DeferredLocationEventType is not applicable for this procedure 

LCS-AreaEventReportArg	::= SEQUENCE {
	referenceNumber				[0]	LCS-ReferenceNumber,
	h-gmlc-address				[1]	GSN-Address,
	... }

LCS-AreaEventCancellationArg	::= SEQUENCE {
	referenceNumber				[0]	LCS-ReferenceNumber,
	h-gmlc-address				[1]	GSN-Address,
	... }


LCS-PeriodicLocationRequestArg	::= SEQUENCE {
	referenceNumber		[0] LCS-ReferenceNumber,
	periodicLDRInfo		[1]	PeriodicLDRInfo,
	lcsClientExternalID	[2] LCSClientExternalID,
	qoS					[3] LCS-QoS					OPTIONAL,
	h-gmlc-address		[4]	GSN-Address				OPTIONAL,
	mo-lrShortCircuit	[5]	NULL					OPTIONAL,
	reportingPLMNList	[6]	ReportingPLMNList		OPTIONAL,
	... }


LCS-PeriodicLocationRequestRes	::= SEQUENCE {
	mo-lrShortCircuit	[0]	NULL					OPTIONAL,
	... }


LCS-LocationUpdateArg	::= SEQUENCE {
	referenceNumber		[0] LCS-ReferenceNumber		OPTIONAL,
	add-LocationEstimate[1] Add-GeographicalInformation 		OPTIONAL,
	velocityEstimate	[2] VelocityEstimate		OPTIONAL,
	sequenceNumber		[3]	SequenceNumber			OPTIONAL,
	... }
-- add-LocationEstimate shall be included if and only if a location estimate was successfully
-- transferred towards an External LCS Client or was successfully obtained for UE self location
-- velocityEstimate may only be included if add-LocationEstimate is included

LCS-LocationUpdateRes	::= SEQUENCE {
	terminationCause 	[0] TerminationCause 		OPTIONAL,
	... }

LCS-PeriodicLocationCancellationArg	::= SEQUENCE {
	referenceNumber		[0] LCS-ReferenceNumber,
	h-gmlc-address		[1]	GSN-Address				OPTIONAL,
	... }


END
