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

#include "RANAP_MDTMode.h"

static asn_per_constraints_t asn_PER_type_RANAP_MDTMode_constr_1 GCC_NOTUSED = {
	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_RANAP_MDTMode_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTMode, choice.immediateMDT),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ImmediateMDT,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"immediateMDT"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MDTMode, choice.loggedMDT),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_LoggedMDT,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"loggedMDT"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_MDTMode_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* immediateMDT */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* loggedMDT */
};
static asn_CHOICE_specifics_t asn_SPC_RANAP_MDTMode_specs_1 = {
	sizeof(struct RANAP_MDTMode),
	offsetof(struct RANAP_MDTMode, _asn_ctx),
	offsetof(struct RANAP_MDTMode, present),
	sizeof(((struct RANAP_MDTMode *)0)->present),
	asn_MAP_RANAP_MDTMode_tag2el_1,
	2,	/* Count of tags in the map */
	0,
	2	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_MDTMode = {
	"RANAP_MDTMode",
	"RANAP_MDTMode",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_decode_uper,
	CHOICE_encode_uper,
	CHOICE_decode_aper,
	CHOICE_encode_aper,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	&asn_PER_type_RANAP_MDTMode_constr_1,
	asn_MBR_RANAP_MDTMode_1,
	2,	/* Elements count */
	&asn_SPC_RANAP_MDTMode_specs_1	/* Additional specs */
};

