/*
 * 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_TransportLayerInformation.h"

static asn_TYPE_member_t asn_MBR_RANAP_TransportLayerInformation_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TransportLayerInformation, transportLayerAddress),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_TransportLayerAddress,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"transportLayerAddress"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_TransportLayerInformation, iuTransportAssociation),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_RANAP_IuTransportAssociation,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iuTransportAssociation"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_TransportLayerInformation, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (2 << 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_TransportLayerInformation_oms_1[] = { 2 };
static const ber_tlv_tag_t asn_DEF_RANAP_TransportLayerInformation_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_TransportLayerInformation_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* transportLayerAddress */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iuTransportAssociation */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_TransportLayerInformation_specs_1 = {
	sizeof(struct RANAP_TransportLayerInformation),
	offsetof(struct RANAP_TransportLayerInformation, _asn_ctx),
	asn_MAP_RANAP_TransportLayerInformation_tag2el_1,
	3,	/* Count of tags in the map */
	asn_MAP_RANAP_TransportLayerInformation_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	2,	/* Start extensions */
	4	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_TransportLayerInformation = {
	"RANAP_TransportLayerInformation",
	"RANAP_TransportLayerInformation",
	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_TransportLayerInformation_tags_1,
	sizeof(asn_DEF_RANAP_TransportLayerInformation_tags_1)
		/sizeof(asn_DEF_RANAP_TransportLayerInformation_tags_1[0]), /* 1 */
	asn_DEF_RANAP_TransportLayerInformation_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_TransportLayerInformation_tags_1)
		/sizeof(asn_DEF_RANAP_TransportLayerInformation_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_TransportLayerInformation_1,
	3,	/* Elements count */
	&asn_SPC_RANAP_TransportLayerInformation_specs_1	/* Additional specs */
};

