/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "HNBAP-IEs"
 * 	found in "../../asn1/hnbap/HNBAP-IEs.asn"
 * 	`asn1c -gen-PER`
 */

#include <osmocom/hnbap/HNBConfigurationInformationProvided.h>

static asn_TYPE_member_t asn_MBR_HNBConfigurationInformationProvided_1[] = {
	{ ATF_POINTER, 2, offsetof(struct HNBConfigurationInformationProvided, psc),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_PSC,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"psc"
		},
	{ ATF_POINTER, 1, offsetof(struct HNBConfigurationInformationProvided, cSG_ID),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_CSG_ID,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"cSG-ID"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct HNBConfigurationInformationProvided, hNB_Cell_Access_Mode),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_HNB_Cell_Access_Mode,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"hNB-Cell-Access-Mode"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct HNBConfigurationInformationProvided, iurh_Signalling_TNL_AddressList),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Iurh_Signalling_TNL_AddressList,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iurh-Signalling-TNL-AddressList"
		},
	{ ATF_POINTER, 1, offsetof(struct HNBConfigurationInformationProvided, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_HNBConfigurationInformationProvided_oms_1[] = { 0, 1, 4 };
static const ber_tlv_tag_t asn_DEF_HNBConfigurationInformationProvided_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_HNBConfigurationInformationProvided_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* psc */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cSG-ID */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* hNB-Cell-Access-Mode */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* iurh-Signalling-TNL-AddressList */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_HNBConfigurationInformationProvided_specs_1 = {
	sizeof(struct HNBConfigurationInformationProvided),
	offsetof(struct HNBConfigurationInformationProvided, _asn_ctx),
	asn_MAP_HNBConfigurationInformationProvided_tag2el_1,
	5,	/* Count of tags in the map */
	asn_MAP_HNBConfigurationInformationProvided_oms_1,	/* Optional members */
	3, 0,	/* Root/Additions */
	4,	/* Start extensions */
	6	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_HNBConfigurationInformationProvided = {
	"HNBConfigurationInformationProvided",
	"HNBConfigurationInformationProvided",
	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_HNBConfigurationInformationProvided_tags_1,
	sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1)
		/sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1[0]), /* 1 */
	asn_DEF_HNBConfigurationInformationProvided_tags_1,	/* Same as above */
	sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1)
		/sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_HNBConfigurationInformationProvided_1,
	5,	/* Elements count */
	&asn_SPC_HNBConfigurationInformationProvided_specs_1	/* Additional specs */
};

