From 41e926ef62cc016064d601122bdf7e9401e14543 Mon Sep 17 00:00:00 2001 From: Raymond Knopp Date: Tue, 21 Oct 2014 06:58:32 +0000 Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5925 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 196 ++++++++++++++++++ .../ETHERNET/USERSPACE/LIB/ethernet_lib.h | 15 ++ 2 files changed, 211 insertions(+) create mode 100644 targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c create mode 100644 targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c new file mode 100644 index 0000000000..7f55a0408c --- /dev/null +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -0,0 +1,196 @@ +/******************************************************************************* + 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 + * + * Authors: Pedro Dinis + * Lucio Ferreira + * Raymond Knopp + * + * Changelog: + * 06.10.2014: Initial version + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common_lib.h" + +#define DEFAULT_IF "eth0" +#define BUF_SIZ 8960 /*Jumbo frame size*/ +#define MAX_INST 4 + +int sockfd[MAX_INST]; +struct sockaddr_in dest_addr[MAX_INST]; +int dest_addr_len[MAX_INST]; + +int i; +int tx_len = 0; +char sendbuf[MAX_INST][BUF_SIZ]; /*TODO*/ + + +/**PDF: Initialization of UDP Socket to communicate with one DEST */ +int ethernet_socket_init(int Mod_id, char *dest_ip,int dest_port) +{ + + /**PDF: To be passed by input argument*/ + // DEST_port = 32000; + struct sockaddr_in *dest = &dest_addr[Mod_id]; + char str[INET_ADDRSTRLEN]; + + /* Open RAW socket to send on */ + + if ((sockfd[Mod_id] = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + perror("ETHERNET: Error opening socket"); + exit(0); + } + + bzero((void *)dest,sizeof(struct sockaddr)); + dest->sin_family = AF_INET; + dest->sin_addr.s_addr=inet_addr(dest_ip); + dest->sin_port=htons(dest_port); + dest_addr_len[Mod_id] = sizeof(struct sockaddr); + + inet_ntop(AF_INET, &(dest->sin_addr), str, INET_ADDRSTRLEN); + printf("Connecting to %s\n",str); + + +} + + + +int ethernet_write_data(int Mod_id, openair0_timestamp timestamp, const void *buff, int antenna_id, int nsamps) { + + void *buff2 = (void*)buff-sizeof(openair0_timestamp)-(sizeof(int16_t)*2); + int32_t temp0 = *(int32_t *)buff2; + openair0_timestamp temp1 = *(openair0_timestamp *)(buff2+(sizeof(int16_t)*2)); + + int n_written; + + n_written = 0; + ((int16_t *)buff2)[0] = 1+(antenna_id<<1); + ((int16_t *)buff2)[1] = nsamps; + *((openair0_timestamp *)(buff2+(sizeof(int16_t)*2))) = timestamp; + + while(n_written < nsamps) { + /* Send packet */ + if ((n_written += sendto(sockfd[Mod_id], + buff2, + (nsamps<<2)+sizeof(openair0_timestamp)+(2*sizeof(int16_t)), + 0, + (struct sockaddr*)&dest_addr[Mod_id], + dest_addr_len[Mod_id])) < 0) { + printf("Send failed for Mod_id %d\n",Mod_id); + exit(-1); + } + } + *(int32_t *)buff2 = temp0; + *(openair0_timestamp *)(buff2+2*sizeof(int16_t)) = temp1; + return n_written; + +} + + +int ethernet_read_data(int Mod_id,openair0_timestamp *timestamp,void *buff, int antenna_id, int nsamps) { + + void *buff2 = buff-sizeof(openair0_timestamp); + int samples_received; + openair0_timestamp temp = *(openair0_timestamp*)buff2; + int16_t mesg[2]; + char str[INET_ADDRSTRLEN]; + + mesg[0] = 0+(antenna_id<<1); + mesg[1] = nsamps; + + inet_ntop(AF_INET, &(dest_addr[Mod_id].sin_addr), str, INET_ADDRSTRLEN); + // send command RX for nsamps samples + printf("requesting %d samples from (%s:%d)\n",nsamps,str,ntohs(dest_addr[Mod_id].sin_port)); + + sendto(sockfd[Mod_id],mesg,4,0,(struct sockaddr *)&dest_addr[Mod_id],dest_addr_len[Mod_id]); + + printf("Waiting for %d samples\n",nsamps); + samples_received=recvfrom(sockfd[Mod_id], + buff2, + (nsamps<<2)+sizeof(openair0_timestamp), + 0, + (struct sockaddr *)&dest_addr[Mod_id], + &dest_addr_len[Mod_id]); + + printf("Received %d samples\n",samples_received); + + *timestamp = *(openair0_timestamp *)(buff-sizeof(openair0_timestamp)); + *(openair0_timestamp *)(buff-sizeof(openair0_timestamp)) = temp; + return samples_received>>2; + +} + + +int trx_eth_start(openair0_device *openair0) { + + return(ethernet_socket_init(openair0->openair0_cfg.Mod_id, openair0->openair0_cfg.rrh_ip,openair0->openair0_cfg.rrh_port)); + +} + +void trx_eth_write(openair0_device *device, openair0_timestamp timestamp, const void *buff, int nsamps, int flags) +{ + ethernet_write_data(device->Mod_id,timestamp,buff,0,nsamps); +} +int trx_eth_read(openair0_device *device, openair0_timestamp *ptimestamp, void *buff, int nsamps) { + + return(ethernet_read_data(device->Mod_id,ptimestamp,buff,0,nsamps)); + +} + +void trx_eth_end(openair0_device *device) { + + + + +} + +int num_devices = 0; + +int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cfg) +{ + + printf("ETHERNET: Initializing openair0_device\n"); + device->Mod_id = num_devices++; + device->trx_start_func = trx_eth_start; + device->trx_end_func = trx_eth_end; + device->trx_read_func = trx_eth_read; + device->trx_write_func = trx_eth_write; + memcpy((void*)&device->openair0_cfg,(void*)openair0_cfg,sizeof(openair0_config_t)); +} diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h new file mode 100644 index 0000000000..32a5057526 --- /dev/null +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int ethernet_socket_init(int Mod_id, char *dest_ip,int dest_port); + +int ethernet_write_data(int Mod_id, const void *buff, int nsamps); + +int ethernet_read_data(int Mod_id,void *buff, int nsamps);