diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c index df2018ad0a4f936f60737de2dda88393fce82f70..5041d188a34461f9cec12eae127ba412a78ce9ff 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/eth_raw.c @@ -52,6 +52,7 @@ #include "common_lib.h" #include "ethernet_lib.h" #include "if_defs.h" +#include "openair1/PHY/LTE_TRANSPORT/if4_tools.h" #define DEBUG 0 @@ -214,7 +215,7 @@ int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, } else if (flags == IF4_PULFFT) { packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks); } else { - packet_size = RAW_IF4_PRACH_SIZE_BYTES(nblocks); + packet_size = RAW_IF4_PRACH_SIZE_BYTES; } eth->tx_nsamps = nblocks; @@ -302,49 +303,66 @@ int trx_eth_read_raw(openair0_device *device, openair0_timestamp *timestamp, voi int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc) { + int nblocks = nsamps; int bytes_received=0; - int i=0; eth_state_t *eth = (eth_state_t*)device->priv; int Mod_id = device->Mod_id; - int rcvfrom_flag =0; - eth->rx_nsamps=nsamps; - - /* buff[i] points to the position in rx buffer where the payload to be received will be placed - buff2 points to the position in rx buffer where the packet header will be placed */ - void *buff2 = (void*)(buff[i]-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES); - - /* we don't want to ovewrite with the header info the previous rx buffer data so we store it*/ - struct ether_header temp = *(struct ether_header *)buff2; - int32_t temp0 = *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES); - openair0_timestamp temp1 = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); - - bytes_received=0; - - while(bytes_received < RAW_PACKET_SIZE_BYTES(nsamps)) { - bytes_received +=recv(eth->sockfd[Mod_id], - buff2, - RAW_PACKET_SIZE_BYTES(nsamps), - rcvfrom_flag); - + ssize_t packet_size = MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t; + + void *test_buffer = (void*)malloc(packet_size); + void *rx_buffer=NULL; + IF4_dl_header_t *test_header = (IF4_dl_header_t*)(test_buffer + MAC_HEADER_SIZE_BYTES); + + bytes_received = recv(eth->sockfd[Mod_id], + test_buffer, + packet_size, + 0); if (bytes_received ==-1) { eth->num_rx_errors++; perror("ETHERNET READ: "); exit(-1); - } else { - /* store the timestamp value from packet's header */ - *timestamp = *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)); - eth->rx_actual_nsamps=bytes_received>>2; - eth->rx_count++; - } - } - - /* tx buffer values restored */ - *(struct ether_header *)buff2 = temp; - *(int32_t *)(buff2 + MAC_HEADER_SIZE_BYTES) = temp0; - *(openair0_timestamp *)(buff2 + MAC_HEADER_SIZE_BYTES + sizeof(int32_t)) = temp1; + } + + *timestamp = test_header->sub_type; + + if (test_header->sub_type == IF4_PDLFFT) { + buff[0] = (void*)malloc(RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) - MAC_HEADER_SIZE_BYTES); + packet_size = RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) - packet_size; + + } else if (test_header->sub_type == IF4_PULFFT) { + buff[0] = (void*)malloc(RAW_IF4_PULFFT_SIZE_BYTES(nblocks) - MAC_HEADER_SIZE_BYTES); + packet_size = RAW_IF4_PULFFT_SIZE_BYTES(nblocks) - packet_size; + + } else { + buff[0] = (void*)malloc(RAW_IF4_PRACH_SIZE_BYTES - MAC_HEADER_SIZE_BYTES); + packet_size = RAW_IF4_PRACH_SIZE_BYTES - packet_size; + } - return (bytes_received-APP_HEADER_SIZE_BYTES-MAC_HEADER_SIZE_BYTES)>>2; + memcpy(buff[0], test_header, sizeof_IF4_dl_header_t); + rx_buffer = (void*)(buff[0]+sizeof_IF4_dl_header_t); + + bytes_received = 0; + + while(bytes_received < packet_size) { + bytes_received += recv(eth->sockfd[Mod_id], + rx_buffer, + packet_size-bytes_received, + 0); + if (bytes_received ==-1) { + eth->num_rx_errors++; + perror("ETHERNET READ: "); + exit(-1); + } else { + eth->rx_actual_nsamps = bytes_received>>1; + eth->rx_count++; + } + } + + eth->rx_nsamps = nsamps; + + free(test_buffer); + return (bytes_received-MAC_HEADER_SIZE_BYTES)>>1; } diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index ee9ba50f66b3786ccfa5739c5ae1f1e85c2216dc..6e5aa111406d74bf64e923cff17e5179769ae74f 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -320,7 +320,8 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth } else if (eth_params->transp_preference == 2) { eth->flags = ETH_UDP_IF4_MODE; } else { - AssertFatal(0==4, "transport_init: Unknown transport preference %d", eth_params->transp_preference); + printf("transport_init: Unknown transport preference %d - default to RAW", eth_params->transp_preference); + eth->flags = ETH_RAW_MODE; } printf("[ETHERNET]: Initializing openair0_device for %s ...\n", ((device->host_type == BBU_HOST) ? "BBU": "RRH")); @@ -346,16 +347,16 @@ int transport_init(openair0_device *device, openair0_config_t *openair0_cfg, eth device->trx_write_func = trx_eth_write_raw_IF4; device->trx_read_func = trx_eth_read_raw_IF4; } else { - device->trx_write_func = trx_eth_write_udp_IF4; - device->trx_read_func = trx_eth_read_udp_IF4; + //device->trx_write_func = trx_eth_write_udp_IF4; + //device->trx_read_func = trx_eth_read_udp_IF4; } eth->if_name[device->Mod_id] = eth_params->local_if_name; device->priv = eth; /* device specific */ - openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered - openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait = 0;//manage when TX processing is triggered + //openair0_cfg[0].txlaunch_wait_slotcount = 0; //manage when TX processing is triggered openair0_cfg[0].iq_rxrescale = 15;//rescale iqs openair0_cfg[0].iq_txshift = eth_params->iq_txshift;// shift openair0_cfg[0].tx_sample_advance = eth_params->tx_sample_advance; diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h index 307a3126708a346341bd350267d71ddb53cbe8df..66cb13ef12e14bb6515af7c539cf2b3ce1aed998 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h @@ -222,8 +222,8 @@ 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); -//int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); -//int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); +int trx_eth_write_raw_IF4(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps,int cc, int flags); +int trx_eth_read_raw_IF4(openair0_device *device, openair0_timestamp *timestamp, void **buff, int nsamps, int cc); int eth_get_dev_conf_raw(openair0_device *device); int eth_set_dev_conf_raw(openair0_device *device); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index 04cd66e6e84a020a9c163106f43846007001bb52..5b95e5eecaafd73caff4a24b2cf6252c81548fec 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -39,6 +39,7 @@ */ #include <netinet/ether.h> +#include <stdint.h> // ETH transport preference modes #define ETH_UDP_MODE 0 @@ -54,7 +55,9 @@ #define RAW_PACKET_SIZE_BYTES(nsamps) (APP_HEADER_SIZE_BYTES + MAC_HEADER_SIZE_BYTES + PAYLOAD_SIZE_BYTES(nsamps)) // Packet sizes for IF4 interface format -#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (2*scaled_nblocks) +#define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(int16_t)*scaled_nblocks) +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*839) // FIX hard coded prach size + #define RAW_IF4_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_dl_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_ul_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) -#define RAW_IF4_PRACH_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) +#define RAW_IF4_PRACH_SIZE_BYTES (MAC_HEADER_SIZE_BYTES + sizeof_IF4_prach_header_t + PRACH_BLOCK_SIZE_BYTES)