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

#include "RANAP_UE-AggregateMaximumBitRate.h"

static asn_TYPE_member_t asn_MBR_RANAP_UE_AggregateMaximumBitRate_1[] = {
	{ ATF_POINTER, 2, offsetof(struct RANAP_UE_AggregateMaximumBitRate, uE_AggregateMaximumBitRateDownlink),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_UE_AggregateMaximumBitRateDownlink,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"uE-AggregateMaximumBitRateDownlink"
		},
	{ ATF_POINTER, 1, offsetof(struct RANAP_UE_AggregateMaximumBitRate, uE_AggregateMaximumBitRateUplink),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_RANAP_UE_AggregateMaximumBitRateUplink,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"uE-AggregateMaximumBitRateUplink"
		},
};
static const int asn_MAP_RANAP_UE_AggregateMaximumBitRate_oms_1[] = { 0, 1 };
static const ber_tlv_tag_t asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RANAP_UE_AggregateMaximumBitRate_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* uE-AggregateMaximumBitRateDownlink */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* uE-AggregateMaximumBitRateUplink */
};
static asn_SEQUENCE_specifics_t asn_SPC_RANAP_UE_AggregateMaximumBitRate_specs_1 = {
	sizeof(struct RANAP_UE_AggregateMaximumBitRate),
	offsetof(struct RANAP_UE_AggregateMaximumBitRate, _asn_ctx),
	asn_MAP_RANAP_UE_AggregateMaximumBitRate_tag2el_1,
	2,	/* Count of tags in the map */
	asn_MAP_RANAP_UE_AggregateMaximumBitRate_oms_1,	/* Optional members */
	2, 0,	/* Root/Additions */
	1,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_RANAP_UE_AggregateMaximumBitRate = {
	"RANAP_UE-AggregateMaximumBitRate",
	"RANAP_UE-AggregateMaximumBitRate",
	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_UE_AggregateMaximumBitRate_tags_1,
	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1)
		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1[0]), /* 1 */
	asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1,	/* Same as above */
	sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1)
		/sizeof(asn_DEF_RANAP_UE_AggregateMaximumBitRate_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_RANAP_UE_AggregateMaximumBitRate_1,
	2,	/* Elements count */
	&asn_SPC_RANAP_UE_AggregateMaximumBitRate_specs_1	/* Additional specs */
};

