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

#include <osmocom/sabp/SABP_Radio-Resource-Loading-List-Item.h>

static asn_TYPE_member_t asn_MBR_SABP_Radio_Resource_Loading_List_Item_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Radio_Resource_Loading_List_Item, service_area_identifier),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_SABP_Service_Area_Identifier,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"service-area-identifier"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Radio_Resource_Loading_List_Item, available_bandwidth),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_SABP_Available_Bandwidth,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"available-bandwidth"
		},
	{ ATF_POINTER, 1, offsetof(struct SABP_Radio_Resource_Loading_List_Item, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_SABP_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_SABP_Radio_Resource_Loading_List_Item_oms_1[] = { 2 };
static const ber_tlv_tag_t asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SABP_Radio_Resource_Loading_List_Item_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* service-area-identifier */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* available-bandwidth */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_SABP_Radio_Resource_Loading_List_Item_specs_1 = {
	sizeof(struct SABP_Radio_Resource_Loading_List_Item),
	offsetof(struct SABP_Radio_Resource_Loading_List_Item, _asn_ctx),
	asn_MAP_SABP_Radio_Resource_Loading_List_Item_tag2el_1,
	3,	/* Count of tags in the map */
	asn_MAP_SABP_Radio_Resource_Loading_List_Item_oms_1,	/* Optional members */
	1, 0,	/* Root/Additions */
	2,	/* Start extensions */
	4	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_SABP_Radio_Resource_Loading_List_Item = {
	"SABP_Radio-Resource-Loading-List-Item",
	"SABP_Radio-Resource-Loading-List-Item",
	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_SABP_Radio_Resource_Loading_List_Item_tags_1,
	sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1)
		/sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1[0]), /* 1 */
	asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1,	/* Same as above */
	sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1)
		/sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_SABP_Radio_Resource_Loading_List_Item_1,
	3,	/* Elements count */
	&asn_SPC_SABP_Radio_Resource_Loading_List_Item_specs_1	/* Additional specs */
};

