Commit 334d7e81 authored by cheny's avatar cheny

commit CU source code

parent f5a2d8b2
Lib/ filter=lfs diff=lfs merge=lfs -text
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
ASN_LIB:E1AP_LIB F1AP_LIB NGAP_LIB RRC_LIB
@echo make ASN_LIB
E1AP_LIB:
${MAKE} -C ${G_ROOT_DIR}/Asn/E1Asn
NGAP_LIB:
${MAKE} -C ${G_ROOT_DIR}/Asn/NgAsn
F1AP_LIB:
${MAKE} -C ${G_ROOT_DIR}/Asn/F1Asn
RRC_LIB:
${MAKE} -C ${G_ROOT_DIR}/Asn/RrcAsn
/****************************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: duApp.h
** Description: this file is the header file of duApp
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.7.22
**
****************************************************************************************************/
#ifndef __CONVERSION_H__
#define __CONVERSION_H__
#include "vos_lib.h"
#include "gnbCommon.h"
#endif
This diff is collapsed.
/****************************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: duApp.h
** Description: this file is the header file of duApp
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.7.22
**
****************************************************************************************************/
#ifndef __GNB_COMM_TYPE_H__
#define __GNB_COMM_TYPE_H__
/** @brief max cell num */
#ifdef NR_DU
#ifdef VIRTUAL_STACK
#define MAX_CELL_NUM 50 //单DU支持最大小区个数
#else
#define MAX_CELL_NUM 4 //单DU支持最大小区个数
#endif
#else //CU支持最大个数宏与DU侧命名一样,但数量要乘以支持最大DU个数
#ifdef VIRTUAL_STACK
#define MAX_CELL_NUM (50) //虚拟小区仍然保持在50
#else
#define MAX_CELL_NUM (4*CU_MAX_DU_NUM) //50*单DU支持最大小区个数
#endif
#endif
/** @brief max cell id */
#define MAX_CELL_ID (MAX_CELL_NUM - 1)
/** @brief max ue num */
#ifdef VIRTUAL_STACK
#define MAX_UE_NUM 50
#else
#define MAX_UE_NUM 42
#endif
#ifdef VIRTUAL_STACK
#define MAX_UE_NUM_PER_CELL 5
#else
#define MAX_UE_NUM_PER_CELL 21
#endif
/** @brief max ue id */
#define MAX_UE_ID (MAX_UE_NUM - 1)
#define MAX_UE_ID_PER_CELL (MAX_UE_NUM_PER_CELL - 1)
/** @brief F1 max cell num */
#ifdef VIRTUAL_STACK
#define F1_MAX_CELL_NUM 50 //
#else
#define F1_MAX_CELL_NUM 4 //单DU支持最大小区个数
#endif
#define MAX_UE_PDU_NUM 8 //UE支持的最大的PDU个数
#define MAX_PDU_REQ_NUM 3 //消息内支持的PDU的最大个数(Setup/Modify/Release)
#define MAX_QOS_FLOW_NUM_ONE_PDU 2 //一条PDU内允许的最大的QoS Flow的个数
#define MAX_QOS_FLOW_NUM_ONE_DRB 2 //一个DRB内允许的最大的QoS Flow的个数
#define MAX_UE_QOS_NUM 16 //UE支持的最大的QoS Flow的个数
#define MAX_DRB_NUM_ONE_PDU 2 //一条PDU内允许的最大的DRB的个数,和QOS个数一致(后面修改)
/** @brief max drb num */
#define MAX_DRB_NUM 8 //UE支持的最大的DRB的个数
/** @brief max drb id */
#define MAX_DRB_ID (MAX_DRB_NUM - 1)
/** @brief max srb num */
#define MAX_SRB_NUM 4
/** @brief max srb id */
#define MAX_SRB_ID (MAX_SRB_NUM - 1)
/** @brief max logical channel num */
#define MAX_LCH_NUM 33
#define MAC_MAX_LCH_NUM 6
#define MAX_PLMN_ID_NUM 8
/** @brief tunnel port */
#define TUNNEL_PORT 2152
#define MAC_CU_DU_TNL_ASSOC_NUM (32)
/** @brief Cell ID */
typedef UINT64 CmNrCellId;
typedef UINT32 CmNrCellIdx;
/** @brief RNTI */
typedef UINT16 CmNrRnti;
/** @brief I-RNTI */
typedef UINT64 CmNrIRnti;
/** @brief Ue Id */
typedef UINT16 CmNrUeId;
/** @brief Radio Bearer ID */
typedef UINT8 CmNrRbId;
/** @brief Logical Channel Type */
typedef UINT8 CmNrLcType;
/** @brief Radio Bearer ID */
typedef UINT8 CmNrRbId;
/** @brief Mode Type TM/UM/AM */
typedef UINT8 CmNrRlcMode;
/** @brief Logical Channel ID */
typedef UINT8 CmNrLcId;
/** @brief Logical Channel Type */
typedef UINT8 CmNrLcType;
/** @brief Sn bits*/
typedef UINT8 CmRlcSnLen;
/*见协议38401 8.5 F1 Startup and cells activation*/
typedef enum
{
CELL_ACTIVE_STATE,
CELL_INACTIVE_STATE,
}CellState_e;
typedef enum
{
RAN_PAGING = 1,
CN_PAGING
}PagingType_e;
typedef struct PlmnId
{
UINT8 mcc2:4;
UINT8 mcc1:4;
UINT8 mnc3:4;
UINT8 mcc3:4;
UINT8 mnc2:4;
UINT8 mnc1:4;
} PlmnId_t;
/* NR CELL Identity */
typedef struct NrCellId
{
UINT64 cellId:36;
}NrCellId_t;
#define TRACKING_AREA_CODE (1<<0)
#define RANRC (1<<1)
typedef struct plmnInformation
{
UINT16 bitMask;
UINT8 plmnIdNum;
PlmnId_t plmnId[MAX_PLMN_ID_NUM];
UINT32 trackingAreaCode; /*option*/
UINT8 ranac; /*option*/
UINT64 cellIdentity;
BOOL cellReservedForOperatorUse;
} PlmnInformation_t;
typedef struct
{
PlmnId_t plmn;
UINT64 cellId;
} GnbNrCgi_t;
typedef struct
{
PlmnId_t plmn;
}GnbServedPlmn_t;
/** @brief SRBID */
typedef LONG GnbSrbId_t;//9.3.1.7
/** @brief DRB ID */
typedef LONG GnbDrbId_t;
/** @brief Transaction ID */
typedef LONG GnbTransId;
/** @brief gND DU ID */
typedef LONG GnbDuId;
/** @brief gND CU ID */
typedef LONG GnbCuId;
#endif
/************************************************************************
*Copyright (c) 2018 Sylincom.
*All rights reserved.
*
*File name: gnbXml.h
*Description: xml parser utils.
*
*Current Version: 0.l
*Author: wangcheng2017@ict.ac.cn
*Date: 2018.09.11
*
************************************************************************/
#ifndef SBS_XML_UTIL_H
#define SBS_XML_UTIL_H
/* Includes-------------------------------------------------------------*/
#include <assert.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
#include <libxml/xmlmemory.h>
#include <libxml/xpointer.h>
typedef int32_t INT32;
/* Macros---------------------------------------------------------------*/
#define XML_ERROR (-1)
#define XML_OK 0
#define RETSET 256
/* Variables------------------------------------------------------------*/
extern char ret[RETSET][RETSET];
/* Declarations---------------------------------------------------------*/
/* Constants------------------------------------------------------------*/
/* Functions------------------------------------------------------------*/
/**********************************************
** open xml file.
**
** Input:
** xml_name.
** Output:
** xmlDocPtr.
** Return:
**
**
**
***********************************************/
extern xmlDocPtr utils_xml_open(const char* xml_name);
/**********************************************
** get xmlXPathContextPtr.
**
** Input:
** xmlDocPtr.
** Output:
** xmlXPathContextPtr.
** Return:
**
**
**
***********************************************/
extern xmlXPathContextPtr utils_xml_xpath_context(xmlDocPtr doc);
/**********************************************
** get xml nodeset.
**
** Input:
** xmlDocPtr, xpath.
** Output:
** xmlXPathObjectPtr.
** Return:
**
**
**
***********************************************/
extern xmlXPathObjectPtr utils_xml_get_node_set(xmlDocPtr pdoc, const xmlChar *xpath);
/**********************************************
** get xml node value by xpath.
**
** Input:
** xmlDocPtr, path, buf.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_get_node_value_by_xpath(xmlDocPtr pdoc, const xmlChar* path, char* buf);
extern INT32 VOS_xml_get_long_index(xmlDocPtr pdoc, const xmlChar* path, int index);
extern INT32 VOS_xml_get_string_index(xmlDocPtr pdoc, const xmlChar* path, char * pchar, int index);
#define VOS_XML_LOG_SWITCH 0
#define _VOS_XML_GET_LONG(pdoc, path, plong) plong = VOS_xml_get_long_index(pdoc, (const xmlChar*)path, 0);
#define _VOS_XML_GET_STRING(pdoc, path, pchar) VOS_xml_get_string_index(pdoc, (const xmlChar*)path, (char*)pchar, 0);
#define _VOS_XML_GET_LONG_INDEX(pdoc, path, plong, index) plong = VOS_xml_get_long_index(pdoc, (const xmlChar*)path, index);
#define _VOS_XML_GET_STRING_INDEX(pdoc, path, pchar, index) VOS_xml_get_string_index(pdoc, (const xmlChar*)path, (char*)pchar, index);
/**********************************************
** get xml node value by node set.
**
** Input:
** xmlXPathObjectPtr, xmlChar*, buf.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_get_node_value_by_node_set(xmlXPathObjectPtr xpop, const xmlChar* node_name, char* buf);
/**********************************************
** set xml node value by xpath.
**
** Input:
** xmlDocPtr, xmlChar*, xmlChar*.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_set_node_value_by_xpath(xmlDocPtr pdoc, const xmlChar* path, const xmlChar* new_value);
/**********************************************
** set xml node value by nodeset.
**
** Input:
** xmlXPathObjectPtr, xmlChar*, xnlChar*.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_set_node_value_by_node_set(xmlXPathObjectPtr xpop, const xmlChar* node_name, const xmlChar* new_value);
/**********************************************
** clean xpath Object.
**
** Input:
** xmlXPathObjectPtr.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_xpath_clean(xmlXPathObjectPtr xpop);
/**********************************************
** save xml file.
**
** Input:
** xmlDocPtr, xml_new_name.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_save(xmlDocPtr pdoc, const char* xml_name);
/**********************************************
** clean xml parser sources.
**
** Input:
** xmlDocPtr.
** Output:
**
** Return:
** success 0
** error -1
**
***********************************************/
extern INT32 utils_xml_clean(xmlDocPtr pdoc);
#endif
#ifdef __cplusplus
extern "C" {
#endif
/* Direction */
typedef enum pdcp_nr_direction
{
PDCP_NR_DIRECTION_UPLINK = 0,
PDCP_NR_DIRECTION_DOWNLINK = 1
}Pdcp_nr_direction_e;
typedef enum pdcp_nr_plane
{
NR_SIGNALING_PLANE = 1,
NR_USER_PLANE = 2
}Pdcp_nr_plane_e;
typedef enum NRBearerType
{
Bearer_DCCH=1,
Bearer_BCCH_BCH=2,
Bearer_BCCH_DL_SCH=3,
Bearer_CCCH=4,
Bearer_PCCH=5,
} NRBearerType_e;
#define PDCP_NR_SN_LENGTH_12_BITS 12
#define PDCP_NR_SN_LENGTH_18_BITS 18
#define PDCP_NR_UL_SDAP_HEADER_PRESENT 0x01
#define PDCP_NR_DL_SDAP_HEADER_PRESENT 0x02
/* Signature. Rather than try to define a port for this, or make the
port number a preference, frames will start with this string (with no
terminating NULL */
#define PDCP_NR_START_STRING "pdcp-nr"
/* Fixed fields:
- plane (1 byte) */
/* Conditional field. This field is mandatory in case of User Plane PDCP PDU.
The format is to have the tag, followed by the value (there is no length field,
it's implicit from the tag). The allowed values are defined above. */
#define PDCP_NR_SEQNUM_LENGTH_TAG 0x02
/* 1 byte */
/* Optional fields. Attaching this info should be added if available.
The format is to have the tag, followed by the value (there is no length field,
it's implicit from the tag) */
#define PDCP_NR_DIRECTION_TAG 0x03
/* 1 byte */
#define PDCP_NR_BEARER_TYPE_TAG 0x04
/* 1 byte */
#define PDCP_NR_BEARER_ID_TAG 0x05
/* 1 byte */
#define PDCP_NR_UEID_TAG 0x06
/* 2 bytes, network order */
#define PDCP_NR_ROHC_COMPRESSION_TAG 0x07
/* 0 byte */
/* N.B. The following ROHC values only have significance if rohc_compression
is in use for the current channel */
#define PDCP_NR_ROHC_IP_VERSION_TAG 0x08
/* 1 byte */
#define PDCP_NR_ROHC_CID_INC_INFO_TAG 0x09
/* 0 byte */
#define PDCP_NR_ROHC_LARGE_CID_PRES_TAG 0x0A
/* 0 byte */
#define PDCP_NR_ROHC_MODE_TAG 0x0B
/* 1 byte */
#define PDCP_NR_ROHC_RND_TAG 0x0C
/* 0 byte */
#define PDCP_NR_ROHC_UDP_CHECKSUM_PRES_TAG 0x0D
/* 0 byte */
#define PDCP_NR_ROHC_PROFILE_TAG 0x0E
/* 2 bytes, network order */
#define PDCP_NR_MACI_PRES_TAG 0x0F
/* 0 byte */
#define PDCP_NR_SDAP_HEADER_TAG 0x10
/* 1 byte, bitmask with PDCP_NR_UL_SDAP_HEADER_PRESENT and/or PDCP_NR_DL_SDAP_HEADER_PRESENT */
/* PDCP PDU. Following this tag comes the actual PDCP PDU (there is no length, the PDU
continues until the end of the frame) */
#define PDCP_NR_PAYLOAD_TAG 0x01
typedef enum rrcLoggerSocketType_e
{
NR_RRC_LOGGER_SOCKET_TYPE_DU,
NR_RRC_LOGGER_SOCKET_TYPE_CU,
NR_RRC_LOGGER_SOCKET_TYPE_MAX_NUM
}RrcLoggerSocketType_e;
extern void nrCuRrcLoggerSendFrame(
unsigned short ueId,
Pdcp_nr_plane_e plane,
Pdcp_nr_direction_e direction,
NRBearerType_e bearerType,
unsigned char bearerID,
unsigned char *pdu,
unsigned int pduLen);
extern void nrDuRrcLoggerSendFrame(
unsigned short ueId,
Pdcp_nr_plane_e plane,
Pdcp_nr_direction_e direction,
NRBearerType_e bearerType,
unsigned char bearerID,
unsigned char *pdu,
int pduLen);
#ifdef __cplusplus
}
#endif
\ No newline at end of file
#ifndef __OM_ADP_COMMON_H__
#define __OM_ADP_COMMON_H__
#include "vos_types.h"
#include "vos_time.h"
/* common define Begin */
#define JOB_CMD_SUCCESS 0
#define JOB_CMD_FAILURE 1
#define PM_INVALID_CELL_ID 0xFFFFFFFFFFFFFFFF
#define INVALID_RAN_UE_ID 0xFFFFFFFFFFFFFFFF
#define INVALID_DRB_ID 0xFF
#define INVALID_FIVEQI_VALUE 0xFFFFFFFF
#define INVALID_S_NSSAI 0xFFFFFFFF
#define MAX_OM_KPI_MEASURE_DRB_NUM 8
#define MAX_OM_KPI_MEASURE_LCH_NUM MAX_OM_KPI_MEASURE_DRB_NUM
#define MAX_OM_KPI_MEASURE_ID_NUM 15
enum
{
KPI_MEAS_SUCCESS,
KPI_MEAS_INVALID_CELLID,
KPI_MEAS_INVALID_RAN_UE_ID,
KPI_MEAS_NON_DRB,
KPI_MEAS_UNKNOWN_MSG,
};
/* common define End */
/* OM Message define Begin */
#define PM_JOB_START_REQUEST 100
#define PM_JOB_START_RESPONSE 101
#define PM_JOB_STOP_REQUEST 102
#define PM_JOB_STOP_RESPONSE 103
#define PM_RESULT_REPORT 104
/* OM Message define End */
/* KPI Measure Obj Define Begin */
#define OM_KPI_MEASURE_OBJECT_RRC 1
#define OM_KPI_MEASURE_OBJECT_DRB 2
#define OM_KPI_MEASURE_OBJECT_TB 3
#define OM_KPI_MEASURE_OBJECT_RRU 4
#define OM_KPI_MEASURE_OBJECT_MM 5
#define OM_KPI_MEASURE_OBJECT_GTP 6
/* KPI Measure Obj Define End */
/* KPI Measure Item ID begin*/
/* RRC- CUCP */
enum
{
RRC_KPI_MEASURE_ID_CONN_UE_DURATION_AVR_TIME = 10000,
RRC_KPI_MEASURE_ID_CONN_UE_NUM,
RRC_KPI_MEASURE_ID_RRC_CONN_ATTEMP_NUM,
RRC_KPI_MEASURE_ID_RRC_CONN_SUCC_NUM,
RRC_KPI_MEASURE_ID_RRC_RESTAB_ATTEMP_NUM,
RRC_KPI_MEASURE_ID_RRC_RESTAB_SUCC_WITH_CXT_NUM,
RRC_KPI_MEASURE_ID_RRC_RESTAB_SUCC_WITHOUT_CXT_NUM,
RRC_KPI_MEASURE_ID_RRC_RESUME_ATTEMP_NUM,
RRC_KPI_MEASURE_ID_RRC_RESUME_SUCC_NUM,
RRC_KPI_MEASURE_ID_RRC_RESUME_SUCC_FALLBACK_NUM,
RRC_KPI_MEASURE_ID_RRC_RESUME_SUSPEND_NUM,
RRC_KPI_MEASURE_ID_RRC_RESUME_RLS_NUM,
RRC_KPI_MEASURE_ID_RRC_CONN_DELAY_MASG3_TO_MSG5,
RRC_KPI_MEASURE_ID_RRC_MAX,
};
/* MM- CUCP */
enum
{
MM_KPI_MEASURE_ID_HO_PREP_INTER_REQ_NUM = 20000,
MM_KPI_MEASURE_ID_HO_PREP_INTER_SUCC_NUM,
MM_KPI_MEASURE_ID_HO_PREP_INTER_FAIL_NUM,
MM_KPI_MEASURE_ID_HO_RES_ALLO_INTER_REQ_NUM,
MM_KPI_MEASURE_ID_HO_RES_ALLO_INTER_SUCC_NUM,
MM_KPI_MEASURE_ID_HO_RES_ALLO_INTER_FAIL_NUM,
MM_KPI_MEASURE_ID_HO_EXE_INTER_REQ_NUM,
MM_KPI_MEASURE_ID_HO_EXE_INTER_SUCC_NUM,
MM_KPI_MEASURE_ID_HO_EXE_INTER_FAIL_NUM,
MM_KPI_MEASURE_ID_HO_EXE_INTRA_REQ_NUM,
MM_KPI_MEASURE_ID_HO_EXE_INTRA_SUCC_NUM,
MM_KPI_MEASURE_ID_MAX,
};
/* DRB- RLC */
enum
{
DRB_KPI_MEASURE_ID_RLC_DL_UP_AVG_RATE = 43001,
DRB_KPI_MEASURE_ID_RLC_UL_UP_AVG_RATE,
DRB_KPI_MEASURE_ID_RLC_DL_AIR_DELAY,
DRB_KPI_MEASURE_ID_RLC_DL_PACK_DROP_RATE,
DRB_KPI_MEASURE_ID_RLC_MAX,
};
/* DRB- MAC */
enum
{
DRB_KPI_MEASURE_ID_MAC_DL_UU_AVG_DELAY = 40000,
DRB_KPI_MEASURE_ID_MAC_UL_UU_AVG_DELAY,
DRB_KPI_MEASURE_ID_MAC_DL_UP_AVG_RATE,
DRB_KPI_MEASURE_ID_MAC_UL_UP_AVG_RATE,
DRB_KPI_MEASURE_ID_MAC_MAX,
};
/* RRU- MAC */
enum
{
RRU_KPI_MEASURE_ID_DL_PRB_USED_RATE = 30000,
RRU_KPI_MEASURE_ID_UL_PRB_USED_RATE,
RRU_KPI_MEASURE_ID_DL_PRB_AVG_NUM,
RRU_KPI_MEASURE_ID_UL_PRB_AVG_NUM,
RRU_KPI_MEASURE_ID_DL_TOTAL_PRB,
RRU_KPI_MEASURE_ID_UL_TOTAL_PRB,
RRU_KPI_MEASURE_ID_MAC_MAX,
};
/* TB- MAC */
enum
{
TB_KPI_MEASURE_ID_DL_TOTAL_NEW_TB_NUM = 50000,
TB_KPI_MEASURE_ID_DL_NEW_TB_ERR_NUM,
TB_KPI_MEASURE_ID_DL_TOTAL_TB_NUM,
TB_KPI_MEASURE_ID_DL_TB_ERR_NUM,
TB_KPI_MEASURE_ID_MAC_MAX,
};
/* DRB- CUUP */
enum
{
DRB_KPI_MEASURE_PDCPU_DL_AVG_DELAY = 60000, //pdcpAvgDelayDl
DRB_KPI_MEASURE_PDCPU_DL_AVG_THROUGHPUT, //PdcpAvgThroughputDl
DRB_KPI_MEASURE_PDCPU_UL_AVG_THROUGHPUT, //PdcpAvgThroughputDl
DRB_KPI_MEASURE_PDCPU_DL_PDU_VOLUME, //pdcpPduVolumeDl
DRB_KPI_MEASURE_PDCPU_UL_PDU_VOLUME, //pdcpPduVolumeUl
DRB_KPI_MEASURE_PDCPU_DL_OCCUPIED_SIZE, //pdcpOccupiedSizeDl
DRB_KPI_MEASURE_PDCPU_DL_BUF_TOTAL_SIZE, //pdcpBufTotalSizeDl
DRB_KPI_MEASURE_PDCPU_DL_PACKET_DROP_RATE, //pdcpPacketDropRateDl
DRB_KPI_MEASURE_ID_PDCPU_MAX,
};
/*GTP-GNB- CUUP*/
enum
{
GNB_KPI_MEASURE_CUUP_NG_GTPU_IN_SDU_OCT = 70000, //InNbrOctGtpU
GNB_KPI_MEASURE_CUUP_NG_GTPU_OUT_SDU_OCT, //OutNbrOctGtpU
GNB_KPI_MEASURE_CUUP_ID_MAX,
};
/* KPI Measure Item ID End */
/* Measure JOB struct Begin */
typedef struct
{
UINT32 measureObjId;
UINT32 measureSubObjId;
UINT64 nrCellId;
UINT64 ranUeId;
}pmKpiJobStartReq_t;
typedef struct
{
UINT32 measureObjId;
UINT32 measureSubObjId;
UINT64 nrCellId;
UINT64 ranUeId;
UINT8 startIndication;
UINT8 casue;
}pmKpiJobStartRsp_t;
typedef struct
{
UINT32 measureObjId;
UINT32 measureSubObjId;
UINT64 nrCellId;
UINT64 ranUeId;
}pmKpiJobStopReq_t;
typedef struct
{
UINT32 measureObjId;
UINT32 measureSubObjId;
UINT64 nrCellId;
UINT64 ranUeId;
UINT8 stopIndication;
UINT8 casue;
}pmKpiJobStopRsp_t;
typedef struct
{
UINT32 measureItemId;
UINT32 measureValue;
}pmKpiMeasRet_t;
typedef struct
{
UINT32 measureObjId;
UINT32 measureSubObjId;
UINT64 nrCellId;
UINT64 ranUeId;
UINT32 drbId;
UINT32 fiveQIValue;
UINT32 s_NSSAI;
VOS_LOCAL_TIME timeStamp;
UINT32 measRetNum;
pmKpiMeasRet_t measRetInfo[MAX_OM_KPI_MEASURE_ID_NUM];
}pmKpiMeasRpt_t;
/* Measure JOB struct End */
#endif
#ifndef __PERF_H__
#define __PERF_H__
#include "vos_types.h"
#define MAX_HST_PERF_RESULT 16
#define MAX_PERF_JOB_NUM 8
#define MAX_PERF_PARA_ID 4
#define MAX_TMP_PERF_VARIABLE 2
typedef enum
{
CU_PERF_ID_CONN_ESTA_ATT = 0,
CU_PERF_ID_CONN_ESTA_SUCC = 1,
CU_PERF_ID_DURATION = 2,
CU_PERF_ID_CONNECTED = 3,
CU_PERF_ID_MAX
}cuPerfId_e;
typedef enum
{
DU_PERF_ID_TPL_DL = 0,
DU_PERF_ID_TPL_UL = 1,
DU_PERF_ID_MAX
}duPerfId_e;
typedef struct perfJobStatisInfo_s
{
UINT32 used;
UINT32 oamGlbalCellId;
UINT32 measureJobID; //测量任务ID,从1开始
UINT32 measureTotalPeriod; //测量周期,单位s
UINT32 measureLoopFlag; //测量循环表示,0不循环,1循环
UINT32 measureObjectID; //测量对象ID,全局唯一
UINT32 measureObjectIndex; //测量对象索引,自定义
UINT32 measureParaID; //队形参数ID,测量对象内唯一,按位标识
UINT64 measureSubcounters; //子计数器(扩展)
UINT32 lastReportTime;
UINT32 hstPerfResult;
UINT32 perfResult[CU_PERF_ID_MAX][MAX_HST_PERF_RESULT];
UINT32 lastTmpMiddVar[MAX_TMP_PERF_VARIABLE]; /*记录上一次计算的中间变量*/
UINT64 lastTmpLongMiddVar[MAX_TMP_PERF_VARIABLE]; /*记录上一次计算的中间变量*/
}perfJobStatisInfo_t;
#ifdef __cplusplus
}
#endif
#endif /* __PERF_H__*/
This diff is collapsed.
/******************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: rrcSiMsg.h
** Description: this file is the message interface struct and message code in CU RRC SI
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.7.19
**
*****************************************************************************************/
#include "gnbCommon.h"
#include "vos_common.h"
#include "cuModuleCommon.h"
#include "cuModuleInterface.h"
#ifdef CU_LOG_TO_FILE
#define CU_MAX_FILE_PATH 255
#endif
/*
typedef unsigned char UINT8;
typedef signed char INT8;
typedef unsigned short UINT16;
typedef signed short INT16;
typedef unsigned int UINT32;
typedef signed int INT32;
typedef unsigned char BOOL;
*/
#define OAM_CUCP_SI_CFG_REQ 0x6000
#if 0
#define CUCP_OAM_READ_BASE 0x7000
#define CUCP_OAM_READ_COMPLETE CUCP_OAM_READ_BASE + 1
#define CUUP_OAM_READ_COMPLETE CUCP_OAM_READ_BASE + 2
#define OAM_CUCP_NET_ELEMENT_ACTIVE_REQ CUCP_OAM_READ_BASE + 3
#define CUCP_OAM_NET_ELEMENT_ACTIVE_RSP CUCP_OAM_READ_BASE + 4
#endif
#if 0
#define RRC_DU_CELL_PARAM_REQ 0x6001
#define RRC_DU_MIB_PDU_REQ 0x6002
#define RRC_DU_SIB1_PDU_REQ 0x6003
#define RRC_DU_SI_PDU_REQ 0x6004
#define DU_RRC_CELL_PARAM_RSP 0x6101
#define DU_RRC_MIB_PDU_RSP 0x6102
#define DU_RRC_SIB1_PDU_RSP 0x6103
#define DU_RRC_SI_PDU_RSP 0x6104
#endif
#if 0
/********************** Sib4_t ************************/
typedef struct sib4
{
}Sib4_t;
/********************** Sib5_t ************************/
typedef struct sib5
{
}Sib5_t;
/********************** Sib6_t ************************/
typedef struct sib6
{
}Sib6_t;
/********************** Sib7_t ************************/
typedef struct sib7
{
}Sib7_t;
/********************** Sib8_t ************************/
typedef struct sib8
{
}Sib8_t;
/********************** Sib9_t ************************/
typedef struct sib9
{
}Sib9_t;
#endif
typedef struct cuCapabilityCfg_s
{
UINT8 maxDuNum;
UINT8 maxCuUpNum;
UINT8 maxUeNumPerCell;
UINT8 maxCellNum;
UINT8 maxCuCpNum;
ActNotiLevel_e actNotiLevel;
INT64 inactiveTimer;
//TBD
}CuCapabilityCfg_t;
typedef struct cuAmfCfg_s{
UINT8 numAmf;
IpAddress_t amfAddr[NGAP_MAX_AMF_NUM];
}CuAmfCfg_t;
typedef struct cuRrmConfig_s
{
UINT8 padding;
}CuRrmConfig_t;
typedef struct oamConfig
{
//MACConfig_t *pMacCfg; /* MAC configuration information*/
NGAPConfig_t *pNgapCfg; /* NGAP configuration information */
//E1APConfig_t *pE1apCfg; /* E1AP configuration information */
CuRrmConfig_t *pRrmCfg; /* RRM configuration information */
SiConfig_t *pSiCfg; /* System Information configuration information */
F1APConfig_t *pF1apCfg; /* F1AP configuration information */
//Cfg_t *pMainCfg; /* gNB Main configuration information */
CuCapabilityCfg_t *pCuCapaCfg; /* gNB CUCP capability infomation */
CuAmfCfg_t *pCuAmfCfg; /* Amf Ip Address infomation */
} OamCuCpConfig_t;
typedef struct rrcMibInfo
{
UINT8 ctrlResourceSetZero;
UINT8 searchSpaceZero;
UINT8 dmrsTypeAPosition;
UINT8 kssb;
UINT8 mibPdu[3];
} RrcMibInfo_t;
typedef struct rrcSib1Info
{
UINT8 sib1Change; /*!< the sib1 msg has been updated */
UINT8 sib1Len;
UINT8 *pData; /*!< the sib1 data */
} RrcSib1Info_t;
typedef struct rrcSiPduReq
{
UINT8 msgType; /*F1 SET UP RSP*/
UINT8 siChange; /*the si msg has been updated*/
UINT8 count; /*the count of si in the array*/
UINT8 siLen[MAX_SI_NUM]; /*each si_len in array*/
UINT8 siPeriodicity[MAX_SI_NUM]; /*each si_periodicity in array*/
UINT8 *pData[MAX_SI_NUM]; /*!< the si data */
} RrcSiPduReq_t;
typedef struct cuSiPdu
{
UINT32 siPduLen[MAX_SI_NUM];
UINT8 siPdu[MAX_SI_NUM][MAX_TX_PDU_NUM];
} CuSiPdu_t;
CuSiPdu_t gSiPduData[MAX_CELL_NUM];
Mib_t gCucMibData[MAX_CELL_NUM];
Sib1_t gCucSib1Data[MAX_CELL_NUM];
This diff is collapsed.
#include "NR-RRC-Definitions.h"
#include "cucpProtocolPara.h"
#include "cucContext.h"
#include "duMsg.h"
#include "omaCuCpCfgInfoGetApi.h"
#include "nrRrclogger.h"
//#define CONCEPT(x) 1
#define SI_PRESENCE(bitmask,bit) ((bitmask) == ((bit) & (bitmask)))
#define SI_CHECK_NULL(prama, content)\
{\
if (NULL == prama)\
{\
VOS_Printf(content);\
return VOS_ERROR;\
}\
}
#define SI_SET_ZERO(x) \
{\
if(x)\
{\
x = 0;\
}\
}
typedef struct SibsToBeEncodedItem_s
{
SibType_e sibType;
union
{
Sib2_t sib2;
Sib3_t sib3;
/*
Sib4_t sib4;
Sib5_t sib5;
Sib6_t sib6;
Sib7_t sib7;
Sib8_t sib8;
Sib9_t sib9;
*/
}u;
}SibsToBeEncodedItem_t;
#define MAX_SIB 32
typedef struct SibsToBeEncodedList_s
{
UINT8 num;
SibsToBeEncodedItem_t SibsToBeEncodedItems[MAX_SIB];
}SibsToBeEncodedList_t;
INT32 siConstructSystemInfo(CuSystemInfo_t *pCuSystemInfo, NrCellId_t nrCellId);
INT32 siSetSib2_CellReselectCommonInfo(CmSib2CellReselectionInfoCommon_t *pReslctCommInner, cellReselectionInfoCommon_t *pReslctCommOma);
INT32 siSetSib2_CellReselectionServingFreq(CmSib2CellReselectionServingFreqInfo_t *pReslctServInner, intraFreqCellReselectionInfo_t *pIntraFreqOma);
INT32 siSetSib2_IntraFreqCellReselection(CmSib2IntraFreqCellReselectionInfo_t *pIntraFreqInner, intraFreqCellReselectionInfo_t *pIntraFreqOma, nrCucpMultiBandList_t *multiBandListOma);
INT32 siPrintfSib2(Sib2_t *pSib2);
INT32 siEncodeSib2 (Sib2_t *pIfmSib2, Mbuf_t *pBuf);
INT32 cucContextGetIdleCellCbIdx();
INT32 siDeconstructSib2(SibInfo_t *pSibInfo);
INT32 siComposeSib2(OSCTXT *pAsnCxt, Sib2_t *pIfmSib2, SIB2 *pSib2);
INT32 siComposeSib3(OSCTXT *pAsnCxt, Sib3_t *pIfmSib3, SIB3 *pSib3);
INT32 siSetSib3_IntraFreqNeighCellInfo(CmSib3IntraFreqNeighCellList_t *pIntraFreqNeighCell, intraFreqCellReselectionInfo_t *pCellReselectInfo);
INT32 siSetSib3_IntraFreqBlackCellInfo(CmSib3IntraFreqBlackCellList_t *pIntraFreqBlackCell, intraFreqCellReselectionInfo_t *pCellReselectInfo);
INT32 siComposeSib4(OSCTXT *pAsnCxt, SIB4 *pSib4, UINT8 interFreqNum, interFreqCarrierFreqInfo_t *pInterFreqInfo);
INT32 siComposeSib5(OSCTXT *pAsnCxt, SIB5 *pSib5, interRatCellReselectionInfo_t *pInterRatReselectInfo);
/****************************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: duApp.h
** Description: this file is the header file of duApp
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.7.22
**
****************************************************************************************************/
#ifndef __VOS_ADP_H__
#define __VOS_ADP_H__
#include "vos_common.h"
#include "vos_sockMgr.h"
extern INT32 vosAdpSendAsynMsg2Module( CHAR src_moduleName[MODULE_NAME_LEN],
CHAR dst_moduleName[MODULE_NAME_LEN],
VOID *msgData,
LONG msgDataLen);
extern INT32 vosAdpSendAsynMsg2ModuleEx( CHAR src_moduleName[MODULE_NAME_LEN],
CHAR dst_moduleName[MODULE_NAME_LEN],
VOID *msgData,
LONG msgDataLen);
extern INT32 vosAdpSendSocketMsg(VOID *buf,LONG size,VOID *opval);
extern INT32 vosAdpAddCommPara(const CHAR *name,vos_sock_para_t *pPara,vos_sock_info_t *op);
extern INT32 vosAdpCreateTimer(LONG module_ID,LONG msg_code,LONG interval,VOS_TIMER_TYPE_EN type,VOID *pArg);
extern INT32 vosDeleteTimer(LONG module_ID,LONG msg_code);
extern INT32 vosAdpQueSend(ULONG taskId, VOID* msg, UINT32 msgLen);
#endif
include ${G_COMMON_OBJ_DIR_F}
SRC_DIR=$(shell pwd)
M_TARGET=${G_TARGET_DIR}/libCommon.a
#M_SOURCES += $(SRC_DIR)/Src/vosAdp.c
#M_SOURCES += $(SRC_DIR)/Src/gnbCommon.c
#M_SOURCES += $(SRC_DIR)/Src/rrcCodec.c
#M_SOURCES += $(SRC_DIR)/Src/cellGroupCfg.c
#M_SOURCES += $(SRC_DIR)/Src/nrRrcLogger.c
#M_SOURCES += $(SRC_DIR)/Src/systemInfo.c
#M_SOURCES += $(SRC_DIR)/Src/gnbXml.c
include ${G_COMPILE_S_LIB_F}
include ${G_COMMON_COMPILE_F}
-include $(M_DEPS)
#ifndef __AMF_CONTEXT_H__
#define __AMF_CONTEXT_H__
#include "vos_common.h"
#include "gnbCommon.h"
#define AMF_MAX_SLICE_NUM 3
#define AMF_MAX_UE_NUM MAX_UE_NUM
#define AMF_SCTP_NUM 2
#define OPVAL_INFO_WITH_SOURCE 0
#define OPVAL_INFO_WITH_TARGET 1
struct amfInstance;
typedef struct amfUeCb
{
UINT64 ranUeId;
UINT64 amfUeId;
UINT8 amfNasTest;
UINT32 isUseFlag;
UINT64 sourceAmfUeId;
UINT64 targetAmfUeId;
}AmfUeCb_t;
typedef struct
{
UINT8 useFlag;
UINT8 useInd;
vos_sock_info_t opval;
}amfSctpInfo_t;
typedef struct amfInstance
{
UINT64 moduleId;
UINT64 queueId;
UINT8 sctpNum;
amfSctpInfo_t sctpPara[AMF_SCTP_NUM];
PlmnId_t plmnId;
UINT8 ueNum;
AmfUeCb_t *pUeCb[AMF_MAX_UE_NUM];
}AmfInstance_t;
INT32 amfSaveOpvalInfo(vos_sock_info_t *pSocketInfo);
vos_sock_info_t* amfGetSourceOpvalInfo();
vos_sock_info_t* amfGetTargetOpvalInfo();
INT32 amfSetTargetOpvalInfo(vos_sock_info_t *pSocketInfo);
#endif
#ifndef __AMF_IE_H__
#define __AMF_IE_H__
#include "vos_common.h"
#include "gnbCommon.h"
#include "ngapAsn.h"
void amfSetAmfName(NGAMFName *pAmfName);
#endif
#ifndef __NG_AMF_TEST_H__
#define __NG_AMF_TEST_H__
#include "vos_types.h"
#include "amfContext.h"
extern AmfInstance_t s_AmfInstance;
#define AMF_MODULE_ID s_AmfInstance.moduleId
#define amflog(level, content, arg...)\
do{\
if(AMF_MODULE_ID == 0)\
{\
VOS_ASSERT(0);\
}\
VOS_SysLog(AMF_MODULE_ID, level,__FILE__, __LINE__, "", content, ##arg);\
}while(0)
#define BITSTRING_TO_GNBID(x, bitString) \
do{\
if(3 == (bitString)->size) \
{\
x = (bitString)->buf[0] << (16 - (bitString)->bits_unused) | \
(bitString)->buf[1] << (8 - (bitString)->bits_unused) | \
(bitString)->buf[2] >> (bitString)->bits_unused; \
}\
\
if(4 == (bitString)->size) \
{\
x = (bitString)->buf[0] << (24 - (bitString)->bits_unused) | \
(bitString)->buf[1] << (16 - (bitString)->bits_unused) | \
(bitString)->buf[2] >> (8 - (bitString)->bits_unused) | \
(bitString)->buf[3] >> (bitString)->bits_unused;\
}\
}while(0);
INT32 amfTaskInit(ULONG moduleId,ULONG queueId);
#endif
/*******************************************************************************
**
** Copyright (c).
** All rights reserved.
**
** File name: cucCode.h
**
** Current Version: 1.0
** Author:
** Date: 2019-08-25
**
******************************************************************************/
#include "rrcSiMsg.h"
#define CU_CHECK_NULL(prama, content) \
{\
if (NULL == prama)\
{\
CUC_LOG(NULL,LOG_ERR, (content));\
return VOS_ERROR;\
}\
}
extern INT32 cuSib2Proc();
extern INT32 cuSib3Proc();
extern INT32 cuEncodeSib2(Sib2_t *pIfmSib2, Mbuf_t *pBuf);
extern INT32 cuDecodeSib2(Mbuf_t *pBuf, Sib2_t *pIfmSib2);
extern INT32 cuPrintfSib2(Sib2_t *pSib2);
This diff is collapsed.
#ifndef __CUC_TIMER_H__
#define __CUC_TIMER_H__
#include "cuList.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CUC_MAX_TIMER_NUM 8
#define CUC_TIMER_TYPE_BASE 0x5000
//Cell 起站流程相关定时器种类
#define CUC_TIMER_TYPE_NGAP_REG (CUC_TIMER_TYPE_BASE + 1)
#define CUC_TIMER_TYPE_E1AP_REG (CUC_TIMER_TYPE_BASE + 2)//CUCP Ori
//Ue相关定时器种类
#define CUC_TIMER_TYPE_UE_RRC_SETUP (CUC_TIMER_TYPE_BASE + 3)
#define CUC_TIMER_TYPE_UE_CAP_ENQUIRY (CUC_TIMER_TYPE_BASE + 4)
#define CUC_TIMER_TYPE_UE_RRC_SMC (CUC_TIMER_TYPE_BASE + 5)
#define CUC_TIMER_TYPE_UE_RRC_RECFG (CUC_TIMER_TYPE_BASE + 6)
#define CUC_TIMER_TYPE_UE_RRC_RESUME (CUC_TIMER_TYPE_BASE + 7)
#define CUC_TIMER_TYPE_UE_RRC_REESTABLISH (CUC_TIMER_TYPE_BASE + 8)
#define CUC_TIMER_TYPE_UE_RRC_MAX (CUC_TIMER_TYPE_BASE + 20)
#define CUC_TIMER_TYPE_UE_E1_BEAR_SETUP (CUC_TIMER_TYPE_UE_RRC_MAX + 1)
#define CUC_TIMER_TYPE_UE_E1_BEAR_MODIFY (CUC_TIMER_TYPE_UE_E1_BEAR_SETUP + 1)
#define CUC_TIMER_TYPE_UE_E1_BEAR_RELEASE (CUC_TIMER_TYPE_UE_E1_BEAR_SETUP + 2)
#define CUC_TIMER_TYPE_UE_E1_MAX (CUC_TIMER_TYPE_UE_E1_BEAR_SETUP + 20)
#define CUC_TIMER_TYPE_UE_F1_CXT_SETUP (CUC_TIMER_TYPE_UE_E1_MAX + 1)
#define CUC_TIMER_TYPE_UE_F1_CXT_MODIFY (CUC_TIMER_TYPE_UE_F1_CXT_SETUP + 1)
#define CUC_TIMER_TYPE_UE_F1_CXT_RELEASE (CUC_TIMER_TYPE_UE_F1_CXT_SETUP + 2)
#define CUC_TIMER_TYPE_PAGING (CUC_TIMER_TYPE_UE_F1_CXT_SETUP + 3)
#define CUC_TIMER_TYPE_UE_F1_CXT_MOD_REQUIRED (CUC_TIMER_TYPE_UE_F1_CXT_SETUP + 4)
#define CUC_TIMER_TYPE_UE_F1_MAX (CUC_TIMER_TYPE_UE_F1_CXT_SETUP + 20)
#define CUC_TIMER_TYPE_NG_SETUP (CUC_TIMER_TYPE_UE_F1_MAX + 1)
#define CUC_TIMER_TYPE_INIT_UE (CUC_TIMER_TYPE_NG_SETUP + 1)
#define CUC_TIMER_TYPE_NG_RELEASE (CUC_TIMER_TYPE_NG_SETUP + 2)
#define CUC_TIMER_TYPE_NG_PATH_SWITCH (CUC_TIMER_TYPE_NG_SETUP + 3)
#define CUC_TIMER_TYPE_NG_HO_RESOURCE_PREPARE (CUC_TIMER_TYPE_NG_SETUP + 4) /* SRC CUC */
#define CUC_TIMER_TYPE_NG_HO_OVER_ALL (CUC_TIMER_TYPE_NG_SETUP + 5) /* SRC CUC */
#define CUC_TIMER_TYPE_NG_HO_CANCEL (CUC_TIMER_TYPE_NG_SETUP + 6) /* SRC CUC */
#define CUC_TIMER_TYPR_NG_HO_RECFG_CMP (CUC_TIMER_TYPE_NG_SETUP + 7) /* TRGT CUC*/
#define CUC_TIMER_TYPE_NG_MAX (CUC_TIMER_TYPE_NG_SETUP + 20)
#define CUC_TIMER_TYPE_OTHER (CUC_TIMER_TYPE_NG_MAX + 1)
#define CUC_TIMER_TYPE_INACTIVE (CUC_TIMER_TYPE_OTHER + 1)
//测量A5事件上报定时器
#define CUC_TIMER_TYPE_MEASUREMENT_REPORT_A5 (CUC_TIMER_TYPE_OTHER + 2)
#define CUC_TIMER_TYPE_OTHER_MAX (CUC_TIMER_TYPE_OTHER + 20)
//测调统计定时器
#define CUC_TIMER_TYPE_PERF_RESULT_REPORT (CUC_TIMER_TYPE_BASE + 19)
//默认超时时长500ms
#define CUC_TIMER_DEFAULT_DURATION 5000
//Ngap register超时时长10s
#define CUC_TIMER_NGAP_REG_DURATION 10000
//测调统计时长10s
#define CUC_TIMER_PERF_RESULT_REPORT 1000
#define CUC_TIMER_CELL_RRC_KPI_MEASURE_RESULT_REPORT (CUC_TIMER_TYPE_BASE + 300) //KPI测量定时器。不区分UE
#define CUC_TIMER_CELL_MM_KPI_MEASURE_RESULT_REPORT (CUC_TIMER_TYPE_BASE + 301) //KPI测量定时器。不区分UE
#define CUC_TIMER_UE_RRC_KPI_MEASURE_RESULT_REPORT (CUC_TIMER_TYPE_BASE + 300) //KPI测量定时器。特定UE
#define CUC_TIMER_UE_MM_KPI_MEASURE_RESULT_REPORT (CUC_TIMER_TYPE_BASE + 301) //KPI测量定时器。特定UE
typedef struct cucTimerinfo_s
{
UINT32 used;
ULONG timerId;
ULONG timeSize;
UINT32 loopFlag;
void *timerCb;
}cucTimerinfo_t;
typedef struct cucTimerMgr_s
{
UINT32 timerNum;
cucTimerinfo_t timerInfo[CUC_MAX_TIMER_NUM];
}cucTimerMgr_t;
typedef struct cucTimerCb_s{
CuListNode_t tmrLnk;
UINT64 transId;
UINT32 loopFlag;
VOID *cb;
cucTimerMgr_t *timerMgr;
}CucTimerCb_t;
/*********************************** macro *************************************/
/**
* @brief CUC start timer
*/
#define CUC_START_TMR(tmrTyp, timerSz, loopFlag, pArg) VOS_RegTimerMsg(cucGetModuleId(), tmrTyp, timerSz, loopFlag, (void *)pArg)
/**
* @brief CUC stop timer
*/
#define CUC_STOP_TMR(tmrTyp) VOS_DeregTimerMsg(cucGetModuleId(), tmrTyp)
#define TIMER_ID_BASE_BIT 12
//#define TIMER_ID_CELLIDX_BIT 16
//#define CUC_TMR_ID(tmrTyp, subTmrCellIdx, subTmrUeIdx) (ULONG)(((ULONG)tmrTyp << TIMER_ID_BASE_BIT) | ((ULONG) subTmrCellIdx << TIMER_ID_CELLIDX_BIT) | (ULONG)(subTmrUeIdx))
#define CUC_TMR_ID(tmrTyp, subTmrId) (ULONG)(((ULONG)tmrTyp << TIMER_ID_BASE_BIT) | (ULONG)(subTmrId))
INT32 cucTimerStart(ULONG timerId, UINT32 timerSz, UINT32 loopFlag, UINT64 tmrCbTransId, void * tmrCbPtr, cucTimerMgr_t * timerMgr);
INT32 cucTimerStop(ULONG timerId, cucTimerMgr_t * cucTmrMgr);
INT32 cucIfmUeE1BearReleaseTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeF1ContextSetupExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeF1ContextModTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeF1ContextReleaseTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeRrcCapEnqTimerExpired(void *pMsg);
INT32 cucIfmUeRrcSmcTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeRrcRecfgTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeE1BearSetupTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmUeE1BearModTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmE1apRegTimerExpired(void *pMsg);
INT32 cucIfmRrcSetupTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmInitUeTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmNgapRegTimerExpired(void *pMsg);
INT32 cucLaunchNgSetupTimerExpired(void *pMsg);
INT32 cucIfmInactiveTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmNgUeCxtRlsReqTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmNgHoRecfgTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucIfmNgHoOverallTimerExpired(void *pMsg, UINT32 timeTye);
INT32 cucInitTimerMgr(cucTimerMgr_t *cucTimerMgr);
INT32 cucFreeTimerMgr(cucTimerMgr_t *cucTimerMgr);
INT32 cucClearTimerInfo(ULONG timerId, cucTimerMgr_t *timerMgr);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* End of __CUC_TIMMER_H__ */
#ifndef _CUC_COMMON_H_
#define _CUC_COMMON_H_
#include "vos_types.h"
#include "dlist.h"
#include "gnbServiceType.h"
#define MAX_CUCP_UE_ID 300
#define INVAIL_CUC_UE_ID 0xFFFF
#define INVAIL_CUC_UE_IDX 0xFF
#define INVAIL_CUC_DU_IDX 0xFF
#define INVAIL_CUC_CELL_ID 0xFFFF
typedef struct cucUeIdMapInfo_s
{
DListNode_t listNode;
UINT8 used;
UINT16 ueId; /*global ue ID*/
}cucUeIdMapInfo_t;
INT32 cucIsExistIdleUeId();
UINT16 cucAllocIdleUeId();
INT32 cucFreeOccupyUeId(UINT16 ueId);
INT32 cucUpdateUeIDMapInfo(UINT16 ueId, NrCellId_t cellId, UINT8 ueIdx);
INT32 cucGetCellIdByUeId(UINT16 ueId, NrCellId_t *cellId);
ULONG cucGetUeIdxByUeId(UINT16 ueId, UINT8 *ueIdx);
#ifdef __cplusplus
}
#endif
#endif
#ifndef __DLIST_H__
#define __DLIST_H__
#include <stdint.h>
typedef struct DListNode {
struct DListNode *next;
struct DListNode *prev;
} DListNode_t;
typedef struct _dlist_s{
DListNode_t *head;
DListNode_t *tail;
uint32_t count;
} DList_t;
#define DLIST_ENTRY(ptr, type, member) \
((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
/*正向遍历链表,不允许遍历过程中删除链表节点*/
#define DLIST_FOR_EACH(p, pList) \
for (p = dlistGetHead(pList); p; p = dlistGetNext(p))
/*正向遍历链表,允许遍历过程中删除链表节点*/
#define DLIST_FOR_EACH_SAFE(p, n, pList) \
for (p = dlistGetHead(pList), n = dlistGetNext(p); p; p = n, n = dlistGetNext(p))
/*反向遍历链表,不允许在遍历过程中删除节点*/
#define DLIST_FOR_EACH_REVERSE(p, pList) \
for (p = dlistGetTail(pList); p; p = dlistGetPrev(p))
/*反向遍历链表,允许在遍历过程中删除节点*/
#define DLIST_FOR_EACH_REVERSE_SAFE(p, n, pList) \
for (p = dlistGetTail(pList), n = dlistGetPrev(p); p; p = n, n = dlistGetPrev(p))
#ifdef __cplusplus
extern "C" {
#endif
void dlistInit(DList_t *pList);
void dlistNodeInit(DListNode_t *pNode);
uint32_t dlistGetCount(DList_t *pList);
int dlistIsEmpty(DList_t *pList);
void dlistPushToTail(DList_t *pList, DListNode_t *pNode);
void dlistPushToHead(DList_t *pList, DListNode_t *pNode);
uint32_t dlistGetCount(DList_t *pList);
void dlistDelNode(DList_t *pList, DListNode_t *pNode);
DListNode_t *dlistGetHead(DList_t *pList);
DListNode_t *dlistGetTail(DList_t *pList);
DListNode_t *dlistGetNext(DListNode_t *pNode);
DListNode_t *dlistGetPrev(DListNode_t *pNode);
void dlistInsertAfter(DList_t *pList, DListNode_t *pPrev, DListNode_t *pNode);
void dlistInsertBefore(DList_t *pList, DListNode_t *pNext, DListNode_t *pNode);
DListNode_t *dlistPopFromHead(DList_t *pList);
DListNode_t *dlistPopFromTail(DList_t *pList);
void dlistMoveToHead(DList_t *pList, DListNode_t *pNode);
void dlistMoveToTail(DList_t *pList, DListNode_t *pNode);
#ifdef __cplusplus
}
#endif
#endif /* __DLIST_H__ */
/************************************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: cucMsgProc.h
** Description: cuc main messge handle .h file
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.8.2
**
************************************************************************************************************/
#ifndef _CTRL_FUNC_H_
#define _CTRL_FUNC_H_
#ifdef __cplusplus
extern "C" {
#endif
INT32 ctrlF1apCuUeContextRelReq(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeContextRelComplete(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeContextModReq(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeContextModRsp(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeContestModFail(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeInactNotify(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuInitRrcMsg(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUlRrcMsg(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeContextSetupRsp(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlF1apCuUeContextSetupFail(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearSetRsp(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearSetFailure(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearModRsp(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearModFailure(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearRlsCmp(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearInactiveNotification(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apDlDataNotification(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlE1apBearCxtReReq(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucDownlinkNas(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucInitCxtSetupReq(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucUeContextReleaseCmd(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucPduSessionSetupReq(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucSessionModifyReq(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucPduSessionReleaseCmd(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucHoCmd(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucHoRequest(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucHoPrepFail(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucHoCancelAck(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucDlRanStatusTransfer(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
INT32 ctrlNgapCucPduSessionModifyCfm(ModuleMsg_t *pMsg,UINT32* pMsgLen,UINT64* pUeId);
#ifdef __cplusplus
}
#endif
#endif /* _CUCMSGPROC_H_*/
#ifndef __CU_LIST_H__
#define __CU_LIST_H__
#ifndef WIN32
#include "vos_common.h"
#else
#include "clist.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*********************** Type Define ***********************/
/** @brief
* list type
*/
#ifndef WIN32
typedef struct cl_lib_listnode CuListNode_t;
typedef struct cuListCb_s
{
CuListNode_t *head; /* first entryNode in list */
CuListNode_t *tail; /* last entryNode in list */
CuListNode_t *crnt; /* entryNode last accessed */
UINT32 count; /* number of entryNodes */
}CuListCb_t;
#else
typedef struct list_t CuListCb_t;
#endif
#if 0
/*********************** Macro Define ***********************/
/** @brief
* Get the list head node
*/
#ifndef WIN32
#define cuListHead(X) cl_lib_listhead((CuListCb_t *)X)
#else
#define cuListHead(X) list_front((const CuListCb_t *)X)
#endif
/** @brief
* Get the list tail node
*/
#ifndef WIN32
#define cuListTail(X) cl_lib_listtail((CuListCb_t *)X)
#else
#define cuListTail(X) list_back((const CuListCb_t *)X)
#endif
/** @brief
* Get the next node
*/
#ifndef WIN32
#define cuListNextNode(X) cl_lib_nextnode(X)
#else
#define listNextNode(X) ((_listnode_t *)X->_pt_next)
#endif
/** @brief
* Get the previous node
*/
#ifndef WIN32
#define listPrevNode(X) cl_lib_prevnode(X)
#else
#define listPrevNode(X) ((_listnode_t *)X->_pt_prev)
#endif
/** @brief
* Get the node count in the list
*/
#ifndef WIN32
#define listCount(X) cl_lib_listcount((List_t *)X)
#else
#define listCount(X) list_size((const list_t *)X)
#endif
/** @brief
* Judge the list is empty or not. Empty: returun 1
*/
#ifndef WIN32
#define listIsEmpty(X) cl_lib_list_isempty(X)
#else
#define listIsEmpty(X) list_empty((const list_t *)X)
#endif
/** @brief
* Get the data point of data in the list
*/
#ifndef WIN32
#define listGetData(X) cl_lib_getdata((ListNode_t *)X)
#else
#define listGetData(X) ((_listnode_t *)X->_pby_data)
#endif
#endif
/*********************************** extern **********************************/
#ifndef WIN32
extern VOID cuListInit(CuListCb_t *lList);
extern VOID cuListAdd2Head(CuListCb_t *lList, CuListNode_t *node);
extern VOID cuListAdd2Tail(CuListCb_t *lList, CuListNode_t *node);
extern VOID cuListInsCrnt(CuListCb_t *lList, CuListNode_t *node);
extern VOID cuListInsAfterCrnt(CuListCb_t *lList, CuListNode_t *node);
extern CuListNode_t *cuListDelFrm(CuListCb_t *lList, CuListNode_t *node);
extern VOID cmLListCatLList( CuListCb_t *list1, CuListCb_t *list2);
#endif
#ifdef __cplusplus
}
#endif
#endif
#ifndef _CUC_COMMON_FUNC_H_
#define _CUC_COMMON_FUNC_H_
#include "cucContext.h"
#ifdef __cplusplus
extern "C" {
#endif
INT32 cucCheckAmfConnection();
INT32 cucMapPlmnByIdx(CuUeCb_t *ueCb,UINT8 selPlmnIdx);
VOID cucFillUeCbSrbInfo(CuUeCb_t *pUeCb, UINT8 srbId);
VOID cucGetTimeStamp(Timestamp_t* pTime);
INT32 cucAllocDrb(UINT8 *drbId, CuUeCb_t *pUeCb);
BOOL cucComparePlmn(PlmnId_t *pLeft, PlmnId_t *pRight);
BOOL cucCompareTai(CuTai_t* cellTaiInfo,CuTai_t* PagingTaiInfo);
#ifdef __cplusplus
}
#endif
#endif
/************************************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: e1apCucHdlMsg.h
** Description: cuc e1ap messge handle .h file
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.8.2
**
************************************************************************************************************/
#ifndef _CUCE1APHANDLEMSG_H_
#define _CUCE1APHANDLEMSG_H_
#include "vos_types.h"
#include "gnbCommon.h"
#ifdef __cplusplus
extern "C" {
#endif
INT32 cucE1apSetupReq(ModuleMsg_t *pMsg);
INT32 cucE1apRlsRsp(ModuleMsg_t *pMsg);
INT32 cucE1apBearSetRsp(ModuleMsg_t *pMsg);
INT32 cucE1apBearModRsp(ModuleMsg_t *pMsg);
INT32 cucE1apBearRlsCmp(ModuleMsg_t *pMsg);
INT32 cucE1apBearSetFailure(ModuleMsg_t *pMsg);
INT32 cucE1apBearModFailure(ModuleMsg_t *pMsg);
INT32 cucE1apBearInactiveNotification(ModuleMsg_t *pMsg);
INT32 cucE1apDlDataNotification(ModuleMsg_t *pMsg) ;
INT32 cucE1apBearCxtRlsReq(ModuleMsg_t *pMsg);
#ifdef __cplusplus
}
#endif
#endif /* _CUCE1APHANDLEMSG_H_*/
/************************************************************************************************************
**
** Copyright (c) 2019-2019 ICT/CAS.
** All rights reserved.
**
** File name: f1apCucHdlMsg.h
** Description: cuc f1ap messge handle .h file
**
** Current Version: 0.1
** $Revision:
** Author:
** Date: 2019.8.2
**
************************************************************************************************************/
#ifndef _CUCF1APHANDLEMSG_H_
#define _CUCF1APHANDLEMSG_H_
#include "vos_types.h"
#include "gnbCommon.h"
#include "cucContext.h"
#include "cuModuleInterface.h"
#ifdef __cplusplus
extern "C" {
#endif
#define RRC_EVENT_BASE 0xF000
#define RRC_SETUP_REQ RRC_EVENT_BASE + 1
#define RRC_RESUME_REQ RRC_EVENT_BASE + 2
#define RRC_REESTABLISHMENT_REQ RRC_EVENT_BASE + 3
#define RRC_SYSTEM_INFO_REQ RRC_EVENT_BASE + 4
#define RRC_RESUME_REQ_1 RRC_EVENT_BASE + 5
#define RRC_MEASUREMENT_RPT RRC_EVENT_BASE + 6
#define RRC_RECONFIG_CMP RRC_EVENT_BASE + 7
#define RRC_SETUP_CMP RRC_EVENT_BASE + 8
#define RRC_REESATBLISHEMNT_CMP RRC_EVENT_BASE + 9
#define RRC_RESUME_CMP RRC_EVENT_BASE + 10
#define RRC_SMC_CMP RRC_EVENT_BASE + 11
#define RRC_SMC_FAILURE RRC_EVENT_BASE + 12
#define RRC_UL_INFO_TRANSFER RRC_EVENT_BASE + 13
#define RRC_LOCATION_MEASURE_IND RRC_EVENT_BASE + 14
#define RRC_UE_CAPA_INFO RRC_EVENT_BASE + 15
#define RRC_COUNTER_CHECK_RSP RRC_EVENT_BASE + 16
#define RRC_UE_ASSIST_INFO RRC_EVENT_BASE + 17
#define RRC_FAILURE_INFO RRC_EVENT_BASE + 18
#define RRC_UL_INFO_TRANS_MRDC RRC_EVENT_BASE + 19
#define RRC_SCG_INFO_FAILURE RRC_EVENT_BASE + 20
#define RRC_SCG_INFO_FAILURE_EUTRA RRC_EVENT_BASE + 21
extern INT32 cucF1apCuF1SetupReq(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuReset(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuDuCfgUpdate(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuCuCfgUpdateAck(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuCuCfgUpdateFail(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuDuResCoor(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuDuStatusInd(ModuleMsg_t *pMsg);
extern INT32 cucF1apUeContextSetupRsp(ModuleMsg_t *pMsg);
extern INT32 cucF1apUeContextSetupFail(ModuleMsg_t *pMsg);
extern INT32 cucF1apUeContextRelReq(ModuleMsg_t *pMsg);
extern INT32 cucF1apUeContextRelComplete(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuUeContextModReq(ModuleMsg_t *pMsg);
extern INT32 cucF1apUeContextModRsp(ModuleMsg_t *pMsg);
extern INT32 cucF1apUeContextModFail(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuUeInactNotify(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuInitRrcMsg(ModuleMsg_t *pMsg);
extern INT32 cucF1apCuUlRrcMsg(ModuleMsg_t *pMsg);
#ifdef __cplusplus
}
#endif
#endif /* _CUCF1APHANDLEMSG_H_*/
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Amf_test:简单的核心网AMF。其主要功能是给基站回复响应消息
Common:上下文,定时器等相关文件
CuC:CUCP网元的核心控制模块,Trans机制,冲突判决机制等
Ho:切换相关功能的主要流程
Mm:移动管理相关的流程,包含RRC相关、UE上下文释放等
Nwm:接口管理,包含NGAP,XNAP等等
Rrm:无线资源管理,包含算法相关等内容
Sm:会话管理相关流程,包含Session建立、修改、释放等等
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment