2x2 20 and 50 MHz tested with AW2S Jaguar with new FW and NR configurations

This commit is contained in:
Raymond Knopp
2022-05-01 13:10:04 +02:00
parent 05cdd1b4da
commit fc0396f9f4
5 changed files with 75 additions and 39 deletions
+26 -9
View File
@@ -37,6 +37,7 @@
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <linux/filter.h>
#include <net/if.h>
#include <netinet/ether.h>
#include <unistd.h>
@@ -151,6 +152,22 @@ int eth_socket_init_udp(openair0_device *device) {
printf("ETHERNET: Cannot set SO_REUSEPORT option on socket (user %d)",i);
exit(0);
}
#ifdef SO_ATTACH_REUSEPORT_EBPF
struct sock_filter code[]={
{ BPF_LD | BPF_W | BPF_ABS, 0, 0, SKF_AD_OFF + SKF_AD_CPU },
/* return A */
{ BPF_RET | BPF_A, 0, 0, 0 },
};
struct sock_fprog bpf = {
.len = sizeof(code)/sizeof(struct sock_filter),
.filter = code,
};
if (i==0 && setsockopt(eth->sockfdd[i], SOL_SOCKET, SO_ATTACH_REUSEPORT_CBPF, &bpf, sizeof(bpf))) {
printf("ETHERNET: Cannot set SO_ATTACH_REUSEPORT_EBPF option on socket (user %d)",i);
exit(0);
}
#endif
}
/* want to receive -> so bind */
@@ -277,6 +294,7 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
int bytes_sent=0;
eth_state_t *eth = (eth_state_t*)device->priv;
int sendto_flag =0;
fhstate_t *fhstate = &device->fhstate;
//sendto_flag|=flags;
eth->tx_nsamps=nsamps;
@@ -321,8 +339,9 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
/* buff[i] points to the position in tx buffer where the payload to be sent is
buff2 points to the position in tx buffer where the packet header will be placed */
void *buff2 = ((void*)buff_tx2)- APP_HEADER_SIZE_BYTES;
openair0_timestamp TS = timestamp + fhstate->TS0;
TS = 6*device->sampling_rate_ratio_d*(TS/device->sampling_rate_ratio_n);
TS -= device->txrx_offset;
bytes_sent = 0;
@@ -338,7 +357,7 @@ int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, voi
// ECPRI PC_ID (2 bytes)
*(uint16_t *)(buff2 + 4) = cc;
// OAI modified SEQ_ID (4 bytes)
*(uint64_t *)(buff2 + 6) = ((uint64_t )timestamp)*6;
*(uint64_t *)(buff2 + 6) = TS;
/*
printf("ECPRI TX (REV %x, MessType %d, Payload size %d, PC_ID %d, TS %llu\n",
@@ -408,7 +427,7 @@ void *udp_read_thread(void *arg) {
char buffer[UDP_PACKET_SIZE_BYTES(256)];
while (oai_exit == 0) {
printf("UDP read thread %d, waiting for start\n",u->thread_id);
LOG_I(PHY,"UDP read thread %d, waiting for start sampling_rate_d %d, sampling_rate_n %d\n",u->thread_id,device->sampling_rate_ratio_n,device->sampling_rate_ratio_d);
while (fhstate->active > 0) {
size_t count = recvfrom(((eth_state_t*)device->priv)->sockfdd[u->thread_id],
buffer,sizeof(buffer),0,
@@ -417,9 +436,8 @@ void *udp_read_thread(void *arg) {
aid = *(uint16_t*)(&buffer[ECPRICOMMON_BYTES]);
TS = *(openair0_timestamp *)(&buffer[ECPRICOMMON_BYTES+ECPRIPCID_BYTES]);
// convert TS to samples, /6 for AW2S @ 30.72 Ms/s, this is converted for other sample rates in OAI application
TS = device->sampling_rate_ratio_n*(TS/device->sampling_rate_ratio_d/6);
printf("udp_thread_id %d count %d, aid %d, TS %llu\n",u->thread_id,count,aid,(unsigned long long)TS);
if (count <= 0) { printf("problem in recvfrom\n"); exit(-1); }
TS = device->sampling_rate_ratio_n*(TS/(device->sampling_rate_ratio_d*6));
if ((int)count <= 0) continue;
AssertFatal(aid < 8,"Cannot handle more than 8 antennas, got aid %d\n",aid);
fhstate->r[aid]=1;
if (aid==0 && fhstate->TS[0] == 0) fhstate->TS0 = TS;
@@ -428,7 +446,6 @@ void *udp_read_thread(void *arg) {
int64_t offset = TS - fhstate->TS0;
if (offset > 0) offset = offset % device->openair0_cfg->rxsize;
else offset = TS % device->openair0_cfg->rxsize + ((((uint64_t)1)<<63)-(fhstate->TS0-1)) % device->openair0_cfg->rxsize;
printf("udp_thread_id %d aid %d, TS %llu, TS0 %llu, offset %d, size %d\n",u->thread_id,aid,(unsigned long long)TS,fhstate->TS0,offset,device->openair0_cfg->rxsize);
// need to do memcpy since there is no guarantee that aid is the same each time, otherwise we could have used
// zero-copy and corrected the header component.
memcpy((void*)(device->openair0_cfg->rxbase[aid]+offset),
@@ -453,7 +470,7 @@ int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, uin
min_TS = fhstate->TS[0];
for (int i=1;i<device->openair0_cfg->rx_num_channels;i++) min_TS = min(min_TS,fhstate->TS[i]);
// poll/sleep until we accumulated enough samples on each antenna port
while (min_TS < prev_read_TS + nsamps) {
while (min_TS < fhstate->TS0+prev_read_TS + nsamps) {
usleep(100);
min_TS = fhstate->TS[0];
for (int i=1;i<device->openair0_cfg->rx_num_channels;i++) min_TS = min(min_TS,fhstate->TS[i]);
@@ -76,16 +76,40 @@ int trx_eth_start(openair0_device *device)
device->sampling_rate_ratio_n=1;
device->sampling_rate_ratio_d=1;
if (device->openair0_cfg->nr_flag==1) { // This check if RRU knows about NR numerologies
if (device->openair0_cfg->num_rb_dl <= 162 && device->openair0_cfg->num_rb_dl > 106) device->sampling_rate_ratio_n = 2;
else if (device->openair0_cfg->num_rb_dl <= 106 && device->openair0_cfg->num_rb_dl > 51) {device->sampling_rate_ratio_d=3;device->sampling_rate_ratio_n=4;}
else if (device->openair0_cfg->num_rb_dl == 51) {device->sampling_rate_ratio_n=1;device->sampling_rate_ratio_d=1;}
if (device->openair0_cfg->num_rb_dl <= 162 && device->openair0_cfg->num_rb_dl > 106) {
device->sampling_rate_ratio_n = 2;
device->txrx_offset=5500;
}
else if (device->openair0_cfg->num_rb_dl <= 106 && device->openair0_cfg->num_rb_dl > 51) {
device->sampling_rate_ratio_d=3;
device->sampling_rate_ratio_n=4;
device->txrx_offset=3750;
}
else if (device->openair0_cfg->num_rb_dl == 51) {
device->sampling_rate_ratio_n=1;
device->sampling_rate_ratio_d=1;
device->txrx_offset=7500;
}
else AssertFatal(1==0,"num_rb_dl %d not ok with ECPRI\n",device->openair0_cfg->num_rb_dl);
}
else {
if (device->openair0_cfg->num_rb_dl == 100 || device->openair0_cfg->num_rb_dl == 51) device->sampling_rate_ratio_d = 1;
else if (device->openair0_cfg->num_rb_dl == 75) {device->sampling_rate_ratio_d = 4; device->sampling_rate_ratio_n=3;}
else if (device->openair0_cfg->num_rb_dl == 50) device->sampling_rate_ratio_d = 2;
else if (device->openair0_cfg->num_rb_dl == 25) device->sampling_rate_ratio_d = 4;
if (device->openair0_cfg->num_rb_dl == 100 || device->openair0_cfg->num_rb_dl == 51) {
device->sampling_rate_ratio_d = 1;
device->txrx_offset=7500;
}
else if (device->openair0_cfg->num_rb_dl == 75) {
device->sampling_rate_ratio_d = 4;
device->sampling_rate_ratio_n=3;
device->txrx_offset=7500;
}
else if (device->openair0_cfg->num_rb_dl == 50) {
device->sampling_rate_ratio_d = 2;
device->txrx_offset=7500;
}
else if (device->openair0_cfg->num_rb_dl == 25) {
device->sampling_rate_ratio_d = 4;
device->txrx_offset=7500;
}
else AssertFatal(1==0,"num_rb_dl %d not ok with ECPRI\n",device->openair0_cfg->num_rb_dl);
}
}
@@ -478,6 +502,7 @@ int transport_init(openair0_device *device,
device->trx_ctlsend_func = trx_eth_ctlsend_udp;
device->trx_ctlrecv_func = trx_eth_ctlrecv_udp;
memset((void*)&device->fhstate,0,sizeof(device->fhstate));
for (int i=openair0_cfg->rx_num_channels;i<8;i++) device->fhstate.r[i] = 1;
} else if (eth->flags == ETH_RAW_IF4p5_MODE) {
device->trx_write_func = trx_eth_write_raw_IF4p5;
device->trx_read_func = trx_eth_read_raw_IF4p5;