/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "RUA-IEs"
 * 	found in "../../asn1/rua/RUA-IEs.asn"
 */

#ifndef	_RUA_Gsm_map_IDNNS_H_
#define	_RUA_Gsm_map_IDNNS_H_


#include <asn_application.h>

/* Including external dependencies */
#include <BOOLEAN.h>
#include <osmocom/rua/RUA_RoutingParameter.h>
#include <constr_SEQUENCE.h>
#include <constr_CHOICE.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Dependencies */
typedef enum routingbasis_PR {
	routingbasis_PR_NOTHING,	/* No components present */
	routingbasis_PR_localPTMSI,
	routingbasis_PR_tMSIofsamePLMN,
	routingbasis_PR_tMSIofdifferentPLMN,
	routingbasis_PR_iMSIresponsetopaging,
	routingbasis_PR_iMSIcauseUEinitiatedEvent,
	routingbasis_PR_iMEI,
	routingbasis_PR_spare2,
	routingbasis_PR_spare1
} routingbasis_PR;

/* RUA_Gsm-map-IDNNS */
typedef struct RUA_Gsm_map_IDNNS {
	struct routingbasis {
		routingbasis_PR present;
		union RUA_Gsm_map_IDNNS__routingbasis_u {
			struct localPTMSI {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} localPTMSI;
			struct tMSIofsamePLMN {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} tMSIofsamePLMN;
			struct tMSIofdifferentPLMN {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} tMSIofdifferentPLMN;
			struct iMSIresponsetopaging {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} iMSIresponsetopaging;
			struct iMSIcauseUEinitiatedEvent {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} iMSIcauseUEinitiatedEvent;
			struct iMEI {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} iMEI;
			struct spare2 {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} spare2;
			struct spare1 {
				RUA_RoutingParameter_t	 routingparameter;
				
				/* Context for parsing across buffer boundaries */
				asn_struct_ctx_t _asn_ctx;
			} spare1;
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} routingbasis;
	BOOLEAN_t	 dummy;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} RUA_Gsm_map_IDNNS_t;

/* Implementation */
extern asn_TYPE_descriptor_t asn_DEF_RUA_Gsm_map_IDNNS;

#ifdef __cplusplus
}
#endif

#endif	/* _RUA_Gsm_map_IDNNS_H_ */
#include <asn_internal.h>
