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

#include <osmocom/ranap/RANAP_SourceRNC-ToTargetRNC-TransparentContainer.h>

static asn_TYPE_member_t asn_MBR_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, rRC_Container),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RRC_Container,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"rRC-Container"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, numberOfIuInstances),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_NumberOfIuInstances,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"numberOfIuInstances"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, relocationType),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RelocationType,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"relocationType"
		},
	{ ATF_POINTER, 10, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenIntegrityProtectionAlgorithm),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ChosenIntegrityProtectionAlgorithm,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"chosenIntegrityProtectionAlgorithm"
		},
	{ ATF_POINTER, 9, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, integrityProtectionKey),
		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IntegrityProtectionKey,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"integrityProtectionKey"
		},
	{ ATF_POINTER, 8, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenEncryptionAlgorithForSignalling),
		(ASN_TAG_CLASS_CONTEXT | (5 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ChosenEncryptionAlgorithm,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"chosenEncryptionAlgorithForSignalling"
		},
	{ ATF_POINTER, 7, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, cipheringKey),
		(ASN_TAG_CLASS_CONTEXT | (6 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_EncryptionKey,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"cipheringKey"
		},
	{ ATF_POINTER, 6, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenEncryptionAlgorithForCS),
		(ASN_TAG_CLASS_CONTEXT | (7 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ChosenEncryptionAlgorithm,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"chosenEncryptionAlgorithForCS"
		},
	{ ATF_POINTER, 5, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, chosenEncryptionAlgorithForPS),
		(ASN_TAG_CLASS_CONTEXT | (8 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ChosenEncryptionAlgorithm,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"chosenEncryptionAlgorithForPS"
		},
	{ ATF_POINTER, 4, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, d_RNTI),
		(ASN_TAG_CLASS_CONTEXT | (9 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_D_RNTI,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"d-RNTI"
		},
	{ ATF_POINTER, 3, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, targetCellId),
		(ASN_TAG_CLASS_CONTEXT | (10 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_TargetCellId,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"targetCellId"
		},
	{ ATF_POINTER, 2, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, rAB_TrCH_Mapping),
		(ASN_TAG_CLASS_CONTEXT | (11 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RAB_TrCH_Mapping,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"rAB-TrCH-Mapping"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (12 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_oms_1[] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
static const ber_tlv_tag_t asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rRC-Container */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* numberOfIuInstances */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* relocationType */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* chosenIntegrityProtectionAlgorithm */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* integrityProtectionKey */
    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* chosenEncryptionAlgorithForSignalling */
    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* cipheringKey */
    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* chosenEncryptionAlgorithForCS */
    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 }, /* chosenEncryptionAlgorithForPS */
    { (ASN_TAG_CLASS_CONTEXT | (9 << 2)), 9, 0, 0 }, /* d-RNTI */
    { (ASN_TAG_CLASS_CONTEXT | (10 << 2)), 10, 0, 0 }, /* targetCellId */
    { (ASN_TAG_CLASS_CONTEXT | (11 << 2)), 11, 0, 0 }, /* rAB-TrCH-Mapping */
    { (ASN_TAG_CLASS_CONTEXT | (12 << 2)), 12, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_specs_1 = {
	sizeof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer),
	offsetof(struct RANAP_SourceRNC_ToTargetRNC_TransparentContainer, _asn_ctx),
	asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tag2el_1,
	13,	/* Count of tags in the map */
	asn_MAP_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_oms_1,	/* Optional members */
	10, 0,	/* Root/Additions */
	12,	/* Start extensions */
	14	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer = {
	"RANAP_SourceRNC-ToTargetRNC-TransparentContainer",
	"RANAP_SourceRNC-ToTargetRNC-TransparentContainer",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	SEQUENCE_decode_uper,
	SEQUENCE_encode_uper,
	SEQUENCE_decode_aper,
	SEQUENCE_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1,
	sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1)
		/sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1[0]), /* 1 */
	asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1)
		/sizeof(asn_DEF_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_1,
	13,	/* Elements count */
	&asn_SPC_RANAP_SourceRNC_ToTargetRNC_TransparentContainer_specs_1	/* Additional specs */
};

