Merge remote-tracking branch 'origin/develop' into NR_RRC_harq_hacks
This commit is contained in:
@@ -37,6 +37,7 @@ memleak:openair2/UTIL/OMG/omg_hashtable.c
|
||||
// _emm_as_encode function creates the encoded buffer
|
||||
//
|
||||
memleak:openair3/NAS/UE/EMM/SAP/emm_as.c
|
||||
memleak:openair1/PHY/INIT/nr_init_ue.c
|
||||
//-----------------------------------------------------------------------------
|
||||
//*****************************************************************************
|
||||
// section for files not used in oai exec's included in CI.
|
||||
|
||||
@@ -807,6 +807,8 @@ class RANManagement():
|
||||
uciStatMsgCount = 0
|
||||
pdcpFailure = 0
|
||||
ulschFailure = 0
|
||||
ulschAllocateCCEerror = 0
|
||||
uplinkSegmentsAborted = 0
|
||||
ulschReceiveOK = 0
|
||||
gnbRxTxWakeUpFailure = 0
|
||||
cdrxActivationMessageCount = 0
|
||||
@@ -925,6 +927,12 @@ class RANManagement():
|
||||
result = re.search('ULSCH in error in round|ULSCH 0 in error', str(line))
|
||||
if result is not None:
|
||||
ulschFailure += 1
|
||||
result = re.search('ERROR ALLOCATING CCEs', str(line))
|
||||
if result is not None:
|
||||
ulschAllocateCCEerror += 1
|
||||
result = re.search('uplink segment error.*aborted [1-9] segments', str(line))
|
||||
if result is not None:
|
||||
uplinkSegmentsAborted += 1
|
||||
result = re.search('ULSCH received ok', str(line))
|
||||
if result is not None:
|
||||
ulschReceiveOK += 1
|
||||
@@ -968,6 +976,14 @@ class RANManagement():
|
||||
statMsg = nodeB_prefix + 'NB showed ' + str(ulschFailure) + ' "ULSCH in error in round" message(s)'
|
||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||
htmleNBFailureMsg += statMsg + '\n'
|
||||
if ulschAllocateCCEerror > 0:
|
||||
statMsg = nodeB_prefix + 'NB showed ' + str(ulschAllocateCCEerror) + ' "eNB_dlsch_ulsch_scheduler(); ERROR ALLOCATING CCEs" message(s)'
|
||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||
htmleNBFailureMsg += statMsg + '\n'
|
||||
if uplinkSegmentsAborted > 0:
|
||||
statMsg = nodeB_prefix + 'NB showed ' + str(uplinkSegmentsAborted) + ' "uplink segment error 0/2, aborted * segments" message(s)'
|
||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||
htmleNBFailureMsg += statMsg + '\n'
|
||||
if dropNotEnoughRBs > 0:
|
||||
statMsg = 'eNB showed ' + str(dropNotEnoughRBs) + ' "dropping, not enough RBs" message(s)'
|
||||
logging.debug('\u001B[1;30;43m ' + statMsg + ' \u001B[0m')
|
||||
|
||||
@@ -1036,7 +1036,9 @@
|
||||
<testCase id="015103">
|
||||
<class>execution</class>
|
||||
<desc>polartest Test cases. (Test1: PBCH polar test),
|
||||
(Test2: DCI polar test)</desc>
|
||||
(Test2: DCI polar test),
|
||||
(Test3: UCI polar test,6-bit CRC),
|
||||
(Test4: UCI polar test,11-bit CRC)</desc>
|
||||
<pre_compile_prog></pre_compile_prog>
|
||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||
@@ -1044,8 +1046,10 @@
|
||||
<pre_exec_args></pre_exec_args>
|
||||
<main_exec> $OPENAIR_DIR/targets/bin/polartest.Rel15</main_exec>
|
||||
<main_exec_args>-q -s-10 -f0
|
||||
-q -s-10 -f0 -m1</main_exec_args>
|
||||
<tags>polartest.test1 polartest.test2</tags>
|
||||
-q -s-10 -f0 -m1
|
||||
-q -s-2 -f2 -m2 -k12
|
||||
-q -s-2 -f2 -m2 -k20</main_exec_args>
|
||||
<tags>polartest.test1 polartest.test2 polartest.test3 polartest.test4</tags>
|
||||
<search_expr_true>BLER= 0.000000</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
@@ -1186,15 +1190,20 @@
|
||||
<desc>nr_pucchsim Test cases. (Test1: Format 0 1-bit ACK miss 106 PRB),
|
||||
(Test2: Format 0 2-bit ACK miss 106 PRB),
|
||||
(Test3: Format 0 2-bit ACK miss, 1-bit SR 106 PRB),
|
||||
(Test4: Format 2 3-bit 106 PRB),
|
||||
(Test5: Format 2 4-bit 106 PRB),
|
||||
(Test6: Format 2 5-bit 106 PRB),
|
||||
(Test7: Format 2 6-bit 106 PRB),
|
||||
(Test8: Format 2 7-bit 106 PRB),
|
||||
(Test9: Format 2 8-bit 106 PRB),
|
||||
(Test10: Format 2 9-bit 106 PRB),
|
||||
(Test11: Format 2 10-bit 106 PRB),
|
||||
(Test12: Format 2 11-bit 106 PRB)</desc>
|
||||
(Test4: Format 2 3-bit 2/106 PRB),
|
||||
(Test5: Format 2 4-bit 2/106 PRB),
|
||||
(Test6: Format 2 5-bit 2/106 PRB),
|
||||
(Test7: Format 2 6-bit 2/106 PRB),
|
||||
(Test8: Format 2 7-bit 2/106 PRB),
|
||||
(Test9: Format 2 8-bit 2/106 PRB),
|
||||
(Test10: Format 2 9-bit 2/106 PRB),
|
||||
(Test11: Format 2 10-bit 2/106 PRB),
|
||||
(Test12: Format 2 11-bit 2/106 PRB),
|
||||
(Test13: Format 2 12-bit 8/106 PRB),
|
||||
(Test14: Format 2 19-bit 8/106 PRB),
|
||||
(Test15: Format 2 32-bit 8/106 PRB),
|
||||
(Test16: Format 2 32-bit 16/106 PRB),
|
||||
(Test17: Format 2 64-bit 16/106 PRB)</desc>
|
||||
<pre_compile_prog></pre_compile_prog>
|
||||
<compile_prog>$OPENAIR_DIR/cmake_targets/build_oai</compile_prog>
|
||||
<compile_prog_args> --phy_simulators -c </compile_prog_args>
|
||||
@@ -1212,8 +1221,15 @@
|
||||
-R 106 -i 1 -P 2 -b 8 -s4 -n1000
|
||||
-R 106 -i 1 -P 2 -b 9 -s5 -n1000
|
||||
-R 106 -i 1 -P 2 -b 10 -s6 -n1000
|
||||
-R 106 -i 1 -P 2 -b 11 -s6 -n1000</main_exec_args>
|
||||
<tags>nr_pucchsim.test1 nr_pucchsim.test2 nr_pucchsim.test3 nr_pucchsim.test4 nr_pucchsim.test5 nr_pucchsim.test6 nr_pucchsim.test7 nr_pucchsim.test8 nr_pucchsim.test9 nr_pucchsim.test10 nr_pucchsim.test11 nr_pucchsim.test12</tags>
|
||||
-R 106 -i 1 -P 2 -b 11 -s6 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 12 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 19 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 19 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q8 -b 32 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q16 -b 32 -s-3 -n1000
|
||||
-R 106 -i 1 -P 2 -q16 -b 64 -s-3 -n1000
|
||||
</main_exec_args>
|
||||
<tags>nr_pucchsim.test1 nr_pucchsim.test2 nr_pucchsim.test3 nr_pucchsim.test4 nr_pucchsim.test5 nr_pucchsim.test6 nr_pucchsim.test7 nr_pucchsim.test8 nr_pucchsim.test9 nr_pucchsim.test10 nr_pucchsim.test11 nr_pucchsim.test12 nr_pucchsim.test13 nr_pucchsim.test14 nr_pucchsim.test15 nr_pucchsim.test16 nr_pucchsim.test17</tags>
|
||||
<search_expr_true>PUCCH test OK</search_expr_true>
|
||||
<search_expr_false>segmentation fault|assertion|exiting|fatal</search_expr_false>
|
||||
<nruns>3</nruns>
|
||||
|
||||
@@ -180,7 +180,7 @@ int config_libconfig_get(paramdef_t *cfgoptions,int numoptions, char *prefix ) {
|
||||
printf_params("[LIBCONFIG] %s: %llu\n", cfgpath,(long long unsigned)(*(cfgoptions[i].u64ptr)) );
|
||||
} else {
|
||||
*(cfgoptions[i].i64ptr) = llu;
|
||||
printf_params("[LIBCONFIG] %s: %llu\n", cfgpath,(long long)(*(cfgoptions[i].i64ptr)) );
|
||||
printf_params("[LIBCONFIG] %s: %lld\n", cfgpath,(long long)(*(cfgoptions[i].i64ptr)) );
|
||||
}
|
||||
} else {
|
||||
defval=config_setdefault_int64(&(cfgoptions[i]),prefix);
|
||||
|
||||
+1
-5
@@ -309,7 +309,6 @@ The following features are valid for the gNB and the 5G-NR UE.
|
||||
- ACK / NACK handling and HARQ procedures for downlink
|
||||
- **As of May 2020** only DL was validated with COTS phone ; UL in progress, validated with OAI UE in noS1 mode
|
||||
|
||||
|
||||
# OpenAirInterface 5G-NR UE Feature Set #
|
||||
|
||||
**as of May 2020** only supporting "noS1" mode (DL):
|
||||
@@ -353,11 +352,8 @@ The following features are valid for the gNB and the 5G-NR UE.
|
||||
- Initial sync and MIB detection
|
||||
- MAC -> PHY configuration of PHY via UE FAPI P5 interface
|
||||
- Basic MAC to control PHY via UE FAPI P7 interface
|
||||
<<<<<<< HEAD
|
||||
- Random access procedure
|
||||
=======
|
||||
- Random ccess procedure
|
||||
>>>>>>> origin/develop
|
||||
|
||||
|
||||
**RLC**
|
||||
|
||||
|
||||
@@ -93,6 +93,14 @@ At the UE the --phy-test flag will
|
||||
|
||||
```bash sudo ./nr-uesoftmodem --phy-test [--rrc_config_path ../../../ci-scripts/rrc-files]```
|
||||
|
||||
Some other useful paramters of the UE are
|
||||
|
||||
- --ue-fo-compensation: enables the frequency offset compenstation at the UE. This is useful when running over the air and/or without an external clock/time source
|
||||
- --usrp-args: this is the equivalend paramter of sdr_addrs field in the gNB config file and can be used to identify the USRP and set some basic paramters (like the clock source)
|
||||
- --clock-source: sets the clock-source (internal or external).
|
||||
- --time-source: sets the time-source (internal or external).
|
||||
|
||||
|
||||
## noS1 setup with OAI UE
|
||||
|
||||
Instead of randomly generated payload, in the phy-test mode we can also inject/receive user-plane traffic over a TUN interface. This is the so-called noS1 mode.
|
||||
|
||||
@@ -963,7 +963,9 @@ if(!IS_SOFTMODEM_NOS1)
|
||||
scopeParms_t p;
|
||||
p.argc=&argc;
|
||||
p.argv=argv;
|
||||
startScope(&p);
|
||||
p.gNB=RC.gNB[0];
|
||||
p.ru=RC.ru[0];
|
||||
gNBinitScope(&p);
|
||||
}
|
||||
|
||||
if (nfapi_mode != 1 && nfapi_mode != 2) {
|
||||
|
||||
@@ -76,36 +76,11 @@ unsigned short config_frames[4] = {2,9,11,13};
|
||||
#include <openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.h>
|
||||
#include <openair1/SCHED_NR_UE/fapi_nr_ue_l1.h>
|
||||
|
||||
#include <forms.h>
|
||||
|
||||
|
||||
/* Callbacks, globals and object handlers */
|
||||
|
||||
extern void reset_stats( FL_OBJECT *, long );
|
||||
//extern void initTpool(char *params, tpool_t *pool, bool performanceMeas);
|
||||
|
||||
/* Forms and Objects */
|
||||
|
||||
typedef struct {
|
||||
FL_FORM *stats_form;
|
||||
void *vdata;
|
||||
char *cdata;
|
||||
long ldata;
|
||||
FL_OBJECT *stats_text;
|
||||
FL_OBJECT *stats_button;
|
||||
} FD_stats_form;
|
||||
|
||||
extern FD_stats_form *create_form_stats_form( void );
|
||||
|
||||
#include "PHY/TOOLS/nr_phy_scope.h"
|
||||
//#include "stats.h"
|
||||
// current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
|
||||
#include "PHY/TOOLS/nr_phy_scope.h"
|
||||
// at eNB 0, an UL scope for every UE
|
||||
FD_phy_scope_nrue *form_nrue[NUMBER_OF_UE_MAX];
|
||||
//FD_lte_phy_scope_enb *form_enb[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
|
||||
//FD_stats_form *form_stats=NULL,*form_stats_l2=NULL;
|
||||
char title[255];
|
||||
static pthread_t forms_thread; //xforms
|
||||
|
||||
#include <executables/nr-uesoftmodem.h>
|
||||
#include "executables/softmodem-common.h"
|
||||
@@ -304,35 +279,6 @@ void reset_stats(FL_OBJECT *button, long arg) {
|
||||
}*/
|
||||
}
|
||||
|
||||
static void *scope_thread(void *arg) {
|
||||
sleep(5);
|
||||
|
||||
while (!oai_exit) {
|
||||
phy_scope_nrUE(form_nrue[0],
|
||||
PHY_vars_UE_g[0][0],
|
||||
0,0,1);
|
||||
usleep(100*1000);
|
||||
}
|
||||
|
||||
pthread_exit((void *)arg);
|
||||
}
|
||||
|
||||
|
||||
void init_scope(void) {
|
||||
int fl_argc=1;
|
||||
|
||||
if (do_forms==1) {
|
||||
char *name="5G-UE-scope";
|
||||
fl_initialize (&fl_argc, &name, NULL, 0, 0);
|
||||
int UE_id = 0;
|
||||
form_nrue[UE_id] = create_phy_scope_nrue();
|
||||
sprintf (title, "NR DL SCOPE UE");
|
||||
fl_show_form (form_nrue[UE_id]->phy_scope_nrue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
|
||||
threadCreate(&forms_thread, scope_thread, NULL, "scope", -1, OAI_PRIORITY_RT_LOW);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void *l2l1_task(void *arg) {
|
||||
MessageDef *message_p = NULL;
|
||||
int result;
|
||||
@@ -814,7 +760,8 @@ int main( int argc, char **argv ) {
|
||||
memset (&UE_PF_PO[0][0], 0, sizeof(UE_PF_PO_t)*NUMBER_OF_UE_MAX*MAX_NUM_CCs);
|
||||
configure_linux();
|
||||
mlockall(MCL_CURRENT | MCL_FUTURE);
|
||||
init_scope();
|
||||
if (do_forms)
|
||||
nrUEinitScope(PHY_vars_UE_g[0][0]);
|
||||
number_of_cards = 1;
|
||||
|
||||
for(int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
|
||||
@@ -1492,7 +1492,7 @@ typedef struct
|
||||
//for dci_pusch_pdu
|
||||
typedef struct
|
||||
{
|
||||
uint8_t pdu_bit_map;
|
||||
uint8_t pduBitmap;
|
||||
uint32_t handle;
|
||||
uint16_t rnti;
|
||||
uint8_t ul_cqi;
|
||||
@@ -1507,7 +1507,7 @@ typedef struct
|
||||
//for PUCCH PDU Format 0/1
|
||||
typedef struct
|
||||
{
|
||||
uint8_t pdu_bit_map;
|
||||
uint8_t pduBitmap;
|
||||
uint32_t handle;
|
||||
uint16_t rnti;
|
||||
uint8_t pucch_format;//PUCCH format Value: 0 -> 1 0: PUCCH Format0 1: PUCCH Format1
|
||||
@@ -1523,7 +1523,7 @@ typedef struct
|
||||
//PUCCH PDU Format 2/3/4
|
||||
typedef struct
|
||||
{
|
||||
uint8_t pdu_bit_map;
|
||||
uint8_t pduBitmap;
|
||||
uint32_t handle;
|
||||
uint16_t rnti;
|
||||
uint8_t pucch_format;//PUCCH format Value: 0 -> 2 0: PUCCH Format2 1: PUCCH Format3 2: PUCCH Format4
|
||||
|
||||
@@ -26,7 +26,7 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
//Default simulation values (Aim for iterations = 1000000.)
|
||||
int decoder_int16=0;
|
||||
int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, -1=UCI
|
||||
int itr, iterations = 1000, arguments, polarMessageType = 0; //0=PBCH, 1=DCI, 2=UCI
|
||||
double SNRstart = -20.0, SNRstop = 0.0, SNRinc= 0.5; //dB
|
||||
double SNR, SNR_lin;
|
||||
int16_t nBitError = 0; // -1 = Decoding failed (All list entries have failed the CRC checks).
|
||||
@@ -41,6 +41,7 @@ int main(int argc, char *argv[])
|
||||
switch (arguments) {
|
||||
case 's':
|
||||
SNRstart = atof(optarg);
|
||||
SNRstop = SNRstart + 2;
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
@@ -90,7 +91,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
case 'k':
|
||||
testLength=atoi(optarg);
|
||||
if (testLength < 12 || testLength > 60) {
|
||||
if (testLength < 12 || testLength > 127) {
|
||||
printf("Illegal packet bitlength %d \n",testLength);
|
||||
exit(-1);
|
||||
}
|
||||
@@ -119,12 +120,13 @@ int main(int argc, char *argv[])
|
||||
crcTableInit();
|
||||
|
||||
if (polarMessageType == 0) { //PBCH
|
||||
aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
|
||||
aggregation_level = NR_POLAR_PBCH_AGGREGATION_LEVEL;
|
||||
} else if (polarMessageType == 1) { //DCI
|
||||
coderLength = 108*aggregation_level;
|
||||
} else if (polarMessageType == -1) { //UCI
|
||||
printf("UCI testing not supported yet\n");
|
||||
exit(-1);
|
||||
coderLength = 108*aggregation_level;
|
||||
} else if (polarMessageType == 2) { //UCI
|
||||
//pucch2 parameters, 1 symbol, aggregation_level = NPRB
|
||||
AssertFatal(aggregation_level>2,"For UCI formats, aggregation (N_RB) should be > 2\n");
|
||||
coderLength = 16*aggregation_level;
|
||||
}
|
||||
|
||||
//Logging
|
||||
|
||||
@@ -382,12 +382,24 @@ unsigned int crc16 (unsigned char * inptr, int bitlen);
|
||||
@param bitlen length of inputs in bits*/
|
||||
unsigned int crc12 (unsigned char * inptr, int bitlen);
|
||||
|
||||
/*!\fn uint32_t crc12(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes an 11-bit crc based on 3GPP NR specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits*/
|
||||
unsigned int crc11 (unsigned char * inptr, int bitlen);
|
||||
|
||||
/*!\fn uint32_t crc8(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 8-bit crc based on 3GPP UMTS specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits*/
|
||||
unsigned int crc8 (unsigned char * inptr, int bitlen);
|
||||
|
||||
/*!\fn uint32_t crc8(uint8_t *inPtr, int32_t bitlen)
|
||||
\brief This computes a 6-bit crc based on 3GPP NR specifications.
|
||||
@param inPtr Pointer to input byte stream
|
||||
@param bitlen length of inputs in bits*/
|
||||
unsigned int crc6 (unsigned char * inptr, int bitlen);
|
||||
|
||||
int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type);
|
||||
|
||||
/*!\fn void phy_viterbi_dot11_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n,int offset,int traceback)
|
||||
|
||||
@@ -90,7 +90,9 @@ static unsigned int crc24bTable[256];
|
||||
static unsigned int crc24cTable[256];
|
||||
static unsigned short crc16Table[256];
|
||||
static unsigned short crc12Table[256];
|
||||
static unsigned short crc11Table[256];
|
||||
static unsigned char crc8Table[256];
|
||||
static unsigned char crc6Table[256];
|
||||
|
||||
void crcTableInit (void)
|
||||
{
|
||||
@@ -102,7 +104,9 @@ void crcTableInit (void)
|
||||
crc24cTable[c] = crcbit (&c, 1, poly24c);
|
||||
crc16Table[c] = (unsigned short) (crcbit (&c, 1, poly16) >> 16);
|
||||
crc12Table[c] = (unsigned short) (crcbit (&c, 1, poly12) >> 16);
|
||||
crc11Table[c] = (unsigned short) (crcbit (&c, 1, poly11) >> 16);
|
||||
crc8Table[c] = (unsigned char) (crcbit (&c, 1, poly8) >> 24);
|
||||
crc6Table[c] = (unsigned char) (crcbit (&c, 1, poly6) >> 24);
|
||||
} while (++c);
|
||||
}
|
||||
|
||||
@@ -207,6 +211,24 @@ crc12 (unsigned char * inptr, int bitlen)
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc11 (unsigned char * inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
while (octetlen-- > 0) {
|
||||
crc = (crc << 8) ^ (crc11Table[(*inptr++) ^ (crc >> 24)] << 16);
|
||||
}
|
||||
|
||||
if (resbit > 0)
|
||||
crc = (crc << resbit) ^ (crc11Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 16);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc8 (unsigned char * inptr, int bitlen)
|
||||
{
|
||||
@@ -225,6 +247,24 @@ crc8 (unsigned char * inptr, int bitlen)
|
||||
return crc;
|
||||
}
|
||||
|
||||
unsigned int
|
||||
crc6 (unsigned char * inptr, int bitlen)
|
||||
{
|
||||
int octetlen, resbit;
|
||||
unsigned int crc = 0;
|
||||
octetlen = bitlen / 8; /* Change in octets */
|
||||
resbit = (bitlen % 8);
|
||||
|
||||
while (octetlen-- > 0) {
|
||||
crc = crc6Table[(*inptr++) ^ (crc >> 24)] << 24;
|
||||
}
|
||||
|
||||
if (resbit > 0)
|
||||
crc = (crc << resbit) ^ (crc8Table[((*inptr) >> (8 - resbit)) ^ (crc >> (32 - resbit))] << 24);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
int check_crc(uint8_t* decoded_bytes, uint32_t n, uint32_t F, uint8_t crc_type)
|
||||
{
|
||||
uint32_t crc=0,oldcrc=0;
|
||||
|
||||
@@ -569,7 +569,7 @@ int8_t polar_decoder_dci(double *input,
|
||||
}
|
||||
|
||||
void init_polar_deinterleaver_table(t_nrPolar_params *polarParams) {
|
||||
AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K);
|
||||
AssertFatal(polarParams->K > 17, "K = %d < 18, is not allowed\n",polarParams->K);
|
||||
AssertFatal(polarParams->K < 129, "K = %d > 128, is not supported yet\n",polarParams->K);
|
||||
int bit_i,ip,ipmod64;
|
||||
int numbytes = polarParams->K>>3;
|
||||
@@ -670,7 +670,9 @@ uint32_t polar_decoder_int16(int16_t *input,
|
||||
A32_flip[1+offset]=((uint8_t *)&Aprime)[2];
|
||||
A32_flip[2+offset]=((uint8_t *)&Aprime)[1];
|
||||
A32_flip[3+offset]=((uint8_t *)&Aprime)[0];
|
||||
crc = (uint64_t)(crc24c(A32_flip,8*offset+len)>>8);
|
||||
if (crclen == 24) crc = (uint64_t)((crc24c(A32_flip,8*offset+len)>>8)&0xffffff);
|
||||
else if (crclen == 11) crc = (uint64_t)((crc11(A32_flip,8*offset+len)>>21)&0x7ff);
|
||||
else if (crclen == 6) crc = (uint64_t)((crc6(A32_flip,8*offset+len)>>26)&0x3f);
|
||||
} else if (len<=64) {
|
||||
Ar = (B[0]>>crclen) | (B[1]<<(64-crclen));;
|
||||
uint8_t A64_flip[8+offset];
|
||||
@@ -688,7 +690,9 @@ uint32_t polar_decoder_int16(int16_t *input,
|
||||
A64_flip[5+offset]=((uint8_t *)&Aprime)[2];
|
||||
A64_flip[6+offset]=((uint8_t *)&Aprime)[1];
|
||||
A64_flip[7+offset]=((uint8_t *)&Aprime)[0];
|
||||
crc = (uint64_t)(crc24c(A64_flip,8*offset+len)>>8);
|
||||
if (crclen==24) crc = (uint64_t)(crc24c(A64_flip,8*offset+len)>>8)&0xffffff;
|
||||
else if (crclen==11) crc = (uint64_t)(crc11(A64_flip,8*offset+len)>>21)&0x7ff;
|
||||
else if (crclen==6) crc = (uint64_t)(crc6(A64_flip,8*offset+len)>>26)&0x3f;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
@@ -295,8 +295,8 @@ static inline void polar_rate_matching(t_nrPolar_params *polarParams,void *in,vo
|
||||
|
||||
void build_polar_tables(t_nrPolar_params *polarParams) {
|
||||
// build table b -> c'
|
||||
AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K);
|
||||
AssertFatal(polarParams->K < 129, "K = %d > 128, is not supported yet\n", polarParams->K);
|
||||
AssertFatal(polarParams->K > 17, "K = %d < 18, is not possible\n",polarParams->K);
|
||||
AssertFatal(polarParams->K < 129, "K = %d > 128, is not supported yet\n",polarParams->K);
|
||||
int bit_i,ip;
|
||||
int numbytes = polarParams->K>>3;
|
||||
int residue = polarParams->K&7;
|
||||
@@ -327,7 +327,7 @@ void build_polar_tables(t_nrPolar_params *polarParams) {
|
||||
AssertFatal(polarParams->N==512 || polarParams->N==256 || polarParams->N==128,"N = %d, not done yet\n",polarParams->N);
|
||||
// build G bit vectors for information bit positions and convert the bit as bytes tables in nr_polar_kronecker_power_matrices.c to 64 bit packed vectors.
|
||||
// keep only rows of G which correspond to information/crc bits
|
||||
polarParams->G_N_tab = (uint64_t **)malloc(polarParams->K * sizeof(int64_t *));
|
||||
polarParams->G_N_tab = (uint64_t **)malloc((polarParams->K + polarParams->n_pc) * sizeof(int64_t *));
|
||||
int k=0;
|
||||
|
||||
for (int i=0; i<polarParams->N; i++) {
|
||||
@@ -412,14 +412,14 @@ void polar_encoder_fast(uint64_t *A,
|
||||
int32_t crcmask,
|
||||
uint8_t ones_flag,
|
||||
t_nrPolar_params *polarParams) {
|
||||
AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K);
|
||||
// AssertFatal(polarParams->K > 32, "K = %d < 33, is not supported yet\n",polarParams->K);
|
||||
AssertFatal(polarParams->K < 129, "K = %d > 128, is not supported yet\n",polarParams->K);
|
||||
AssertFatal(polarParams->payloadBits < 65, "payload bits = %d > 64, is not supported yet\n",polarParams->payloadBits);
|
||||
uint64_t B[4]= {0,0,0,0},Cprime[4]= {0,0,0,0};
|
||||
int bitlen = polarParams->payloadBits;
|
||||
// append crc
|
||||
AssertFatal(bitlen<129,"support for payloads <= 128 bits\n");
|
||||
AssertFatal(polarParams->crcParityBits == 24,"support for 24-bit crc only for now\n");
|
||||
// AssertFatal(polarParams->crcParityBits == 24,"support for 24-bit crc only for now\n");
|
||||
//int bitlen0=bitlen;
|
||||
uint64_t tcrc=0;
|
||||
uint8_t offset = 0;
|
||||
@@ -444,7 +444,9 @@ void polar_encoder_fast(uint64_t *A,
|
||||
A32_flip[1+offset]=((uint8_t *)&Aprime)[2];
|
||||
A32_flip[2+offset]=((uint8_t *)&Aprime)[1];
|
||||
A32_flip[3+offset]=((uint8_t *)&Aprime)[0];
|
||||
tcrc = (uint64_t)((crcmask^(crc24c(A32_flip,8*offset+bitlen)>>8)));
|
||||
if (polarParams->crcParityBits == 24) tcrc = (uint64_t)(((crcmask^(crc24c(A32_flip,8*offset+bitlen)>>8)))&0xffffff);
|
||||
else if (polarParams->crcParityBits == 11) tcrc = (uint64_t)(((crcmask^(crc11(A32_flip,bitlen)>>21)))&0x7ff);
|
||||
else if (polarParams->crcParityBits == 6) tcrc = (uint64_t)(((crcmask^(crc6(A32_flip,bitlen)>>26)))&0x3f);
|
||||
} else if (bitlen<=64) {
|
||||
uint8_t A64_flip[8+offset];
|
||||
if (ones_flag) {
|
||||
@@ -461,7 +463,8 @@ void polar_encoder_fast(uint64_t *A,
|
||||
A64_flip[5+offset]=((uint8_t *)&Aprime)[2];
|
||||
A64_flip[6+offset]=((uint8_t *)&Aprime)[1];
|
||||
A64_flip[7+offset]=((uint8_t *)&Aprime)[0];
|
||||
tcrc = (uint64_t)((crcmask^(crc24c(A64_flip,8*offset+bitlen)>>8)));
|
||||
if (polarParams->crcParityBits == 24) tcrc = (uint64_t)((crcmask^(crc24c(A64_flip,8*offset+bitlen)>>8)))&0xffffff;
|
||||
else if (polarParams->crcParityBits == 11) tcrc = (uint64_t)((crcmask^(crc11(A64_flip,bitlen)>>21)))&0x7ff;
|
||||
}
|
||||
else if (bitlen<=128) {
|
||||
uint8_t A128_flip[16+offset];
|
||||
@@ -479,7 +482,8 @@ void polar_encoder_fast(uint64_t *A,
|
||||
A128_flip[10+offset]=((uint8_t*)&Aprime)[5]; A128_flip[11+offset]=((uint8_t*)&Aprime)[4];
|
||||
A128_flip[12+offset]=((uint8_t*)&Aprime)[3]; A128_flip[13+offset]=((uint8_t*)&Aprime)[2];
|
||||
A128_flip[14+offset]=((uint8_t*)&Aprime)[1]; A128_flip[15+offset]=((uint8_t*)&Aprime)[0];
|
||||
tcrc = (uint64_t)((crcmask^(crc24c(A128_flip,8*offset+bitlen)>>8)));
|
||||
if (polarParams->crcParityBits == 24) tcrc = (uint64_t)((crcmask^(crc24c(A128_flip,8*offset+bitlen)>>8)))&0xffffff;
|
||||
else if (polarParams->crcParityBits == 11) tcrc = (uint64_t)((crcmask^(crc11(A128_flip,bitlen)>>21)))&0x7ff;
|
||||
}
|
||||
|
||||
int n;
|
||||
@@ -522,6 +526,7 @@ void polar_encoder_fast(uint64_t *A,
|
||||
|
||||
#ifdef DEBUG_POLAR_ENCODER
|
||||
|
||||
printf("Polar encoder: (N,K) : (%d,%d)\n",polarParams->N,polarParams->K);
|
||||
if (polarParams->K<65)
|
||||
printf("A %llx B %llx Cprime %llx (payload bits %d,crc %x)\n",
|
||||
(unsigned long long)(A[0]&(((uint64_t)1<<bitlen)-1)),
|
||||
@@ -546,7 +551,7 @@ void polar_encoder_fast(uint64_t *A,
|
||||
crc24c((uint8_t *)A,bitlen)>>8);
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
/* printf("Bbytes : %x.%x.%x.%x.%x.%x.%x.%x\n",Bbyte[0],Bbyte[1],Bbyte[2],Bbyte[3],Bbyte[4],Bbyte[5],Bbyte[6],Bbyte[7]);
|
||||
printf("%llx,%llx,%llx,%llx,%llx,%llx,%llx,%llx\n",polarParams->cprime_tab[0][Bbyte[0]] ,
|
||||
polarParams->cprime_tab[1][Bbyte[1]] ,
|
||||
|
||||
@@ -33,8 +33,8 @@
|
||||
#ifndef __NR_POLAR_UCI_DEFS__H__
|
||||
#define __NR_POLAR_UCI_DEFS__H__
|
||||
|
||||
#define NR_POLAR_UCI_MESSAGE_TYPE -1 //int8_t
|
||||
#define NR_POLAR_UCI_CRC_ERROR_CORRECTION_BITS 3
|
||||
#define NR_POLAR_UCI_PUCCH_MESSAGE_TYPE 2 //int8_t
|
||||
#define NR_POLAR_PUCCH_CRC_ERROR_CORRECTION_BITS 3
|
||||
#define NR_POLAR_PUCCH_PAYLOAD_BITS 32
|
||||
#define NR_POLAR_PUCCH_E 32
|
||||
|
||||
|
||||
@@ -43,11 +43,12 @@ static void nr_polar_init(t_nrPolar_params * *polarParams,
|
||||
uint8_t aggregation_level,
|
||||
int decoder_flag) {
|
||||
t_nrPolar_params *currentPtr = *polarParams;
|
||||
uint16_t aggregation_prime = nr_polar_aggregation_prime(aggregation_level);
|
||||
uint16_t aggregation_prime = (messageType >= 2) ? aggregation_level : nr_polar_aggregation_prime(aggregation_level);
|
||||
|
||||
//Parse the list. If the node is already created, return without initialization.
|
||||
while (currentPtr != NULL) {
|
||||
//printf("currentPtr->idx %d, (%d,%d)\n",currentPtr->idx,currentPtr->payloadBits,currentPtr->encoderLength);
|
||||
//LOG_D(PHY,"Looking for index %d\n",(messageType * messageLength * aggregation_prime));
|
||||
if (currentPtr->idx == (messageType * messageLength * aggregation_prime)) return;
|
||||
else currentPtr = currentPtr->nextPtr;
|
||||
}
|
||||
@@ -55,8 +56,9 @@ static void nr_polar_init(t_nrPolar_params * *polarParams,
|
||||
// printf("currentPtr %p (polarParams %p)\n",currentPtr,polarParams);
|
||||
//Else, initialize and add node to the end of the linked list.
|
||||
t_nrPolar_params *newPolarInitNode = calloc(sizeof(t_nrPolar_params),1);
|
||||
|
||||
|
||||
if (newPolarInitNode != NULL) {
|
||||
// LOG_D(PHY,"Setting new polarParams index %d, messageType %d, messageLength %d, aggregation_prime %d\n",(messageType * messageLength * aggregation_prime),messageType,messageLength,aggregation_prime);
|
||||
newPolarInitNode->idx = (messageType * messageLength * aggregation_prime);
|
||||
newPolarInitNode->nextPtr = NULL;
|
||||
//printf("newPolarInitNode->idx %d, (%d,%d,%d:%d)\n",newPolarInitNode->idx,messageType,messageLength,aggregation_prime,aggregation_level);
|
||||
@@ -87,15 +89,44 @@ static void nr_polar_init(t_nrPolar_params * *polarParams,
|
||||
newPolarInitNode->crcCorrectionBits = NR_POLAR_DCI_CRC_ERROR_CORRECTION_BITS;
|
||||
newPolarInitNode->crc_generator_matrix=crc24c_generator_matrix(newPolarInitNode->payloadBits+newPolarInitNode->crcParityBits);//G_P
|
||||
//printf("Initializing polar parameters for DCI (K %d, E %d, L %d)\n",newPolarInitNode->payloadBits,newPolarInitNode->encoderLength,aggregation_level);
|
||||
} else if (messageType == -1) { //UCI
|
||||
} else if (messageType == 2) { //UCI PUCCH2
|
||||
AssertFatal(aggregation_level>2,"Aggregation level (%d) for PUCCH 2 encoding is NPRB and should be > 2\n",aggregation_level);
|
||||
AssertFatal(messageLength>11,"Message length %d is too short for polar encoding of UCI\n",messageLength);
|
||||
newPolarInitNode->n_max = NR_POLAR_PUCCH_N_MAX;
|
||||
newPolarInitNode->i_il = NR_POLAR_PUCCH_I_IL;
|
||||
newPolarInitNode->encoderLength = aggregation_level * 16;
|
||||
|
||||
newPolarInitNode->i_seg = 0;
|
||||
|
||||
if ((messageLength >= 360 && newPolarInitNode->encoderLength >= 1088)||
|
||||
(messageLength >= 1013)) newPolarInitNode->i_seg = 1;
|
||||
|
||||
newPolarInitNode->crcParityBits = 11;
|
||||
newPolarInitNode->n_pc = 0;
|
||||
newPolarInitNode->n_pc_wm = 0;
|
||||
|
||||
if (messageLength < 20) {
|
||||
newPolarInitNode->crcParityBits = 6;
|
||||
newPolarInitNode->n_pc = 3;
|
||||
if ((newPolarInitNode->encoderLength - messageLength - 6 + 3) < 193) newPolarInitNode->n_pc_wm = 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
newPolarInitNode->i_bil = NR_POLAR_PUCCH_I_BIL;
|
||||
|
||||
newPolarInitNode->payloadBits = messageLength;
|
||||
newPolarInitNode->crcCorrectionBits = NR_POLAR_PUCCH_CRC_ERROR_CORRECTION_BITS;
|
||||
//newPolarInitNode->crc_generator_matrix=crc24c_generator_matrix(newPolarInitNode->payloadBits+newPolarInitNode->crcParityBits);//G_P
|
||||
//LOG_D(PHY,"New polar node, encoderLength %d, aggregation_level %d\n",newPolarInitNode->encoderLength,aggregation_level);
|
||||
} else {
|
||||
AssertFatal(1 == 0, "[nr_polar_init] Incorrect Message Type(%d)", messageType);
|
||||
}
|
||||
|
||||
newPolarInitNode->K = newPolarInitNode->payloadBits + newPolarInitNode->crcParityBits; // Number of bits to encode.
|
||||
newPolarInitNode->N = nr_polar_output_length(newPolarInitNode->K,
|
||||
newPolarInitNode->encoderLength,
|
||||
newPolarInitNode->n_max);
|
||||
newPolarInitNode->encoderLength,
|
||||
newPolarInitNode->n_max);
|
||||
newPolarInitNode->n = log2(newPolarInitNode->N);
|
||||
newPolarInitNode->G_N = nr_polar_kronecker_power_matrices(newPolarInitNode->n);
|
||||
//polar_encoder vectors:
|
||||
@@ -191,16 +222,19 @@ t_nrPolar_params *nr_polar_params (int8_t messageType,
|
||||
nr_polar_init(polarList_ext != NULL ? polarList_ext : &polarList,
|
||||
messageType,messageLength,aggregation_level,decoding_flag);
|
||||
t_nrPolar_params *polarParams=polarList_ext != NULL ? *polarList_ext : polarList;
|
||||
const int tag=messageType * messageLength * nr_polar_aggregation_prime(aggregation_level);
|
||||
const int tag=messageType * messageLength * (messageType>=2 ? aggregation_level : nr_polar_aggregation_prime(aggregation_level));
|
||||
|
||||
|
||||
|
||||
while (polarParams != NULL) {
|
||||
// LOG_D(PHY,"nr_polar_params : tag %d (from nr_polar_init %d)\n",tag,polarParams->idx);
|
||||
if (polarParams->idx == tag)
|
||||
return polarParams;
|
||||
|
||||
polarParams = polarParams->nextPtr;
|
||||
}
|
||||
|
||||
AssertFatal(false,"Polar Init tables internal failure\n");
|
||||
AssertFatal(false,"Polar Init tables internal failure, no polarParams found\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -821,15 +821,14 @@ int rx_pdsch(PHY_VARS_UE *ue,
|
||||
pllr_symbol_cw0 += llr_offset_symbol;
|
||||
pllr_symbol_cw1 += llr_offset_symbol;
|
||||
|
||||
/*
|
||||
LOG_I(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p\n",
|
||||
LOG_D(PHY,"compute LLRs [AbsSubframe %d.%d-%d] NbRB %d Qm %d LLRs-Length %d LLR-Offset %d @LLR Buff %p @LLR Buff(symb) %p energy: %d\n",
|
||||
frame, subframe,symbol,
|
||||
nb_rb,dlsch0_harq->Qm,
|
||||
pdsch_vars[eNB_id]->llr_length[symbol],
|
||||
pdsch_vars[eNB_id]->llr_offset[symbol],
|
||||
(int16_t*)pdsch_vars[eNB_id]->llr[0],
|
||||
pllr_symbol_cw0);
|
||||
*/
|
||||
pllr_symbol_cw0,
|
||||
signal_energy(pdsch_vars[eNB_id]->rxdataF_comp0[0], 7*2*frame_parms->N_RB_DL*12));
|
||||
switch (dlsch0_harq->Qm) {
|
||||
case 2 :
|
||||
if ((rx_type==rx_standard) || (codeword_TB1 == -1)) {
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "PHY/impl_defs_nr.h"
|
||||
#include "PHY/sse_intrin.h"
|
||||
#include <common/utils/LOG/log.h>
|
||||
|
||||
__m64 byte2m64_re[256];
|
||||
__m64 byte2m64_im[256];
|
||||
@@ -42,7 +43,7 @@ void init_byte2m64(void) {
|
||||
byte2m64_im[s] = _mm_insert_pi16(byte2m64_im[s],(1-2*((s>>5)&1)),2);
|
||||
byte2m64_re[s] = _mm_insert_pi16(byte2m64_re[s],(1-2*((s>>6)&1)),3);
|
||||
byte2m64_im[s] = _mm_insert_pi16(byte2m64_im[s],(1-2*((s>>7)&1)),3);
|
||||
printf("init_scrambling_luts: s %x (%d) ((%d,%d),(%d,%d),(%d,%d),(%d,%d))\n",
|
||||
LOG_T(PHY,"init_scrambling_luts: s %x (%d) ((%d,%d),(%d,%d),(%d,%d),(%d,%d))\n",
|
||||
((uint16_t*)&s)[0],
|
||||
(1-2*(s&1)),
|
||||
((int16_t*)&byte2m64_re[s])[0],((int16_t*)&byte2m64_im[s])[0],
|
||||
|
||||
@@ -168,7 +168,7 @@ void rx_nr_prach_ru(RU_t *ru,
|
||||
|
||||
int dftlen=0;
|
||||
int mu = fp->numerology_index;
|
||||
int Ncp;
|
||||
int Ncp = 0;
|
||||
int16_t *prach2;
|
||||
|
||||
if (prach_sequence_length == 0) {
|
||||
@@ -568,9 +568,6 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
|
||||
int16_t prach_ifft_tmp[2048*2] __attribute__((aligned(32)));
|
||||
int32_t *prach_ifft=(int32_t*)NULL;
|
||||
|
||||
|
||||
AssertFatal(gNB!=NULL,"gNB is null\n");
|
||||
|
||||
fp = &gNB->frame_parms;
|
||||
|
||||
nb_rx = gNB->gNB_config.carrier_config.num_rx_ant.value;
|
||||
|
||||
@@ -232,7 +232,7 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
|
||||
|
||||
unsigned short start_re, re, nb_re_pusch;
|
||||
unsigned char aarx;
|
||||
uint8_t K_ptrs;
|
||||
uint8_t K_ptrs = 0;
|
||||
uint32_t rxF_ext_index = 0;
|
||||
uint32_t ul_ch0_ext_index = 0;
|
||||
uint32_t ul_ch0_index = 0;
|
||||
@@ -1156,8 +1156,8 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
|
||||
//----------------------------------------------------------
|
||||
//-------------------- LLRs computation --------------------
|
||||
//----------------------------------------------------------
|
||||
|
||||
start_meas(&gNB->ulsch_llr_stats);
|
||||
AssertFatal(gNB->pusch_vars[ulsch_id]->rxdataF_ext_offset * rel15_ul->qam_mod_order+nb_re_pusch*rel15_ul->qam_mod_order < (8*((3*8*6144)+12)) , "Mysterious llr buffer size check");
|
||||
nr_ulsch_compute_llr(&gNB->pusch_vars[ulsch_id]->rxdataF_comp[0][symbol * rel15_ul->rb_size * NR_NB_SC_PER_RB],
|
||||
gNB->pusch_vars[ulsch_id]->ul_ch_mag0,
|
||||
gNB->pusch_vars[ulsch_id]->ul_ch_magb0,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -846,7 +846,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
|
||||
|
||||
rel15 = &pdcch_vars->pdcch_config[i];
|
||||
int dci_length = rel15->dci_length;
|
||||
int gNB_id = 0;
|
||||
//int gNB_id = 0;
|
||||
int16_t tmp_e[16*108];
|
||||
rnti_t n_rnti;
|
||||
|
||||
|
||||
@@ -211,7 +211,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
dlsch1_harq = dlsch[1]->harq_processes[codeword_TB1];
|
||||
|
||||
#ifdef DEBUG_HARQ
|
||||
printf("[DEMOD] I am assuming only TB1 is active, it is in cw %d\n", dlsch0_harq->codeword);
|
||||
printf("[DEMOD] I am assuming only TB1 is active, it is in cw %d\n", dlsch1_harq->codeword);
|
||||
#endif
|
||||
|
||||
AssertFatal(1 == 0, "[UE][FATAL] DLSCH: TB0 not active and TB1 active case is not supported\n");
|
||||
@@ -230,6 +230,9 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
|
||||
|
||||
}
|
||||
|
||||
if (dlsch0_harq == NULL)
|
||||
AssertFatal(1 == 0, "Done\n");
|
||||
|
||||
dlsch0_harq->Qm = nr_get_Qm_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table);
|
||||
dlsch0_harq->R = nr_get_code_rate_dl(dlsch[0]->harq_processes[harq_pid]->mcs, dlsch[0]->harq_processes[harq_pid]->mcs_table);
|
||||
|
||||
|
||||
@@ -505,7 +505,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
|
||||
return(-1);
|
||||
}
|
||||
*/
|
||||
if (symbol==1) {
|
||||
if (symbol==2) {
|
||||
nr_pbch_quantize(pbch_e_rx,
|
||||
(short *)&(nr_ue_pbch_vars->rxdataF_comp[0][symbol*240]),
|
||||
144);
|
||||
|
||||
@@ -80,7 +80,7 @@ int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, uint8_t slot){
|
||||
uint16_t preamble_shift = 0, preamble_index0, n_shift_ra, n_shift_ra_bar, d_start, numshift, N_ZC, u, offset, offset2, first_nonzero_root_idx;
|
||||
int16_t prach_tmp[98304*2*4] __attribute__((aligned(32)));
|
||||
|
||||
int16_t Ncp, amp, *prach, *prach2, *prachF, *Xu;
|
||||
int16_t Ncp = 0, amp, *prach, *prach2, *prachF, *Xu;
|
||||
int32_t Xu_re, Xu_im, samp_count;
|
||||
int prach_start, prach_sequence_length, i, prach_len, dftlen, mu, kbar, K, n_ra_prb, k;
|
||||
//int restricted_Type;
|
||||
|
||||
@@ -799,27 +799,47 @@ void nr_generate_pucch1_old(PHY_VARS_NR_UE *ue,
|
||||
}
|
||||
#endif //0
|
||||
|
||||
inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,uint32_t B,uint8_t *btilde) __attribute__((always_inline));
|
||||
inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,uint32_t B,uint8_t *btilde) {
|
||||
inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,uint64_t *B64,uint8_t *btilde) __attribute__((always_inline));
|
||||
inline void nr_pucch2_3_4_scrambling(uint16_t M_bit,uint16_t rnti,uint16_t n_id,uint64_t *B64,uint8_t *btilde) {
|
||||
uint32_t x1, x2, s=0;
|
||||
int i;
|
||||
uint8_t c;
|
||||
// c_init=nRNTI*2^15+n_id according to TS 38.211 Subclause 6.3.2.6.1
|
||||
//x2 = (rnti) + ((uint32_t)(1+nr_tti_tx)<<16)*(1+(fp->Nid_cell<<1));
|
||||
x2 = ((rnti)<<15)+n_id;
|
||||
s = lte_gold_generic(&x1, &x2, 1);
|
||||
#ifdef DEBUG_NR_PUCCH_TX
|
||||
printf("\t\t [nr_pucch2_3_4_scrambling] gold sequence s=%x\n",s);
|
||||
printf("\t\t [nr_pucch2_3_4_scrambling] gold sequence s=%x, M_bit %d\n",s,M_bit);
|
||||
#endif
|
||||
|
||||
for (i=0; i<M_bit; i++) {
|
||||
c = (uint8_t)((s>>i)&1);
|
||||
btilde[i] = (((B>>i)&1) ^ c);
|
||||
uint8_t *btildep=btilde;
|
||||
int M_bit2=M_bit > 31 ? 32 : (M_bit&31), M_bit3=M_bit;
|
||||
uint32_t B;
|
||||
for (int iprime=0;iprime<=(M_bit>>5);iprime++,btildep+=32) {
|
||||
s = lte_gold_generic(&x1, &x2, (iprime==0) ? 1 : 0);
|
||||
B=((uint32_t*)B64)[iprime];
|
||||
for (int n=0;n<M_bit2;n+=8)
|
||||
LOG_D(PHY,"PUCCH2 encoded %d : %d,%d,%d,%d,%d,%d,%d,%d\n",n,
|
||||
(B>>n)&1,
|
||||
(B>>(n+1))&1,
|
||||
(B>>(n+2))&1,
|
||||
(B>>(n+3))&1,
|
||||
(B>>(n+4))&1,
|
||||
(B>>(n+5))&1,
|
||||
(B>>(n+6))&1,
|
||||
(B>>(n+7))&1
|
||||
);
|
||||
for (i=0; i<M_bit2; i++) {
|
||||
c = (uint8_t)((s>>i)&1);
|
||||
btildep[i] = (((B>>i)&1) ^ c);
|
||||
#ifdef DEBUG_NR_PUCCH_TX
|
||||
//printf("\t\t\t btilde[%d]=%lx from scrambled bit %d\n",i,btilde[i],((B>>i)&1));
|
||||
printf("\t\t\t btilde[%d]=%lx from unscrambled bit %d and scrambling %d (%x)\n",i+(iprime<<5),btilde[i],((B>>i)&1),c,s>>i);
|
||||
#endif
|
||||
}
|
||||
M_bit3-=32;
|
||||
M_bit2=M_bit3 > 31 ? 32 : (M_bit3&31);
|
||||
}
|
||||
|
||||
|
||||
#ifdef DEBUG_NR_PUCCH_TX
|
||||
printf("\t\t [nr_pucch2_3_4_scrambling] scrambling M_bit=%d bits\n", M_bit);
|
||||
#endif
|
||||
@@ -909,24 +929,13 @@ void nr_uci_encoding(uint64_t payload,
|
||||
// CRC bits are not attached, and coding small block lengths (subclause 5.3.3)
|
||||
b[0] = encodeSmallBlock((uint16_t*)&payload,A);
|
||||
} else if (A>=12) {
|
||||
AssertFatal(1==0,"Polar encoding not supported yet for UCI\n");
|
||||
// procedure in subclause 6.3.1.2.1 (UCI encoded by Polar code -> subclause 6.3.1.3.1)
|
||||
/*if ((A>=360 && E>=1088)||(A>=1013)) {
|
||||
I_seg = 1;
|
||||
} else {
|
||||
I_seg = 0;
|
||||
}*/
|
||||
|
||||
/*if (A>=20) {
|
||||
// parity bits (subclause 5.2.1) computed by setting L=11 and using generator polynomial gCRC11(D) (subclause 5.1)
|
||||
L=11;
|
||||
} else if (A<=19) {
|
||||
// parity bits (subclause 5.2.1) computed by setting L=6 and using generator polynomial gCRC6(D) (subclause 5.1)
|
||||
L=6;
|
||||
}*/
|
||||
|
||||
// code block segmentation and CRC attachment is performed according to subclause 5.2.1
|
||||
// polar coding subclause 5.3.1
|
||||
AssertFatal(A<65,"Polar encoding not supported yet for UCI with more than 64 bits\n");
|
||||
t_nrPolar_params *currentPtr = nr_polar_params(NR_POLAR_UCI_PUCCH_MESSAGE_TYPE,
|
||||
A,
|
||||
nrofPRB,
|
||||
1,
|
||||
NULL);
|
||||
polar_encoder_fast(&payload, b, 0,0,currentPtr);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -950,7 +959,7 @@ void nr_generate_pucch2(PHY_VARS_NR_UE *ue,
|
||||
printf("\t [nr_generate_pucch2] start function at slot(nr_tti_tx)=%d with payload=%lu and nr_bit=%d\n",nr_tti_tx, payload, nr_bit);
|
||||
#endif
|
||||
// b is the block of bits transmitted on the physical channel after payload coding
|
||||
uint64_t b;
|
||||
uint64_t b[16]; // limit to 1024-bit encoded length
|
||||
// M_bit is the number of bits of block b (payload after encoding)
|
||||
uint16_t M_bit;
|
||||
nr_uci_encoding(payload,nr_bit,pucch_format2_nr,0,nrofSymbols,nrofPRB,1,0,0,&b,&M_bit);
|
||||
|
||||
+675
-745
File diff suppressed because it is too large
Load Diff
@@ -34,55 +34,15 @@
|
||||
//#include "PHY/impl_defs_top.h"
|
||||
#include "PHY/defs_nr_UE.h"
|
||||
|
||||
/* Forms and Objects */
|
||||
typedef struct {
|
||||
FL_FORM * phy_scope_gnb;
|
||||
FL_OBJECT * rxsig_t;
|
||||
FL_OBJECT * chest_f;
|
||||
FL_OBJECT * chest_t;
|
||||
FL_OBJECT * pusch_comp;
|
||||
FL_OBJECT * pucch_comp;
|
||||
FL_OBJECT * pucch_comp1;
|
||||
FL_OBJECT * pusch_llr;
|
||||
FL_OBJECT * pusch_tput;
|
||||
FL_OBJECT * button_0;
|
||||
} FD_phy_scope_gnb;
|
||||
|
||||
typedef struct {
|
||||
FL_FORM * phy_scope_nrue;
|
||||
FL_OBJECT * rxsig_t;
|
||||
FL_OBJECT * chest_f;
|
||||
FL_OBJECT * chest_t;
|
||||
FL_OBJECT * pbch_comp;
|
||||
FL_OBJECT * pbch_llr;
|
||||
FL_OBJECT * pdcch_comp;
|
||||
FL_OBJECT * pdcch_llr;
|
||||
FL_OBJECT * pdsch_comp;
|
||||
FL_OBJECT * pdsch_llr;
|
||||
FL_OBJECT * pdsch_comp1;
|
||||
FL_OBJECT * pdsch_llr1;
|
||||
FL_OBJECT * pdsch_tput;
|
||||
FL_OBJECT * button_0;
|
||||
} FD_phy_scope_nrue;
|
||||
|
||||
typedef struct {
|
||||
int *argc;
|
||||
char **argv;
|
||||
RU_t* ru;
|
||||
RU_t *ru;
|
||||
PHY_VARS_gNB *gNB;
|
||||
} scopeParms_t;
|
||||
|
||||
extern unsigned char scope_enb_num_ue;
|
||||
FD_phy_scope_nrue * create_phy_scope_nrue( void );
|
||||
|
||||
void phy_scope_nrUE(FD_phy_scope_nrue *form,
|
||||
PHY_VARS_NR_UE *phy_vars_ue,
|
||||
int eNB_id,
|
||||
int UE_id,
|
||||
uint8_t subframe);
|
||||
|
||||
|
||||
void startScope(scopeParms_t * p);
|
||||
void gNBinitScope(scopeParms_t *p);
|
||||
void nrUEinitScope(PHY_VARS_NR_UE *ue);
|
||||
|
||||
extern RAN_CONTEXT_t RC;
|
||||
#endif
|
||||
|
||||
@@ -689,6 +689,8 @@ typedef struct PHY_VARS_gNB_s {
|
||||
NR_gNB_ULSCH_t *ulsch[NUMBER_OF_NR_ULSCH_MAX][2]; // [Nusers times][2 codewords]
|
||||
NR_gNB_DLSCH_t *dlsch_SI,*dlsch_ra,*dlsch_p;
|
||||
NR_gNB_DLSCH_t *dlsch_PCH;
|
||||
t_nrPolar_params *uci_polarParams;
|
||||
|
||||
uint8_t pbch_configured;
|
||||
char gNB_generate_rar;
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
||||
|
||||
// Note: we have to handle the thread IDs for this. To be revisited completely.
|
||||
thread_id = PHY_vars_UE_g[module_id][cc_id]->current_thread_id[slot];
|
||||
NR_UE_DLSCH_t *dlsch0;
|
||||
NR_UE_DLSCH_t *dlsch0 = NULL;
|
||||
NR_UE_PDCCH *pdcch_vars = PHY_vars_UE_g[module_id][cc_id]->pdcch_vars[thread_id][0];
|
||||
NR_UE_ULSCH_t *ulsch0 = PHY_vars_UE_g[module_id][cc_id]->ulsch[thread_id][0][0];
|
||||
NR_DL_FRAME_PARMS frame_parms = PHY_vars_UE_g[module_id][cc_id]->frame_parms;
|
||||
@@ -131,7 +131,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
||||
|
||||
uint8_t pdu_type = ul_config->ul_config_list[i].pdu_type, pucch_resource_id, current_harq_pid, format, gNB_id = 0;
|
||||
/* PRACH */
|
||||
NR_PRACH_RESOURCES_t *prach_resources;
|
||||
//NR_PRACH_RESOURCES_t *prach_resources;
|
||||
fapi_nr_ul_config_prach_pdu *prach_config_pdu;
|
||||
/* PUSCH */
|
||||
nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu;
|
||||
@@ -201,7 +201,7 @@ int8_t nr_ue_scheduled_response(nr_scheduled_response_t *scheduled_response){
|
||||
|
||||
case (FAPI_NR_UL_CONFIG_TYPE_PRACH):
|
||||
// prach config pdu
|
||||
prach_resources = PHY_vars_UE_g[module_id][cc_id]->prach_resources[gNB_id];
|
||||
//prach_resources = PHY_vars_UE_g[module_id][cc_id]->prach_resources[gNB_id];
|
||||
prach_config_pdu = &ul_config->ul_config_list[i].prach_config_pdu;
|
||||
memcpy((void*)&(PHY_vars_UE_g[module_id][cc_id]->prach_vars[gNB_id]->prach_pdu), (void*)prach_config_pdu, sizeof(fapi_nr_ul_config_prach_pdu));
|
||||
PHY_vars_UE_g[module_id][cc_id]->prach_vars[gNB_id]->prach_Config_enabled = 1;
|
||||
|
||||
@@ -4130,12 +4130,13 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
|
||||
|
||||
LOG_D(PHY,"[UE %d] Frame %d, nr_tti_rx %d: found %d DCIs\n", ue->Mod_id, frame_rx, nr_tti_rx, dci_cnt);
|
||||
|
||||
NR_UE_DLSCH_t *dlsch;
|
||||
NR_UE_DLSCH_t *dlsch = NULL;
|
||||
if (ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0]->active == 1){
|
||||
dlsch = ue->dlsch[ue->current_thread_id[nr_tti_rx]][eNB_id][0];
|
||||
} else if (ue->dlsch_ra[0]->active == 1){
|
||||
dlsch = ue->dlsch_ra[0];
|
||||
}
|
||||
AssertFatal(dlsch != NULL, "Unsupported mode\n");
|
||||
uint8_t harq_pid = dlsch->current_harq_pid;
|
||||
NR_DL_UE_HARQ_t *dlsch0_harq = dlsch->harq_processes[harq_pid];
|
||||
uint16_t nb_symb_sch = dlsch0_harq->nb_symbols;
|
||||
@@ -4505,7 +4506,7 @@ void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
|
||||
uint8_t mod_id = ue->Mod_id;
|
||||
UE_MODE_t UE_mode = get_nrUE_mode(mod_id, ue->CC_id, gNB_id);
|
||||
NR_PRACH_RESOURCES_t * prach_resources = ue->prach_resources[gNB_id];
|
||||
uint8_t nr_prach;
|
||||
uint8_t nr_prach = 0;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_IN);
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ void nr_get_prach_resources(module_id_t mod_id,
|
||||
NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon;
|
||||
// NR_BeamFailureRecoveryConfig_t *beam_failure_recovery_config = &mac->RA_BeamFailureRecoveryConfig; // todo
|
||||
|
||||
int messagePowerOffsetGroupB, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA, numberOfRA_Preambles, i, deltaPreamble_Msg3;
|
||||
int messagePowerOffsetGroupB = 0, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA, numberOfRA_Preambles, i, deltaPreamble_Msg3 = 0;
|
||||
uint8_t noGroupB = 0, s_id, f_id, ul_carrier_id, msg1_FDM, prach_ConfigIndex, SFN_nbr, Msg3_size;
|
||||
|
||||
// NR_RSRP_Range_t rsrp_ThresholdSSB; // todo
|
||||
|
||||
@@ -86,7 +86,7 @@ int main(int argc, char **argv)
|
||||
int format=0;
|
||||
//uint8_t extended_prefix_flag=0;
|
||||
FILE *input_fd=NULL;
|
||||
uint8_t nacktoack_flag=0;
|
||||
//uint8_t nacktoack_flag=0;
|
||||
int16_t amp=0x7FFF;
|
||||
int nr_tti_tx=0;
|
||||
uint64_t actual_payload=0,payload_received;
|
||||
@@ -285,7 +285,7 @@ int main(int argc, char **argv)
|
||||
actual_payload=atoi(optarg);
|
||||
break;
|
||||
case 'T':
|
||||
nacktoack_flag=(uint8_t)atoi(optarg);
|
||||
//nacktoack_flag=(uint8_t)atoi(optarg);
|
||||
target_error_rate=0.001;
|
||||
break;
|
||||
default:
|
||||
@@ -338,7 +338,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
AssertFatal(((format < 2)&&(nr_bit<3)&&(actual_payload<4)) ||
|
||||
((format == 2)&&(nr_bit>2)&&(nr_bit<12)),"illegal combination format %d, nr_bit %d\n",
|
||||
((format == 2)&&(nr_bit>2)&&(nr_bit<65)),"illegal combination format %d, nr_bit %d\n",
|
||||
format,nr_bit);
|
||||
|
||||
actual_payload &= ((1<<nr_bit)-1);
|
||||
@@ -459,6 +459,8 @@ int main(int argc, char **argv)
|
||||
pucch_GroupHopping_t PUCCH_GroupHopping=UE->pucch_config_common_nr->pucch_GroupHopping;
|
||||
uint32_t hopping_id=UE->pucch_config_common_nr->hoppingId;
|
||||
uint32_t dmrs_scrambling_id = 0, data_scrambling_id=0;
|
||||
//t_nrPolar_params *currentPtr;
|
||||
|
||||
if(format==0){
|
||||
// for now we are not considering SR just HARQ-ACK
|
||||
if (nr_bit ==0)
|
||||
@@ -469,7 +471,8 @@ int main(int argc, char **argv)
|
||||
mcs=table2_mcs[actual_payload];
|
||||
else AssertFatal(1==0,"Either nr_bit %d or sr_flag %d must be non-zero\n", nr_bit, sr_flag);
|
||||
}
|
||||
|
||||
else if (format == 2 && nr_bit > 11) gNB->uci_polarParams = nr_polar_params(2, nr_bit, nrofPRB, 1, NULL);
|
||||
|
||||
for(SNR=snr0;SNR<=snr1;SNR=SNR+1){
|
||||
ack_nack_errors=0;
|
||||
n_errors = 0;
|
||||
@@ -500,7 +503,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
int rxlev = signal_energy(&rxdataF[aa][startingSymbolIndex*frame_parms->ofdm_symbol_size],
|
||||
frame_parms->ofdm_symbol_size);
|
||||
// printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
|
||||
if (n_trials==1) printf("rxlev %d (%d dB), sigma2 %f dB, SNR %f, TX %f\n",rxlev,dB_fixed(rxlev),sigma2_dB,SNR,10*log10((double)txlev*UE->frame_parms.ofdm_symbol_size/12));
|
||||
if(format==0){
|
||||
nfapi_nr_uci_pucch_pdu_format_0_1_t uci_pdu;
|
||||
nfapi_nr_pucch_pdu_t pucch_pdu;
|
||||
@@ -508,6 +511,8 @@ int main(int argc, char **argv)
|
||||
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
||||
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
||||
pucch_pdu.bit_len_harq = nr_bit;
|
||||
pucch_pdu.bit_len_csi_part1 = 0;
|
||||
pucch_pdu.bit_len_csi_part2 = 0;
|
||||
pucch_pdu.sr_flag = sr_flag;
|
||||
pucch_pdu.nr_of_symbols = nrofSymbols;
|
||||
pucch_pdu.hopping_id = hopping_id;
|
||||
@@ -536,7 +541,9 @@ int main(int argc, char **argv)
|
||||
pucch_pdu.subcarrier_spacing = 1;
|
||||
pucch_pdu.group_hop_flag = PUCCH_GroupHopping&1;
|
||||
pucch_pdu.sequence_hop_flag = (PUCCH_GroupHopping>>1)&1;
|
||||
pucch_pdu.bit_len_harq = nr_bit;
|
||||
pucch_pdu.bit_len_csi_part1 = nr_bit;
|
||||
pucch_pdu.bit_len_harq = 0;
|
||||
pucch_pdu.bit_len_csi_part2 = 0;
|
||||
pucch_pdu.sr_flag = 0;
|
||||
pucch_pdu.nr_of_symbols = nrofSymbols;
|
||||
pucch_pdu.hopping_id = hopping_id;
|
||||
@@ -547,14 +554,15 @@ int main(int argc, char **argv)
|
||||
pucch_pdu.dmrs_scrambling_id = dmrs_scrambling_id;
|
||||
pucch_pdu.data_scrambling_id = data_scrambling_id;
|
||||
nr_decode_pucch2(gNB,nr_tti_tx,&uci_pdu,&pucch_pdu);
|
||||
int harq_bytes=pucch_pdu.bit_len_harq>>3;
|
||||
if ((pucch_pdu.bit_len_harq&7) > 0) harq_bytes++;
|
||||
for (int i=0;i<harq_bytes;i++)
|
||||
if (uci_pdu.harq.harq_payload[i] != ((int8_t*)&actual_payload)[i]) {
|
||||
int csi_part1_bytes=pucch_pdu.bit_len_csi_part1>>3;
|
||||
if ((pucch_pdu.bit_len_csi_part1&7) > 0) csi_part1_bytes++;
|
||||
for (int i=0;i<csi_part1_bytes;i++) {
|
||||
if (uci_pdu.csi_part1.csi_part1_payload[i] != ((uint8_t*)&actual_payload)[i]) {
|
||||
ack_nack_errors++;
|
||||
break;
|
||||
}
|
||||
free(uci_pdu.harq.harq_payload);
|
||||
}
|
||||
free(uci_pdu.csi_part1.csi_part1_payload);
|
||||
|
||||
}
|
||||
n_errors=((actual_payload^payload_received)&1)+(((actual_payload^payload_received)&2)>>1)+(((actual_payload^payload_received)&4)>>2)+n_errors;
|
||||
|
||||
@@ -119,7 +119,7 @@ int main(int argc, char **argv)
|
||||
int trial, n_trials = 1, n_errors = 0, n_false_positive = 0, delay = 0;
|
||||
uint8_t n_tx = 1, n_rx = 1;
|
||||
//uint8_t transmission_mode = 1;
|
||||
uint16_t Nid_cell = 0;
|
||||
//uint16_t Nid_cell = 0;
|
||||
channel_desc_t *gNB2UE;
|
||||
uint8_t extended_prefix_flag = 0;
|
||||
//int8_t interf1 = -21, interf2 = -21;
|
||||
@@ -130,7 +130,7 @@ int main(int argc, char **argv)
|
||||
int frame_length_complex_samples,frame_length_complex_samples_no_prefix;
|
||||
NR_DL_FRAME_PARMS *frame_parms;
|
||||
int loglvl = OAILOG_WARNING;
|
||||
uint64_t SSB_positions=0x01;
|
||||
//uint64_t SSB_positions=0x01;
|
||||
uint16_t nb_symb_sch = 12;
|
||||
int start_symbol = 2;
|
||||
uint16_t nb_rb = 50;
|
||||
@@ -377,6 +377,7 @@ int main(int argc, char **argv)
|
||||
printf("-P Print ULSCH performances\n");
|
||||
exit(-1);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -75,12 +75,12 @@ static void configure_nr_rrc(uint32_t gnb_id)
|
||||
static uint32_t gNB_app_register(uint32_t gnb_id_start, uint32_t gnb_id_end)//, const Enb_properties_array_t *enb_properties)
|
||||
{
|
||||
uint32_t gnb_id;
|
||||
MessageDef *msg_p;
|
||||
//MessageDef *msg_p;
|
||||
uint32_t register_gnb_pending = 0;
|
||||
|
||||
for (gnb_id = gnb_id_start; (gnb_id < gnb_id_end) ; gnb_id++) {
|
||||
{
|
||||
s1ap_register_enb_req_t *s1ap_register_gNB; //Type Temporarily reuse
|
||||
//s1ap_register_enb_req_t *s1ap_register_gNB; //Type Temporarily reuse
|
||||
|
||||
// note: there is an implicit relationship between the data structure and the message name
|
||||
/*msg_p = itti_alloc_new_message (TASK_GNB_APP, S1AP_REGISTER_ENB_REQ); //Message Temporarily reuse
|
||||
|
||||
@@ -130,6 +130,7 @@ int8_t nr_get_DELTA_PREAMBLE(module_id_t mod_id, int CC_id, uint16_t prach_forma
|
||||
AssertFatal(1 == 0, "[UE %d] ue_procedures.c: FATAL, Illegal preambleFormat %d, prachConfigIndex %d\n", mod_id, prach_format, prachConfigIndex);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* TS 38.321 subclause 5.1.3 - RA preamble transmission - ra_PREAMBLE_RECEIVED_TARGET_POWER configuration */
|
||||
@@ -149,4 +150,4 @@ int nr_get_Po_NOMINAL_PUSCH(NR_PRACH_RESOURCES_t *prach_resources, module_id_t m
|
||||
receivedTargerPower = preambleReceivedTargetPower + delta_preamble + (mac->RA_PREAMBLE_POWER_RAMPING_COUNTER - 1) * prach_resources->RA_PREAMBLE_POWER_RAMPING_STEP;
|
||||
|
||||
return receivedTargerPower;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ void nr_get_prach_resources(module_id_t mod_id,
|
||||
|
||||
// NR_BeamFailureRecoveryConfig_t *beam_failure_recovery_config = &mac->RA_BeamFailureRecoveryConfig; // todo
|
||||
|
||||
int messagePowerOffsetGroupB, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA, numberOfRA_Preambles, i, deltaPreamble_Msg3;
|
||||
int messagePowerOffsetGroupB = 0, messageSizeGroupA, PLThreshold, sizeOfRA_PreamblesGroupA = 0, numberOfRA_Preambles, i, deltaPreamble_Msg3 = 0;
|
||||
uint8_t noGroupB = 0, s_id, f_id, ul_carrier_id, prach_ConfigIndex, SFN_nbr, Msg3_size;
|
||||
|
||||
AssertFatal(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup != NULL, "[UE %d] FATAL nr_rach_ConfigCommon is NULL !!!\n", mod_id);
|
||||
@@ -345,14 +345,15 @@ uint8_t nr_ue_get_rach(NR_PRACH_RESOURCES_t *prach_resources,
|
||||
|
||||
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
|
||||
uint8_t mac_sdus[MAX_NR_ULSCH_PAYLOAD_BYTES];
|
||||
uint8_t lcid = UL_SCH_LCID_CCCH_MSG3, *payload, ra_ResponseWindow;
|
||||
uint8_t lcid = UL_SCH_LCID_CCCH_MSG3, *payload;
|
||||
//uint8_t ra_ResponseWindow;
|
||||
uint16_t size_sdu = 0;
|
||||
unsigned short post_padding;
|
||||
fapi_nr_config_request_t *cfg = &mac->phy_config.config_req;
|
||||
//fapi_nr_config_request_t *cfg = &mac->phy_config.config_req;
|
||||
NR_ServingCellConfigCommon_t *scc = mac->scc;
|
||||
NR_RACH_ConfigCommon_t *setup = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
|
||||
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
|
||||
NR_FrequencyInfoDL_t *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
|
||||
//NR_FrequencyInfoDL_t *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
|
||||
NR_RACH_ConfigDedicated_t *rach_ConfigDedicated = mac->rach_ConfigDedicated;
|
||||
|
||||
// int32_t frame_diff = 0;
|
||||
|
||||
@@ -160,7 +160,7 @@ void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl
|
||||
if (mac->crnti > 0) {
|
||||
|
||||
NR_SearchSpace_t *css;
|
||||
NR_SearchSpace_t *uss;
|
||||
NR_SearchSpace_t *uss = NULL;
|
||||
NR_ServingCellConfigCommon_t *scc;
|
||||
NR_SearchSpaceId_t ra_SearchSpaceId;
|
||||
rel15 = &dl_config->dl_config_list[dl_config->number_pdus].dci_config_pdu.dci_config_rel15;
|
||||
|
||||
@@ -937,7 +937,7 @@ void nr_ue_msg2_scheduler(module_id_t mod_id,
|
||||
// and if the slot is not among the PDCCH monitored ones (38.213 10.1)
|
||||
while ((*msg2_slot > slot_limit) || ((*msg2_frame*nr_slots_per_frame[mu] + *msg2_slot - monitoring_offset) % monitoring_slot_period != 0)) {
|
||||
if((*msg2_slot % tdd_period_slot) > 0)
|
||||
*msg2_slot--;
|
||||
(*msg2_slot)--;
|
||||
else
|
||||
AssertFatal(1 == 0, "No available DL slot to schedule reception of msg2 has been found");
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ uint16_t nr_ue_process_rar(module_id_t mod_id,
|
||||
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1); // RAR subPDU pointer
|
||||
uint8_t n_subPDUs = 0; // number of RAR payloads
|
||||
uint8_t n_subheaders = 0; // number of MAC RAR subheaders
|
||||
uint8_t best_rx_rapid = -1; // the closest RAPID receive from all RARs
|
||||
//uint8_t best_rx_rapid = -1; // the closest RAPID receive from all RARs
|
||||
unsigned char freq_hopping, msg3_t_alloc, mcs, tpc_command, csi_req;
|
||||
uint16_t ta_command = 0, msg3_f_alloc, bwp_size;
|
||||
int f_alloc, mask;
|
||||
|
||||
@@ -221,13 +221,14 @@ void nr_schedule_msg2(uint16_t rach_frame, uint16_t rach_slot,
|
||||
|
||||
// slot and frame limit to transmit msg2 according to response window
|
||||
uint8_t slot_limit = (rach_slot + slot_window)%nr_slots_per_frame_mac[mu];
|
||||
uint8_t frame_limit = (slot_limit>(rach_slot))? rach_frame : (rach_frame +1);
|
||||
//uint8_t frame_limit = (slot_limit>(rach_slot))? rach_frame : (rach_frame +1);
|
||||
|
||||
|
||||
// go to previous slot if the current scheduled slot is beyond the response window
|
||||
// and if the slot is not among the PDCCH monitored ones (38.213 10.1)
|
||||
while ((*msg2_slot>slot_limit) || ((*msg2_frame*nr_slots_per_frame_mac[mu]+*msg2_slot-monitoring_offset)%monitoring_slot_period !=0)) {
|
||||
if((*msg2_slot%tdd_period_slot) > 0)
|
||||
*msg2_slot--;
|
||||
(*msg2_slot)--;
|
||||
else
|
||||
AssertFatal(1==0,"No available DL slot to schedule msg2 has been found");
|
||||
}
|
||||
@@ -763,7 +764,8 @@ void nr_fill_rar(uint8_t Mod_idP,
|
||||
NR_RA_HEADER_RAPID *rarh = (NR_RA_HEADER_RAPID *) dlsch_buffer;
|
||||
NR_MAC_RAR *rar = (NR_MAC_RAR *) (dlsch_buffer + 1);
|
||||
unsigned char csi_req = 0, tpc_command;
|
||||
uint8_t N_UL_Hop, valid_bits;
|
||||
//uint8_t N_UL_Hop;
|
||||
uint8_t valid_bits;
|
||||
uint32_t ul_grant;
|
||||
uint16_t f_alloc, prb_alloc, bwp_size, truncation=0;
|
||||
|
||||
|
||||
@@ -503,8 +503,6 @@ pdcp_data_ind(
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
pdcp_t *pdcp_p = NULL;
|
||||
list_t *sdu_list_p = NULL;
|
||||
mem_block_t *new_sdu_p = NULL;
|
||||
uint8_t pdcp_header_len = 0;
|
||||
uint8_t pdcp_tailer_len = 0;
|
||||
pdcp_sn_t sequence_number = 0;
|
||||
@@ -576,7 +574,6 @@ pdcp_data_ind(
|
||||
}
|
||||
}
|
||||
|
||||
sdu_list_p = &pdcp_sdu_list;
|
||||
|
||||
if (sdu_buffer_sizeP == 0) {
|
||||
LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n");
|
||||
@@ -974,9 +971,8 @@ pdcp_data_ind(
|
||||
#endif
|
||||
|
||||
if (FALSE == packet_forwarded) {
|
||||
new_sdu_p = get_free_mem_block(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), __func__);
|
||||
notifiedFIFO_elt_t * new_sdu_p = newNotifiedFIFO_elt(sdu_buffer_sizeP - payload_offset + sizeof (pdcp_data_ind_header_t), 0, NULL, NULL);
|
||||
|
||||
if (new_sdu_p) {
|
||||
if ((MBMS_flagP == 0) && (pdcp_p->rlc_mode == RLC_MODE_AM)) {
|
||||
pdcp_p->last_submitted_pdcp_rx_sn = sequence_number;
|
||||
}
|
||||
@@ -984,14 +980,15 @@ pdcp_data_ind(
|
||||
/*
|
||||
* Prepend PDCP indication header which is going to be removed at pdcp_fifo_flush_sdus()
|
||||
*/
|
||||
memset(new_sdu_p->data, 0, sizeof (pdcp_data_ind_header_t));
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size = sdu_buffer_sizeP - payload_offset;
|
||||
pdcp_data_ind_header_t * pdcpHead=(pdcp_data_ind_header_t *)NotifiedFifoData(new_sdu_p);
|
||||
memset(pdcpHead, 0, sizeof (pdcp_data_ind_header_t));
|
||||
pdcpHead->data_size = sdu_buffer_sizeP - payload_offset;
|
||||
AssertFatal((sdu_buffer_sizeP - payload_offset >= 0), "invalid PDCP SDU size!");
|
||||
|
||||
// Here there is no virtualization possible
|
||||
// set ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst for IP layer here
|
||||
if (ctxt_pP->enb_flag == ENB_FLAG_NO) {
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_id;
|
||||
pdcpHead->rb_id = rb_id;
|
||||
|
||||
if (EPC_MODE_ENABLED) {
|
||||
/* for the UE compiled in S1 mode, we need 1 here
|
||||
@@ -1002,45 +999,40 @@ pdcp_data_ind(
|
||||
#ifdef UESIM_EXPANSION
|
||||
|
||||
if (UE_NAS_USE_TUN) {
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||
pdcpHead->inst = ctxt_pP->module_id;
|
||||
} else {
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = 0;
|
||||
pdcpHead->inst = 0;
|
||||
}
|
||||
|
||||
#else
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||
pdcpHead->inst = ctxt_pP->module_id;
|
||||
#endif
|
||||
} else { // nfapi_mode
|
||||
if (UE_NAS_USE_TUN) {
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||
pdcpHead->inst = ctxt_pP->module_id;
|
||||
} else {
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = 1;
|
||||
pdcpHead->inst = 1;
|
||||
}
|
||||
} // nfapi_mode
|
||||
}
|
||||
} else {
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->rb_id = rb_id + (ctxt_pP->module_id * LTE_maxDRB);
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = ctxt_pP->module_id;
|
||||
pdcpHead->rb_id = rb_id + (ctxt_pP->module_id * LTE_maxDRB);
|
||||
pdcpHead->inst = ctxt_pP->module_id;
|
||||
}
|
||||
|
||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) ) {
|
||||
static uint32_t pdcp_inst = 0;
|
||||
((pdcp_data_ind_header_t *) new_sdu_p->data)->inst = pdcp_inst++;
|
||||
LOG_D(PDCP, "inst=%d size=%d\n", ((pdcp_data_ind_header_t *) new_sdu_p->data)->inst, ((pdcp_data_ind_header_t *) new_sdu_p->data)->data_size);
|
||||
pdcpHead->inst = pdcp_inst++;
|
||||
LOG_D(PDCP, "inst=%d size=%d\n", pdcpHead->inst, pdcpHead->data_size);
|
||||
}
|
||||
|
||||
memcpy(&new_sdu_p->data[sizeof (pdcp_data_ind_header_t)],
|
||||
memcpy(pdcpHead+1,
|
||||
&sdu_buffer_pP->data[payload_offset],
|
||||
sdu_buffer_sizeP - payload_offset);
|
||||
|
||||
#if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
|
||||
LOG_I(PDCP, "Printing first bytes of PDCP SDU before adding it to the list: \n");
|
||||
for (int i=0; i<30; i++){
|
||||
LOG_I(PDCP, "%x", sdu_buffer_pP->data[i]);
|
||||
}
|
||||
#endif
|
||||
list_add_tail_eurecom (new_sdu_p, sdu_list_p);
|
||||
}
|
||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
|
||||
log_dump(PDCP, pdcpHead+1, min(sdu_buffer_sizeP - payload_offset,30) , LOG_DUMP_CHAR,
|
||||
"Printing first bytes of PDCP SDU before adding it to the list: \n");
|
||||
pushNotifiedFIFO(&pdcp_sdu_list, new_sdu_p);
|
||||
|
||||
/* Print octets of incoming data in hexadecimal form */
|
||||
LOG_D(PDCP, "Following content has been received from RLC (%d,%d)(PDCP header has already been removed):\n",
|
||||
@@ -2467,7 +2459,7 @@ void pdcp_layer_init(void)
|
||||
/*
|
||||
* Initialize SDU list
|
||||
*/
|
||||
list_init(&pdcp_sdu_list, NULL);
|
||||
initNotifiedFIFO(&pdcp_sdu_list);
|
||||
pdcp_coll_p = hashtable_create ((LTE_maxDRB + 2) * NUMBER_OF_UE_MAX, NULL, pdcp_free);
|
||||
AssertFatal(pdcp_coll_p != NULL, "UNRECOVERABLE error, PDCP hashtable_create failed");
|
||||
|
||||
@@ -2540,7 +2532,8 @@ void pdcp_layer_init(void)
|
||||
void pdcp_layer_cleanup (void)
|
||||
//-----------------------------------------------------------------------------
|
||||
{
|
||||
list_free (&pdcp_sdu_list);
|
||||
//list_free (&pdcp_sdu_list);
|
||||
while(pollNotifiedFIFO(&pdcp_sdu_list)) {};
|
||||
hashtable_destroy(&pdcp_coll_p);
|
||||
#ifdef MBMS_MULTICAST_OUT
|
||||
|
||||
|
||||
@@ -522,7 +522,7 @@ pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][LTE_maxServiceC
|
||||
|
||||
sdu_size_t pdcp_output_sdu_bytes_to_write;
|
||||
sdu_size_t pdcp_output_header_bytes_to_write;
|
||||
list_t pdcp_sdu_list;
|
||||
notifiedFIFO_t pdcp_sdu_list;
|
||||
int pdcp_sent_a_sdu;
|
||||
pdcp_data_req_header_t pdcp_input_header;
|
||||
unsigned char pdcp_input_sdu_buffer[MAX_IP_PACKET_SIZE];
|
||||
|
||||
@@ -111,69 +111,59 @@ void debug_pdcp_pc5s_sdu(sidelink_pc5s_element *sl_pc5s_msg, char *title) {
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
|
||||
mem_block_t *sdu_p;
|
||||
notifiedFIFO_elt_t *sdu_p;
|
||||
int pdcp_nb_sdu_sent = 0;
|
||||
int ret=0;
|
||||
while ((sdu_p = pollNotifiedFIFO(&pdcp_sdu_list)) != NULL ) {
|
||||
pdcp_data_ind_header_t * pdcpHead=(pdcp_data_ind_header_t *)NotifiedFifoData(sdu_p);
|
||||
AssertFatal(pdcpHead->inst==ctxt_pP->module_id, "To implement correctly multi module id\n");
|
||||
|
||||
while ((sdu_p = list_get_head (&pdcp_sdu_list)) != NULL && ((pdcp_data_ind_header_t *)(sdu_p->data))->inst == ctxt_pP->module_id) {
|
||||
((pdcp_data_ind_header_t *)(sdu_p->data))->inst = 0;
|
||||
int rb_id = ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id;
|
||||
int rb_id = pdcpHead->rb_id;
|
||||
int sizeToWrite= sizeof (pdcp_data_ind_header_t) +
|
||||
((pdcp_data_ind_header_t *) sdu_p->data)->data_size;
|
||||
pdcpHead->data_size;
|
||||
void * pdcpData=(void*)(pdcpHead+1);
|
||||
|
||||
if (rb_id == 10) { //hardcoded for PC5-Signaling
|
||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) ) {
|
||||
debug_pdcp_pc5s_sdu((sidelink_pc5s_element *)&(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),
|
||||
debug_pdcp_pc5s_sdu((sidelink_pc5s_element *)pdcpData,
|
||||
"pdcp_fifo_flush_sdus sends a aPC5S message");
|
||||
}
|
||||
|
||||
ret = sendto(pdcp_pc5_sockfd, &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),
|
||||
ret = sendto(pdcp_pc5_sockfd, pdcpData,
|
||||
sizeof(sidelink_pc5s_element), 0, (struct sockaddr *)&prose_pdcp_addr,sizeof(prose_pdcp_addr) );
|
||||
|
||||
} else if (UE_NAS_USE_TUN) {
|
||||
//ret = write(nas_sock_fd[ctxt_pP->module_id], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
|
||||
if(rb_id == mbms_rab_id){
|
||||
ret = write(nas_sock_mbms_fd, &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
|
||||
LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH MBMS DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[ctxt_pP->module_id],sizeToWrite);
|
||||
ret = write(nas_sock_mbms_fd, pdcpData,sizeToWrite );
|
||||
LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH MBMS DATA TO rb_id %d handle %d sizeToWrite %d\n",
|
||||
ret,rb_id,nas_sock_fd[ctxt_pP->module_id],sizeToWrite);
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
|
||||
LOG_I(PHY, "PDCP output to be sent to TUN interface: \n");
|
||||
for (int i = sizeof(pdcp_data_ind_header_t); i < sizeToWrite; i++) {
|
||||
printf("%02x ",(unsigned char)sdu_p->data[i]);
|
||||
}
|
||||
printf("\n");
|
||||
#endif
|
||||
ret = write(nas_sock_fd[ctxt_pP->module_id], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
|
||||
//LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[ctxt_pP->module_id],sizeToWrite);
|
||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
|
||||
log_dump(PDCP, pdcpData, sizeToWrite, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
|
||||
ret = write(nas_sock_fd[ctxt_pP->module_id], pdcpData,sizeToWrite );
|
||||
LOG_T(PDCP,"[UE PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",
|
||||
ret,rb_id,nas_sock_fd[ctxt_pP->module_id],sizeToWrite);
|
||||
}
|
||||
} else if (ENB_NAS_USE_TUN) {
|
||||
#if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
|
||||
LOG_I(PHY, "PDCP output to be sent to TUN interface: \n");
|
||||
for (int i = sizeof(pdcp_data_ind_header_t); i < sizeToWrite; i++) {
|
||||
printf("%02x ",(unsigned char)sdu_p->data[i]);
|
||||
}
|
||||
printf("\n");
|
||||
#endif
|
||||
ret = write(nas_sock_fd[0], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]), sizeToWrite);
|
||||
|
||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
|
||||
log_dump(PDCP, pdcpData, sizeToWrite, LOG_DUMP_CHAR,"PDCP output to be sent to TUN interface: \n");
|
||||
ret = write(nas_sock_fd[0], pdcpData, sizeToWrite);
|
||||
LOG_T(PDCP,"[NB PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[0],sizeToWrite);
|
||||
} else if (PDCP_USE_NETLINK) {
|
||||
memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) sdu_p->data, sizeToWrite);
|
||||
memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) pdcpHead, sizeToWrite);
|
||||
nas_nlh_tx->nlmsg_len = sizeToWrite;
|
||||
ret = sendmsg(nas_sock_fd[0],&nas_msg_tx,0);
|
||||
} // PDCP_USE_NETLINK
|
||||
|
||||
AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s), nas_sock_fd[0]: %d\n", errno, strerror(errno), nas_sock_fd[0]);
|
||||
|
||||
#if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
|
||||
LOG_I(PDCP, "Printing first bytes of PDCP SDU before removing it from the list: \n");
|
||||
for (int i=0; i<30; i++){
|
||||
LOG_I(PDCP, "%x", sdu_p->data[i]);
|
||||
}
|
||||
#endif
|
||||
list_remove_head (&pdcp_sdu_list);
|
||||
free_mem_block (sdu_p, __func__);
|
||||
if( LOG_DEBUGFLAG(DEBUG_PDCP) )
|
||||
log_dump(PDCP, pdcpData, min(sizeToWrite,30) , LOG_DUMP_CHAR,
|
||||
"Printing first bytes of PDCP SDU before removing it from the list: \n");
|
||||
delNotifiedFIFO_elt (sdu_p);
|
||||
pdcp_nb_sdu_sent ++;
|
||||
}
|
||||
|
||||
@@ -181,12 +171,13 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) {
|
||||
}
|
||||
|
||||
int pdcp_fifo_flush_mbms_sdus(const protocol_ctxt_t *const ctxt_pP) {
|
||||
mem_block_t *sdu_p;
|
||||
notifiedFIFO_elt_t *sdu_p;
|
||||
int pdcp_nb_sdu_sent = 0;
|
||||
//int ret=0;
|
||||
|
||||
while ((sdu_p = list_get_head (&pdcp_sdu_list)) != NULL && ((pdcp_data_ind_header_t *)(sdu_p->data))->inst == ctxt_pP->module_id) {
|
||||
((pdcp_data_ind_header_t *)(sdu_p->data))->inst = 0;
|
||||
while ((sdu_p = pollNotifiedFIFO(&pdcp_sdu_list)) != NULL ) {
|
||||
pdcp_data_ind_header_t * pdcpHead=(pdcp_data_ind_header_t *)NotifiedFifoData(sdu_p);
|
||||
AssertFatal(pdcpHead->inst==ctxt_pP->module_id, "To implement correctly multi module id\n");
|
||||
//int rb_id = ((pdcp_data_ind_header_t *)(sdu_p->data))->rb_id;
|
||||
//int sizeToWrite= sizeof (pdcp_data_ind_header_t) +
|
||||
//((pdcp_data_ind_header_t *) sdu_p->data)->data_size;
|
||||
@@ -212,8 +203,8 @@ int pdcp_fifo_flush_mbms_sdus(const protocol_ctxt_t *const ctxt_pP) {
|
||||
//} // PDCP_USE_NETLINK
|
||||
|
||||
//AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s)\n", errno, strerror(errno));
|
||||
list_remove_head (&pdcp_sdu_list);
|
||||
free_mem_block (sdu_p, __func__);
|
||||
//AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s)\n", errno, strerror(errno));
|
||||
delNotifiedFIFO_elt (sdu_p);
|
||||
pdcp_nb_sdu_sent ++;
|
||||
}
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ int nr_ue_ul_indication(nr_uplink_indication_t *ul_info){
|
||||
if (is_nr_UL_slot(mac->scc, ul_info->slot_tx) && get_softmodem_params()->do_ra){
|
||||
nr_ue_prach_scheduler(module_id, ul_info->frame_tx, ul_info->slot_tx);
|
||||
if (mac->generate_nr_prach){
|
||||
uint16_t monitoring_slot_period, monitoring_offset;
|
||||
//uint16_t monitoring_slot_period, monitoring_offset;
|
||||
uint16_t rach_frame = mac->scheduled_response.ul_config->sfn;
|
||||
uint16_t rx_rach_frame = (rach_frame + mac->RA_offset) % MAX_FRAME_NUMBER; // compensate 2 frames offset delay at gNB side
|
||||
uint16_t rach_slot = mac->scheduled_response.ul_config->slot;
|
||||
@@ -244,8 +244,8 @@ int nr_ue_dl_indication(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_
|
||||
dl_info->rx_ind = NULL;
|
||||
dl_info->dci_ind = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
nr_ue_if_module_t *nr_ue_if_module_init(uint32_t module_id){
|
||||
|
||||
@@ -129,14 +129,14 @@ NwGtpv1uRcT gtpv1u_gNB_process_stack_req(
|
||||
case NW_GTPV1U_ULP_API_RECV_TPDU: {
|
||||
uint8_t buffer[4096];
|
||||
uint32_t buffer_len;
|
||||
uint16_t msgType = NW_GTP_GPDU;
|
||||
NwGtpv1uMsgT *pMsg = NULL;
|
||||
//uint16_t msgType = NW_GTP_GPDU;
|
||||
//NwGtpv1uMsgT *pMsg = NULL;
|
||||
/* Nw-gptv1u stack has processed a PDU. we can schedule it to PDCP
|
||||
* for transmission.
|
||||
*/
|
||||
teid = pUlpApi->apiInfo.recvMsgInfo.teid;
|
||||
pMsg = (NwGtpv1uMsgT *) pUlpApi->apiInfo.recvMsgInfo.hMsg;
|
||||
msgType = pMsg->msgType;
|
||||
//pMsg = (NwGtpv1uMsgT *) pUlpApi->apiInfo.recvMsgInfo.hMsg;
|
||||
//msgType = pMsg->msgType;
|
||||
|
||||
if (NW_GTPV1U_OK != nwGtpv1uMsgGetTpdu(pUlpApi->apiInfo.recvMsgInfo.hMsg,
|
||||
buffer, &buffer_len)) {
|
||||
|
||||
@@ -1791,8 +1791,8 @@ int s1ap_eNB_generate_E_RAB_Modification_Indication(
|
||||
S1AP_E_RABToBeModifiedItemBearerModInd_t *E_RAB_ToBeModifiedItem_BearerModInd = NULL;
|
||||
S1AP_E_RABToBeModifiedItemBearerModIndIEs_t *E_RAB_ToBeModifiedItem_BearerModInd_IEs = NULL;
|
||||
|
||||
S1AP_E_RABNotToBeModifiedItemBearerModInd_t *E_RAB_NotToBeModifiedItem_BearerModInd = NULL;
|
||||
S1AP_E_RABNotToBeModifiedItemBearerModIndIEs_t *E_RAB_NotToBeModifiedItem_BearerModInd_IEs = NULL;
|
||||
//S1AP_E_RABNotToBeModifiedItemBearerModInd_t *E_RAB_NotToBeModifiedItem_BearerModInd = NULL;
|
||||
//S1AP_E_RABNotToBeModifiedItemBearerModIndIEs_t *E_RAB_NotToBeModifiedItem_BearerModInd_IEs = NULL;
|
||||
|
||||
|
||||
s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL;
|
||||
@@ -1804,10 +1804,10 @@ int s1ap_eNB_generate_E_RAB_Modification_Indication(
|
||||
DevAssert(e_rab_modification_ind != NULL);
|
||||
|
||||
int num_e_rabs_tobemodified = e_rab_modification_ind->nb_of_e_rabs_tobemodified;
|
||||
int num_e_rabs_nottobemodified = e_rab_modification_ind->nb_of_e_rabs_nottobemodified;
|
||||
//int num_e_rabs_nottobemodified = e_rab_modification_ind->nb_of_e_rabs_nottobemodified;
|
||||
|
||||
uint32_t CSG_id = 0;
|
||||
uint32_t pseudo_gtp_teid = 10;
|
||||
//uint32_t CSG_id = 0;
|
||||
//uint32_t pseudo_gtp_teid = 10;
|
||||
|
||||
if ((ue_context_p = s1ap_eNB_get_ue_context(s1ap_eNB_instance_p,
|
||||
e_rab_modification_ind->eNB_ue_s1ap_id)) == NULL) {
|
||||
|
||||
@@ -476,14 +476,16 @@ static bool flushInput(rfsimulator_state_t *t, int timeout, int nsamps_for_initi
|
||||
b->trashingPacket=true;
|
||||
} else if ( b->lastReceivedTS < b->th.timestamp) {
|
||||
int nbAnt= b->th.nbAnt;
|
||||
|
||||
if ( b->th.timestamp-b->lastReceivedTS < CirSize ) {
|
||||
for (uint64_t index=b->lastReceivedTS; index < b->th.timestamp; index++ ) {
|
||||
for (int a=0; a < nbAnt; a++) {
|
||||
b->circularBuf[(index*nbAnt+a)%CirSize].r = 0;
|
||||
b->circularBuf[(index*nbAnt+a)%CirSize].i = 0;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
memset(b->circularBuf, 0, sampleToByte(CirSize,1));
|
||||
}
|
||||
if (b->lastReceivedTS != 0 && b->th.timestamp-b->lastReceivedTS > 50 )
|
||||
LOG_W(HW,"UEsock: %d gap of: %ld in reception\n", fd, b->th.timestamp-b->lastReceivedTS );
|
||||
b->lastReceivedTS=b->th.timestamp;
|
||||
@@ -646,10 +648,11 @@ int rfsimulator_read(openair0_device *device, openair0_timestamp *ptimestamp, vo
|
||||
);
|
||||
else { // no channel modeling
|
||||
sample_t *out=(sample_t *)samplesVoid[a];
|
||||
|
||||
const int64_t base=t->nextTimestamp*nbAnt+a;
|
||||
for ( int i=0; i < nsamps; i++ ) {
|
||||
out[i].r+=ptr->circularBuf[((t->nextTimestamp+i)*nbAnt+a)%CirSize].r;
|
||||
out[i].i+=ptr->circularBuf[((t->nextTimestamp+i)*nbAnt+a)%CirSize].i;
|
||||
const int idx=(i*nbAnt+base)%CirSize;
|
||||
out[i].r+=ptr->circularBuf[idx].r;
|
||||
out[i].i+=ptr->circularBuf[idx].i;
|
||||
}
|
||||
} // end of no channel modeling
|
||||
} // end for a...
|
||||
|
||||
Reference in New Issue
Block a user