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

#include <osmocom/rspro/IpPort.h>

static asn_TYPE_member_t asn_MBR_IpPort_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct IpPort, ip),
		-1 /* Ambiguous tag (CHOICE?) */,
		0,
		&asn_DEF_IpAddress,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"ip"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct IpPort, port),
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		&asn_DEF_PortNumber,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"port"
		},
};
static const ber_tlv_tag_t asn_DEF_IpPort_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_IpPort_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* port */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ipv4 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 } /* ipv6 */
};
static asn_SEQUENCE_specifics_t asn_SPC_IpPort_specs_1 = {
	sizeof(struct IpPort),
	offsetof(struct IpPort, _asn_ctx),
	asn_MAP_IpPort_tag2el_1,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_IpPort = {
	"IpPort",
	"IpPort",
	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_IpPort_tags_1,
	sizeof(asn_DEF_IpPort_tags_1)
		/sizeof(asn_DEF_IpPort_tags_1[0]), /* 1 */
	asn_DEF_IpPort_tags_1,	/* Same as above */
	sizeof(asn_DEF_IpPort_tags_1)
		/sizeof(asn_DEF_IpPort_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_IpPort_1,
	2,	/* Elements count */
	&asn_SPC_IpPort_specs_1	/* Additional specs */
};

