/*
 * 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-DataForwardingItem-SRNS-CtxReq.h"

static asn_TYPE_member_t asn_MBR_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_DataForwardingItem_SRNS_CtxReq, 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, 1, offsetof(struct RANAP_RAB_DataForwardingItem_SRNS_CtxReq, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (1 << 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_DataForwardingItem_SRNS_CtxReq_oms_1[] = { 1 };
static const ber_tlv_tag_t asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* rAB-ID */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_specs_1 = {
	sizeof(struct RANAP_RAB_DataForwardingItem_SRNS_CtxReq),
	offsetof(struct RANAP_RAB_DataForwardingItem_SRNS_CtxReq, _asn_ctx),
	asn_MAP_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tag2el_1,
	2,	/* Count of tags in the map */
	asn_MAP_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq = {
	"RANAP_RAB-DataForwardingItem-SRNS-CtxReq",
	"RANAP_RAB-DataForwardingItem-SRNS-CtxReq",
	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_DataForwardingItem_SRNS_CtxReq_tags_1,
	sizeof(asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tags_1)
		/sizeof(asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tags_1[0]), /* 1 */
	asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tags_1)
		/sizeof(asn_DEF_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_1,
	2,	/* Elements count */
	&asn_SPC_RANAP_RAB_DataForwardingItem_SRNS_CtxReq_specs_1	/* Additional specs */
};

