Commit 87a61800 authored by 111's avatar 111

add dmrs data

parent a9c8b1b6
/*
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>
#include "PHY/defs_nr_common.h"
#include <assert.h>
#include <termio.h>
#include <pthread.h>
int scan_keyboard()
{
int in;
struct termios new_settings;
struct termios stored_settings;
tcgetattr(0, &stored_settings); // 读取原始配置信息
new_settings = stored_settings;
new_settings.c_lflag &= (~ICANON); // 屏蔽整行缓存,不需要回车,输入单个字符即可输出
new_settings.c_cc[VTIME] = 0;
new_settings.c_cc[VMIN] = 1;
tcsetattr(0, TCSANOW, &new_settings); // 设置新的配置信息
in = getchar();
tcsetattr(0, TCSANOW, &stored_settings); // 恢复原始配置信息
return in;
}
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;
uint8_t *ta_information;
int ric_send_len;
int shift;
int iSocketFD = 0; //socket句柄
int new_fd = 0; //建立连接后的句柄
int res;
int round_times = 0;//轮数
//定义两个表示线程的变量(标识符)
pthread_t myThread1;
//创建 myThread1 线程
static int start=0;
static int closesocket=0;
#define RIC_INTERFACE_PORT 7788
#define RIC_INTERFACE_SOCKET_MAX_LEN (104+4*273*12*4*2*4)
//#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 *ThreadFun(void *arg)
{
while(1)
{
if (scan_keyboard() == 49)
{
//closesocket = closesocket + 1;
//closesocket = closesocket % 2;
if(round_times == 0)
{
int s=2022;
send(new_fd, &s, 4, 0);
close(iSocketFD);
iSocketFD = -1;
printf("socket关闭!\n");
LOG_W(PHY,"socket关闭!socket关闭!\n");
}
}
}
}
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(closesocket == 0)
{
//开启监听 ,第二个参数是最大监听数
if(0 > listen(iSocketFD, 1))
{
perror("监听失败!\n");
return;
}
//assert(0);
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);
res = pthread_create(&myThread1, NULL, ThreadFun, NULL);
if (res != 0) {
printf("线程创建失败");
return 0;
}
start = 1;//是否传数据
//assert(0);
// iRecvLen = recv(new_fd, buf, sizeof(buf), 0);
// if(0 >= iRecvLen) //对端关闭连接 返回0
// {
// printf("接收失败或者对端关闭连接!\n");
// }else{
// printf("buf: %s\n", buf);
// }
int send_len1;
int send_len2;
int send_len3;
int len2 = OFFSETOF(NR_DMRS_CAPS_t, dmrs_Origion);
int len1 = OFFSETOF(NR_DMRS_CAPS_t, dmrsData);
//FILE * output_fd = NULL;
//output_fd =fopen("/tmp/ul_dmrs_params_new.am","w");
while(closesocket == 0)
{
// 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))
{
// if(output_fd==NULL)
// {
// printf("Error opening\n");
// }
// else
// {
// fwrite(ric_send_buf, sizeof(int32_t), 26, output_fd);
// //printf("writing\n");
// }
send_len1 = send(new_fd, ric_send_buf, ric_send_len-12-(ric_send_len-12-len1)/2, 0);
//printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len-12-(ric_send_len-len1-12)/2, send_len1);
send_len2 = send(new_fd, ric_send_buf + len2, (ric_send_len-len1-12)/2, 0); //pos*4*2
//printf ("send data %p, size %d to client. %d OK \n", ric_send_buf,(ric_send_len-len1-12)/2 , send_len2);
send_len3 = send(new_fd, ta_information, 12, 0);
//printf ("send data %p, size %d to client. %d OK \n", ta_information, ric_send_len, send_len3);
round_times = round_times + 1;
}
else
{
break;
}
// getsockopt(new_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
// if((info.tcpi_state==1))
// {
// send_len2 = send(new_fd, ric_send_buf + OFFSETOF(NR_DMRS_CAPS_t, dmrs_Origion), ric_send_len-OFFSETOF(NR_DMRS_CAPS_t, dmrsData), 0);
// printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len, send_len2);
// }
// else
// {
// break;
// }
// getsockopt(new_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
// if((info.tcpi_state==1))
// {
// send_len2 = send(new_fd, ric_send_buf + OFFSETOF(NR_DMRS_CAPS_t, dmrs_Origion), ric_send_len-OFFSETOF(NR_DMRS_CAPS_t, dmrsData), 0);
// printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len, send_len2);
// }
// else
// {
// break;
// }
}
}
close(iSocketFD);
iSocketFD = -1;
closesocket = 1;
printf("socket关闭!\n");
LOG_E(PHY,"socket关闭!socket关闭!\n");
}
#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 7788 //目标地址端口号 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}; //存储接收到的数据
int *pdata = (int *)buf;
//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");
// if (pdata[1] == 50)
// {
// memcpy(buf_debug, buf, recv_len);
// FILE *fd;
// if ((fd = fopen("pdsch_dmts_data.dat","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
/*
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;
}
else if (recv_len == 32768)
{
recv_len = recv(iSocketFD, &buf[recv_len], RIC_INTERFACE_SOCKET_MAX_LEN, 0);
recv_len += 32768;
}
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_4ant.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
......@@ -11,13 +11,49 @@ used to send PDSCH/PUSCH DMRS to client
#include <netinet/in.h>
#include <netinet/ip.h>
#include <linux/tcp.h>
#include <semaphore.h>
#include <semaphore.h>
#include "PHY/defs_nr_common.h"
#include <assert.h>
#include <termio.h>
#include <pthread.h>
int scan_keyboard()
{
int in;
struct termios new_settings;
struct termios stored_settings;
tcgetattr(0, &stored_settings); // 读取原始配置信息
new_settings = stored_settings;
new_settings.c_lflag &= (~ICANON); // 屏蔽整行缓存,不需要回车,输入单个字符即可输出
new_settings.c_cc[VTIME] = 0;
new_settings.c_cc[VMIN] = 1;
tcsetattr(0, TCSANOW, &new_settings); // 设置新的配置信息
in = getchar();
tcsetattr(0, TCSANOW, &stored_settings); // 恢复原始配置信息
return in;
}
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;
uint8_t *ta_information;
int ric_send_len;
int shift;
int iSocketFD = 0; //socket句柄
int new_fd = 0; //建立连接后的句柄
int res;
int round_times = 0;//轮数
//定义两个表示线程的变量(标识符)
pthread_t myThread1;
//创建 myThread1 线程
static int start=0;
static int closesocket=0;
#define RIC_INTERFACE_PORT 7788
#define RIC_INTERFACE_SOCKET_MAX_LEN (100+4*273*12)*4 //52516
#define RIC_INTERFACE_SOCKET_MAX_LEN (104+4*273*12*4*2*4)
//#define RIC_INTERFACE_SOCKET_MAX_LEN 65536
/*
......@@ -27,12 +63,36 @@ gcc -o ric_s ric-interface.c -DRIC_TEST_SERVER -pthread
#ifdef RIC_TEST_SERVER
void main()
#else
void *ThreadFun(void *arg)
{
while(1)
{
if (scan_keyboard() == 49)
{
//closesocket = closesocket + 1;
//closesocket = closesocket % 2;
if(round_times == 0)
{
int s=2022;
send(new_fd, &s, 4, 0);
close(iSocketFD);
iSocketFD = -1;
printf("socket关闭!\n");
LOG_W(PHY,"socket关闭!socket关闭!\n");
}
}
}
}
void *ric_interface_task(void *args_p)
#endif
{
int iSocketFD = 0; //socket句柄
//int iSocketFD = 0; //socket句柄
int iRecvLen = 0; //接收成功后的返回值
int new_fd = 0; //建立连接后的句柄
//int new_fd = 0; //建立连接后的句柄
char buf[4096] = {0}; //
struct sockaddr_in stLocalAddr = {0}; //本地地址信息结构图,下面有具体的属性赋值
struct sockaddr_in stRemoteAddr = {0}; //对方地址信息
......@@ -65,7 +125,7 @@ void *ric_interface_task(void *args_p)
return;
}
while(1)
while(closesocket == 0)
{
//开启监听 ,第二个参数是最大监听数
......@@ -74,7 +134,7 @@ void *ric_interface_task(void *args_p)
perror("监听失败!\n");
return;
}
//assert(0);
printf("iSocketFD: %d\n", iSocketFD);
//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小
new_fd = accept(iSocketFD, (void *)&stRemoteAddr, &socklen);
......@@ -87,7 +147,16 @@ void *ric_interface_task(void *args_p)
}
printf("new_fd: %d\n", new_fd);
printf("new_fd: %d\n", new_fd);
res = pthread_create(&myThread1, NULL, ThreadFun, NULL);
if (res != 0) {
printf("线程创建失败");
return 0;
}
start = 1;//是否传数据
//assert(0);
// iRecvLen = recv(new_fd, buf, sizeof(buf), 0);
// if(0 >= iRecvLen) //对端关闭连接 返回0
// {
......@@ -95,28 +164,77 @@ void *ric_interface_task(void *args_p)
// }else{
// printf("buf: %s\n", buf);
// }
int send_len;
while(1)
int send_len1;
int send_len2;
int send_len3;
int len2 = OFFSETOF(NR_DMRS_CAPS_t, dmrs_Origion);
int len1 = OFFSETOF(NR_DMRS_CAPS_t, dmrsData);
//FILE * output_fd = NULL;
//output_fd =fopen("/tmp/ul_dmrs_params_new.am","w");
while(closesocket == 0)
{
// printf ("wait for ric_send_sem \n");
#ifdef RIC_TEST_SERVER
usleep(10000);
#else
sem_wait (&ric_send_sem);
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);
// if(output_fd==NULL)
// {
// printf("Error opening\n");
// }
// else
// {
// fwrite(ric_send_buf, sizeof(int32_t), 26, output_fd);
// //printf("writing\n");
// }
send_len1 = send(new_fd, ric_send_buf, ric_send_len-12-(ric_send_len-12-len1)/2, 0);
//printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len-12-(ric_send_len-len1-12)/2, send_len1);
send_len2 = send(new_fd, ric_send_buf + len2, (ric_send_len-len1-12)/2, 0); //pos*4*2
//printf ("send data %p, size %d to client. %d OK \n", ric_send_buf,(ric_send_len-len1-12)/2 , send_len2);
send_len3 = send(new_fd, ta_information, 12, 0);
//printf ("send data %p, size %d to client. %d OK \n", ta_information, ric_send_len, send_len3);
round_times = round_times + 1;
}
else
{
break;
}
// getsockopt(new_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
// if((info.tcpi_state==1))
// {
// send_len2 = send(new_fd, ric_send_buf + OFFSETOF(NR_DMRS_CAPS_t, dmrs_Origion), ric_send_len-OFFSETOF(NR_DMRS_CAPS_t, dmrsData), 0);
// printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len, send_len2);
// }
// else
// {
// break;
// }
// getsockopt(new_fd, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);
// if((info.tcpi_state==1))
// {
// send_len2 = send(new_fd, ric_send_buf + OFFSETOF(NR_DMRS_CAPS_t, dmrs_Origion), ric_send_len-OFFSETOF(NR_DMRS_CAPS_t, dmrsData), 0);
// printf ("send data %p, size %d to client. %d OK \n", ric_send_buf, ric_send_len, send_len2);
// }
// else
// {
// break;
// }
}
}
close(iSocketFD);
iSocketFD = -1;
closesocket = 1;
printf("socket关闭!\n");
LOG_E(PHY,"socket关闭!socket关闭!\n");
}
......@@ -134,7 +252,7 @@ gcc -o ric_c ric-interface.c -DRIC_TEST_CLIENT -pthread
#include <netinet/in.h>
#include <netinet/ip.h>
#define PORT 7789 //目标地址端口号 7788 -- ue 7789 -- NB
#define PORT 7788 //目标地址端口号 7788 -- ue 7789 -- NB
#define ADDR "127.0.0.1" //目标地址IP
void main()
{
......@@ -144,11 +262,9 @@ void main()
struct sockaddr_in stRemoteAddr = {0}; //对端,即目标地址信息
socklen_t socklen = 0;
unsigned char buf[RIC_INTERFACE_SOCKET_MAX_LEN] = {0}; //存储接收到的数据
short *pdata = (int *)buf;
int *pdata = (int *)buf;
static int log_first = 0;
unsigned char buf_debug[RIC_INTERFACE_SOCKET_MAX_LEN] = {0}; //存储接收到的数据
//unsigned char buf_debug[RIC_INTERFACE_SOCKET_MAX_LEN] = {0}; //存储接收到的数据
iSocketFD = socket(AF_INET, SOCK_STREAM, 0); //建立socket
......@@ -181,31 +297,26 @@ void main()
printf("socket ERROR !!! \n\n\n");
return;
}
else if (recv_len == 32768)
{
recv_len = recv(iSocketFD, &buf[recv_len], RIC_INTERFACE_SOCKET_MAX_LEN, 0);
recv_len += 32768;
}
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_4ant.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);
}
// printf("\n\n\n");
// if (pdata[1] == 50)
// {
// memcpy(buf_debug, buf, recv_len);
// FILE *fd;
// if ((fd = fopen("pdsch_dmts_data.dat","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);
// }
}
}
......@@ -216,4 +327,4 @@ void main()
close(iSocketFD);//关闭socket
}
#endif
\ No newline at end of file
#endif
......@@ -15,6 +15,26 @@
#define INVALID_VALUE 255
#define dmrs_caps_max 50
#define dmrs_caps_ue_max 4
#define dmrs_caps_ue_total 200 // dmrs_caps_max * dmrs_caps_ue_max
#define SEND_BY_SOCKET
int g_dmrs_caps_idx = 0;
int g_dmrs_cnt = 0;
int start;
#if defined SEND_BY_SOCKET
NR_DMRS_CAPS_t g_dmrs_caps[2];
extern uint8_t *ric_send_buf;
extern int ric_send_len;
extern sem_t ric_send_sem;
#else
NR_DMRS_CAPS_t g_dmrs_caps[dmrs_caps_ue_total];
int data_total_len = 0;
#endif
int8_t dmrs_cap_flag = 1;
int dmrs_cap_ue_num = 1;
extern int g_ue_access;
void nr_idft(int32_t *z, uint32_t Msc_PUSCH)
{
......@@ -1870,6 +1890,63 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
return(0);
}
unsigned short nr_ulsch_extract_rbs_dmrs(int **rxdataF,
int *rxdataF_ext,
int slot,
unsigned char symbol,
unsigned short start_rb,
unsigned short nb_rb_pdsch,
NR_DL_FRAME_PARMS *frame_parms
)
{
unsigned short k,rb;
unsigned char nushift,j,i,aarx,aatx;
int *rxF,*rxF_ext;
int startK = frame_parms->first_carrier_offset + NR_NB_SC_PER_RB*start_rb;
int upperNum = frame_parms->ofdm_symbol_size-startK;
int lowerNum = 0;
int startK_low = 0;
int slot_offset = 0;
slot_offset = (slot & 0x3) * frame_parms->ofdm_symbol_size * frame_parms->symbols_per_slot;
if (upperNum >= nb_rb_pdsch * 12)
{
upperNum = nb_rb_pdsch * 12;
}
else if (upperNum <= 0)
{
lowerNum = nb_rb_pdsch * 12;
startK_low = 0 - upperNum;
}
else
{
lowerNum = nb_rb_pdsch * 12 - upperNum;
startK_low = 0;
}
LOG_D(PHY, "slot %d, symbol %d, slot offset %d, start_rb %d %d, upperNum %d, lowerNum %d, startK %d, startK_low %d\n",
slot, symbol, slot_offset,start_rb, nb_rb_pdsch, upperNum, lowerNum, startK, startK_low);
for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
rxF_ext = &rxdataF_ext[aarx * (nb_rb_pdsch*12)];
rxF = &rxdataF[aarx][slot_offset + (startK+(symbol*(frame_parms->ofdm_symbol_size)))];
if (upperNum > 0)
memcpy((void*)rxF_ext,(void*)rxF,upperNum*sizeof(*rxF_ext));
if (lowerNum > 0)
{
if (upperNum > 0)
rxF_ext += upperNum;
rxF = &rxdataF[aarx][slot_offset + startK_low + (symbol*(frame_parms->ofdm_symbol_size))];
memcpy((void*)rxF_ext,(void*)rxF,lowerNum*sizeof(*rxF_ext));
}
}//aarx
return(nb_rb_pdsch);
}
//==============================================================================================
/* Main Function */
......@@ -2141,4 +2218,139 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
}
}
} // symbol loop
//杜敬祎修改
#if 1
if ((dmrs_cap_flag > 0) && (g_ue_access <= dmrs_cap_ue_num) && (g_dmrs_caps_idx < g_ue_access * dmrs_caps_max) )
{
int pos = 0;
int symbolExtId = 0;
int symb_pos = 0;
g_dmrs_caps[g_dmrs_caps_idx].msgIdx = g_dmrs_cnt;
g_dmrs_caps[g_dmrs_caps_idx].portMap = 1; // port 0
g_dmrs_caps[g_dmrs_caps_idx].rnti = rel15_ul->rnti;
g_dmrs_caps[g_dmrs_caps_idx].BWPStart = rel15_ul->bwp_start;
g_dmrs_caps[g_dmrs_caps_idx].start_rb = rel15_ul->rb_start;
g_dmrs_caps[g_dmrs_caps_idx].nb_rb = rel15_ul->rb_size;
g_dmrs_caps[g_dmrs_caps_idx].start_symbol = rel15_ul->start_symbol_index;
g_dmrs_caps[g_dmrs_caps_idx].nb_symbols = rel15_ul->nr_of_symbols;
g_dmrs_caps[g_dmrs_caps_idx].antNum = frame_parms->nb_antennas_rx;
g_dmrs_caps[g_dmrs_caps_idx].dmrsConfigType = rel15_ul->dmrs_config_type;
g_dmrs_caps[g_dmrs_caps_idx].n_dmrs_cdm_groups = rel15_ul->num_dmrs_cdm_grps_no_data;
g_dmrs_caps[g_dmrs_caps_idx].slotId = slot;
g_dmrs_caps[g_dmrs_caps_idx].frameId = frame;
g_dmrs_caps[g_dmrs_caps_idx].scid = rel15_ul->scid;
g_dmrs_caps[g_dmrs_caps_idx].nscid = rel15_ul->ul_dmrs_scrambling_id; //gNB->Nid_pusch[rel15_ul->scid];
g_dmrs_caps[g_dmrs_caps_idx].dmrsMap = rel15_ul->ul_dmrs_symb_pos;
int pilot[3280];//by luhan
int jj =0;
for(uint8_t symbol = rel15_ul->start_symbol_index; symbol < (rel15_ul->start_symbol_index + rel15_ul->nr_of_symbols); symbol++) {
if (((rel15_ul->ul_dmrs_symb_pos >> symbol) & 0x01) == 1)
{
nr_ulsch_extract_rbs_dmrs(gNB->common_vars.rxdataF,
&g_dmrs_caps[g_dmrs_caps_idx].dmrsData[pos],
slot,
symbol,
rel15_ul->bwp_start + rel15_ul->rb_start,
rel15_ul->rb_size,
frame_parms);
symbolExtId++;
g_dmrs_caps[g_dmrs_caps_idx].dmrs_pos[symb_pos++] = symbol;
pos += (12 * rel15_ul->rb_size * frame_parms->nb_antennas_rx);
//by luhan
//dmrs_len的长度保持与 g_dmrs_caps.dmrsData的长度一致;但实际上两者有效数据长度不一样;
/* 举例:假设rb_num = 5, 天线数为2,g_dmrs_caps_dmrsData的长度为12 * 5 *2 = 120(由于
在type=0时,dmrs和数据间隔放置,所有有效dmrs为60个);而此时,dmrs_len= 30,这是由于
只计算了一个天线上的dmrs。
*/
int dmrs_len = (12 * rel15_ul->rb_size * frame_parms->nb_antennas_rx) ;
//nr_pusch_dmrs_rx 该函数是生成dmrs的函数,dmrs由slot、rb位置个数、天线配置等参数影响
nr_pusch_dmrs_rx(gNB, slot, gNB->nr_gold_pusch_dmrs[rel15_ul->scid][slot][symbol], &g_dmrs_caps[g_dmrs_caps_idx].dmrs_Origion[0] + dmrs_len * jj, 1000, 0, rel15_ul->rb_size,
(rel15_ul->bwp_start + rel15_ul->rb_start)*NR_NB_SC_PER_RB, rel15_ul->dmrs_config_type);
//memcpy(&g_dmrs_caps[g_dmrs_caps_idx].dmrs_Origion[0] + dmrs_len * jj, &pilot[0], dmrs_len * 4);
//jj = jj + 1;
// if (save_gen_dmrsnew == NULL){
// save_gen_dmrsnew = fopen("/tmp/save_gen_dmrsnew.hex","w");
// }
// fwrite(&g_dmrs_caps[g_dmrs_caps_idx].dmrs_Origion[0]+ dmrs_len * jj,4, dmrs_len, save_gen_dmrsnew);
// fflush(save_gen_dmrsnew);
jj = jj + 1;
//将生成的dmrs打印出来
#if 0
printf("current slot is %d, symbol is %d, number of rb is %d, start rb is %d \n", slot, symbol, rel15_ul->rb_size, rel15_ul->rb_start);
for( int xy = 0; xy < dmrs_len;xy ++){
printf(" %d+j*%d ", * (short*)(pilot + xy), *((short*)(pilot + xy)+1));
}
printf("\n --------------------!\n");
#endif
}
}
g_dmrs_caps[g_dmrs_caps_idx].DmrsNum = symbolExtId;
g_dmrs_caps[g_dmrs_caps_idx].dmrsDataLen = pos;
//memcpy(&g_dmrs_caps[g_dmrs_caps_idx].dmrsData[0] + pos, &g_dmrs_caps[g_dmrs_caps_idx].dmrs_Origion[0], pos * 4);
#if defined SEND_BY_SOCKET
ric_send_buf = &g_dmrs_caps[g_dmrs_caps_idx];
ric_send_len = OFFSETOF(NR_DMRS_CAPS_t, dmrsData) + pos * 4 * 2 + 12;//长度
g_dmrs_caps[g_dmrs_caps_idx].dataLen = ric_send_len;
if(start == 1)
{
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++;
g_dmrs_caps_idx = (g_dmrs_caps_idx+1) % 2;
#else
g_dmrs_caps[g_dmrs_caps_idx].dataLen = OFFSETOF(NR_DMRS_CAPS_t, dmrsData) + pos * 4;
data_total_len += OFFSETOF(NR_DMRS_CAPS_t, dmrsData)/4 + pos;
g_dmrs_cnt++;
g_dmrs_caps_idx++;
if (g_dmrs_caps_idx >= dmrs_cap_ue_num * dmrs_caps_max)
{
FILE * output_fd = NULL;
LOG_I(PHY, "dmrs_cap_ue_num %d, g_ue_access %d\n",dmrs_cap_ue_num, g_ue_access);
output_fd =fopen("/tmp/ul_dmrs_params.am","w");
if(output_fd==NULL)
{
printf("Error opening\n");
}
else
{
int ii;
for (ii = 0; ii < g_dmrs_caps_idx; ii++)
fwrite(&g_dmrs_caps[ii], sizeof(int32_t), OFFSETOF(NR_DMRS_CAPS_t, dmrsData)/4, output_fd);
fclose(output_fd);
}
output_fd = NULL;
output_fd =fopen("/tmp/ul_dmrs_data.am","w");
if(output_fd==NULL)
{
printf("Error opening\n");
}
else
{
int ii;
for (ii = 0; ii < g_dmrs_caps_idx; ii++)
fwrite(&g_dmrs_caps[ii].dmrsData[0], sizeof(int32_t), g_dmrs_caps[ii].dmrsDataLen, output_fd);
fclose(output_fd);
}
}
#endif
}
#endif
//杜敬祎修改
}
......@@ -45,8 +45,8 @@
//#define SRS_DEBUG
#define SEND_BY_SOCKET
int g_dmrs_caps_idx = 0;
int g_dmrs_cnt = 0;
int g_srs_caps_idx = 0;
int g_srs_cnt = 0;
nr_srs_cap_t g_srs_caps[2];
#if defined SEND_BY_SOCKET
......@@ -210,7 +210,7 @@ int nr_cap_srs_signal(PHY_VARS_gNB *gNB,
const uint16_t n_symbols = (slot&3)*frame_parms->symbols_per_slot; // number of symbols until this slot
const uint8_t l0 = frame_parms->symbols_per_slot - 1 - srs_config_pdu->time_start_position; // starting symbol in this slot
const uint64_t symbol_offset = (n_symbols+l0)*frame_parms->ofdm_symbol_size;
nr_srs_cap_t *ns_srs_cap = (nr_srs_cap_t *)&g_srs_caps[g_dmrs_caps_idx];
nr_srs_cap_t *ns_srs_cap = (nr_srs_cap_t *)&g_srs_caps[g_srs_caps_idx];
ns_srs_cap->num_ant_ports = srs_config_pdu->num_ant_ports;
ns_srs_cap->num_symbols = srs_config_pdu->num_symbols;
ns_srs_cap->num_repetitions = srs_config_pdu->num_repetitions;
......@@ -264,7 +264,7 @@ int nr_cap_srs_signal(PHY_VARS_gNB *gNB,
ric_send_len = 40*2+273*12*ant_num*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++;
g_srs_cnt++;
#else
FILE *output_fd = NULL;
......@@ -280,6 +280,6 @@ int nr_cap_srs_signal(PHY_VARS_gNB *gNB,
}
#endif
g_dmrs_caps_idx = (g_dmrs_caps_idx+1) % 2;
g_srs_caps_idx = (g_srs_caps_idx+1) % 2;
}
\ No newline at end of file
......@@ -109,6 +109,8 @@
#define NR_NB_NSCID 2
#define OFFSETOF(struct_name,member_name) (int)&(((struct_name*)0)->member_name)
extern const uint8_t nr_rv_round_map[4];
static inline
......@@ -400,6 +402,40 @@ typedef struct {
} nr_srs_cap_t;
typedef struct {
int32_t dataLen;
int32_t msgIdx;
int32_t frameId;
int32_t slotId;
int32_t antNum;
int32_t portId;
int32_t rnti;
int32_t rnti_type;
int32_t scid;
int32_t nscid;
int32_t BWPStart;
int32_t start_rb;
int32_t nb_rb;
/// Number of Symbols
int32_t nb_symbols;
int32_t start_symbol;
/// DMRS symbol positions
int32_t DmrsNum;
/// DMRS Configuration Type
int32_t dmrsConfigType;
// Number of DMRS CDM groups with no data
int32_t n_dmrs_cdm_groups;
int32_t dmrsMap;
int32_t portMap;
int32_t dmrsDataLen;
int32_t pad;
int32_t dmrs_pos[4];
int32_t dmrsData[4*273*12*4];
int32_t dmrs_Origion[4*273*12*4];
/// Starting Symbol number
}NR_DMRS_CAPS_t;
// rel16 prs k_prime table as per ts138.211 sec.7.4.1.7.2
#define K_PRIME_TABLE_ROW_SIZE 4
#define K_PRIME_TABLE_COL_SIZE 12
......
......@@ -54,6 +54,10 @@ uint8_t DELTA[4]= {2,3,4,6};
#define MAX_NUMBER_OF_SSB 64
float ssb_per_rach_occasion[8] = {0.125,0.25,0.5,1,2,4,8};
//杜敬祎修改
int g_ue_access = 0;
//杜敬祎修改
int16_t ssb_index_from_prach(module_id_t module_idP,
frame_t frameP,
sub_frame_t slotP,
......@@ -1865,6 +1869,9 @@ void nr_check_Msg4_Ack(module_id_t module_id, int CC_id, frame_t frame, sub_fram
sched_ctrl->rrc_processing_timer = (delay_ms << ra->DL_BWP.scs);
LOG_I(NR_MAC, "(%d.%d) Activating RRC processing timer for UE %04x with %d ms\n", frame, slot, UE->rnti, delay_ms);
//杜敬祎修改
g_ue_access++;
//杜敬祎修改
} else {
LOG_I(NR_MAC, "(ue rnti 0x%04x) RA Procedure failed at Msg4!\n", ra->rnti);
}
......
......@@ -1554,7 +1554,7 @@ void pf_ul(module_id_t module_id,
gNB_MAC_INST *nrmac = RC.nrmac[module_id];
NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[CC_id].ServingCellConfigCommon;
const int min_rb = 5;
const int min_rb = 90;
// UEs that could be scheduled
UEsched_t UE_sched[MAX_MOBILES_PER_GNB] = {0};
int remainUEs = max_num_ue;
......
......@@ -49,10 +49,10 @@ gNBs =
# downlinkConfigCommon
#frequencyInfoDL
# this is 3300.24 + 134*12*30e3 = 3348.48 MHz (5G NR GSCN: 7741)
absoluteFrequencySSB = 623232; #652608;
absoluteFrequencySSB = 623232; #623232; #652608;
dl_frequencyBand = 78;
# this is 3300.24 MHz
dl_absoluteFrequencyPointA = 620016; #651280;
dl_absoluteFrequencyPointA = 620016; #620016; #651280;
#scs-SpecificCarrierList
dl_offstToCarrier = 0;
# subcarrierSpacing
......@@ -95,7 +95,7 @@ gNBs =
prach_msg1_FDM = 0;
prach_msg1_FrequencyStart = 0;
zeroCorrelationZoneConfig = 12;
preambleReceivedTargetPower = -90;
preambleReceivedTargetPower = -80;
#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
preambleTransMax = 6;
#powerRampingStep
......@@ -125,14 +125,14 @@ gNBs =
restrictedSetConfig = 0,
msg3_DeltaPreamble = 1;
p0_NominalWithGrant =-90;
p0_NominalWithGrant =-80;
# pucch-ConfigCommon setup :
# pucchGroupHopping
# 0 = neither, 1= group hopping, 2=sequence hopping
pucchGroupHopping = 0;
hoppingId = 40;
p0_nominal = -70;
p0_nominal = -80;
# ssb_PositionsInBurs_BitmapPR
# 1=short, 2=medium, 3=long
ssb_PositionsInBurst_PR = 2;
......@@ -238,8 +238,8 @@ MACRLCs = (
num_cc = 1;
tr_s_preference = "local_L1";
tr_n_preference = "local_RRC";
pusch_TargetSNRx10 = 250;
pucch_TargetSNRx10 = 300;
pusch_TargetSNRx10 = 300;
pucch_TargetSNRx10 = 250;
pusch_FailureThres = 1000;
ulsch_max_frame_inactivity = 0;
}
......@@ -259,12 +259,12 @@ RUs = (
local_rf = "yes"
nb_tx = 1;
nb_rx = 4;
att_tx = 85;
att_tx = 89;
att_rx = 0;
bands = [78];
num_tp_cores = 8;
max_pdschReferenceSignalPower = -27;
max_rxgain = 15;
max_rxgain = 55;
eNB_instances = [0];
##beamforming 1x2 matrix: 1 layer x 2 antennas
#bf_weights = [0x00007fff, 0x0000];
......
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