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

#include <osmocom/rspro/ConfigClientIdReq.h>

static asn_TYPE_member_t asn_MBR_ConfigClientIdReq_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ConfigClientIdReq, clientSlot),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_ClientSlot,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"clientSlot"
		},
};
static const ber_tlv_tag_t asn_DEF_ConfigClientIdReq_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ConfigClientIdReq_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* clientSlot */
};
static asn_SEQUENCE_specifics_t asn_SPC_ConfigClientIdReq_specs_1 = {
	sizeof(struct ConfigClientIdReq),
	offsetof(struct ConfigClientIdReq, _asn_ctx),
	asn_MAP_ConfigClientIdReq_tag2el_1,
	1,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ConfigClientIdReq = {
	"ConfigClientIdReq",
	"ConfigClientIdReq",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No UPER support, use "-gen-PER" to enable */
	0, 0,	/* No APER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ConfigClientIdReq_tags_1,
	sizeof(asn_DEF_ConfigClientIdReq_tags_1)
		/sizeof(asn_DEF_ConfigClientIdReq_tags_1[0]), /* 1 */
	asn_DEF_ConfigClientIdReq_tags_1,	/* Same as above */
	sizeof(asn_DEF_ConfigClientIdReq_tags_1)
		/sizeof(asn_DEF_ConfigClientIdReq_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_ConfigClientIdReq_1,
	1,	/* Elements count */
	&asn_SPC_ConfigClientIdReq_specs_1	/* Additional specs */
};

