put pdcp on extra thread for improved real-time operation (no impact on simulation/emulation)
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4068 818b1a75-f10b-46b9-bf7c-635c3b92a50f
This commit is contained in:
@@ -55,8 +55,8 @@
|
|||||||
#include "RRC/LITE/extern.h"
|
#include "RRC/LITE/extern.h"
|
||||||
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
#include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
|
||||||
|
|
||||||
|
|
||||||
//#include "LAYER2/MAC/pre_processor.c"
|
//#include "LAYER2/MAC/pre_processor.c"
|
||||||
|
#include "pdcp.h"
|
||||||
|
|
||||||
double snr_mcs[28]={-4.1130, -3.3830, -2.8420, -2.0480, -1.3230, -0.6120, 0.1080, 0.977, 1.7230, 2.7550, 3.1960, 3.8080, 4.6870, 5.6840, 6.6550, 7.7570, 8.3730, 9.3040, 9.5990, 10.9020, 11.7220, 12.5950, 13.4390, 14.8790, 15.8800, 16.4800, 17.8690, 18.7690};
|
double snr_mcs[28]={-4.1130, -3.3830, -2.8420, -2.0480, -1.3230, -0.6120, 0.1080, 0.977, 1.7230, 2.7550, 3.1960, 3.8080, 4.6870, 5.6840, 6.6550, 7.7570, 8.3730, 9.3040, 9.5990, 10.9020, 11.7220, 12.5950, 13.4390, 14.8790, 15.8800, 16.4800, 17.8690, 18.7690};
|
||||||
int cqi_mcs[3][16] = {{0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 25, 27, 27},{0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 25, 27, 27},{0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 19, 22, 24, 26, 27}};
|
int cqi_mcs[3][16] = {{0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 25, 27, 27},{0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 20, 22, 25, 27, 27},{0, 0, 0, 2, 4, 6, 8, 11, 13, 15, 18, 19, 22, 24, 26, 27}};
|
||||||
@@ -4199,7 +4199,27 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf
|
|||||||
|
|
||||||
//if (subframe%5 == 0)
|
//if (subframe%5 == 0)
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
pdcp_run(frame, 1, 0, Mod_id);
|
//pdcp_run(frame, 1, 0, Mod_id);
|
||||||
|
|
||||||
|
if (pthread_mutex_lock (&pdcp_mutex) != 0) {
|
||||||
|
LOG_E(PDCP,"Cannot lock mutex\n");
|
||||||
|
//return(-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pdcp_instance_cnt++;
|
||||||
|
pthread_mutex_unlock(&pdcp_mutex);
|
||||||
|
|
||||||
|
if (pdcp_instance_cnt == 0) {
|
||||||
|
if (pthread_cond_signal(&pdcp_cond) != 0) {
|
||||||
|
LOG_E(PDCP,"pthread_cond_signal unsuccessfull\n");
|
||||||
|
//return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef CELLULAR
|
#ifdef CELLULAR
|
||||||
rrc_rx_tx(Mod_id, frame, 0, 0);
|
rrc_rx_tx(Mod_id, frame, 0, 0);
|
||||||
|
|||||||
@@ -35,6 +35,10 @@
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef EXMIMO
|
||||||
|
#include <pthread.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "extern.h"
|
#include "extern.h"
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#ifdef PHY_EMUL
|
#ifdef PHY_EMUL
|
||||||
@@ -54,6 +58,7 @@
|
|||||||
#ifdef PHY_EMUL
|
#ifdef PHY_EMUL
|
||||||
#include "SIMULATION/simulation_defs.h"
|
#include "SIMULATION/simulation_defs.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "pdcp.h"
|
||||||
|
|
||||||
#define DEBUG_HEADER_PARSING 1
|
#define DEBUG_HEADER_PARSING 1
|
||||||
#define ENABLE_MAC_PAYLOAD_DEBUG
|
#define ENABLE_MAC_PAYLOAD_DEBUG
|
||||||
@@ -1211,7 +1216,27 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire
|
|||||||
//Rrc_xface->Frame_index=Mac_rlc_xface->frame;
|
//Rrc_xface->Frame_index=Mac_rlc_xface->frame;
|
||||||
//if (subframe%5 == 0)
|
//if (subframe%5 == 0)
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
pdcp_run(frame, 0, Mod_id, eNB_index);
|
//pdcp_run(frame, 0, Mod_id, eNB_index);
|
||||||
|
|
||||||
|
if (pthread_mutex_lock (&pdcp_mutex) != 0) {
|
||||||
|
LOG_E(PDCP,"Cannot lock mutex\n");
|
||||||
|
//return(-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pdcp_instance_cnt++;
|
||||||
|
pthread_mutex_unlock(&pdcp_mutex);
|
||||||
|
|
||||||
|
if (pdcp_instance_cnt == 0) {
|
||||||
|
if (pthread_cond_signal(&pdcp_cond) != 0) {
|
||||||
|
LOG_E(PDCP,"pthread_cond_signal unsuccessfull\n");
|
||||||
|
//return(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
UE_mac_inst[Mod_id].frame = frame;
|
UE_mac_inst[Mod_id].frame = frame;
|
||||||
UE_mac_inst[Mod_id].subframe = subframe;
|
UE_mac_inst[Mod_id].subframe = subframe;
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ SOURCES_L2 += $(PDCP_DIR)/pdcp_fifo.c
|
|||||||
SOURCES_L2 += $(PDCP_DIR)/pdcp_sequence_manager.c
|
SOURCES_L2 += $(PDCP_DIR)/pdcp_sequence_manager.c
|
||||||
SOURCES_L2 += $(PDCP_DIR)/pdcp_primitives.c
|
SOURCES_L2 += $(PDCP_DIR)/pdcp_primitives.c
|
||||||
SOURCES_L2 += $(PDCP_DIR)/pdcp_util.c
|
SOURCES_L2 += $(PDCP_DIR)/pdcp_util.c
|
||||||
|
SOURCES_L2 += $(PDCP_DIR)/pdcp_thread.c
|
||||||
|
|
||||||
SOURCES_L2 += $(RLC_AM_DIR)/rlc_am.c
|
SOURCES_L2 += $(RLC_AM_DIR)/rlc_am.c
|
||||||
SOURCES_L2 += $(RLC_AM_DIR)/rlc_am_init.c
|
SOURCES_L2 += $(RLC_AM_DIR)/rlc_am_init.c
|
||||||
|
|||||||
@@ -84,6 +84,17 @@
|
|||||||
|
|
||||||
#define FALSE (0x00)
|
#define FALSE (0x00)
|
||||||
#define TRUE !(FALSE)
|
#define TRUE !(FALSE)
|
||||||
|
|
||||||
|
extern pthread_t pdcp_thread;
|
||||||
|
extern pthread_attr_t pdcp_thread_attr;
|
||||||
|
extern pthread_mutex_t pdcp_mutex;
|
||||||
|
extern pthread_cond_t pdcp_cond;
|
||||||
|
extern int pdcp_instance_cnt;
|
||||||
|
|
||||||
|
static void *pdcp_thread_main(void* param);
|
||||||
|
int init_pdcp_thread(u8 eNB_flag);
|
||||||
|
void cleanup_pdcp_thread(void);
|
||||||
|
|
||||||
typedef unsigned char BOOL;
|
typedef unsigned char BOOL;
|
||||||
|
|
||||||
public_pdcp(unsigned int Pdcp_stats_tx[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
|
public_pdcp(unsigned int Pdcp_stats_tx[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
|
||||||
|
|||||||
@@ -0,0 +1,154 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
|
||||||
|
Eurecom OpenAirInterface
|
||||||
|
Copyright(c) 1999 - 2011 Eurecom
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms and conditions of the GNU General Public License,
|
||||||
|
version 2, as published by the Free Software Foundation.
|
||||||
|
|
||||||
|
This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along with
|
||||||
|
this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
The full GNU General Public License is included in this distribution in
|
||||||
|
the file called "COPYING".
|
||||||
|
|
||||||
|
Contact Information
|
||||||
|
Openair Admin: openair_admin@eurecom.fr
|
||||||
|
Openair Tech : openair_tech@eurecom.fr
|
||||||
|
Forums : http://forums.eurecom.fsr/openairinterface
|
||||||
|
Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France
|
||||||
|
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
/*! \file pdcp_thread.c
|
||||||
|
* \brief
|
||||||
|
* \author F. Kaltenberger
|
||||||
|
* \date 2013
|
||||||
|
* \version 0.1
|
||||||
|
* \company Eurecom
|
||||||
|
* \email: florian.kaltenberger@eurecom.fr
|
||||||
|
* \note
|
||||||
|
* \warning
|
||||||
|
*/
|
||||||
|
#include <pthread.h>
|
||||||
|
//#include <inttypes.h>
|
||||||
|
|
||||||
|
#include "pdcp.h"
|
||||||
|
#include "PHY/extern.h" //for PHY_vars
|
||||||
|
#include "UTIL/LOG/log.h"
|
||||||
|
#include "UTIL/LOG/vcd_signal_dumper.h"
|
||||||
|
|
||||||
|
#define OPENAIR_THREAD_STACK_SIZE 8192
|
||||||
|
#define OPENAIR_THREAD_PRIORITY 255
|
||||||
|
|
||||||
|
extern int oai_exit;
|
||||||
|
|
||||||
|
pthread_t pdcp_thread;
|
||||||
|
pthread_attr_t pdcp_thread_attr;
|
||||||
|
pthread_mutex_t pdcp_mutex;
|
||||||
|
pthread_cond_t pdcp_cond;
|
||||||
|
int pdcp_instance_cnt;
|
||||||
|
|
||||||
|
static void *pdcp_thread_main(void* param) {
|
||||||
|
|
||||||
|
u8 eNB_flag = *((u8*)param);
|
||||||
|
|
||||||
|
while (!oai_exit) {
|
||||||
|
|
||||||
|
if (pthread_mutex_lock(&pdcp_mutex) != 0) {
|
||||||
|
LOG_E(PDCP,"Error locking mutex.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (pdcp_instance_cnt < 0) {
|
||||||
|
pthread_cond_wait(&pdcp_cond,&pdcp_mutex);
|
||||||
|
}
|
||||||
|
if (pthread_mutex_unlock(&pdcp_mutex) != 0) {
|
||||||
|
LOG_E(PDCP,"Error unlocking mutex.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oai_exit) break;
|
||||||
|
|
||||||
|
if (eNB_flag) {
|
||||||
|
pdcp_run(PHY_vars_eNB_g[0]->frame, eNB_flag, PHY_vars_eNB_g[0]->Mod_id, 0);
|
||||||
|
//LOG_I(PDCP,"Calling pdcp_run (eNB) for frame %d\n",PHY_vars_eNB_g[0]->frame);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pdcp_run(PHY_vars_UE_g[0]->frame, eNB_flag, 0, PHY_vars_UE_g[0]->Mod_id);
|
||||||
|
//LOG_I(PDCP,"Calling pdcp_run (UE) for frame %d\n",PHY_vars_UE_g[0]->frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (pthread_mutex_lock(&pdcp_mutex) != 0) {
|
||||||
|
LOG_E(PDCP,"Error locking mutex.\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pdcp_instance_cnt--;
|
||||||
|
if (pthread_mutex_unlock(&pdcp_mutex) != 0) {
|
||||||
|
LOG_E(PDCP,"Error unlocking mutex.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int init_pdcp_thread(u8 eNB_flag) {
|
||||||
|
|
||||||
|
int error_code;
|
||||||
|
struct sched_param p;
|
||||||
|
|
||||||
|
pthread_attr_init (&pdcp_thread_attr);
|
||||||
|
pthread_attr_setstacksize(&pdcp_thread_attr,OPENAIR_THREAD_STACK_SIZE);
|
||||||
|
//attr_dlsch_threads.priority = 1;
|
||||||
|
|
||||||
|
p.sched_priority = OPENAIR_THREAD_PRIORITY;
|
||||||
|
pthread_attr_setschedparam (&pdcp_thread_attr, &p);
|
||||||
|
#ifndef RTAI_ISNT_POSIX
|
||||||
|
pthread_attr_setschedpolicy (&pdcp_thread_attr, SCHED_FIFO);
|
||||||
|
#endif
|
||||||
|
pthread_mutex_init(&pdcp_mutex,NULL);
|
||||||
|
pthread_cond_init(&pdcp_cond,NULL);
|
||||||
|
|
||||||
|
pdcp_instance_cnt = -1;
|
||||||
|
LOG_I(PDCP,"Allocating PDCP thread\n");
|
||||||
|
error_code = pthread_create(&pdcp_thread,
|
||||||
|
&pdcp_thread_attr,
|
||||||
|
pdcp_thread_main,
|
||||||
|
(void*)(&eNB_flag));
|
||||||
|
|
||||||
|
if (error_code!= 0) {
|
||||||
|
LOG_I(PDCP,"Could not allocate PDCP thread, error %d\n",error_code);
|
||||||
|
return(error_code);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LOG_I(PDCP,"Allocate PDCP thread successful\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cleanup_pdcp_thread(void) {
|
||||||
|
void *status;
|
||||||
|
|
||||||
|
LOG_I(PDCP,"Scheduling PDCP thread to exit\n");
|
||||||
|
|
||||||
|
pdcp_instance_cnt = 0;
|
||||||
|
if (pthread_cond_signal(&pdcp_cond) != 0)
|
||||||
|
LOG_I(PDCP,"ERROR pthread_cond_signal\n");
|
||||||
|
else
|
||||||
|
LOG_I(PDCP,"Signalled PDCP thread to exit\n");
|
||||||
|
|
||||||
|
pthread_join(pdcp_thread,&status);
|
||||||
|
LOG_I(PDCP,"PDCP thread exited\n");
|
||||||
|
pthread_cond_destroy(&pdcp_cond);
|
||||||
|
pthread_mutex_destroy(&pdcp_mutex);
|
||||||
|
}
|
||||||
@@ -364,14 +364,14 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si
|
|||||||
rlcP->reassembly_missing_sn_detected = 0;
|
rlcP->reassembly_missing_sn_detected = 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
LOG_W(RLC, "[MSC_NBOX][FRAME %05d][RLC_UM][MOD %02d][RB %02d][Missing SN detected][RLC_UM][MOD %02d][RB %02d]\n",
|
||||||
|
frame, rlcP->module_id,rlcP->rb_id, rlcP->module_id,rlcP->rb_id);
|
||||||
#ifdef USER_MODE
|
#ifdef USER_MODE
|
||||||
assert(1 != 1);
|
assert(1 != 1);
|
||||||
#endif
|
#endif
|
||||||
rlcP->stat_rx_data_pdu_dropped += 1;
|
rlcP->stat_rx_data_pdu_dropped += 1;
|
||||||
rlcP->stat_rx_data_bytes_dropped += tb_ind->size;
|
rlcP->stat_rx_data_bytes_dropped += tb_ind->size;
|
||||||
|
|
||||||
LOG_W(RLC, "[MSC_NBOX][FRAME %05d][RLC_UM][MOD %02d][RB %02d][Missing SN detected][RLC_UM][MOD %02d][RB %02d]\n",
|
|
||||||
frame, rlcP->module_id,rlcP->rb_id, rlcP->module_id,rlcP->rb_id);
|
|
||||||
rlcP->reassembly_missing_sn_detected = 1;
|
rlcP->reassembly_missing_sn_detected = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,8 +381,8 @@ void rlc_um_try_reassembly(rlc_um_entity_t *rlcP, u32_t frame, u8_t eNB_flag, si
|
|||||||
rlcP->dar_buffer[sn] = NULL;
|
rlcP->dar_buffer[sn] = NULL;
|
||||||
} else {
|
} else {
|
||||||
rlcP->last_reassemblied_missing_sn = sn;
|
rlcP->last_reassemblied_missing_sn = sn;
|
||||||
LOG_W(RLC, "[MSC_NBOX][FRAME %05d][RLC_UM][MOD %02d][RB %02d][Missing SN %04d detected, clearing RX SDU][RLC_UM][MOD %02d][RB %02d]\n",
|
LOG_D(RLC, "[MSC_NBOX][FRAME %05d][RLC_UM][MOD %02d][RB %02d][Missing SN %04d detected, clearing RX SDU][RLC_UM][MOD %02d][RB %02d]\n",
|
||||||
frame, rlcP->module_id,rlcP->rb_id, sn, rlcP->module_id,rlcP->rb_id);
|
frame, rlcP->module_id,rlcP->rb_id, sn, rlcP->module_id,rlcP->rb_id);
|
||||||
rlcP->reassembly_missing_sn_detected = 1;
|
rlcP->reassembly_missing_sn_detected = 1;
|
||||||
rlc_um_clear_rx_sdu(rlcP);
|
rlc_um_clear_rx_sdu(rlcP);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -461,6 +461,7 @@ void rrc_eNB_process_MeasurementReport(u8 Mod_id,u16 UE_index,MeasResults_t *me
|
|||||||
//void rrc_ue_process_ueCapabilityEnquiry(uint8_t Mod_id,uint32_t frame,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index);
|
//void rrc_ue_process_ueCapabilityEnquiry(uint8_t Mod_id,uint32_t frame,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index);
|
||||||
//void rrc_ue_process_securityModeCommand(uint8_t Mod_id,uint32_t frame,SecurityModeCommand_t *securityModeCommand,uint8_t eNB_index);
|
//void rrc_ue_process_securityModeCommand(uint8_t Mod_id,uint32_t frame,SecurityModeCommand_t *securityModeCommand,uint8_t eNB_index);
|
||||||
|
|
||||||
|
void rrc_remove_UE (u8 Mod_id, u8 UE_id);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1391,6 +1391,10 @@ int main(int argc, char **argv) {
|
|||||||
// }
|
// }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef OPENAIR2
|
||||||
|
init_pdcp_thread(!UE_flag);
|
||||||
|
#endif
|
||||||
|
|
||||||
number_of_cards = openair0_num_detected_cards;
|
number_of_cards = openair0_num_detected_cards;
|
||||||
if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
|
if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
|
||||||
openair_daq_vars.timing_advance = 138;
|
openair_daq_vars.timing_advance = 138;
|
||||||
@@ -1665,6 +1669,10 @@ int main(int argc, char **argv) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef OPENAIR2
|
||||||
|
cleanup_pdcp_thread();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef RTAI
|
#ifdef RTAI
|
||||||
stop_rt_timer();
|
stop_rt_timer();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user