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

#include <osmocom/ranap/RANAP_MBMSIPMulticastAddressandAPNlist.h>

static asn_TYPE_member_t asn_MBR_RANAP_MBMSIPMulticastAddressandAPNlist_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, tMGI),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_TMGI,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"tMGI"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, iPMulticastAddress),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IPMulticastAddress,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iPMulticastAddress"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, aPN),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_APN,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"aPN"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_oms_1[] = { 3 };
static const ber_tlv_tag_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* tMGI */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iPMulticastAddress */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* aPN */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_MBMSIPMulticastAddressandAPNlist_specs_1 = {
	sizeof(struct RANAP_MBMSIPMulticastAddressandAPNlist),
	offsetof(struct RANAP_MBMSIPMulticastAddressandAPNlist, _asn_ctx),
	asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_tag2el_1,
	4,	/* Count of tags in the map */
	asn_MAP_RANAP_MBMSIPMulticastAddressandAPNlist_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	3,	/* Start extensions */
	5	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist = {
	"RANAP_MBMSIPMulticastAddressandAPNlist",
	"RANAP_MBMSIPMulticastAddressandAPNlist",
	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_MBMSIPMulticastAddressandAPNlist_tags_1,
	sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1)
		/sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1[0]), /* 1 */
	asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1)
		/sizeof(asn_DEF_RANAP_MBMSIPMulticastAddressandAPNlist_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_MBMSIPMulticastAddressandAPNlist_1,
	4,	/* Elements count */
	&asn_SPC_RANAP_MBMSIPMulticastAddressandAPNlist_specs_1	/* Additional specs */
};

