/*
 *
 * Copyright 2019 AT&T Intellectual Property
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */


/*
 * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
 * From ASN.1 module "X2AP-PDU-Contents"
 * 	found in "../../asnFiles/X2AP-PDU-Contents.asn"
 * 	`asn1c -fcompound-names -fincludes-quoted -fno-include-deps -findirect-choice -gen-PER -no-gen-OER -D.`
 */

#ifndef	_E_RABs_ToBeReleased_SgNBRelReq_Item_H_
#define	_E_RABs_ToBeReleased_SgNBRelReq_Item_H_


#include "asn_application.h"

/* Including external dependencies */
#include "E-RAB-ID.h"
#include "EN-DC-ResourceConfiguration.h"
#include "constr_CHOICE.h"
#include "constr_SEQUENCE.h"

#ifdef __cplusplus
extern "C" {
#endif

/* Dependencies */
typedef enum E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_PR {
	E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_PR_NOTHING,	/* No components present */
	E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_PR_sgNBPDCPpresent,
	E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_PR_sgNBPDCPnotpresent
	/* Extensions may appear below */
	
} E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_PR;

/* Forward declarations */
struct ProtocolExtensionContainer;
struct E_RABs_ToBeReleased_SgNBRelReq_Item_SgNBPDCPpresent;
struct E_RABs_ToBeReleased_SgNBRelReq_Item_SgNBPDCPnotpresent;

/* E-RABs-ToBeReleased-SgNBRelReq-Item */
typedef struct E_RABs_ToBeReleased_SgNBRelReq_Item {
	E_RAB_ID_t	 e_RAB_ID;
	EN_DC_ResourceConfiguration_t	 en_DC_ResourceConfiguration;
	struct E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration {
		E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_PR present;
		union E_RABs_ToBeReleased_SgNBRelReq_Item__resource_configuration_u {
			struct E_RABs_ToBeReleased_SgNBRelReq_Item_SgNBPDCPpresent	*sgNBPDCPpresent;
			struct E_RABs_ToBeReleased_SgNBRelReq_Item_SgNBPDCPnotpresent	*sgNBPDCPnotpresent;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} resource_configuration;
	struct ProtocolExtensionContainer	*iE_Extensions;	/* OPTIONAL */
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} E_RABs_ToBeReleased_SgNBRelReq_Item_t;

/* Implementation */
extern asn_TYPE_descriptor_t asn_DEF_E_RABs_ToBeReleased_SgNBRelReq_Item;

#ifdef __cplusplus
}
#endif

#endif	/* _E_RABs_ToBeReleased_SgNBRelReq_Item_H_ */
#include "asn_internal.h"
