Commit e4ed054c authored by 111's avatar 111

add ric and changes for 4rx

parent 2e36b896
......@@ -2430,6 +2430,7 @@ add_executable(nr-softmodem
${OPENAIR_DIR}/executables/nr-ru.c
${OPENAIR_DIR}/executables/nr-softmodem.c
${OPENAIR_DIR}/executables/softmodem-common.c
${OPENAIR_DIR}/executables/ric-interface.c
${OPENAIR_DIR}/radio/COMMON/common_lib.c
${OPENAIR_DIR}/radio/COMMON/record_player.c
${OPENAIR2_DIR}/RRC/NAS/nas_config.c
......
......@@ -403,7 +403,7 @@ void *tx_reorder_thread(void* param) {
if (resL1Reserve) {
resL1=resL1Reserve;
if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot) {
LOG_E(PHY,"order mistake\n");
LOG_E(PHY,"order mistakeslot %d %d\n", ((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot, next_tx_slot);
resL1Reserve = NULL;
resL1 = pullTpool(&gNB->L1_tx_out, &gNB->threadPool);
}
......@@ -415,7 +415,7 @@ void *tx_reorder_thread(void* param) {
resL1Reserve = resL1;
resL1 = pullTpool(&gNB->L1_tx_out, &gNB->threadPool);
if (((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot != next_tx_slot)
LOG_E(PHY,"error, pull two msg, none is good\n");
LOG_E(PHY,"error, pull two msg, none is good, slot %d %d\n", ((processingData_L1tx_t *)NotifiedFifoData(resL1))->slot, next_tx_slot);
}
}
if (resL1 == NULL)
......
This diff is collapsed.
......@@ -154,4 +154,5 @@ extern int emulate_rf;
extern int numerology;
extern int usrp_tx_thread;
extern void *ric_interface_task(void *args_p);
#endif
......@@ -151,6 +151,8 @@ int otg_enabled;
uint32_t timing_advance = 0;
uint64_t num_missed_slots=0; // counter for the number of missed slots
extern sem_t ric_send_sem;
#include <executables/split_headers.h>
#include <SIMULATION/ETH_TRANSPORT/proto.h>
......@@ -577,6 +579,15 @@ int main( int argc, char **argv ) {
#endif
LOG_I(HW, "Version: %s\n", PACKAGE_VERSION);
sem_init(&ric_send_sem,0,0);
pthread_t ntid;
int gnb_flag = 1;
if (pthread_create(&ntid, NULL, ric_interface_task, &gnb_flag) < 0) {
fprintf(stderr, "ric_interface_task: Failed to create thread: %s\n",
strerror(errno));
exit;
}
if (RC.nb_nr_L1_inst > 0)
RCconfig_NR_L1();
......
/*
OpenXG RIC socket server
used to send PDSCH/PUSCH DMRS to client
*/
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <linux/tcp.h>
#include <semaphore.h>
sem_t ric_send_sem;
//uint8_t ric_test_data[]={0,1,2,3,4,5,6,7,8,9};
uint8_t *ric_send_buf;
int ric_send_len;
#define RIC_INTERFACE_PORT 7788
#define RIC_INTERFACE_SOCKET_MAX_LEN (100+4*273*12)*4 //52516
//#define RIC_INTERFACE_SOCKET_MAX_LEN 65536
/*
gcc -o ric_s ric-interface.c -DRIC_TEST_SERVER -pthread
*/
#ifdef RIC_TEST_SERVER
void main()
#else
void *ric_interface_task(void *args_p)
#endif
{
int iSocketFD = 0; //socket句柄
int iRecvLen = 0; //接收成功后的返回值
int new_fd = 0; //建立连接后的句柄
char buf[4096] = {0}; //
struct sockaddr_in stLocalAddr = {0}; //本地地址信息结构图,下面有具体的属性赋值
struct sockaddr_in stRemoteAddr = {0}; //对方地址信息
socklen_t socklen = 0;
#ifdef RIC_TEST_SERVER
int gnb_flag = 0;
ric_send_buf = malloc(RIC_INTERFACE_SOCKET_MAX_LEN);
ric_send_buf[0] = 0x1E;
ric_send_buf[10] = 0x20;
ric_send_len = RIC_INTERFACE_SOCKET_MAX_LEN;
#else
int gnb_flag = *(int*)args_p;
#endif
iSocketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
if(0 > iSocketFD)
{
perror("创建socket失败!\n");
return;
}
stLocalAddr.sin_family = AF_INET; /*该属性表示接收本机或其他机器传输*/
stLocalAddr.sin_port = htons(RIC_INTERFACE_PORT+gnb_flag); /*端口号*/
stLocalAddr.sin_addr.s_addr=htonl(INADDR_ANY); /*IP,括号内容表示本机IP*/
//绑定地址结构体和socket
if(0 > bind(iSocketFD, (void *)&stLocalAddr, sizeof(stLocalAddr)))
{
printf("绑定失败!gnb_flag %d\n", gnb_flag);
perror("绑定失败!");
return;
}
while(1)
{
//开启监听 ,第二个参数是最大监听数
if(0 > listen(iSocketFD, 1))
{
perror("监听失败!\n");
return;
}
printf("iSocketFD: %d\n", iSocketFD);
//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小
new_fd = accept(iSocketFD, (void *)&stRemoteAddr, &socklen);
if(0 > new_fd)
{
perror("接收失败!\n");
return;
}else{
printf("接收成功!\n");
}
printf("new_fd: %d\n", new_fd);
// iRecvLen = recv(new_fd, buf, sizeof(buf), 0);
// if(0 >= iRecvLen) //对端关闭连接 返回0
// {
// printf("接收失败或者对端关闭连接!\n");
// }else{
// printf("buf: %s\n", buf);
// }
int send_len;
while(1)
{
// printf ("wait for ric_send_sem \n");
#ifdef RIC_TEST_SERVER
usleep(10000);
#else
sem_wait (&ric_send_sem);
#endif
struct tcp_info info;
int len=sizeof(info);
getsockopt(new_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
if((info.tcpi_state==1))
{
send_len = send(new_fd, ric_send_buf, ric_send_len, 0);
printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len, send_len);
}
else
break;
}
}
}
#ifdef RIC_TEST_CLIENT
/*
gcc -o ric_c ric-interface.c -DRIC_TEST_CLIENT -pthread
*/
#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#define PORT 7789 //目标地址端口号 7788 -- ue 7789 -- NB
#define ADDR "127.0.0.1" //目标地址IP
void main()
{
int iSocketFD = 0; //socket句柄
unsigned int iRemoteAddr = 0;
struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息
socklen_t socklen = 0;
unsigned char buf[RIC_INTERFACE_SOCKET_MAX_LEN] = {0}; //存储接收到的数据
short *pdata = (int *)buf;
static int log_first = 0;
unsigned char buf_debug[RIC_INTERFACE_SOCKET_MAX_LEN] = {0}; //存储接收到的数据
iSocketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
if(0 > iSocketFD)
{
printf("创建socket失败!\n");
return;
}
stRemoteAddr.sin_family = AF_INET;
stRemoteAddr.sin_port = htons(PORT);
inet_pton(AF_INET, ADDR, &iRemoteAddr);
stRemoteAddr.sin_addr.s_addr=iRemoteAddr;
//连接方法: 传入句柄,目标地址,和大小
while (1)
{
if(0 > connect(iSocketFD, (void *)&stRemoteAddr, sizeof(stRemoteAddr)))
{
printf("连接失败!\n");
//printf("connect failed:%d",errno);//失败时也可打印errno
}else{
printf("连接成功!\n");
int recv_len;
while(1)
{
recv_len = recv(iSocketFD, buf, RIC_INTERFACE_SOCKET_MAX_LEN, 0);
if (0 == recv_len)
{
printf("socket ERROR !!! \n\n\n");
return;
}
printf("Received(%d):, msg len %d, cnt %d\n", recv_len, pdata[0], pdata[1]);
// for(int i=0;i<20;i++)
// {
// printf("%02x ",buf[i]);
// }
//printf("\n\n\n");
log_first++;
if (log_first == 1)
{
memcpy(buf_debug, buf, recv_len);
FILE *fd;
if ((fd = fopen("srs_data.am","w")) != NULL) {
fwrite((void *)buf_debug,
sizeof(int32_t),
recv_len/4,
fd);
printf("Dummping Frame ...len %d bye bye \n", recv_len);
fclose(fd);
}
}
}
}
sleep(2);
}
close(iSocketFD);//关闭socket
}
#endif
\ No newline at end of file
......@@ -289,6 +289,7 @@ extern int oai_exit;
void tx_func(void *param);
void rx_func(void *param);
void ru_tx_func(void *param);
void ru_rx_func(void *param);
extern uint8_t nfapi_mode;
extern int16_t vnf_pnf_sfnslot_delta;
#ifdef __cplusplus
......
......@@ -384,8 +384,8 @@ void rx_nr_prach_ru(RU_t *ru,
k*=K;
k+=kbar;
for (int aa=0; aa<ru->nb_rx; aa++) {
//for (int aa=0; aa<ru->nb_rx; aa++) {
for (int aa=0; aa<1; aa++) {
AssertFatal(prach[aa]!=NULL,"prach[%d] is null\n",aa);
// do DFT
......@@ -462,6 +462,7 @@ void rx_nr_prach(PHY_VARS_gNB *gNB,
fp = &gNB->frame_parms;
nb_rx = gNB->gNB_config.carrier_config.num_rx_ant.value;
nb_rx = 1;
rootSequenceIndex = cfg->num_prach_fd_occasions_list[prach_pdu->num_ra].prach_root_sequence_index.value;
numrootSequenceIndex = cfg->num_prach_fd_occasions_list[prach_pdu->num_ra].num_root_sequences.value;
NCS = prach_pdu->num_cs;//cfg->num_prach_fd_occasions_list[0].prach_zero_corr_conf.value;
......
......@@ -43,15 +43,17 @@
#include "T.h"
//#define SRS_DEBUG
#define SEND_BY_SOCKET
int g_dmrs_caps_idx = 0;
int g_dmrs_cnt = 0;
//#if defined SEND_BY_SOCKET
nr_srs_cap_t g_srs_caps[2];
// extern uint8_t *ric_send_buf;
// extern int ric_send_len;
// extern sem_t ric_send_sem;
//#endif
nr_srs_cap_t g_srs_caps[2];
#if defined SEND_BY_SOCKET
extern uint8_t *ric_send_buf;
extern int ric_send_len;
extern sem_t ric_send_sem;
#endif
......@@ -252,6 +254,14 @@ int nr_cap_srs_signal(PHY_VARS_gNB *gNB,
}
}
#ifdef SEND_BY_SOCKET
ric_send_buf = ns_srs_cap;
ric_send_len = 40*2+273*12*frame_parms->nb_antennas_rx*N_symb_SRS*4;//for test
sem_post(&ric_send_sem);
//LOG_I(PHY,"sem_post(&ric_send_sem) buf %p, size %d pos %d \n\n\n",ric_send_buf,ric_send_len, pos);
g_dmrs_cnt++;
#else
FILE *output_fd = NULL;
output_fd = fopen("srs_data.am","w");
if (output_fd==NULL){
......@@ -263,6 +273,8 @@ int nr_cap_srs_signal(PHY_VARS_gNB *gNB,
fwrite(&(ns_srs_cap->num_ant_ports),sizeof(int16_t),38+273*12*frame_parms->nb_antennas_rx*N_symb_SRS*2,output_fd);
fclose(output_fd);
}
g_dmrs_caps_idx++;
#endif
g_dmrs_caps_idx = (g_dmrs_caps_idx+1) % 2;
}
\ No newline at end of file
......@@ -175,6 +175,7 @@ typedef struct {
struct RU_t_s *ru;
int startSymbol;
int endSymbol;
int frame;
int slot;
} feprx_cmd_t;
......@@ -254,7 +255,7 @@ typedef struct RU_proc_t_s {
/// pthread structure for RU FH processing thread
pthread_t pthread_FH;
pthread_t pthread_FH1;
/// pthread structure for RU control thread
/// pthread structure for RU control thread
pthread_t pthread_ctrl;
/// pthread structure for RU prach processing thread
pthread_t pthread_prach;
......@@ -649,6 +650,7 @@ typedef struct RU_t_s {
notifiedFIFO_t *respfeprx;
/// to signal end of feptx
notifiedFIFO_t *respfeptx;
notifiedFIFO_t *resprurx;
/// core id for RX fhaul (IF5 ECPRI)
int rxfh_core_id;
/// core id for RX fhaul (IF5 ECPRI)
......
......@@ -374,6 +374,8 @@ typedef struct {
} prs_meas_t;
typedef struct {
uint16_t frame;
uint16_t slot;
uint16_t num_ant_ports; // Number of antenna ports N_SRS_ap [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 port, 1 = 2 ports, 2 = 4 ports
uint16_t num_symbols; // Number of symbols N_SRS_symb [3GPP TS 38.211, Sec 6.4.1.4.1], Value: 0 = 1 symbol, 1 = 2 symbols, 2 = 4 symbols
uint16_t num_repetitions; // Repetition factor R [3GPP TS 38.211, Sec 6.4.1.4.3], Value: 0 = 1, 1 = 2, 2 = 4
......
......@@ -880,7 +880,8 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
generate_srs_nr(srs_pdu, frame_parms, gNB->nr_srs_info[i]->srs_generated_signal, 0, gNB->nr_srs_info[i], AMP, frame_rx, slot_rx);
int srs_est = nr_get_srs_signal(gNB, frame_rx, slot_rx, srs_pdu, gNB->nr_srs_info[i], srs_received_signal);
static int log_first = 0;
if ((log_first == 0) && ((1<<srs_pdu->num_ant_ports)== 2))
//if ((log_first == 0) && ((1<<srs_pdu->num_ant_ports)== 2))
if (log_first == 0)
{
nr_cap_srs_signal(gNB, frame_rx, slot_rx, srs_pdu, gNB->nr_srs_info[i]);
log_first++;
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment