150 lines
3.3 KiB
C
150 lines
3.3 KiB
C
/*
|
|
Author: Laurent THOMAS, Open Cells
|
|
copyleft: OpenAirInterface Software Alliance and it's licence
|
|
*/
|
|
|
|
#include <common/utils/simple_executable.h>
|
|
|
|
volatile int oai_exit = 0;
|
|
|
|
void fullwrite(int fd, void *_buf, int count) {
|
|
char *buf = _buf;
|
|
int l;
|
|
|
|
while (count) {
|
|
l = write(fd, buf, count);
|
|
|
|
if (l <= 0) {
|
|
if (errno==EINTR)
|
|
continue;
|
|
|
|
if(errno==EAGAIN) {
|
|
continue;
|
|
} else {
|
|
AssertFatal(false,"Lost socket\n");
|
|
}
|
|
} else {
|
|
count -= l;
|
|
buf += l;
|
|
}
|
|
}
|
|
}
|
|
|
|
int server_start(short port) {
|
|
int listen_sock;
|
|
AssertFatal((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, "");
|
|
int enable = 1;
|
|
AssertFatal(setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) == 0, "");
|
|
struct sockaddr_in addr = {
|
|
sin_family:
|
|
AF_INET,
|
|
sin_port:
|
|
htons(port),
|
|
sin_addr:
|
|
{ s_addr: INADDR_ANY }
|
|
};
|
|
bind(listen_sock, (struct sockaddr *)&addr, sizeof(addr));
|
|
AssertFatal(listen(listen_sock, 5) == 0, "");
|
|
return accept(listen_sock,NULL,NULL);
|
|
}
|
|
|
|
int client_start(char *IP, short port) {
|
|
int sock;
|
|
AssertFatal((sock = socket(AF_INET, SOCK_STREAM, 0)) >= 0, "");
|
|
struct sockaddr_in addr = {
|
|
sin_family:
|
|
AF_INET,
|
|
sin_port:
|
|
htons(port),
|
|
sin_addr:
|
|
{ s_addr: INADDR_ANY }
|
|
};
|
|
addr.sin_addr.s_addr = inet_addr(IP);
|
|
bool connected=false;
|
|
|
|
while(!connected) {
|
|
LOG_I(HW,"rfsimulator: trying to connect to %s:%d\n", IP, port);
|
|
|
|
if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0) {
|
|
LOG_I(HW,"rfsimulator: connection established\n");
|
|
connected=true;
|
|
}
|
|
|
|
perror("simulated node");
|
|
sleep(1);
|
|
}
|
|
|
|
return sock;
|
|
}
|
|
|
|
enum blocking_t {
|
|
notBlocking,
|
|
blocking
|
|
};
|
|
|
|
void setblocking(int sock, enum blocking_t active) {
|
|
int opts;
|
|
AssertFatal( (opts = fcntl(sock, F_GETFL)) >= 0,"");
|
|
|
|
if (active==blocking)
|
|
opts = opts & ~O_NONBLOCK;
|
|
else
|
|
opts = opts | O_NONBLOCK;
|
|
|
|
AssertFatal(fcntl(sock, F_SETFL, opts) >= 0, "");
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if(argc != 4) {
|
|
printf("Need parameters: source file, server or destination IP, TCP port\n");
|
|
exit(1);
|
|
}
|
|
|
|
int fd;
|
|
AssertFatal((fd=open(argv[1],O_RDONLY)) != -1, "file: %s", argv[1]);
|
|
off_t fileSize=lseek(fd, 0, SEEK_END);
|
|
int serviceSock;
|
|
|
|
if (strcmp(argv[2],"server")==0) {
|
|
serviceSock=server_start(atoi(argv[3]));
|
|
} else {
|
|
client_start(argv[2],atoi(argv[3]));
|
|
}
|
|
|
|
samplesBlockHeader_t header;
|
|
int bufSize=100000;
|
|
void *buff=malloc(bufSize);
|
|
|
|
while (1) {
|
|
//Rewind the file to loop on the samples
|
|
if ( lseek(fd, 0, SEEK_CUR) >= fileSize )
|
|
lseek(fd, 0, SEEK_SET);
|
|
|
|
// Read one block and send it
|
|
setblocking(serviceSock, blocking);
|
|
AssertFatal(read(fd,&header,sizeof(header)), "");
|
|
fullwrite(serviceSock, &header, sizeof(header));
|
|
int dataSize=sizeof(int32_t)*header.size*header.nbAnt;
|
|
|
|
if (dataSize>bufSize) {
|
|
void * new_buff = realloc(buff, dataSize);
|
|
if (new_buff == NULL) {
|
|
free(buff);
|
|
AssertFatal(1, "Could not reallocate");
|
|
} else {
|
|
buff = new_buff;
|
|
}
|
|
}
|
|
|
|
AssertFatal(read(fd,buff,dataSize) == dataSize, "");
|
|
fullwrite(serviceSock, buff, dataSize);
|
|
// Purge incoming samples
|
|
setblocking(serviceSock, notBlocking);
|
|
|
|
while(recv(serviceSock,buff, bufSize, MSG_DONTWAIT) > 0) {
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|