/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "HNBAP-IEs"
 * 	found in "../../asn1/hnbap/HNBAP-IEs.asn"
 * 	`asn1c -gen-PER`
 */

#ifndef	_TransportInfo_H_
#define	_TransportInfo_H_


#include <asn_application.h>

/* Including external dependencies */
#include <osmocom/hnbap/TransportLayerAddress.h>
#include <osmocom/hnbap/GTP-TEI.h>
#include <osmocom/hnbap/BindingID.h>
#include <constr_CHOICE.h>
#include <constr_SEQUENCE.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Dependencies */
typedef enum transportAssociation_PR {
	transportAssociation_PR_NOTHING,	/* No components present */
	transportAssociation_PR_gtp_TEI,
	transportAssociation_PR_bindingID,
	/* Extensions may appear below */
	
} transportAssociation_PR;

/* Forward declarations */
struct IE_Extensions;

/* TransportInfo */
typedef struct TransportInfo {
	TransportLayerAddress_t	 transportLayerAddress;
	struct transportAssociation {
		transportAssociation_PR present;
		union TransportInfo__transportAssociation_u {
			GTP_TEI_t	 gtp_TEI;
			BindingID_t	 bindingID;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} transportAssociation;
	struct IE_Extensions	*iE_Extensions	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} TransportInfo_t;

/* Implementation */
extern asn_TYPE_descriptor_t asn_DEF_TransportInfo;

#ifdef __cplusplus
}
#endif

/* Referred external types */
#include <osmocom/hnbap/IE-Extensions.h>

#endif	/* _TransportInfo_H_ */
#include <asn_internal.h>
