Commit 7c8019da authored by matzakos's avatar matzakos

Merge develop into nsa_remove_band_hardcodings branch

parents db33ee5e 5372a347
...@@ -21,3 +21,7 @@ The Regents of the University of California: BSD 3-Clause Licence. ...@@ -21,3 +21,7 @@ The Regents of the University of California: BSD 3-Clause Licence.
Niels Provos <provos@citi.umich.edu>: BSD 2-Clause Licence. Niels Provos <provos@citi.umich.edu>: BSD 2-Clause Licence.
## Credits for source code openair3/GTPV1-U/nw-gtpv1u: ##
Amit Chawre <http://www.amitchawre.net/contact.html>: BSD 2-Clause Licence.
...@@ -30,7 +30,6 @@ def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) { ...@@ -30,7 +30,6 @@ def sendSocialMediaMessage(pipeChannel, pipeColor, pipeMessage) {
} }
} }
def doRedHatBuild = false
def doFlexranCtrlTest = false def doFlexranCtrlTest = false
// Location of the executor node // Location of the executor node
...@@ -85,21 +84,6 @@ pipeline { ...@@ -85,21 +84,6 @@ pipeline {
echo "Platform is ${env.TESTPLATFORM_OWNER}" echo "Platform is ${env.TESTPLATFORM_OWNER}"
} }
if (params.RedHatRemoteServer == null) {
allParametersPresent = false
}
if (params.RedHatRemoteCredentials == null) {
allParametersPresent = false
}
if (params.RedHatWorkingPath == null) {
allParametersPresent = false
}
if (allParametersPresent) {
echo "Performing Red Hat Build"
doRedHatBuild = true
} else {
doRedHatBuild = false
}
if (params.FlexRanRtcGitLabRepository_Credentials != null) { if (params.FlexRanRtcGitLabRepository_Credentials != null) {
doFlexranCtrlTest = true doFlexranCtrlTest = true
} }
...@@ -279,7 +263,7 @@ pipeline { ...@@ -279,7 +263,7 @@ pipeline {
steps { steps {
gitlabCommitStatus(name: "Build eNB-USRP") { gitlabCommitStatus(name: "Build eNB-USRP") {
timeout (time: 20, unit: 'MINUTES') { timeout (time: 20, unit: 'MINUTES') {
sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID} --keep-vm-alive" sh "./ci-scripts/oai-ci-vm-tool wait --workspace $WORKSPACE --variant enb-usrp --job-name ${JOB_NAME} --build-id ${BUILD_ID}"
} }
} }
} }
...@@ -311,28 +295,6 @@ pipeline { ...@@ -311,28 +295,6 @@ pipeline {
} }
} }
} }
stage ("Build eNB-USRP on Red Hat") {
when {
expression {doRedHatBuild}
}
steps {
gitlabCommitStatus(name: "Build eNB-USRP-RHE") {
script {
try {
withCredentials([
[$class: 'UsernamePasswordMultiBinding', credentialsId: "${params.RedHatRemoteCredentials}", usernameVariable: 'RH_Username', passwordVariable: 'RH_Password']
]) {
timeout (time: 20, unit: 'MINUTES') {
sh "./ci-scripts/buildOnRH.sh --workspace $WORKSPACE --job-name ${JOB_NAME} --build-id ${BUILD_ID} --remote-host ${params.RedHatRemoteServer} --remote-path ${params.RedHatWorkingPath} --remote-user-name ${RH_Username} --remote-password ${RH_Password}"
}
}
} catch (Exception e) {
echo "Red Hat build failed but we could keep running pipeline if all ubuntu-based build passed"
}
}
}
}
}
} }
post { post {
failure { failure {
......
...@@ -77,7 +77,7 @@ then ...@@ -77,7 +77,7 @@ then
IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext"` IS_NFAPI=`echo $FILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext"`
IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE` IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FILE`
IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence" $FILE` IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence" $FILE`
IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h"` IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h|openair3/GTPV1-U/nw-gtpv1u|openair2/UTIL/OPT/ws_"`
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
then then
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ] if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
...@@ -194,12 +194,12 @@ do ...@@ -194,12 +194,12 @@ do
IS_NFAPI=`echo $FULLFILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext"` IS_NFAPI=`echo $FULLFILE | egrep -c "nfapi/open-nFAPI|nfapi/oai_integration/vendor_ext"`
IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FULLFILE` IS_OAI_LICENCE_PRESENT=`egrep -c "OAI Public License" $FULLFILE`
IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence" $FULLFILE` IS_BSD_LICENCE_PRESENT=`egrep -c "the terms of the BSD Licence" $FULLFILE`
IS_EXCEPTION=`echo $FILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h"` IS_EXCEPTION=`echo $FULLFILE | egrep -c "common/utils/collection/tree.h|common/utils/collection/queue.h|common/utils/itti_analyzer/common/queue.h|openair3/UTILS/tree.h|openair3/UTILS/queue.h|openair3/GTPV1-U/nw-gtpv1u|openair2/UTIL/OPT/ws_"`
if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ] if [ $IS_OAI_LICENCE_PRESENT -eq 0 ] && [ $IS_BSD_LICENCE_PRESENT -eq 0 ]
then then
if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ] if [ $IS_NFAPI -eq 0 ] && [ $IS_EXCEPTION -eq 0 ]
then then
echo $FILE >> ./files-w-suspect-banner.txt echo $FULLFILE >> ./files-w-suspect-banner.txt
fi fi
fi fi
fi fi
......
...@@ -2027,30 +2027,6 @@ function run_test_on_vm { ...@@ -2027,30 +2027,6 @@ function run_test_on_vm {
done done
full_l2_sim_destroy
echo "############################################################"
echo "Checking run status"
echo "############################################################"
if [ $PING_STATUS -ne 0 ]; then STATUS=-1; fi
if [ $IPERF_STATUS -ne 0 ]; then STATUS=-1; fi
if [ $MBMS_STATUS -eq 0 ]
then
echo "LTE MBMS RFSIM seems OK"
else
echo "LTE MBMS RFSIM seems to FAIL"
STATUS=-1
fi
if [ $STATUS -eq 0 ]
then
echo "LTE RFSIM seems OK"
echo "LTE: TEST_OK" > $ARCHIVES_LOC/test_final_status.log
else
echo "LTE RFSIM seems to FAIL"
echo "LTE: TEST_KO" > $ARCHIVES_LOC/test_final_status.log
fi
#################### ####################
## FeMBMS CASE noS1 ## ## FeMBMS CASE noS1 ##
#################### ####################
...@@ -2123,6 +2099,13 @@ function run_test_on_vm { ...@@ -2123,6 +2099,13 @@ function run_test_on_vm {
if [ $PING_STATUS -ne 0 ]; then STATUS=-1; fi if [ $PING_STATUS -ne 0 ]; then STATUS=-1; fi
if [ $IPERF_STATUS -ne 0 ]; then STATUS=-1; fi if [ $IPERF_STATUS -ne 0 ]; then STATUS=-1; fi
if [ $MBMS_STATUS -eq 0 ]
then
echo "LTE MBMS RFSIM seems OK"
else
echo "LTE MBMS RFSIM seems to FAIL"
STATUS=-1
fi
if [ $FeMBMS_STATUS -eq 0 ] if [ $FeMBMS_STATUS -eq 0 ]
then then
echo "LTE FeMBMS RFSIM seems OK" echo "LTE FeMBMS RFSIM seems OK"
...@@ -2153,7 +2136,7 @@ function run_test_on_vm { ...@@ -2153,7 +2136,7 @@ function run_test_on_vm {
NR_STATUS=0 NR_STATUS=0
######### start of loop ######### start of loop
while [ $try_cnt -lt 1 ] while [ $try_cnt -lt 4 ]
do do
SYNC_STATUS=0 SYNC_STATUS=0
PING_STATUS=0 PING_STATUS=0
......
#ifndef _TRACER_DEFS_H_ #ifndef _COMMON_UTILS_T_DEFS_H_
#define _TRACER_DEFS_H_ #define _COMMON_UTILS_T_DEFS_H_
/* types of plots */ /* types of plots */
#define PLOT_VS_TIME 0 #define PLOT_VS_TIME 0
...@@ -27,4 +27,4 @@ void *forwarder(char *ip, int port); ...@@ -27,4 +27,4 @@ void *forwarder(char *ip, int port);
void forward(void *forwarder, char *buf, int size); void forward(void *forwarder, char *buf, int size);
void forward_start_client(void *forwarder, int socket); void forward_start_client(void *forwarder, int socket);
#endif /* _TRACER_DEFS_H_ */ #endif /* _COMMON_UTILS_T_DEFS_H_ */
#ifndef _TRACER_DEFS_H_ #ifndef _COMMON_UTILS_T_TRACER_DEFS_H_
#define _TRACER_DEFS_H_ #define _COMMON_UTILS_T_TRACER_DEFS_H_
/* types of plots */ /* types of plots */
#define PLOT_VS_TIME 0 #define PLOT_VS_TIME 0
...@@ -21,4 +21,4 @@ void t_gui_start(void); ...@@ -21,4 +21,4 @@ void t_gui_start(void);
void t_gui_set_input_signal(int eNB, int frame, int subframe, int antenna, void t_gui_set_input_signal(int eNB, int frame, int subframe, int antenna,
int size, void *buf); int size, void *buf);
#endif /* _TRACER_DEFS_H_ */ #endif /* _COMMON_UTILS_T_TRACER_DEFS_H_ */
...@@ -12,6 +12,7 @@ STATUS 2020/09/10 : updated the status of interop (end to end UL/DL traffic) ...@@ -12,6 +12,7 @@ STATUS 2020/09/10 : updated the status of interop (end to end UL/DL traffic)
7. [Log file monitoring](#log-file-monitoring) 7. [Log file monitoring](#log-file-monitoring)
6. [Required tools for debug](#required-tools-for-debug) 6. [Required tools for debug](#required-tools-for-debug)
7. [Status of interoperability](#status-of-interoperability) 7. [Status of interoperability](#status-of-interoperability)
8. [CI integration](#ci-integration)
## Configuration Overview ## Configuration Overview
...@@ -70,7 +71,7 @@ cd cmake_targets/ ...@@ -70,7 +71,7 @@ cd cmake_targets/
- **EPC** - **EPC**
for reference: for reference:
https://github.com/OPENAIRINTERFACE/openair-epc-fed/blob/master-documentation/docs/DEPLOY_HOME.md https://github.com/OPENAIRINTERFACE/openair-epc-fed/blob/master/docs/DEPLOY_HOME.md
...@@ -204,7 +205,7 @@ The test takes typically a few seconds, max 10-15 seconds. If it takes more than ...@@ -204,7 +205,7 @@ The test takes typically a few seconds, max 10-15 seconds. If it takes more than
- **EPC** (on EPC host): - **EPC** (on EPC host):
for reference: for reference:
https://github.com/OPENAIRINTERFACE/openair-epc-fed/blob/master-documentation/docs/DEPLOY_HOME.md https://github.com/OPENAIRINTERFACE/openair-epc-fed/blob/master/docs/DEPLOY_HOME.md
...@@ -384,3 +385,16 @@ The following parts have been validated with FR1 COTS UE: ...@@ -384,3 +385,16 @@ The following parts have been validated with FR1 COTS UE:
some packet losses might still occur even in ideal channel conditions some packet losses might still occur even in ideal channel conditions
## CI integration
The automation scripts are available on ILIADE.
The end-to-end test is integrated in the CI flow in a semi-automated manner, comprising 3 steps:
- update a YAML file comprising the IT resources definition, branch and commit number the test has to run on
- run the python script that generates the test from the YAML file
```
python3 obj_build_from_yaml.py py_params_template.yaml fr1.sh
```
- run the test (fr1.sh)
At the date of writing, the test comprises the deployment of the components (epc, eNB, gNB, cots ue) and the execution of 2 pings procedures (20 pings in 20sec, then 5 pings in 1sec)
This automation is run for every integration branch to be merged into develop.
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
/* Header file generated by fdesign on Thu Aug 28 12:13:51 2014 */ /* Header file generated by fdesign on Thu Aug 28 12:13:51 2014 */
#ifndef FD_stats_form_h_ #ifndef _EXECUTABLES_STATS_H_
#define FD_stats_form_h_ #define _EXECUTABLES_STATS_H_
#include <forms.h> #include <forms.h>
...@@ -43,4 +43,4 @@ typedef struct { ...@@ -43,4 +43,4 @@ typedef struct {
extern FD_stats_form *create_form_stats_form( void ); extern FD_stats_form *create_form_stats_form( void );
#endif /* FD_stats_form_h_ */ #endif /* _EXECUTABLES_STATS_H_ */
#ifndef _THREADS_T_H_ #ifndef _EXECUTABLES_THREADS_T_H_
#define _THREADS_T_H_ #define _EXECUTABLES_THREADS_T_H_
typedef struct threads_s { typedef struct threads_s {
int main; int main;
...@@ -18,4 +18,4 @@ typedef struct threads_s { ...@@ -18,4 +18,4 @@ typedef struct threads_s {
//int dlsch_td1_three; //int dlsch_td1_three;
} threads_t; } threads_t;
#endif /* _THREADS_T_H_ */ #endif /* _EXECUTABLES_THREADS_T_H_ */
...@@ -67,7 +67,7 @@ int nr_find_pucch(uint16_t rnti, ...@@ -67,7 +67,7 @@ int nr_find_pucch(uint16_t rnti,
AssertFatal(gNB!=NULL,"gNB is null\n"); AssertFatal(gNB!=NULL,"gNB is null\n");
int index = -1; int index = -1;
for (int i=0; i<NUMBER_OF_NR_ULSCH_MAX; i++) { for (int i=0; i<NUMBER_OF_NR_PUCCH_MAX; i++) {
AssertFatal(gNB->pucch[i]!=NULL,"gNB->pucch[%d] is null\n",i); AssertFatal(gNB->pucch[i]!=NULL,"gNB->pucch[%d] is null\n",i);
if ((gNB->pucch[i]->active >0) && if ((gNB->pucch[i]->active >0) &&
(gNB->pucch[i]->pucch_pdu.rnti==rnti) && (gNB->pucch[i]->pucch_pdu.rnti==rnti) &&
......
...@@ -442,6 +442,11 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP, ...@@ -442,6 +442,11 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
pdcp_run(&ctxt); pdcp_run(&ctxt);
//rrc_rx_tx(&ctxt, CC_id); //rrc_rx_tx(&ctxt, CC_id);
/* send tick to RLC every ms */
if ((slot & ((1 << *scc->ssbSubcarrierSpacing) - 1)) == 0) {
void nr_rlc_tick(int frame, int subframe);
nr_rlc_tick(frame, slot >> *scc->ssbSubcarrierSpacing);
}
dlsch_in_slot_bitmap = &RC.nrmac[module_idP]->UE_list.UE_sched_ctrl[UE_id].dlsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains dlsch dlsch_in_slot_bitmap = &RC.nrmac[module_idP]->UE_list.UE_sched_ctrl[UE_id].dlsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains dlsch
ulsch_in_slot_bitmap = &RC.nrmac[module_idP]->UE_list.UE_sched_ctrl[UE_id].ulsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains ulsch ulsch_in_slot_bitmap = &RC.nrmac[module_idP]->UE_list.UE_sched_ctrl[UE_id].ulsch_in_slot_bitmap; // static bitmap signaling which slot in a tdd period contains ulsch
......
...@@ -158,14 +158,6 @@ mac_rlc_status_resp_t mac_rlc_status_ind( ...@@ -158,14 +158,6 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
mac_rlc_status_resp_t ret; mac_rlc_status_resp_t ret;
nr_rlc_entity_t *rb; nr_rlc_entity_t *rb;
/* TODO: handle time a bit more properly */
if (nr_rlc_current_time_last_frame != frameP ||
nr_rlc_current_time_last_subframe != subframeP) {
nr_rlc_current_time++;
nr_rlc_current_time_last_frame = frameP;
nr_rlc_current_time_last_subframe = subframeP;
}
nr_rlc_manager_lock(nr_rlc_ue_manager); nr_rlc_manager_lock(nr_rlc_ue_manager);
ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP); ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP);
...@@ -921,3 +913,10 @@ rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x) ...@@ -921,3 +913,10 @@ rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x)
return RLC_OP_STATUS_OK; return RLC_OP_STATUS_OK;
} }
void nr_rlc_tick(int frame, int subframe)
{
if (frame != nr_rlc_current_time_last_frame ||
subframe != nr_rlc_current_time_last_subframe)
nr_rlc_current_time++;
}
#ifndef _LOG_H_ #ifndef _NR_RLC_TESTS_LOG_H_
#define _LOG_H_ #define _NR_RLC_TESTS_LOG_H_
#include <stdio.h> #include <stdio.h>
...@@ -7,4 +7,4 @@ ...@@ -7,4 +7,4 @@
#define LOG_D(x, ...) printf(__VA_ARGS__) #define LOG_D(x, ...) printf(__VA_ARGS__)
#define LOG_W(x, ...) printf(__VA_ARGS__) #define LOG_W(x, ...) printf(__VA_ARGS__)
#endif /* _LOG_H_ */ #endif /* _NR_RLC_TESTS_LOG_H_ */
#ifndef _LOG_H_ #ifndef _RLC_V2_TESTS_LOG_H_
#define _LOG_H_ #define _RLC_V2_TESTS_LOG_H_
#include <stdio.h> #include <stdio.h>
...@@ -7,4 +7,4 @@ ...@@ -7,4 +7,4 @@
#define LOG_D(x, ...) printf(__VA_ARGS__) #define LOG_D(x, ...) printf(__VA_ARGS__)
#define LOG_W(x, ...) printf(__VA_ARGS__) #define LOG_W(x, ...) printf(__VA_ARGS__)
#endif /* _LOG_H_ */ #endif /* _RLC_V2_TESTS_LOG_H_ */
...@@ -155,7 +155,6 @@ init_SI( ...@@ -155,7 +155,6 @@ init_SI(
LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__); LOG_D(RRC,"%s()\n\n\n\n",__FUNCTION__);
if(configuration->radioresourceconfig[CC_id].mbms_dedicated_serving_cell == TRUE) { if(configuration->radioresourceconfig[CC_id].mbms_dedicated_serving_cell == TRUE) {
LOG_I(RRC, "Configuring MIB FeMBMS (N_RB_DL %d)\n", LOG_I(RRC, "Configuring MIB FeMBMS (N_RB_DL %d)\n",
(int)configuration->N_RB_DL[CC_id]); (int)configuration->N_RB_DL[CC_id]);
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MIB_FeMBMS = (uint8_t *) malloc16(4); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MIB_FeMBMS = (uint8_t *) malloc16(4);
...@@ -500,13 +499,17 @@ init_SI( ...@@ -500,13 +499,17 @@ init_SI(
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].FeMBMS_flag, RC.rrc[ctxt_pP->module_id]->carrier[CC_id].FeMBMS_flag,
(carrier->sib1_MBMS==NULL?(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL:(LTE_BCCH_DL_SCH_Message_MBMS_t *)carrier->sib1_MBMS),//(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL, (carrier->sib1_MBMS==NULL?(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL:(LTE_BCCH_DL_SCH_Message_MBMS_t *)carrier->sib1_MBMS),//(LTE_BCCH_DL_SCH_Message_MBMS_t *) NULL,
(LTE_SchedulingInfo_MBMS_r14_t *) NULL, (LTE_SchedulingInfo_MBMS_r14_t *) NULL,
(carrier->sib1_MBMS==NULL?(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL:(struct LTE_NonMBSFN_SubframeConfig_r14 *)carrier->sib1_MBMS->nonMBSFN_SubframeConfig_r14),//(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (carrier->sib1_MBMS==NULL
(carrier->sib1_MBMS==NULL?(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL:(LTE_SystemInformationBlockType1_MBMS_r14_t *)carrier->sib1_MBMS->systemInformationBlockType13_r14),//(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, ? (struct LTE_NonMBSFN_SubframeConfig_r14 *)NULL
(carrier->sib1_MBMS==NULL?(LTE_MBSFN_AreaInfoList_r9_t *) NULL:(LTE_MBSFN_AreaInfoList_r9_t *)&carrier->sib1_MBMS->systemInformationBlockType13_r14->mbsfn_AreaInfoList_r9)//(LTE_MBSFN_AreaInfoList_r9_t *) NULL : (struct LTE_NonMBSFN_SubframeConfig_r14 *)carrier->sib1_MBMS->nonMBSFN_SubframeConfig_r14),//(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(carrier->sib1_MBMS==NULL
,(LTE_MBSFNAreaConfiguration_r9_t*) NULL ? (LTE_SystemInformationBlockType1_MBMS_r14_t *)NULL
: (LTE_SystemInformationBlockType1_MBMS_r14_t *)carrier->sib1_MBMS->systemInformationBlockType13_r14),//(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
); (carrier->sib1_MBMS==NULL
? (LTE_MBSFN_AreaInfoList_r9_t *)NULL
: (LTE_MBSFN_AreaInfoList_r9_t *)&carrier->sib1_MBMS->systemInformationBlockType13_r14->mbsfn_AreaInfoList_r9),//(LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t *)NULL
);
} }
/* set flag to indicate that cell information is configured. This is required /* set flag to indicate that cell information is configured. This is required
...@@ -590,7 +593,7 @@ init_MCCH( ...@@ -590,7 +593,7 @@ init_MCCH(
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
} }
...@@ -1040,59 +1043,59 @@ void release_UE_in_freeList(module_id_t mod_id) { ...@@ -1040,59 +1043,59 @@ void release_UE_in_freeList(module_id_t mod_id) {
for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) { for (CC_id = 0; CC_id < MAX_NUM_CCs; CC_id++) {
eNB_PHY = RC.eNB[mod_id][CC_id]; eNB_PHY = RC.eNB[mod_id][CC_id];
int id;
// clean ULSCH entries for rnti
id = find_ulsch(rnti,eNB_PHY,SEARCH_EXIST);
int id;
// clean ULSCH entries for rnti
id = find_ulsch(rnti,eNB_PHY,SEARCH_EXIST);
if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]); if (id>=0) clean_eNb_ulsch(eNB_PHY->ulsch[id]);
// clean DLSCH entries for rnti // clean DLSCH entries for rnti
id = find_dlsch(rnti,eNB_PHY,SEARCH_EXIST); id = find_dlsch(rnti,eNB_PHY,SEARCH_EXIST);
if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]); if (id>=0) clean_eNb_dlsch(eNB_PHY->dlsch[id][0]);
// clean UCI entries for rnti // clean UCI entries for rnti
for (i=0; i<NUMBER_OF_UCI_VARS_MAX; i++) { for (i=0; i<NUMBER_OF_UCI_VARS_MAX; i++) {
if(eNB_PHY->uci_vars[i].rnti == rnti) { if(eNB_PHY->uci_vars[i].rnti == rnti) {
LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti); LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI)); memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
} }
} }
/*
for (i=0; i<MAX_MOBILES_PER_ENB; i++) {
ulsch = eNB_PHY->ulsch[i];
if((ulsch != NULL) && (ulsch->rnti == rnti)) {
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
clean_eNb_ulsch(ulsch);
}
dlsch = eNB_PHY->dlsch[i][0]; /*
for (i=0; i<MAX_MOBILES_PER_ENB; i++) {
ulsch = eNB_PHY->ulsch[i];
if((dlsch != NULL) && (dlsch->rnti == rnti)) { if((ulsch != NULL) && (ulsch->rnti == rnti)) {
void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch); void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
LOG_I(RRC, "clean_eNb_dlsch dlsch[%d] UE %x \n", i, rnti); LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
clean_eNb_dlsch(dlsch); clean_eNb_ulsch(ulsch);
} }
}
ulsch = eNB_PHY->ulsch[i]; dlsch = eNB_PHY->dlsch[i][0];
if((ulsch != NULL) && (ulsch->rnti == rnti)) { if((dlsch != NULL) && (dlsch->rnti == rnti)) {
void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch); void clean_eNb_dlsch(LTE_eNB_DLSCH_t *dlsch);
LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti); LOG_I(RRC, "clean_eNb_dlsch dlsch[%d] UE %x \n", i, rnti);
clean_eNb_ulsch(ulsch); clean_eNb_dlsch(dlsch);
} }
}
for (i=0; i<NUMBER_OF_UCI_VARS_MAX; i++) { ulsch = eNB_PHY->ulsch[i];
if(eNB_PHY->uci_vars[i].rnti == rnti) {
LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti); if((ulsch != NULL) && (ulsch->rnti == rnti)) {
memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI)); void clean_eNb_ulsch(LTE_eNB_ULSCH_t *ulsch);
} LOG_I(RRC, "clean_eNb_ulsch ulsch[%d] UE %x\n", i, rnti);
} clean_eNb_ulsch(ulsch);
*/ }
for (i=0; i<NUMBER_OF_UCI_VARS_MAX; i++) {
if(eNB_PHY->uci_vars[i].rnti == rnti) {
LOG_I(MAC, "clean eNb uci_vars[%d] UE %x \n",i, rnti);
memset(&eNB_PHY->uci_vars[i],0,sizeof(LTE_eNB_UCI));
}
}
*/
if (flexran_agent_get_rrc_xface(mod_id)) { if (flexran_agent_get_rrc_xface(mod_id)) {
flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change( flexran_agent_get_rrc_xface(mod_id)->flexran_agent_notify_ue_state_change(
...@@ -1496,7 +1499,7 @@ rrc_eNB_generate_RRCConnectionReestablishment( ...@@ -1496,7 +1499,7 @@ rrc_eNB_generate_RRCConnectionReestablishment(
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
break; break;
} }
...@@ -2198,7 +2201,6 @@ rrc_eNB_generate_RRCConnectionRelease( ...@@ -2198,7 +2201,6 @@ rrc_eNB_generate_RRCConnectionRelease(
uint8_t buffer[RRC_BUF_SIZE]; uint8_t buffer[RRC_BUF_SIZE];
uint16_t size = 0; uint16_t size = 0;
int release_num; int release_num;
memset(buffer, 0, RRC_BUF_SIZE); memset(buffer, 0, RRC_BUF_SIZE);
T(T_ENB_RRC_CONNECTION_RELEASE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T(T_ENB_RRC_CONNECTION_RELEASE, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
...@@ -3601,20 +3603,19 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t ...@@ -3601,20 +3603,19 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
size, size,
buffer, buffer,
PDCP_TRANSMISSION_MODE_CONTROL); PDCP_TRANSMISSION_MODE_CONTROL);
/* Refresh SRBs/DRBs */ /* Refresh SRBs/DRBs */
rrc_pdcp_config_asn1_req(ctxt_pP, rrc_pdcp_config_asn1_req(ctxt_pP,
*SRB_configList2, // NULL, *SRB_configList2, // NULL,
*DRB_configList, *DRB_configList,
NULL, NULL,
0xff, // already configured during the securitymodecommand 0xff, // already configured during the securitymodecommand
NULL, NULL,
NULL, NULL,
NULL NULL
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
, (LTE_PMCH_InfoList_r9_t *) NULL , (LTE_PMCH_InfoList_r9_t *) NULL
#endif #endif
, NULL); , NULL);
/* Refresh SRBs/DRBs */ /* Refresh SRBs/DRBs */
if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
...@@ -3627,7 +3628,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t ...@@ -3627,7 +3628,7 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
0, 0,
0 0
#endif #endif
); );
} }
free(Sparams); free(Sparams);
...@@ -4674,7 +4675,7 @@ rrc_eNB_process_MeasurementReport( ...@@ -4674,7 +4675,7 @@ rrc_eNB_process_MeasurementReport(
for (int e_rab=0; e_rab < X2AP_ENDC_SGNB_ADDITION_REQ(msg).nb_e_rabs_tobeadded; e_rab++) { for (int e_rab=0; e_rab < X2AP_ENDC_SGNB_ADDITION_REQ(msg).nb_e_rabs_tobeadded; e_rab++) {
X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id; X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].e_rab_id = ue_context_pP->ue_context.e_rab[e_rab].param.e_rab_id;
X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].gtp_teid = ue_context_pP->ue_context.e_rab[e_rab].param.gtp_teid; X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].gtp_teid = ue_context_pP->ue_context.e_rab[e_rab].param.gtp_teid;
X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].drb_ID = ue_context_pP->ue_context.DRB_configList->list.array[e_rab]->drb_Identity; X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].drb_ID = ue_context_pP->ue_context.DRB_configList->list.array[e_rab]->drb_Identity;
memcpy(&X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].sgw_addr, memcpy(&X2AP_ENDC_SGNB_ADDITION_REQ(msg).e_rabs_tobeadded[e_rab].sgw_addr,
&ue_context_pP->ue_context.e_rab[e_rab].param.sgw_addr, &ue_context_pP->ue_context.e_rab[e_rab].param.sgw_addr,
sizeof(transport_layer_addr_t)); sizeof(transport_layer_addr_t));
...@@ -5797,7 +5798,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct ...@@ -5797,7 +5798,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
// Configure target eNB SRB2 // Configure target eNB SRB2
/// SRB2 /// SRB2
...@@ -6349,20 +6350,19 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct ...@@ -6349,20 +6350,19 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
ue_context_pP->ue_context.rnti, ue_context_pP->ue_context.rnti,
rrc_eNB_mui, rrc_eNB_mui,
size); size);
/* Refresh SRBs/DRBs */ /* Refresh SRBs/DRBs */
rrc_pdcp_config_asn1_req(ctxt_pP, rrc_pdcp_config_asn1_req(ctxt_pP,
*SRB_configList2, // NULL, *SRB_configList2, // NULL,
*DRB_configList, *DRB_configList,
NULL, NULL,
0xff, // already configured during the securitymodecommand 0xff, // already configured during the securitymodecommand
NULL, NULL,
NULL, NULL,
NULL NULL
#if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0)) #if (LTE_RRC_VERSION >= MAKE_VERSION(9, 0, 0))
, (LTE_PMCH_InfoList_r9_t *) NULL , (LTE_PMCH_InfoList_r9_t *) NULL
#endif #endif
, NULL); , NULL);
/* Refresh SRBs/DRBs */ /* Refresh SRBs/DRBs */
if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
...@@ -6375,7 +6375,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct ...@@ -6375,7 +6375,7 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
0, 0,
0 0
#endif #endif
); );
} }
free(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ); free(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ);
...@@ -6421,6 +6421,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc ...@@ -6421,6 +6421,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc
NULL, NULL,
NULL, NULL,
(LTE_PMCH_InfoList_r9_t *) NULL, NULL); (LTE_PMCH_InfoList_r9_t *) NULL, NULL);
if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
rrc_rlc_config_asn1_req(ctxt_pP, rrc_rlc_config_asn1_req(ctxt_pP,
ue_context_p->ue_context.SRB_configList, ue_context_p->ue_context.SRB_configList,
...@@ -6478,7 +6479,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc ...@@ -6478,7 +6479,7 @@ rrc_eNB_configure_rbs_handover(struct rrc_eNB_ue_context_s *ue_context_p, protoc
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
} }
...@@ -6561,6 +6562,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ...@@ -6561,6 +6562,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
kUPenc, kUPenc,
(LTE_PMCH_InfoList_r9_t *) NULL, (LTE_PMCH_InfoList_r9_t *) NULL,
NULL); NULL);
/* Refresh SRBs/DRBs */ /* Refresh SRBs/DRBs */
if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) { if (!NODE_IS_CU(RC.rrc[ctxt_pP->module_id]->node_type)) {
rrc_rlc_config_asn1_req(ctxt_pP, rrc_rlc_config_asn1_req(ctxt_pP,
...@@ -6570,7 +6572,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ...@@ -6570,7 +6572,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
(LTE_PMCH_InfoList_r9_t *) NULL, (LTE_PMCH_InfoList_r9_t *) NULL,
0, 0,
0 0
); );
} }
/* Set the SRB active in UE context */ /* Set the SRB active in UE context */
...@@ -6695,7 +6697,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ...@@ -6695,7 +6697,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
} }
} else { // remove LCHAN from MAC/PHY } else { // remove LCHAN from MAC/PHY
...@@ -6755,7 +6757,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ...@@ -6755,7 +6757,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete(
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
} }
} // end else of if (ue_context_pP->ue_context.DRB_active[drb_id] == 0) } // end else of if (ue_context_pP->ue_context.DRB_active[drb_id] == 0)
...@@ -6918,7 +6920,7 @@ rrc_eNB_generate_RRCConnectionSetup( ...@@ -6918,7 +6920,7 @@ rrc_eNB_generate_RRCConnectionSetup(
(struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL, (struct LTE_NonMBSFN_SubframeConfig_r14 *) NULL,
(LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL, (LTE_SystemInformationBlockType1_MBMS_r14_t *) NULL,
(LTE_MBSFN_AreaInfoList_r9_t *) NULL, (LTE_MBSFN_AreaInfoList_r9_t *) NULL,
(LTE_MBSFNAreaConfiguration_r9_t*) NULL (LTE_MBSFNAreaConfiguration_r9_t *) NULL
); );
break; break;
} }
...@@ -7054,6 +7056,16 @@ char openair_rrc_eNB_configuration( ...@@ -7054,6 +7056,16 @@ char openair_rrc_eNB_configuration(
return 0; return 0;
} }
static
void rrc_eNB_generate_RRCConnectionReestablishmentReject_unknown_UE(protocol_ctxt_t *const ctxt_pP,
const int CC_id) {
struct rrc_eNB_ue_context_s *ue_context_p = rrc_eNB_get_next_free_ue_context(ctxt_pP, ctxt_pP->rnti);
rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP,
ue_context_p,
CC_id);
ue_context_p->ue_context.ul_failure_timer = 500; // 500 milliseconds to send the message and remove temporary entry
}
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
int int
rrc_eNB_decode_ccch( rrc_eNB_decode_ccch(
...@@ -7132,12 +7144,14 @@ rrc_eNB_decode_ccch( ...@@ -7132,12 +7144,14 @@ rrc_eNB_decode_ccch(
uint16_t c_rnti = 0; uint16_t c_rnti = 0;
if (rrcConnectionReestablishmentRequest->ue_Identity.physCellId != RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId) { if (rrcConnectionReestablishmentRequest->ue_Identity.physCellId != RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId) {
/* UE was moving from previous cell so quickly that RRCConnectionReestablishment for previous cell was recieved in this cell */
LOG_E(RRC, LOG_E(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" LTE_RRCConnectionReestablishmentRequest ue_Identity.physCellId(%ld) is not equal to current physCellId(%d), let's reject the UE\n", PROTOCOL_RRC_CTXT_UE_FMT" LTE_RRCConnectionReestablishmentRequest ue_Identity.physCellId(%ld) is not equal to current physCellId(%d), let's reject the UE\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP), PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
rrcConnectionReestablishmentRequest->ue_Identity.physCellId, rrcConnectionReestablishmentRequest->ue_Identity.physCellId,
RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId); RC.rrc[ctxt_pP->module_id]->carrier[CC_id].physCellId);
rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); rrc_eNB_generate_RRCConnectionReestablishmentReject_unknown_UE(ctxt_pP,
CC_id);
break; break;
} }
...@@ -7150,10 +7164,12 @@ rrc_eNB_decode_ccch( ...@@ -7150,10 +7164,12 @@ rrc_eNB_decode_ccch(
if (rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI.size == 0 || if (rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI.size == 0 ||
rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI.size > 2) { rrcConnectionReestablishmentRequest->ue_Identity.c_RNTI.size > 2) {
/* c_RNTI range error should not happen */
LOG_E(RRC, LOG_E(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" LTE_RRCConnectionReestablishmentRequest c_RNTI range error, let's reject the UE\n", PROTOCOL_RRC_CTXT_UE_FMT" LTE_RRCConnectionReestablishmentRequest c_RNTI range error, let's reject the UE\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); rrc_eNB_generate_RRCConnectionReestablishmentReject_unknown_UE(ctxt_pP,
CC_id);
break; break;
} }
...@@ -7165,7 +7181,8 @@ rrc_eNB_decode_ccch( ...@@ -7165,7 +7181,8 @@ rrc_eNB_decode_ccch(
LOG_E(RRC, LOG_E(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" LTE_RRCConnectionReestablishmentRequest without UE context, let's reject the UE\n", PROTOCOL_RRC_CTXT_UE_FMT" LTE_RRCConnectionReestablishmentRequest without UE context, let's reject the UE\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
rrc_eNB_generate_RRCConnectionReestablishmentReject(ctxt_pP, ue_context_p, CC_id); rrc_eNB_generate_RRCConnectionReestablishmentReject_unknown_UE(ctxt_pP,
CC_id);
break; break;
} }
...@@ -7232,8 +7249,10 @@ rrc_eNB_decode_ccch( ...@@ -7232,8 +7249,10 @@ rrc_eNB_decode_ccch(
if(ue_context_p->ue_context.ue_reestablishment_timer > 0) { if(ue_context_p->ue_context.ue_reestablishment_timer > 0) {
LOG_E(RRC, LOG_E(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" RRRCConnectionReconfigurationComplete(Previous) don't receive, delete the Previous UE\n", PROTOCOL_RRC_CTXT_UE_FMT" RRRCConnectionReconfigurationComplete(Previous) don't receive, delete the Previous UE,\nprevious Status %d, new Status RRC_RECONFIGURED\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP)); PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
ue_context_p->ue_context.Status
);
ue_context_p->ue_context.Status = RRC_RECONFIGURED; ue_context_p->ue_context.Status = RRC_RECONFIGURED;
protocol_ctxt_t ctxt_old_p; protocol_ctxt_t ctxt_old_p;
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt_old_p, PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt_old_p,
...@@ -7818,8 +7837,7 @@ rrc_eNB_decode_dcch( ...@@ -7818,8 +7837,7 @@ rrc_eNB_decode_dcch(
LOG_I(RRC, LOG_I(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_HO_EXECUTION (xid %ld)\n", PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_HO_EXECUTION (xid %ld)\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier); PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.rrc_TransactionIdentifier);
} } else if(ue_context_p->ue_context.Status == RRC_NR_NSA) {
else if(ue_context_p->ue_context.Status == RRC_NR_NSA){
//Looking for a condition to trigger S1AP E-RAB-Modification-indication, based on the reception of RRCConnectionReconfigurationComplete //Looking for a condition to trigger S1AP E-RAB-Modification-indication, based on the reception of RRCConnectionReconfigurationComplete
//including NR specific elements. //including NR specific elements.
if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8. if(ul_dcch_msg->message.choice.c1.choice.rrcConnectionReconfigurationComplete.criticalExtensions.choice.rrcConnectionReconfigurationComplete_r8.
...@@ -7847,8 +7865,7 @@ rrc_eNB_decode_dcch( ...@@ -7847,8 +7865,7 @@ rrc_eNB_decode_dcch(
} }
} }
} }
} } else {
else {
dedicated_DRB = 0; dedicated_DRB = 0;
ue_context_p->ue_context.Status = RRC_RECONFIGURED; ue_context_p->ue_context.Status = RRC_RECONFIGURED;
LOG_I(RRC, LOG_I(RRC,
...@@ -7857,7 +7874,6 @@ rrc_eNB_decode_dcch( ...@@ -7857,7 +7874,6 @@ rrc_eNB_decode_dcch(
} }
ue_context_p->ue_context.reestablishment_xid = -1; ue_context_p->ue_context.reestablishment_xid = -1;
} else { } else {
dedicated_DRB = 1; dedicated_DRB = 1;
ue_context_p->ue_context.Status = RRC_RECONFIGURED; ue_context_p->ue_context.Status = RRC_RECONFIGURED;
...@@ -8393,8 +8409,7 @@ rrc_eNB_decode_dcch( ...@@ -8393,8 +8409,7 @@ rrc_eNB_decode_dcch(
case LTE_UL_DCCH_MessageType__c1_PR_mbmsCountingResponse_r10: case LTE_UL_DCCH_MessageType__c1_PR_mbmsCountingResponse_r10:
T(T_ENB_RRC_MBMS_COUNTING_RESPONSE_R10, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame), T(T_ENB_RRC_MBMS_COUNTING_RESPONSE_R10, T_INT(ctxt_pP->module_id), T_INT(ctxt_pP->frame),
T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti)); T_INT(ctxt_pP->subframe), T_INT(ctxt_pP->rnti));
LOG_E(RRC, "THINH [LTE_UL_DCCH_MessageType__c1_PR_mbmsCountingResponse_r10]\n"); LOG_E(RRC, "THINH [LTE_UL_DCCH_MessageType__c1_PR_mbmsCountingResponse_r10]\n");
break; break;
case LTE_UL_DCCH_MessageType__c1_PR_interFreqRSTDMeasurementIndication_r10: case LTE_UL_DCCH_MessageType__c1_PR_interFreqRSTDMeasurementIndication_r10:
...@@ -8422,46 +8437,46 @@ rrc_eNB_decode_dcch( ...@@ -8422,46 +8437,46 @@ rrc_eNB_decode_dcch(
case LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2: //SidelinkUEInformation case LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2: //SidelinkUEInformation
if(ul_dcch_msg->message.choice.messageClassExtension.choice.c2.present == if(ul_dcch_msg->message.choice.messageClassExtension.choice.c2.present ==
LTE_UL_DCCH_MessageType__messageClassExtension__c2_PR_scgFailureInformationNR_r15){ LTE_UL_DCCH_MessageType__messageClassExtension__c2_PR_scgFailureInformationNR_r15) {
if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15. if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.
criticalExtensions.present == LTE_SCGFailureInformationNR_r15__criticalExtensions_PR_c1){ criticalExtensions.present == LTE_SCGFailureInformationNR_r15__criticalExtensions_PR_c1) {
if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions. if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions.
choice.c1.present == LTE_SCGFailureInformationNR_r15__criticalExtensions__c1_PR_scgFailureInformationNR_r15){ choice.c1.present == LTE_SCGFailureInformationNR_r15__criticalExtensions__c1_PR_scgFailureInformationNR_r15) {
if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions. if (ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions.
choice.c1.choice.scgFailureInformationNR_r15.failureReportSCG_NR_r15!=NULL) { choice.c1.choice.scgFailureInformationNR_r15.failureReportSCG_NR_r15!=NULL) {
LOG_E(RRC, "Received NR scgFailureInformation from UE, failure type: %ld \n", LOG_E(RRC, "Received NR scgFailureInformation from UE, failure type: %ld \n",
ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions. ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.scgFailureInformationNR_r15.criticalExtensions.
choice.c1.choice.scgFailureInformationNR_r15.failureReportSCG_NR_r15->failureType_r15); choice.c1.choice.scgFailureInformationNR_r15.failureReportSCG_NR_r15->failureType_r15);
xer_fprint(stdout, &asn_DEF_LTE_UL_DCCH_Message, (void *)ul_dcch_msg); xer_fprint(stdout, &asn_DEF_LTE_UL_DCCH_Message, (void *)ul_dcch_msg);
} }
} }
} }
} } else if(ul_dcch_msg->message.choice.messageClassExtension.choice.c2.present == LTE_UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12) {
else if(ul_dcch_msg->message.choice.messageClassExtension.choice.c2.present == LTE_UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12){
//case UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12: //SidelinkUEInformation //case UL_DCCH_MessageType__messageClassExtension__c2_PR_sidelinkUEInformation_r12: //SidelinkUEInformation
LOG_I(RRC,"THINH [LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2]\n"); LOG_I(RRC,"THINH [LTE_UL_DCCH_MessageType__messageClassExtension_PR_c2]\n");
LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP, LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)Rx_sdu,sdu_sizeP,
"[MSG] RRC SidelinkUEInformation \n"); "[MSG] RRC SidelinkUEInformation \n");
MSC_LOG_RX_MESSAGE( MSC_LOG_RX_MESSAGE(
MSC_RRC_ENB, MSC_RRC_ENB,
MSC_RRC_UE, MSC_RRC_UE,
Rx_sdu, Rx_sdu,
sdu_sizeP, sdu_sizeP,
MSC_AS_TIME_FMT" SidelinkUEInformation UE %x size %u", MSC_AS_TIME_FMT" SidelinkUEInformation UE %x size %u",
MSC_AS_TIME_ARGS(ctxt_pP), MSC_AS_TIME_ARGS(ctxt_pP),
ue_context_p->ue_context.rnti, ue_context_p->ue_context.rnti,
sdu_sizeP);
LOG_I(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
"(SidelinkUEInformation) ---> RRC_eNB\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
DCCH,
sdu_sizeP); sdu_sizeP);
LOG_I(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" RLC RB %02d --- RLC_DATA_IND %d bytes "
"(SidelinkUEInformation) ---> RRC_eNB\n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP),
DCCH,
sdu_sizeP);
rrc_eNB_process_SidelinkUEInformation( rrc_eNB_process_SidelinkUEInformation(
ctxt_pP, ctxt_pP,
ue_context_p, ue_context_p,
&ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.sidelinkUEInformation_r12); &ul_dcch_msg->message.choice.messageClassExtension.choice.c2.choice.sidelinkUEInformation_r12);
} }
break; break;
default: default:
...@@ -8628,17 +8643,14 @@ void rrc_enb_init(void) { ...@@ -8628,17 +8643,14 @@ void rrc_enb_init(void) {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void process_successful_rlc_sdu_indication(int instance, void process_successful_rlc_sdu_indication(int instance,
int rnti, int rnti,
int message_id) int message_id) {
{
int release_num; int release_num;
int release_total; int release_total;
RRC_release_ctrl_t *release_ctrl; RRC_release_ctrl_t *release_ctrl;
/* Check if the message sent was RRC Connection Release. /* Check if the message sent was RRC Connection Release.
* If yes then continue the release process. * If yes then continue the release process.
*/ */
pthread_mutex_lock(&rrc_release_freelist); pthread_mutex_lock(&rrc_release_freelist);
if (rrc_release_info.num_UEs > 0) { if (rrc_release_info.num_UEs > 0) {
...@@ -8680,14 +8692,11 @@ void process_successful_rlc_sdu_indication(int instance, ...@@ -8680,14 +8692,11 @@ void process_successful_rlc_sdu_indication(int instance,
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void process_unsuccessful_rlc_sdu_indication(int instance, int rnti) void process_unsuccessful_rlc_sdu_indication(int instance, int rnti) {
{
int release_num; int release_num;
int release_total; int release_total;
RRC_release_ctrl_t *release_ctrl; RRC_release_ctrl_t *release_ctrl;
/* radio link failure detected by RLC layer, remove UE properly */ /* radio link failure detected by RLC layer, remove UE properly */
pthread_mutex_lock(&rrc_release_freelist); pthread_mutex_lock(&rrc_release_freelist);
/* first, check if the rnti is in the list rrc_release_info.RRC_release_ctrl */ /* first, check if the rnti is in the list rrc_release_info.RRC_release_ctrl */
...@@ -8755,8 +8764,7 @@ void process_rlc_sdu_indication(int instance, ...@@ -8755,8 +8764,7 @@ void process_rlc_sdu_indication(int instance,
int rnti, int rnti,
int is_successful, int is_successful,
int srb_id, int srb_id,
int message_id) int message_id) {
{
if (is_successful) if (is_successful)
process_successful_rlc_sdu_indication(instance, rnti, message_id); process_successful_rlc_sdu_indication(instance, rnti, message_id);
else else
...@@ -9120,51 +9128,49 @@ void rrc_eNB_process_AdditionResponseInformation(const module_id_t enb_mod_idP, ...@@ -9120,51 +9128,49 @@ void rrc_eNB_process_AdditionResponseInformation(const module_id_t enb_mod_idP,
return; return;
} }
protocol_ctxt_t ctxt; protocol_ctxt_t ctxt;
rrc_eNB_ue_context_t *ue_context; rrc_eNB_ue_context_t *ue_context;
unsigned char buffer[8192]; unsigned char buffer[8192];
int size; int size;
ue_context = rrc_eNB_get_ue_context(RC.rrc[enb_mod_idP], m->rnti);
ue_context = rrc_eNB_get_ue_context(RC.rrc[enb_mod_idP], m->rnti);
if (ue_context) { if (ue_context) {
ue_context->ue_context.nb_of_modify_endc_e_rabs = m->nb_e_rabs_admitted_tobeadded; ue_context->ue_context.nb_of_modify_endc_e_rabs = m->nb_e_rabs_admitted_tobeadded;
int j=0;
int j=0;
while(j < m->nb_e_rabs_admitted_tobeadded){ while(j < m->nb_e_rabs_admitted_tobeadded) {
for (int e_rab_idx=0; e_rab_idx<ue_context->ue_context.setup_e_rabs; e_rab_idx++){ for (int e_rab_idx=0; e_rab_idx<ue_context->ue_context.setup_e_rabs; e_rab_idx++) {
//Update ue_context information with gNB's address and new GTP tunnel ID //Update ue_context information with gNB's address and new GTP tunnel ID
if( ue_context->ue_context.e_rab[e_rab_idx].param.e_rab_id == m->e_rabs_admitted_tobeadded[j].e_rab_id){ if( ue_context->ue_context.e_rab[e_rab_idx].param.e_rab_id == m->e_rabs_admitted_tobeadded[j].e_rab_id) {
memcpy(ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].buffer, memcpy(ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].buffer,
m->e_rabs_admitted_tobeadded[j].gnb_addr.buffer, m->e_rabs_admitted_tobeadded[j].gnb_addr.buffer,
m->e_rabs_admitted_tobeadded[j].gnb_addr.length); m->e_rabs_admitted_tobeadded[j].gnb_addr.length);
ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].length = m->e_rabs_admitted_tobeadded[j].gnb_addr.length; ue_context->ue_context.gnb_gtp_endc_addrs[e_rab_idx].length = m->e_rabs_admitted_tobeadded[j].gnb_addr.length;
ue_context->ue_context.gnb_gtp_endc_teid[e_rab_idx] = m->e_rabs_admitted_tobeadded[j].gtp_teid; ue_context->ue_context.gnb_gtp_endc_teid[e_rab_idx] = m->e_rabs_admitted_tobeadded[j].gtp_teid;
ue_context->ue_context.e_rab[e_rab_idx].status = E_RAB_STATUS_TOMODIFY; ue_context->ue_context.e_rab[e_rab_idx].status = E_RAB_STATUS_TOMODIFY;
break; break;
} }
}
j++;
} }
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt, j++;
0,
ENB_FLAG_YES,
m->rnti,
0, 0);
size = rrc_eNB_generate_RRCConnectionReconfiguration_endc(&ctxt, ue_context, buffer, 8192, scg_CellGroupConfig, nr1_conf);
rrc_data_req(&ctxt,
DCCH,
rrc_eNB_mui++,
SDU_CONFIRM_NO,
size,
buffer,
PDCP_TRANSMISSION_MODE_CONTROL);
} else {
LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", m->rnti);
} }
PROTOCOL_CTXT_SET_BY_INSTANCE(&ctxt,
0,
ENB_FLAG_YES,
m->rnti,
0, 0);
size = rrc_eNB_generate_RRCConnectionReconfiguration_endc(&ctxt, ue_context, buffer, 8192, scg_CellGroupConfig, nr1_conf);
rrc_data_req(&ctxt,
DCCH,
rrc_eNB_mui++,
SDU_CONFIRM_NO,
size,
buffer,
PDCP_TRANSMISSION_MODE_CONTROL);
} else {
LOG_E(F1AP, "no ue_context for RNTI %x, acknowledging release\n", m->rnti);
}
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -9505,8 +9511,8 @@ void *rrc_enb_process_itti_msg(void *notUsed) { ...@@ -9505,8 +9511,8 @@ void *rrc_enb_process_itti_msg(void *notUsed) {
break; break;
case M2AP_MCE_CONFIGURATION_UPDATE: case M2AP_MCE_CONFIGURATION_UPDATE:
rrc_eNB_process_M2AP_MCE_CONFIGURATION_UPDATE(&ctxt,&M2AP_MCE_CONFIGURATION_UPDATE(msg_p)); rrc_eNB_process_M2AP_MCE_CONFIGURATION_UPDATE(&ctxt,&M2AP_MCE_CONFIGURATION_UPDATE(msg_p));
break; break;
case RLC_SDU_INDICATION: case RLC_SDU_INDICATION:
process_rlc_sdu_indication(instance, process_rlc_sdu_indication(instance,
...@@ -9550,7 +9556,7 @@ rrc_enb_task( ...@@ -9550,7 +9556,7 @@ rrc_enb_task(
//if (go_nr) rrc_go_nr(); //if (go_nr) rrc_go_nr();
} }
} }
} }
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
void void
......
...@@ -16,13 +16,13 @@ ...@@ -16,13 +16,13 @@
#include "NwEvt.h" #include "NwEvt.h"
#include "NwLog.h" #include "NwLog.h"
#ifndef __NW_MINI_LOG_MGR_H__
#define __NW_MINI_LOG_MGR_H__
#ifndef NW_ASSERT #ifndef NW_ASSERT
#define NW_ASSERT assert #define NW_ASSERT assert
#endif #endif
#ifndef __NW_MINI_LOG_MGR_H__
#define __NW_MINI_LOG_MGR_H__
extern uint32_t g_log_level; extern uint32_t g_log_level;
......
...@@ -17,13 +17,13 @@ ...@@ -17,13 +17,13 @@
#include "NwEvt.h" #include "NwEvt.h"
#include "NwLog.h" #include "NwLog.h"
#ifndef __NW_MINI_TMR_MGR_H__
#define __NW_MINI_TMR_MGR_H__
#ifndef NW_ASSERT #ifndef NW_ASSERT
#define NW_ASSERT assert #define NW_ASSERT assert
#endif #endif
#ifndef __NW_MINI_TMR_MGR_H__
#define __NW_MINI_TMR_MGR_H__
typedef struct { typedef struct {
NwEventT ev; NwEventT ev;
void* timeoutArg; void* timeoutArg;
......
...@@ -17,13 +17,13 @@ ...@@ -17,13 +17,13 @@
#include "NwEvt.h" #include "NwEvt.h"
#include "NwLog.h" #include "NwLog.h"
#ifndef __NW_MINI_UDP_ENTITY_H__
#define __NW_MINI_UDP_ENTITY_H__
#ifndef NW_ASSERT #ifndef NW_ASSERT
#define NW_ASSERT assert #define NW_ASSERT assert
#endif #endif
#ifndef __NW_MINI_UDP_ENTITY_H__
#define __NW_MINI_UDP_ENTITY_H__
typedef struct { typedef struct {
uint32_t hSocket; uint32_t hSocket;
NwEventT ev; NwEventT ev;
......
#ifndef _THREADS_T_H_ #ifndef _TARGETS_COMMON_THREADS_T_H_
#define _THREADS_T_H_ #define _TARGETS_COMMON_THREADS_T_H_
typedef struct threads_s { typedef struct threads_s {
int main; int main;
...@@ -18,4 +18,4 @@ typedef struct threads_s { ...@@ -18,4 +18,4 @@ typedef struct threads_s {
//int dlsch_td1_three; //int dlsch_td1_three;
} threads_t; } threads_t;
#endif /* _THREADS_T_H_ */ #endif /* _TARGETS_COMMON_THREADS_T_H_ */
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
/* Header file generated by fdesign on Thu Aug 28 12:13:51 2014 */ /* Header file generated by fdesign on Thu Aug 28 12:13:51 2014 */
#ifndef FD_stats_form_h_ #ifndef _TARGETS_RT_USER_STATS_H_
#define FD_stats_form_h_ #define _TARGETS_RT_USER_STATS_H_
#include <forms.h> #include <forms.h>
...@@ -43,4 +43,4 @@ typedef struct { ...@@ -43,4 +43,4 @@ typedef struct {
extern FD_stats_form * create_form_stats_form( void ); extern FD_stats_form * create_form_stats_form( void );
#endif /* FD_stats_form_h_ */ #endif /* _TARGETS_RT_USER_STATS_H_ */
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