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

#include "RANAP_RAB-ReleasedItem-IuRelComp.h"

static asn_TYPE_member_t asn_MBR_RANAP_RAB_ReleasedItem_IuRelComp_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ReleasedItem_IuRelComp, rAB_ID),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_RAB_ID,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"rAB-ID"
		},
	{ ATF_POINTER, 3, offsetof(struct RANAP_RAB_ReleasedItem_IuRelComp, dL_GTP_PDU_SequenceNumber),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_DL_GTP_PDU_SequenceNumber,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"dL-GTP-PDU-SequenceNumber"
		},
	{ ATF_POINTER, 2, offsetof(struct RANAP_RAB_ReleasedItem_IuRelComp, uL_GTP_PDU_SequenceNumber),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_UL_GTP_PDU_SequenceNumber,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"uL-GTP-PDU-SequenceNumber"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_RAB_ReleasedItem_IuRelComp, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_ProtocolExtensionContainer,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_RANAP_RAB_ReleasedItem_IuRelComp_oms_1[] = { 1, 2, 3 };
static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ReleasedItem_IuRelComp_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rAB-ID */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* dL-GTP-PDU-SequenceNumber */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* uL-GTP-PDU-SequenceNumber */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ReleasedItem_IuRelComp_specs_1 = {
	sizeof(struct RANAP_RAB_ReleasedItem_IuRelComp),
	offsetof(struct RANAP_RAB_ReleasedItem_IuRelComp, _asn_ctx),
	asn_MAP_RANAP_RAB_ReleasedItem_IuRelComp_tag2el_1,
	4,	/* Count of tags in the map */
	asn_MAP_RANAP_RAB_ReleasedItem_IuRelComp_oms_1,	/* Optional members */
	3, 0,	/* Root/Additions */
	3,	/* Start extensions */
	5	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp = {
	"RANAP_RAB-ReleasedItem-IuRelComp",
	"RANAP_RAB-ReleasedItem-IuRelComp",
	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_RAB_ReleasedItem_IuRelComp_tags_1,
	sizeof(asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp_tags_1)
		/sizeof(asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp_tags_1[0]), /* 1 */
	asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp_tags_1)
		/sizeof(asn_DEF_RANAP_RAB_ReleasedItem_IuRelComp_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_RAB_ReleasedItem_IuRelComp_1,
	4,	/* Elements count */
	&asn_SPC_RANAP_RAB_ReleasedItem_IuRelComp_specs_1	/* Additional specs */
};

