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

#include <osmocom/rspro/IpAddress.h>

static asn_TYPE_member_t asn_MBR_IpAddress_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct IpAddress, choice.ipv4),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Ipv4Address,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"ipv4"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct IpAddress, choice.ipv6),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Ipv6Address,
		0,	/* Defer constraints checking to the member type */
		0,	/* PER is not compiled, use -gen-PER */
		0,
		"ipv6"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_IpAddress_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* ipv4 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* ipv6 */
};
static asn_CHOICE_specifics_t asn_SPC_IpAddress_specs_1 = {
	sizeof(struct IpAddress),
	offsetof(struct IpAddress, _asn_ctx),
	offsetof(struct IpAddress, present),
	sizeof(((struct IpAddress *)0)->present),
	asn_MAP_IpAddress_tag2el_1,
	2,	/* Count of tags in the map */
	0,
	-1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_IpAddress = {
	"IpAddress",
	"IpAddress",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	0, 0,	/* No UPER support, use "-gen-PER" to enable */
	0, 0,	/* No APER support, use "-gen-PER" to enable */
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	0,	/* No PER visible constraints */
	asn_MBR_IpAddress_1,
	2,	/* Elements count */
	&asn_SPC_IpAddress_specs_1	/* Additional specs */
};

