Commit fe21cd8c authored by IvanG's avatar IvanG

MAC UDP socket added. Opening of socket and packet reception tested

parent 94cca321
...@@ -202,6 +202,23 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, ...@@ -202,6 +202,23 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
uint16_t sfn_sf = frameP << 7 | slotP; uint16_t sfn_sf = frameP << 7 | slotP;
int dl_carrier_bandwidth = cfg->rf_config.dl_carrier_bandwidth.value; int dl_carrier_bandwidth = cfg->rf_config.dl_carrier_bandwidth.value;
//socket_mac_gNB_data *socket_data;
//socket_data = calloc(1, sizeof(*socket_data));
//memset((void *)socket_data, 0, sizeof(socket_data));
const char *ip_address = "10.102.81.239";
const uint16_t port = 53108;
//const uint16_t port = 554; //RTSP port
//const uint16_t port = 50202; //Custom port
char* pdu[5888] = {0};
//Connect socket
//connect_mac_socket_to_data_source(ip_address, port, nr_mac->socket_mac_data);
// everything here is hard-coded to 30 kHz // everything here is hard-coded to 30 kHz
int scs = get_dlscs(cfg); int scs = get_dlscs(cfg);
int slots_per_frame = get_spf(cfg); int slots_per_frame = get_spf(cfg);
...@@ -299,6 +316,20 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, ...@@ -299,6 +316,20 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
dl_req->number_dci++; dl_req->number_dci++;
dl_req->number_pdsch_rnti++; dl_req->number_pdsch_rnti++;
dl_req->number_pdu+=2; dl_req->number_pdu+=2;
//while(1){
//Call get_mac_pdu_from_socket() around here?
//LOG_I(MAC, "get_mac_pdu_from_socket\n");
get_mac_pdu_from_socket(pdu, 5888, nr_mac->socket_mac_data);
//get_mac_pdu_from_socket(pdu, dl_config_dlsch_pdu->dlsch_pdu.dlsch_pdu_rel15.transport_block_size, socket_mac_gNB_data *socket_data);
//}
TX_req = &nr_mac->TX_req[CC_id].tx_request_body.tx_pdu_list[nr_mac->TX_req[CC_id].tx_request_body.number_of_pdus]; TX_req = &nr_mac->TX_req[CC_id].tx_request_body.tx_pdu_list[nr_mac->TX_req[CC_id].tx_request_body.number_of_pdus];
TX_req->pdu_length = 6; TX_req->pdu_length = 6;
...@@ -321,4 +352,139 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP, ...@@ -321,4 +352,139 @@ void nr_schedule_uss_dlsch_phytest(module_id_t module_idP,
nr_mac->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST; nr_mac->TX_req[CC_id].header.message_id = NFAPI_TX_REQUEST;
} }
//disconnect_mac_socket_from_data_source(nr_mac->socket_mac_data);
} }
/* Function to get the MAC PDU from socket data */
int get_mac_pdu_from_socket(char* pdu,
uint32_t TBS,
socket_mac_gNB_data *socket_data)
{
//LOG_I(MAC, "[get_mac_pdu_from_socket] TEST\n");
/* Should I set the socket as non-blocking? */
//fcntl(socket_data->sd, F_SETFL, O_NONBLOCK);
//If listening to more than one socket (e.g. for TCP and UDP listening) select() should be used
int recv_ret;
//struct sockaddr *from_addr;
struct sockaddr_in from_addr;
socklen_t from_addr_len;
from_addr_len = sizeof(struct sockaddr_in);
//LOG_I(MAC, "[get_mac_pdu_from_socket] TEST1, socket_data->sd=%d\n", socket_data->sd);
//recv_ret = recv(socket_data->sd, pdu, (size_t)TBS, 0);
recv_ret = recvfrom(socket_data->sd, pdu, (size_t)TBS, 0, &from_addr, &from_addr_len);
//LOG_I(MAC, "[get_mac_pdu_from_socket] TEST2\n");
if (recv_ret == -1) {
/* Failure case */
switch (errno) {
//case EWOULDBLOCK:
case EAGAIN:
return -1;
default:
//g_info("recv failed: %s", g_strerror(errno));
LOG_I(MAC, "[get_mac_pdu_from_socket] ERROR. Received %d bytes in MAC socket. Errno=%d\n", recv_ret, errno);
return -1;
break;
}
//} else if (recv_ret == 0) {
// /* We lost the connection with other peer or shutdown asked */
// ui_pipe_write_message(socket_data->pipe_fd,
// UI_PIPE_CONNECTION_LOST, NULL, 0);
// free(socket_data->ip_address);
// free(socket_data);
// pthread_exit(NULL);
}else{
//Source IP address could be checked to only transmit RTP packets for video flow
LOG_I(MAC, "[get_mac_pdu_from_socket] Received %d bytes in MAC socket.\n", recv_ret);
}
return recv_ret;
}
/* Function to open a socket and connect to the MAC data source*/
int connect_mac_socket_to_data_source(const char *ip_address,
const uint16_t port, socket_mac_gNB_data *socket_mac)
{
//LOG_I(MAC, "[connect_mac_socket_to_data_source]TEST\n");
//socket_mac_gNB_data *socket_data;
//socket_data = calloc(1, sizeof(*socket_data));
socket_mac->ip_address = strdup(ip_address);
socket_mac->port = port;
socket_mac->sd = -1;
struct sockaddr_in si_me;
//g_assert(socket_data != NULL);
/* Preparing the socket */
//if ((socket_data->sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
if ((socket_mac->sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
//g_warning("socket failed: %s", g_strerror(errno));
LOG_I(MAC, "socket failed\n");
free(socket_mac->ip_address);
free(socket_mac);
return RESULT_FAILED;
}
memset((void *)&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(socket_mac->port);
//si_me.sin_addr.s_addr = htonl(INADDR_ANY);
//si_me.sin_addr.s_addr = htonl(socket_data->ip_address);
si_me.sin_addr.s_addr = inet_addr(socket_mac->ip_address);
if (inet_aton(socket_mac->ip_address, &si_me.sin_addr) == 0) {
//g_warning("inet_aton() failed\n");
LOG_I(MAC, "inet_aton() failed\n");
free(socket_mac->ip_address);
free(socket_mac);
return RESULT_FAILED;
}
if(bind(socket_mac->sd, (struct sockaddr *)&si_me, sizeof(struct sockaddr_in)) == -1){
//g_warning("binding socket failed\n");
LOG_I(MAC, "binding socket failed\n");
free(socket_mac->ip_address);
free(socket_mac);
return RESULT_FAILED;
}
//Set socket as non-blocking
fcntl(socket_mac->sd, F_SETFL, O_NONBLOCK);
//If more than one socket, there should be a set of sockets to use select() with them
//The socket should be added to the set in this function.
//memcpy(socket_mac, socket_data, sizeof(socket_data));
//&socket_mac = &socket_data;
LOG_I(MAC, "[connect_mac_socket_to_data_source]MAC socket connected; socket_mac->sd= %d\n", socket_mac->sd);
return RESULT_OK;
}
/* Function to close the MAC data source socket */
int disconnect_mac_socket_from_data_source(socket_mac_gNB_data *socket_data)
{
close(socket_data->sd);
free(socket_data->ip_address);
free(socket_data);
LOG_I(MAC, "[disconnect_mac_socket_from_data_source] Disconnecting MAC socket\n");
return RESULT_OK;
}
...@@ -119,6 +119,9 @@ void mac_top_init_gNB(void) ...@@ -119,6 +119,9 @@ void mac_top_init_gNB(void)
nr_init_search_space(&RC.nrmac[i]->search_space[j][1]); nr_init_search_space(&RC.nrmac[i]->search_space[j][1]);
} }
RC.nrmac[i]->socket_mac_data = calloc(1, sizeof(socket_mac_gNB_data));
//Open socket for receiving data to send from MAC layer (should have different ports for different nrmac)
connect_mac_socket_to_data_source("10.102.81.239", 53108, RC.nrmac[i]->socket_mac_data);
}//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++) }//END for (i = 0; i < RC.nb_nr_macrlc_inst; i++)
......
...@@ -62,6 +62,27 @@ ...@@ -62,6 +62,27 @@
#include "LAYER2/MAC/mac_extern.h" #include "LAYER2/MAC/mac_extern.h"
#include "common/ran_context.h" #include "common/ran_context.h"
#define RESULT_OK 0
#define RESULT_FAILED -1
/* structure for socket as source of MAC gNB data; copied from common/utils/itti_analyzer/libbuffer/socket.h */
typedef struct {
pthread_t thread;
int sd;
char *ip_address;
uint16_t port;
/* The pipe used between main thread (running GTK) and the socket thread */
int pipe_fd;
/* Time used to avoid refreshing UI every time a new signal is incoming */
//gint64 last_data_notification;
//uint8_t nb_signals_since_last_update;
/* The last signals received which are not yet been updated in GUI */
//GList *signal_list;
} socket_mac_gNB_data;
/*! \brief gNB common channels */ /*! \brief gNB common channels */
typedef struct { typedef struct {
int physCellId; int physCellId;
...@@ -147,6 +168,9 @@ typedef struct gNB_MAC_INST_s { ...@@ -147,6 +168,9 @@ typedef struct gNB_MAC_INST_s {
/// UL handle /// UL handle
uint32_t ul_handle; uint32_t ul_handle;
//Socket to receive data that will be sent from MAC
socket_mac_gNB_data *socket_mac_data;
// MAC function execution peformance profiler // MAC function execution peformance profiler
/// processing time of eNB scheduler /// processing time of eNB scheduler
...@@ -175,4 +199,16 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP, ...@@ -175,4 +199,16 @@ void nr_schedule_css_dlsch_phytest(module_id_t module_idP,
frame_t frameP, frame_t frameP,
sub_frame_t subframeP); sub_frame_t subframeP);
/* Function to get the MAC PDU from socket data */
int get_mac_pdu_from_socket(char* pdu, uint32_t TBS, socket_mac_gNB_data *socket_data);
/* Function to open a socket and connect to the MAC data source*/
int connect_mac_socket_to_data_source(const char *remote_ip, const uint16_t port, socket_mac_gNB_data *socket_data);
/* Function to close the MAC data source socket */
int disconnect_mac_socket_from_data_source(socket_mac_gNB_data *socket_data);
#endif /*__LAYER2_NR_MAC_GNB_H__ */ #endif /*__LAYER2_NR_MAC_GNB_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment