From d704453e4b7973e1f7829d5f701b4ed334c0e429 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 21 Oct 2014 06:58:53 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5926 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- targets/RT/USER/rrh.c | 191 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 targets/RT/USER/rrh.c diff --git a/targets/RT/USER/rrh.c b/targets/RT/USER/rrh.c new file mode 100644 index 0000000000..8407e019af --- /dev/null +++ b/targets/RT/USER/rrh.c @@ -0,0 +1,191 @@ +/******************************************************************************* + OpenAirInterface + Copyright(c) 1999 - 2014 Eurecom + + OpenAirInterface is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + + OpenAirInterface is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OpenAirInterface.The full GNU General Public License is + included in this distribution in the file called "COPYING". If not, + see . + + Contact Information + OpenAirInterface Admin: openair_admin@eurecom.fr + OpenAirInterface Tech : openair_tech@eurecom.fr + OpenAirInterface Dev : openair4g-devel@eurecom.fr + + Address : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE + + *******************************************************************************/ + + /** ethernet_lib : API to stream I/Q samples over standard ethernet (RRH component) + * + * Authors: Raymond Knopp + * + * Changelog: + * 06.10.2014: Initial version + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common_lib.h" + +typedef struct { + int port; + char *dest_ip; +} rrh_desc_t; + +int rrh_exit=0; + +int32_t tx_buffer[4][(1+(sizeof(openair0_timestamp)>>2))+76800*4],rx_buffer[4][(1+(sizeof(openair0_timestamp)>>2))+76800*4]; + +void *rrh_eNB_thread(void *arg) { + + int sockid=-1; + struct sockaddr_in serveraddr; + struct sockaddr clientaddr; + socklen_t clientaddrlen; + rrh_desc_t *rrh_desc = (rrh_desc_t *)arg; + char str[INET_ADDRSTRLEN]; + int8_t msg_header[4+sizeof(openair0_timestamp)]; + int16_t cmd,nsamps,antenna_index; + ssize_t bytes_received; + openair0_timestamp timestamp_tx,timestamp_rx=0; + int local_host = 0; + + while (rrh_exit==0) { + + + sockid=socket(AF_INET,SOCK_DGRAM,0); + if (sockid==-1) { + perror("Cannot create socket: "); + rrh_exit=1; + } + + + bzero((char *)&serveraddr,sizeof(serveraddr)); + serveraddr.sin_family=AF_INET; + serveraddr.sin_port=htons(rrh_desc->port); + inet_pton(AF_INET,"127.0.0.1",&serveraddr.sin_addr.s_addr); + + inet_ntop(AF_INET, &(serveraddr.sin_addr), str, INET_ADDRSTRLEN); + printf("Binding to socket for %s:%d\n",str,ntohs(serveraddr.sin_port)); + + if (bind(sockid,(struct sockaddr *)&serveraddr,sizeof(serveraddr))<0) { + perror("Cannot bind to socket: "); + rrh_exit = 1; + } + + // now wait for commands from eNB + while (rrh_exit==0) { + + // get header info + bytes_received = recvfrom(sockid,msg_header,4+sizeof(openair0_timestamp),0,&clientaddr,&clientaddrlen); + cmd = msg_header[0]; + antenna_index = cmd>>1; + timestamp_tx = *(openair0_timestamp*)(msg_header+4); + nsamps = *(int16_t *)(msg_header+2); + cmd = cmd&1; + inet_ntop(AF_INET, &(((struct sockaddr_in*)&clientaddr)->sin_addr), str, INET_ADDRSTRLEN); + if ((((struct sockaddr_in*)&clientaddr)->sin_addr.s_addr) == 0) local_host = 1; + else local_host = 0; + + switch (cmd) { + case 0: // RX + printf("Received RX request for antenna %d, nsamps %d (from %s:%d)\n",antenna_index,nsamps,str, + ntohs(((struct sockaddr_in*)&clientaddr)->sin_port),INET_ADDRSTRLEN); + // send return + + if (sendto(sockid, + &rx_buffer[antenna_index][timestamp_rx%(76800*4)], + (nsamps<<2)+sizeof(openair0_timestamp), + MSG_DONTWAIT, + (local_host == 0) ? &clientaddr : (struct sockaddr*)&serveraddr, + sizeof(struct sockaddr))<0) + perror("RRH: sendto for RX"); + timestamp_rx+=nsamps; + break; + case 1: // TX + printf("Received TX request for antenna %d, nsamps %d, timestamp %llu\n",antenna_index,nsamps,timestamp_tx); + bytes_received = recvfrom(sockid,&tx_buffer[antenna_index][timestamp_tx%(76800*4)],(nsamps<<2),0,NULL,NULL); + printf("Received TX samples for antenna %d, nsamps %d (%d)\n",antenna_index,nsamps,(bytes_received>>2)); + break; + } + } + } + + close(sockid); + + + return(0); +} + + +void signal_handler(int sig) +{ + void *array[10]; + size_t size; + + if (sig==SIGSEGV) { + // get void*'s for all entries on the stack + size = backtrace(array, 10); + + // print out all the frames to stderr + fprintf(stderr, "Error: signal %d:\n", sig); + backtrace_symbols_fd(array, size, 2); + exit(-1); + } + else { + printf("trying to exit gracefully...\n"); + rrh_exit = 1; + } +} + +int main(int argc, char **argv) { + + pthread_t main_rrh_eNB_thread; + pthread_attr_t attr; + struct sched_param sched_param_rrh; + int error_code; + rrh_desc_t rrh; + + rrh.port = 22222; + rrh.dest_ip = "127.0.0.1"; + + pthread_attr_init(&attr); + sched_param_rrh.sched_priority = sched_get_priority_max(SCHED_FIFO); + + + pthread_attr_setschedparam(&attr,&sched_param_rrh); + pthread_attr_setschedpolicy(&attr,SCHED_FIFO); + + error_code = pthread_create(&main_rrh_eNB_thread, &attr, rrh_eNB_thread, (void *)&rrh); + + printf("TYPE TO TERMINATE\n"); + + while (rrh_exit==0) + sleep(1); + + +}