ethernet_lib.h 8.26 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/*******************************************************************************
    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 <http://www.gnu.org/licenses/>.

   Contact Information
   OpenAirInterface Admin: openair_admin@eurecom.fr
   OpenAirInterface Tech : openair_tech@eurecom.fr
24
   OpenAirInterface Dev  : openair4g-devel@lists.eurecom.fr
25 26 27 28 29 30 31 32 33 34 35 36 37 38

   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE

 *******************************************************************************/
/*! \file ethernet_lib.h
 * \brief API to stream I/Q samples over standard ethernet
 * \author Katerina Trilyraki, Navid Nikaein
 * \date 2015
 * \version 0.2
 * \company Eurecom
 * \maintainer:  navid.nikaein@eurecom.fr
 * \note
 * \warning 
 */
39 40
#ifndef ETHERNET_LIB_H
#define ETHERNET_LIB_H
41

Raymond Knopp's avatar
 
Raymond Knopp committed
42 43 44 45 46 47 48 49 50 51
#include <arpa/inet.h>
#include <linux/if_packet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <net/if.h>
#include <netinet/ether.h>

52 53 54 55 56 57
#define MAX_INST      4
#define DEFAULT_IF   "lo"

#define TX_FLAG	        1
#define RX_FLAG 	0

58
#include "if_defs.h"
59
#define APP_HEADER_SIZE_BYTES (sizeof(int32_t) + sizeof(openair0_timestamp))
Raymond Knopp's avatar
 
Raymond Knopp committed
60

61
/*!\brief opaque ethernet data structure */
62
typedef struct {
63 64
  
  /*!\brief socket file desc */ 
65
  int sockfd;
66
  /*!\brief interface name */ 
67
  char *if_name;
68
  /*!\brief buffer size */ 
69
  unsigned int buffer_size;
70 71 72 73 74 75 76 77 78 79 80 81
  /*!\brief destination address for UDP socket*/
  struct sockaddr_in dest_addr;
  /*!\brief local address for UDP socket*/
  struct sockaddr_in local_addr;
  /*!\brief address length for both UDP and RAW socket*/
  int addr_len;
  /*!\brief destination address for RAW socket*/
  struct sockaddr_ll dest_addr_ll;
  /*!\brief local address for RAW socket*/
  struct sockaddr_ll local_addr_ll;
  /*!\brief inteface index for RAW socket*/
  struct ifreq if_index;
82 83 84 85 86 87 88
  /*!\brief timeout ms */ 
  unsigned int rx_timeout_ms;
  /*!\brief timeout ms */ 
  unsigned int tx_timeout_ms;
  /*!\brief runtime flags */ 
  uint32_t flags;   
  /*!\ time offset between transmiter timestamp and receiver timestamp */ 
89
  double tdiff;
90 91 92
  /*!\ calibration */
  int tx_forward_nsamps;
  
93 94 95
  // --------------------------------
  // Debug and output control
  // --------------------------------
96 97 98 99 100
  
  /*!\brief number of I/Q samples to be printed */ 
  int iqdumpcnt;

  /*!\brief number of underflows in interface */ 
101
  int num_underflows;
102
  /*!\brief number of overflows in interface */ 
103
  int num_overflows;
104
  /*!\brief number of concesutive errors in interface */ 
105
  int num_seq_errors;
106
  /*!\brief number of errors in interface's receiver */ 
107
  int num_rx_errors;
108
  /*!\brief umber of errors in interface's transmitter */ 
109
  int num_tx_errors;
110 111 112 113 114 115 116 117
  
  /*!\brief current TX timestamp */ 
  openair0_timestamp tx_current_ts;
  /*!\brief socket file desc */ 
  openair0_timestamp rx_current_ts;
  /*!\brief actual number of samples transmitted */ 
  uint64_t tx_actual_nsamps; 
  /*!\brief actual number of samples received */
118
  uint64_t rx_actual_nsamps;
119 120 121
  /*!\brief number of samples to be transmitted */
  uint64_t tx_nsamps; 
  /*!\brief number of samples to be received */
122
  uint64_t rx_nsamps;
123 124 125
  /*!\brief number of packets transmitted */
  uint64_t tx_count; 
  /*!\brief number of packets received */
126 127
  uint64_t rx_count;

128 129
  struct ether_header eh; 

130 131 132
} eth_state_t;


133 134

/*!\brief packet header */
135
typedef struct {
136 137 138 139
  /*!\brief packet sequence number max value=packets per frame*/
  uint16_t seq_num ;
  /*!\brief antenna port used to resynchronize */
  uint16_t antenna_id;
140
  /*!\brief packet's timestamp */ 
141 142 143
  openair0_timestamp timestamp;
} header_t;

144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
/*!\brief different options for ethernet tuning in socket and driver level */
typedef enum {
  MIN_OPT = 0,  
  /*!\brief socket send buffer size in bytes */
  SND_BUF_SIZE,
  /*!\brief socket receive buffer size in bytes */
  RCV_BUF_SIZE,
  /*!\brief receiving timeout */
  RCV_TIMEOUT,
  /*!\brief sending timeout */
  SND_TIMEOUT,
  /*!\brief maximun transmission unit size in bytes */
  MTU_SIZE,
  /*!\brief TX queue length */
  TX_Q_LEN,
  /*!\brief RX/TX  ring parameters of ethernet device */
  RING_PAR,
  /*!\brief interruptions coalesence mechanism of ethernet device */
  COALESCE_PAR,
  /*!\brief pause parameters of ethernet device */
  PAUSE_PAR,
  MAX_OPT
} eth_opt_t;

168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
/*
#define SND_BUF_SIZE	1
#define RCV_BUF_SIZE	1<<1
#define SND_TIMEOUT	1<<2
#define RCV_TIMEOUT	1<<3
#define MTU_SIZE        1<<4
#define TX_Q_LEN	1<<5
#define RING_PAR	1<<5
#define COALESCE_PAR	1<<6
#define PAUSE_PAR       1<<7
*/

/*!\brief I/Q samples */
typedef struct {
  /*!\brief phase  */
  short i;
  /*!\brief quadrature */
  short q;
} iqoai_t ;

void dump_packet(char *title, unsigned char* pkt, int bytes, unsigned int tx_rx_flag);
unsigned short calc_csum (unsigned short *buf, int nwords);
void dump_dev(openair0_device *device);
Raymond Knopp's avatar
Raymond Knopp committed
191
/*void inline dump_buff(openair0_device *device, char *buff,unsigned int tx_rx_flag,int nsamps);
192 193
void inline dump_rxcounters(openair0_device *device);
void inline dump_txcounters(openair0_device *device);
Raymond Knopp's avatar
Raymond Knopp committed
194
*/
195 196
void dump_iqs(char * buff, int iq_cnt);

197 198


199
/*! \fn int ethernet_tune (openair0_device *device, unsigned int option, int value);
200 201 202 203 204 205 206
* \brief this function allows you to configure certain ethernet parameters in socket or device level
* \param[in] openair0 device which bears the socket
* \param[in] name of parameter to configure
* \return 0 on success, otherwise -1
* \note
* @ingroup  _oai
*/
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
int ethernet_tune(openair0_device *device, unsigned int option, int value);



/*! \fn int eth_socket_init_udp(openair0_device *device)
* \brief initialization of UDP Socket to communicate with one destination
* \param[in] *device openair device for which the socket will be created
* \param[out]
* \return 0 on success, otherwise -1
* \note
* @ingroup  _oai
*/
int eth_socket_init_udp(openair0_device *device);
int trx_eth_write_udp(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
int trx_eth_read_udp(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
222 223
//int trx_eth_write_udp_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
//int trx_eth_read_udp_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
224 225 226 227 228 229 230 231 232 233 234 235 236 237
int eth_get_dev_conf_udp(openair0_device *device);

/*! \fn static int eth_set_dev_conf_udp(openair0_device *device)
* \brief
* \param[in] *device openair device
* \param[out]
* \return 0 on success, otherwise -1
* \note
* @ingroup  _oai
*/
int eth_set_dev_conf_udp(openair0_device *device);
int eth_socket_init_raw(openair0_device *device);
int trx_eth_write_raw(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
238 239
int trx_eth_write_raw_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
int trx_eth_read_raw_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
Raymond Knopp's avatar
Raymond Knopp committed
240 241
int trx_eth_write_udp_IF4p5(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags);
int trx_eth_read_udp_IF4p5(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc);
242 243
int eth_get_dev_conf_raw(openair0_device *device);
int eth_set_dev_conf_raw(openair0_device *device);
244 245
int eth_get_dev_conf_raw_IF4p5(openair0_device *device);
int eth_set_dev_conf_raw_IF4p5(openair0_device *device);
246 247

#endif