-- **************************************************************
--
-- Information Element Definitions
--
-- **************************************************************

RUA-IEs {
itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
umts-Access (20) modules (3) rua(5) version1 (1) rUA-IEs (2) }

DEFINITIONS AUTOMATIC TAGS ::= 

BEGIN

IMPORTS
	maxNrOfErrors
FROM RUA-Constants

	Criticality,
	ProcedureCode,
	ProtocolIE-ID,
	TriggeringMessage
FROM RUA-CommonDataTypes

	ProtocolExtensionContainer{},
	RUA-PROTOCOL-EXTENSION
FROM RUA-Containers;


CN-DomainIndicator ::= ENUMERATED { 
	cs-domain, 
	ps-domain 
}

CSGMembershipStatus ::= ENUMERATED { 
	member, 
	non-member,
	...
}

Establishment-Cause ::= ENUMERATED {
	emergency-call,
	normal-call,
	... 
}





Context-ID	::=	 BIT STRING (SIZE(24))

IntraDomainNasNodeSelector ::=	SEQUENCE {
	version	CHOICE {
		release99	SEQUENCE {
			cn-Type		CHOICE {
				gsm-Map-IDNNS	Gsm-map-IDNNS,
				ansi-41-IDNNS	Ansi-41-IDNNS
			}
		},
		later	SEQUENCE {
			futurecoding	BIT STRING (SIZE (15))
		}
	}
}

Gsm-map-IDNNS ::= SEQUENCE {
	routingbasis	CHOICE {
		localPTMSI	SEQUENCE {
			routingparameter	RoutingParameter
		},
		tMSIofsamePLMN	SEQUENCE {
			routingparameter	RoutingParameter
		},
		tMSIofdifferentPLMN	SEQUENCE {
			routingparameter	RoutingParameter
		},
		iMSIresponsetopaging	SEQUENCE {
			routingparameter	RoutingParameter
		},
		iMSIcauseUEinitiatedEvent SEQUENCE {
			routingparameter	RoutingParameter
		},
		iMEI	SEQUENCE {
			routingparameter	RoutingParameter
		},
		spare2	SEQUENCE {
			routingparameter	RoutingParameter
		},
		spare1	SEQUENCE {
			routingparameter	RoutingParameter
		}
	},
	-- dummy is not used in this version of the specification and
	-- it should be ignored by the receiver.
	dummy	BOOLEAN
}


Ansi-41-IDNNS ::= BIT STRING (SIZE (14))

RANAP-Message	::= OCTET STRING

RoutingParameter ::= BIT STRING (SIZE (10))


-- **************************************************************
--
-- Cause IE
--
-- **************************************************************

Cause ::= CHOICE {
	radioNetwork	CauseRadioNetwork,
	transport	CauseTransport,
	protocol	CauseProtocol,
	misc		CauseMisc,
	...
}
CauseRadioNetwork ::= ENUMERATED {
	normal,
	connect-failed,
	network-release,
	unspecified,
	...
}
CauseTransport ::= ENUMERATED {
	transport-resource-unavailable,
	unspecified,
	...
}

CauseProtocol ::= ENUMERATED {
	transfer-syntax-error,
	abstract-syntax-error-reject,
	abstract-syntax-error-ignore-and-notify,
	message-not-compatible-with-receiver-state,
	semantic-error,
	unspecified,
	abstract-syntax-error-falsely-constructed-message,
	...
}

CauseMisc ::= ENUMERATED {
	processing-overload,
	hardware-failure,
	o-and-m-intervention,
	unspecified,
	...
}

-- **************************************************************
--
-- CriticalityDiagnostics
--
-- **************************************************************

CriticalityDiagnostics ::= SEQUENCE {
	procedureCode			ProcedureCode	OPTIONAL,
	triggeringMessage		TriggeringMessage	OPTIONAL,
	procedureCriticality		Criticality	OPTIONAL,
	iEsCriticalityDiagnostics	CriticalityDiagnostics-IE-List	OPTIONAL,
	iE-Extensions			ProtocolExtensionContainer { {CriticalityDiagnostics-ExtIEs} } 	OPTIONAL,
	...
}

CriticalityDiagnostics-IE-List ::= SEQUENCE (SIZE (1..maxNrOfErrors)) OF
	SEQUENCE {
		iECriticality			Criticality,
		iE-ID				ProtocolIE-ID,
		typeOfError			TypeOfError,
		iE-Extensions			ProtocolExtensionContainer { {CriticalityDiagnostics-IE-List-ExtIEs} }	OPTIONAL,
		...
	}

CriticalityDiagnostics-IE-List-ExtIEs RUA-PROTOCOL-EXTENSION ::= {
	...
}

CriticalityDiagnostics-ExtIEs RUA-PROTOCOL-EXTENSION ::= {
	...
}


TypeOfError ::= ENUMERATED {
	not-understood,
	missing,
	...
}

END
