Commit c4e3c774 authored by Navid Nikaein's avatar Navid Nikaein

*updates for OAI E-UTRAN and LTEBox EPC IOT



git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5209 818b1a75-f10b-46b9-bf7c-635c3b92a50f
parent ee9a31b9
...@@ -42,8 +42,9 @@ Address : EURECOM, ...@@ -42,8 +42,9 @@ Address : EURECOM,
/* When gtpv1u is compiled for eNB use MACRO from UTILS/log.h, /* When gtpv1u is compiled for eNB use MACRO from UTILS/log.h,
* otherwise use standard fprintf as logger. * otherwise use standard fprintf as logger.
*/ */
#if defined(ENB_MODE) //#if defined(ENB_MODE)
# define GTPU_DEBUG(x, args...) LOG_D(GTPU, x, ##args) #if 0
# define GTPU_DEBUG(x, args...) LOG_I(GTPU, x, ##args)
# define GTPU_INFO(x, args...) LOG_I(GTPU, x, ##args) # define GTPU_INFO(x, args...) LOG_I(GTPU, x, ##args)
# define GTPU_WARN(x, args...) LOG_W(GTPU, x, ##args) # define GTPU_WARN(x, args...) LOG_W(GTPU, x, ##args)
# define GTPU_ERROR(x, args...) LOG_E(GTPU, x, ##args) # define GTPU_ERROR(x, args...) LOG_E(GTPU, x, ##args)
......
...@@ -492,6 +492,7 @@ gtpv1u_new_data_req( ...@@ -492,6 +492,7 @@ gtpv1u_new_data_req(
stack_req.apiInfo.sendtoInfo.teid = bearer_p->teid_sgw; stack_req.apiInfo.sendtoInfo.teid = bearer_p->teid_sgw;
stack_req.apiInfo.sendtoInfo.ipAddr = bearer_p->sgw_ip_addr; stack_req.apiInfo.sendtoInfo.ipAddr = bearer_p->sgw_ip_addr;
LOG_W(GTPU, "TX TO TEID %u addr 0x%x\n",bearer_p->teid_sgw, bearer_p->sgw_ip_addr);
rc = nwGtpv1uGpduMsgNew(gtpv1u_data_p->gtpv1u_stack, rc = nwGtpv1uGpduMsgNew(gtpv1u_data_p->gtpv1u_stack,
bearer_p->teid_sgw, bearer_p->teid_sgw,
NW_FALSE, NW_FALSE,
...@@ -533,6 +534,7 @@ static int gtpv1u_create_s1u_tunnel(gtpv1u_enb_create_tunnel_req_t *create_tunne ...@@ -533,6 +534,7 @@ static int gtpv1u_create_s1u_tunnel(gtpv1u_enb_create_tunnel_req_t *create_tunne
hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS; hashtable_rc_t hash_rc = HASH_TABLE_KEY_NOT_EXISTS;
int i; int i;
ebi_t eps_bearer_id = 0; ebi_t eps_bearer_id = 0;
int ipv4_addr = 0;
message_p = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_CREATE_TUNNEL_RESP); message_p = itti_alloc_new_message(TASK_GTPV1_U, GTPV1U_ENB_CREATE_TUNNEL_RESP);
GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).ue_index = create_tunnel_req_pP->ue_index; GTPV1U_ENB_CREATE_TUNNEL_RESP(message_p).ue_index = create_tunnel_req_pP->ue_index;
...@@ -576,7 +578,8 @@ static int gtpv1u_create_s1u_tunnel(gtpv1u_enb_create_tunnel_req_t *create_tunne ...@@ -576,7 +578,8 @@ static int gtpv1u_create_s1u_tunnel(gtpv1u_enb_create_tunnel_req_t *create_tunne
} else if (hash_rc == HASH_TABLE_OK) { } else if (hash_rc == HASH_TABLE_OK) {
gtpv1u_ue_data_p->ue_id = create_tunnel_req_pP->ue_index; gtpv1u_ue_data_p->ue_id = create_tunnel_req_pP->ue_index;
gtpv1u_ue_data_p->instance_id = 0; // TO DO gtpv1u_ue_data_p->instance_id = 0; // TO DO
#warning "TO DO TO DO gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].sgw_ip_addr" ipv4_addr =
#warning "TO DO TO DO gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].sgw_ip_addr = (uint32_t)(create_tunnel_req_pP->sgw_addr[i].buffer;"
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].state = BEARER_IN_CONFIG; gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].state = BEARER_IN_CONFIG;
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_eNB = s1u_teid; gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_eNB = s1u_teid;
gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_sgw = create_tunnel_req_pP->sgw_S1u_teid[i]; gtpv1u_ue_data_p->bearers[eps_bearer_id - GTPV1U_BEARER_OFFSET].teid_sgw = create_tunnel_req_pP->sgw_S1u_teid[i];
......
...@@ -406,9 +406,9 @@ extern int asn1_xer_print; ...@@ -406,9 +406,9 @@ extern int asn1_xer_print;
# include "s1ap_eNB_default_values.h" # include "s1ap_eNB_default_values.h"
# define S1AP_ERROR(x, args...) LOG_E(S1AP, x, ##args) # define S1AP_ERROR(x, args...) LOG_E(S1AP, x, ##args)
# define S1AP_WARN(x, args...) LOG_W(S1AP, x, ##args) # define S1AP_WARN(x, args...) LOG_W(S1AP, x, ##args)
# define S1AP_TRAF(x, args...) LOG_T(S1AP, x, ##args) # define S1AP_TRAF(x, args...) LOG_I(S1AP, x, ##args)
# define S1AP_INFO(x, args...) LOG_I(S1AP, x, ##args) # define S1AP_INFO(x, args...) LOG_I(S1AP, x, ##args)
# define S1AP_DEBUG(x, args...) LOG_D(S1AP, x, ##args) # define S1AP_DEBUG(x, args...) LOG_I(S1AP, x, ##args)
#else #else
# include "mme_default_values.h" # include "mme_default_values.h"
# define S1AP_ERROR(x, args...) do { fprintf(stdout, "[S1AP][E]"x, ##args); } while(0) # define S1AP_ERROR(x, args...) do { fprintf(stdout, "[S1AP][E]"x, ##args); } while(0)
......
...@@ -82,8 +82,8 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message, ...@@ -82,8 +82,8 @@ static int s1ap_eNB_decode_initiating_message(s1ap_message *message,
default: default:
S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n", S1AP_ERROR("Unknown procedure ID (%d) for initiating message\n",
(int)initiating_p->procedureCode); (int)initiating_p->procedureCode);
AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n", //AssertFatal( 0 , "Unknown procedure ID (%d) for initiating message\n",
(int)initiating_p->procedureCode); // (int)initiating_p->procedureCode);
return -1; return -1;
} }
......
...@@ -402,14 +402,14 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance, ...@@ -402,14 +402,14 @@ void s1ap_eNB_nas_non_delivery_ind(instance_t instance,
int s1ap_eNB_initial_ctxt_resp( int s1ap_eNB_initial_ctxt_resp(
instance_t instance, s1ap_initial_context_setup_resp_t *initial_ctxt_resp_p) instance_t instance, s1ap_initial_context_setup_resp_t *initial_ctxt_resp_p)
{ {
s1ap_eNB_instance_t *s1ap_eNB_instance_p; s1ap_eNB_instance_t *s1ap_eNB_instance_p = NULL;
struct s1ap_eNB_ue_context_s *ue_context_p; struct s1ap_eNB_ue_context_s *ue_context_p = NULL;
S1ap_InitialContextSetupResponseIEs_t *initial_ies_p; S1ap_InitialContextSetupResponseIEs_t *initial_ies_p = NULL;
s1ap_message message; s1ap_message message;
uint8_t *buffer; uint8_t *buffer = NULL;
uint32_t length; uint32_t length;
int ret = -1; int ret = -1;
int i; int i;
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
# include "UTIL/LOG/log.h" # include "UTIL/LOG/log.h"
# define SCTP_ERROR(x, args...) LOG_E(SCTP, x, ##args) # define SCTP_ERROR(x, args...) LOG_E(SCTP, x, ##args)
# define SCTP_WARN(x, args...) LOG_W(SCTP, x, ##args) # define SCTP_WARN(x, args...) LOG_W(SCTP, x, ##args)
# define SCTP_DEBUG(x, args...) LOG_D(SCTP, x, ##args) # define SCTP_DEBUG(x, args...) LOG_I(SCTP, x, ##args)
#else #else
# define SCTP_ERROR(x, args...) do { fprintf(stderr, "[SCTP][E]"x, ##args); } while(0) # define SCTP_ERROR(x, args...) do { fprintf(stderr, "[SCTP][E]"x, ##args); } while(0)
# define SCTP_DEBUG(x, args...) do { fprintf(stdout, "[SCTP][D]"x, ##args); } while(0) # define SCTP_DEBUG(x, args...) do { fprintf(stdout, "[SCTP][D]"x, ##args); } while(0)
......
...@@ -549,17 +549,17 @@ inline void sctp_eNB_read_from_socket(struct sctp_cnx_list_elm_s *sctp_cnx) ...@@ -549,17 +549,17 @@ inline void sctp_eNB_read_from_socket(struct sctp_cnx_list_elm_s *sctp_cnx)
} else { } else {
sctp_cnx->nb_messages++; sctp_cnx->nb_messages++;
if (sinfo.sinfo_ppid != sctp_cnx->ppid) { if (ntohl(sinfo.sinfo_ppid) != sctp_cnx->ppid) {
/* Mismatch in Payload Protocol Identifier, /* Mismatch in Payload Protocol Identifier,
* may be we received unsollicited traffic from stack other than S1AP. * may be we received unsollicited traffic from stack other than S1AP.
*/ */
SCTP_ERROR("Received data from peer with unsollicited PPID %d, expecting %d\n", SCTP_ERROR("Received data from peer with unsollicited PPID %d, expecting %d\n",
sinfo.sinfo_ppid, sctp_cnx->ppid); ntohl(sinfo.sinfo_ppid), sctp_cnx->ppid);
} }
SCTP_DEBUG("[%d][%d] Msg of length %d received from port %u, on stream %d, PPID %d\n", SCTP_DEBUG("[%d][%d] Msg of length %d received from port %u, on stream %d, PPID %d\n",
sinfo.sinfo_assoc_id, sctp_cnx->sd, n, ntohs(addr.sin_port), sinfo.sinfo_assoc_id, sctp_cnx->sd, n, ntohs(addr.sin_port),
sinfo.sinfo_stream, sinfo.sinfo_ppid); sinfo.sinfo_stream, ntohl(sinfo.sinfo_ppid));
sctp_itti_send_new_message_ind(sctp_cnx->task_id, sctp_itti_send_new_message_ind(sctp_cnx->task_id,
sinfo.sinfo_assoc_id, sinfo.sinfo_assoc_id,
......
/******************************************************************************* /*******************************************************************************
Eurecom OpenAirInterface core network
Eurecom OpenAirInterface Copyright(c) 1999 - 2014 Eurecom
Copyright(c) 1999 - 2014 Eurecom
This program is free software; you can redistribute it and/or modify it
This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License,
under the terms and conditions of the GNU General Public License, version 2, as published by the Free Software Foundation.
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
This program is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
more details.
You should have received a copy of the GNU General Public License along with
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc.,
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
The full GNU General Public License is included in this distribution in the file called "COPYING".
the file called "COPYING".
Contact Information
Contact Information Openair Admin: openair_admin@eurecom.fr
Openair Admin: openair_admin@eurecom.fr Openair Tech : openair_tech@eurecom.fr
Openair Tech : openair_tech@eurecom.fr Forums : http://forums.eurecom.fsr/openairinterface
Forums : http://forums.eurecom.fr/openairinterface Address : EURECOM,
Address : EURECOM, Campus SophiaTech, 450 Route des Chappes Campus SophiaTech,
06410 Biot FRANCE 450 Route des Chappes,
CS 50193
06904 Biot Sophia Antipolis cedex,
FRANCE
*******************************************************************************/ *******************************************************************************/
/*! \file udp_eNB_task.c
* \brief
* \author Sebastien ROUX, Lionel Gauthier
* \company Eurecom
* \email: lionel.gauthier@eurecom.fr
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -53,7 +61,6 @@ ...@@ -53,7 +61,6 @@
(uint8_t)(((aDDRESS) & 0x00ff0000) >> 16), \ (uint8_t)(((aDDRESS) & 0x00ff0000) >> 16), \
(uint8_t)(((aDDRESS) & 0xff000000) >> 24) (uint8_t)(((aDDRESS) & 0xff000000) >> 24)
static void *udp_receiver_thread(void *arg_p);
struct udp_socket_desc_s { struct udp_socket_desc_s {
int sd; /* Socket descriptor to use */ int sd; /* Socket descriptor to use */
...@@ -72,10 +79,38 @@ static STAILQ_HEAD(udp_socket_list_s, udp_socket_desc_s) udp_socket_list; ...@@ -72,10 +79,38 @@ static STAILQ_HEAD(udp_socket_list_s, udp_socket_desc_s) udp_socket_list;
static pthread_mutex_t udp_socket_list_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t udp_socket_list_mutex = PTHREAD_MUTEX_INITIALIZER;
static
struct udp_socket_desc_s *
udp_eNB_get_socket_desc(task_id_t task_id);
void udp_eNB_process_file_descriptors(
struct epoll_event *events,
int nb_events);
static
int
udp_eNB_create_socket(
int port,
char *ip_addr,
task_id_t task_id);
int
udp_eNB_send_to(
int sd,
uint16_t port,
uint32_t address,
const uint8_t *buffer,
uint32_t length);
void udp_eNB_receiver(struct udp_socket_desc_s *udp_sock_pP);
void *udp_eNB_task(void *args_p);
int udp_enb_init(const Enb_properties_t *enb_config_p);
/* @brief Retrieve the descriptor associated with the task_id /* @brief Retrieve the descriptor associated with the task_id
*/ */
static static
struct udp_socket_desc_s *udp_get_socket_desc(task_id_t task_id) struct udp_socket_desc_s *udp_eNB_get_socket_desc(task_id_t task_id)
{ {
struct udp_socket_desc_s *udp_sock_p = NULL; struct udp_socket_desc_s *udp_sock_p = NULL;
...@@ -90,11 +125,31 @@ struct udp_socket_desc_s *udp_get_socket_desc(task_id_t task_id) ...@@ -90,11 +125,31 @@ struct udp_socket_desc_s *udp_get_socket_desc(task_id_t task_id)
return udp_sock_p; return udp_sock_p;
} }
void udp_eNB_process_file_descriptors(struct epoll_event *events, int nb_events)
{
int i;
struct udp_socket_desc_s *udp_sock_p = NULL;
if (events == NULL) {
return;
}
for (i = 0; i < nb_events; i++) {
STAILQ_FOREACH(udp_sock_p, &udp_socket_list, entries) {
if (udp_sock_p->sd == events[i].data.fd) {
LOG_D(UDP_, "Found matching task desc\n");
udp_eNB_receiver(udp_sock_p);
break;
}
}
}
}
static static
int udp_create_socket(int port, char *ip_addr, task_id_t task_id) int udp_eNB_create_socket(int port, char *ip_addr, task_id_t task_id)
{ {
struct udp_socket_desc_s *thread_arg; struct udp_socket_desc_s *udp_socket_desc_p = NULL;
int sd, rc; int sd, rc;
struct sockaddr_in sin; struct sockaddr_in sin;
...@@ -118,53 +173,83 @@ int udp_create_socket(int port, char *ip_addr, task_id_t task_id) ...@@ -118,53 +173,83 @@ int udp_create_socket(int port, char *ip_addr, task_id_t task_id)
} }
/* Create a new descriptor for this connection */ /* Create a new descriptor for this connection */
thread_arg = calloc(1, sizeof(struct udp_socket_desc_s)); udp_socket_desc_p = calloc(1, sizeof(struct udp_socket_desc_s));
DevAssert(thread_arg != NULL); DevAssert(udp_socket_desc_p != NULL);
thread_arg->sd = sd; udp_socket_desc_p->sd = sd;
thread_arg->local_address = ip_addr; udp_socket_desc_p->local_address = ip_addr;
thread_arg->local_port = port; udp_socket_desc_p->local_port = port;
thread_arg->task_id = task_id; udp_socket_desc_p->task_id = task_id;
if (pthread_create(&thread_arg->listener_thread, NULL, LOG_I(UDP_, "Inserting new descriptor for task %d, sd %d\n", udp_socket_desc_p->task_id, udp_socket_desc_p->sd);
&udp_receiver_thread, (void *)thread_arg) < 0) { pthread_mutex_lock(&udp_socket_list_mutex);
LOG_E(UDP_, "Pthred_create failed (%s)\n", strerror(errno)); STAILQ_INSERT_TAIL(&udp_socket_list, udp_socket_desc_p, entries);
return -1; pthread_mutex_unlock(&udp_socket_list_mutex);
}
itti_subscribe_event_fd(TASK_UDP, sd);
LOG_I(UDP_, "Initializing UDP for local address %s with port %d: DONE\n", ip_addr, port); LOG_I(UDP_, "Initializing UDP for local address %s with port %d: DONE\n", ip_addr, port);
return sd; return sd;
} }
static void *udp_receiver_thread(void *arg_p) int
udp_eNB_send_to(
int sd,
uint16_t port,
uint32_t address,
const uint8_t *buffer,
uint32_t length)
{ {
struct udp_socket_desc_s *udp_sock_p; struct sockaddr_in to;
uint8_t buffer[2048]; socklen_t to_length;
udp_sock_p = (struct udp_socket_desc_s *)arg_p; if (sd <= 0 || ((buffer == NULL) && (length > 0))) {
LOG_D(UDP_, "Inserting new descriptor for task %d, sd %d\n", udp_sock_p->task_id, udp_sock_p->sd); LOG_E(UDP_, "udp_send_to: bad param\n");
pthread_mutex_lock(&udp_socket_list_mutex); return -1;
STAILQ_INSERT_TAIL(&udp_socket_list, udp_sock_p, entries); }
pthread_mutex_unlock(&udp_socket_list_mutex);
while (1) { memset(&to, 0, sizeof(struct sockaddr_in));
to_length = sizeof(to);
to.sin_family = AF_INET;
to.sin_port = htons(port);
to.sin_addr.s_addr = address;
if (sendto(sd, (void *)buffer, (size_t)length, 0, (struct sockaddr *)&to,
to_length) < 0) {
LOG_E(UDP_,
"[SD %d] Failed to send data to "IPV4_ADDR" on port %d, buffer size %u\n",
sd, IPV4_ADDR_FORMAT(address), port, length);
return -1;
}
LOG_I(UDP_, "[SD %d] Successfully sent to "IPV4_ADDR
" on port %d, buffer size %u, buffer address %x\n",
sd, IPV4_ADDR_FORMAT(address), port, length, buffer);
return 0;
}
void udp_eNB_receiver(struct udp_socket_desc_s *udp_sock_pP)
{
uint8_t l_buffer[2048];
int n; int n;
socklen_t from_len; socklen_t from_len;
struct sockaddr_in addr; struct sockaddr_in addr;
MessageDef *message_p = NULL;
udp_data_ind_t *udp_data_ind_p = NULL;
uint8_t *forwarded_buffer = NULL;
while (1) {
from_len = (socklen_t)sizeof(struct sockaddr_in); from_len = (socklen_t)sizeof(struct sockaddr_in);
if ((n = recvfrom(udp_sock_p->sd, buffer, sizeof(buffer), 0, LOG_I(UDP_, "before recvfrom sd %d\n", udp_sock_pP->sd);
if ((n = recvfrom(udp_sock_pP->sd, l_buffer, sizeof(l_buffer), 0,
(struct sockaddr *)&addr, &from_len)) < 0) { (struct sockaddr *)&addr, &from_len)) < 0) {
LOG_E(UDP_, "Recvfrom failed %s\n", strerror(errno)); LOG_E(UDP_, "Recvfrom failed %s\n", strerror(errno));
break; break;
} else { } else {
MessageDef *message_p = NULL;
udp_data_ind_t *udp_data_ind_p;
uint8_t *forwarded_buffer = NULL;
forwarded_buffer = calloc(n, sizeof(uint8_t)); forwarded_buffer = calloc(n, sizeof(uint8_t));
memcpy(forwarded_buffer, buffer, n); memcpy(forwarded_buffer, l_buffer, n);
message_p = itti_alloc_new_message(TASK_UDP, UDP_DATA_IND); message_p = itti_alloc_new_message(TASK_UDP, UDP_DATA_IND);
DevAssert(message_p != NULL); DevAssert(message_p != NULL);
udp_data_ind_p = &message_p->ittiMsg.udp_data_ind; udp_data_ind_p = &message_p->ittiMsg.udp_data_ind;
...@@ -173,42 +258,53 @@ static void *udp_receiver_thread(void *arg_p) ...@@ -173,42 +258,53 @@ static void *udp_receiver_thread(void *arg_p)
udp_data_ind_p->peer_port = htons(addr.sin_port); udp_data_ind_p->peer_port = htons(addr.sin_port);
udp_data_ind_p->peer_address = addr.sin_addr.s_addr; udp_data_ind_p->peer_address = addr.sin_addr.s_addr;
LOG_D(UDP_, "Msg of length %d received from %s:%u\n", LOG_I(UDP_, "Msg of length %d received from %s:%u\n",
n, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); n, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
if (itti_send_msg_to_task(udp_sock_p->task_id, INSTANCE_DEFAULT, message_p) < 0) { if (itti_send_msg_to_task(udp_sock_pP->task_id, INSTANCE_DEFAULT, message_p) < 0) {
LOG_D(UDP_, "Failed to send message %d to task %d\n", LOG_I(UDP_, "Failed to send message %d to task %d\n",
UDP_DATA_IND, udp_sock_p->task_id); UDP_DATA_IND,
udp_sock_pP->task_id);
break; break;
} }
} }
} }
close(udp_sock_p->sd); //close(udp_sock_p->sd);
udp_sock_p->sd = -1; //udp_sock_p->sd = -1;
pthread_mutex_lock(&udp_socket_list_mutex);
STAILQ_REMOVE(&udp_socket_list, udp_sock_p, udp_socket_desc_s, entries);
pthread_mutex_unlock(&udp_socket_list_mutex);
return NULL; //pthread_mutex_lock(&udp_socket_list_mutex);
//STAILQ_REMOVE(&udp_socket_list, udp_sock_p, udp_socket_desc_s, entries);
//pthread_mutex_unlock(&udp_socket_list_mutex);
} }
void *udp_eNB_task(void *args_p) void *udp_eNB_task(void *args_p)
{ {
int nb_events;
struct epoll_event *events;
MessageDef *received_message_p = NULL;
const char *msg_name = NULL;
instance_t instance = 0;
udp_enb_init(NULL);
itti_mark_task_ready(TASK_UDP); itti_mark_task_ready(TASK_UDP);
while(1) { while(1) {
MessageDef *received_message_p = NULL;
itti_receive_msg(TASK_UDP, &received_message_p); itti_receive_msg(TASK_UDP, &received_message_p);
DevAssert(received_message_p != NULL); if (received_message_p != NULL) {
msg_name = ITTI_MSG_NAME (received_message_p);
instance = ITTI_MSG_INSTANCE (received_message_p);
switch (ITTI_MSG_ID(received_message_p)) switch (ITTI_MSG_ID(received_message_p))
{ {
case UDP_INIT: { case UDP_INIT: {
udp_init_t *udp_init_p; udp_init_t *udp_init_p;
udp_init_p = &received_message_p->ittiMsg.udp_init; udp_init_p = &received_message_p->ittiMsg.udp_init;
udp_create_socket(udp_init_p->port, udp_init_p->address, udp_eNB_create_socket(
udp_init_p->port,
udp_init_p->address,
ITTI_MSG_ORIGIN_ID(received_message_p)); ITTI_MSG_ORIGIN_ID(received_message_p));
} break; } break;
case UDP_DATA_REQ: { case UDP_DATA_REQ: {
int udp_sd = -1; int udp_sd = -1;
ssize_t bytes_written; ssize_t bytes_written;
...@@ -226,11 +322,13 @@ void *udp_eNB_task(void *args_p) ...@@ -226,11 +322,13 @@ void *udp_eNB_task(void *args_p)
peer_addr.sin_addr.s_addr = udp_data_req_p->peer_address; peer_addr.sin_addr.s_addr = udp_data_req_p->peer_address;
pthread_mutex_lock(&udp_socket_list_mutex); pthread_mutex_lock(&udp_socket_list_mutex);
udp_sock_p = udp_get_socket_desc(ITTI_MSG_ORIGIN_ID(received_message_p)); udp_sock_p = udp_eNB_get_socket_desc(ITTI_MSG_ORIGIN_ID(received_message_p));
if (udp_sock_p == NULL) { if (udp_sock_p == NULL) {
LOG_E(UDP_, "Failed to retrieve the udp socket descriptor " LOG_E(UDP_,
"associated with task %d\n", ITTI_MSG_ORIGIN_ID(received_message_p)); "Failed to retrieve the udp socket descriptor "
"associated with task %d\n",
ITTI_MSG_ORIGIN_ID(received_message_p));
pthread_mutex_unlock(&udp_socket_list_mutex); pthread_mutex_unlock(&udp_socket_list_mutex);
if (udp_data_req_p->buffer) { if (udp_data_req_p->buffer) {
free(udp_data_req_p->buffer); free(udp_data_req_p->buffer);
...@@ -240,13 +338,17 @@ void *udp_eNB_task(void *args_p) ...@@ -240,13 +338,17 @@ void *udp_eNB_task(void *args_p)
udp_sd = udp_sock_p->sd; udp_sd = udp_sock_p->sd;
pthread_mutex_unlock(&udp_socket_list_mutex); pthread_mutex_unlock(&udp_socket_list_mutex);
LOG_D(UDP_, "[%d] Sending message of size %u to "IPV4_ADDR" and port %u\n", LOG_I(UDP_, "[%d] Sending message of size %u to "IPV4_ADDR" and port %u\n",
udp_sd, udp_data_req_p->buffer_length, udp_sd,
udp_data_req_p->buffer_length,
IPV4_ADDR_FORMAT(udp_data_req_p->peer_address), IPV4_ADDR_FORMAT(udp_data_req_p->peer_address),
udp_data_req_p->peer_port); udp_data_req_p->peer_port);
bytes_written = sendto(udp_sd, udp_data_req_p->buffer, bytes_written = sendto(
udp_data_req_p->buffer_length, 0, udp_sd,
udp_data_req_p->buffer,
udp_data_req_p->buffer_length,
0,
(struct sockaddr *)&peer_addr, (struct sockaddr *)&peer_addr,
sizeof(struct sockaddr_in)); sizeof(struct sockaddr_in));
...@@ -255,27 +357,37 @@ void *udp_eNB_task(void *args_p) ...@@ -255,27 +357,37 @@ void *udp_eNB_task(void *args_p)
"(%d:%s)\n", errno, strerror(errno)); "(%d:%s)\n", errno, strerror(errno));
} }
} break; } break;
case TERMINATE_MESSAGE: { case TERMINATE_MESSAGE: {
itti_exit_task(); itti_exit_task();
} break; } break;
case MESSAGE_TEST: { case MESSAGE_TEST: {
} break; } break;
default: { default: {
LOG_D(UDP_, "Unkwnon message ID %d:%s\n", LOG_I(UDP_, "Unkwnon message ID %d:%s\n",
ITTI_MSG_ID(received_message_p), ITTI_MSG_NAME(received_message_p)); ITTI_MSG_ID(received_message_p),
ITTI_MSG_NAME(received_message_p));
} break; } break;
} }
on_error: on_error:
free(received_message_p); itti_free (ITTI_MSG_ORIGIN_ID(received_message_p), received_message_p);
received_message_p = NULL; received_message_p = NULL;
} }
nb_events = itti_get_events(TASK_UDP, &events);
/* Now handle notifications for other sockets */
if (nb_events > 0) {
udp_eNB_process_file_descriptors(events, nb_events);
}
}
return NULL; return NULL;
} }
int udp_enb_init(const Enb_properties_t *enb_config_p) int udp_enb_init(const Enb_properties_t *enb_config_p)
{ {
LOG_D(UDP_, "Initializing UDP task interface\n"); LOG_I(UDP_, "Initializing UDP task interface\n");
STAILQ_INIT(&udp_socket_list); STAILQ_INIT(&udp_socket_list);
LOG_D(UDP_, "Initializing UDP task interface: DONE\n"); LOG_I(UDP_, "Initializing UDP task interface: DONE\n");
return 0; return 0;
} }
...@@ -2943,7 +2943,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,ui ...@@ -2943,7 +2943,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,ui
phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j])
- phy_vars_eNB->rx_total_gain_eNB_dB; - phy_vars_eNB->rx_total_gain_eNB_dB;
#ifdef DEBUG_PHY_PROC #ifdef DEBUG_PHY_PROC
LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n", LOG_I(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n",
phy_vars_eNB->Mod_id,frame,last_slot>>1,i, phy_vars_eNB->Mod_id,frame,last_slot>>1,i,
dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]), dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1])); dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]));
...@@ -3058,9 +3058,10 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,ui ...@@ -3058,9 +3058,10 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,ui
} }
// If we've dropped the UE, go back to PRACH mode for this UE // If we've dropped the UE, go back to PRACH mode for this UE
#if !defined(EXMIMO_IOT)
if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) { if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) {
LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached, removing UE\n", LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, removing UE\n",
phy_vars_eNB->Mod_id,frame,last_slot>>1, i); phy_vars_eNB->Mod_id,frame,last_slot>>1, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]);
phy_vars_eNB->eNB_UE_stats[i].mode = PRACH; phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
#ifdef OPENAIR2 #ifdef OPENAIR2
mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id, mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
...@@ -3070,6 +3071,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,ui ...@@ -3070,6 +3071,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,ui
remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag); remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0; phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0;
} }
#endif
} }
} // ulsch in error } // ulsch in error
else { else {
......
...@@ -2468,8 +2468,8 @@ int main(int argc, char **argv) { ...@@ -2468,8 +2468,8 @@ int main(int argc, char **argv) {
} //ABStraction } //ABStraction
if ( (test_perf != 0) && (100 * effective_rate > test_perf )) { if ( (test_perf != 0) && (100 * effective_rate > test_perf )) {
fprintf(bler_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n"); fprintf(time_meas_fd,"SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err\n");
fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n", fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
SNR, SNR,
mcs, mcs,
PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS, PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
......
ENB_APP_DIR = $(OPENAIR2_TOP)/ENB_APP ENB_APP_DIR = $(OPENAIR2_TOP)/ENB_APP
ENB_APP_OBJS = $(ENB_APP_DIR)/enb_app.o $(ENB_APP_DIR)/enb_config.o ENB_APP_OBJS = $(ENB_APP_DIR)/enb_app.o \
$(ENB_APP_DIR)/enb_config.o
ENB_APP_incl = \ ENB_APP_incl = \
-I$(ENB_APP_DIR) -I$(ENB_APP_DIR)
\ No newline at end of file
/******************************************************************************* /*******************************************************************************
Eurecom OpenAirInterface 2
Eurecom OpenAirInterface Copyright(c) 1999 - 2014 Eurecom
Copyright(c) 1999 - 2012 Eurecom
This program is free software; you can redistribute it and/or modify it
This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License,
under the terms and conditions of the GNU General Public License, version 2, as published by the Free Software Foundation.
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
This program is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
more details.
You should have received a copy of the GNU General Public License along with
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc.,
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
The full GNU General Public License is included in this distribution in the file called "COPYING".
the file called "COPYING".
Contact Information
Contact Information Openair Admin: openair_admin@eurecom.fr
Openair Admin: openair_admin@eurecom.fr Openair Tech : openair_tech@eurecom.fr
Openair Tech : openair_tech@eurecom.fr Forums : http://forums.eurecom.fsr/openairinterface
Forums : http://forums.eurecom.fr/openairinterface Address : EURECOM,
Address : EURECOM, Campus SophiaTech, 450 Route des Chappes Campus SophiaTech,
06410 Biot FRANCE 450 Route des Chappes,
CS 50193
*******************************************************************************/ 06904 Biot Sophia Antipolis cedex,
FRANCE
*******************************************************************************/
/*
enb_app.c
-------------------
AUTHOR : Laurent Winckel, Sebastien ROUX, Lionel GAUTHIER
COMPANY : EURECOM
EMAIL : Lionel.Gauthier@eurecom.fr
*/
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
...@@ -47,9 +56,7 @@ ...@@ -47,9 +56,7 @@
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
# include "s1ap_eNB.h" # include "s1ap_eNB.h"
# include "sctp_eNB_task.h" # include "sctp_eNB_task.h"
# if defined(LINK_PDCP_TO_GTPV1U) # include "gtpv1u_eNB_task.h"
# include "gtpv1u_eNB_defs.h"
# endif
# endif # endif
extern unsigned char NB_eNB_INST; extern unsigned char NB_eNB_INST;
...@@ -169,7 +176,7 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con ...@@ -169,7 +176,7 @@ static uint32_t eNB_app_register(uint32_t enb_id_start, uint32_t enb_id_end, con
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
void *eNB_app_task(void *args_p) void *eNB_app_task(void *args_p)
{ {
const Enb_properties_array_t *enb_properties = NULL; const Enb_properties_array_t *enb_properties_p = NULL;
#if defined(ENABLE_ITTI) #if defined(ENABLE_ITTI)
uint32_t enb_nb = 1; /* Default number of eNB is 1 */ uint32_t enb_nb = 1; /* Default number of eNB is 1 */
uint32_t enb_id_start = 0; uint32_t enb_id_start = 0;
...@@ -199,25 +206,22 @@ void *eNB_app_task(void *args_p) ...@@ -199,25 +206,22 @@ void *eNB_app_task(void *args_p)
# endif # endif
# endif # endif
enb_properties = enb_config_get(); enb_properties_p = enb_config_get();
AssertFatal (enb_nb <= enb_properties->number, AssertFatal (enb_nb <= enb_properties_p->number,
"Number of eNB is greater than eNB defined in configuration file (%d/%d)!", "Number of eNB is greater than eNB defined in configuration file (%d/%d)!",
enb_nb, enb_properties->number); enb_nb, enb_properties_p->number);
for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++)
{ {
configure_phy(enb_id, enb_properties); configure_phy(enb_id, enb_properties_p);
configure_rrc(enb_id, enb_properties); configure_rrc(enb_id, enb_properties_p);
} }
# if defined(ENABLE_USE_MME) # if defined(ENABLE_USE_MME)
# if defined(LINK_PDCP_TO_GTPV1U)
gtpv1u_eNB_init(enb_properties->properties[0]);
# endif
/* Try to register each eNB */ /* Try to register each eNB */
registered_enb = 0; registered_enb = 0;
register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties); register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p);
# else # else
/* Start L2L1 task */ /* Start L2L1 task */
msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE); msg_p = itti_alloc_new_message(TASK_ENB_APP, INITIALIZE_MESSAGE);
...@@ -293,7 +297,7 @@ void *eNB_app_task(void *args_p) ...@@ -293,7 +297,7 @@ void *eNB_app_task(void *args_p)
sleep(ENB_REGISTER_RETRY_DELAY); sleep(ENB_REGISTER_RETRY_DELAY);
/* Restart the registration process */ /* Restart the registration process */
registered_enb = 0; registered_enb = 0;
register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties); register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p);
} }
} }
} }
...@@ -313,7 +317,7 @@ void *eNB_app_task(void *args_p) ...@@ -313,7 +317,7 @@ void *eNB_app_task(void *args_p)
{ {
/* Restart the registration process */ /* Restart the registration process */
registered_enb = 0; registered_enb = 0;
register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties); register_enb_pending = eNB_app_register (enb_id_start, enb_id_end, enb_properties_p);
} }
break; break;
# endif # endif
......
/******************************************************************************* /*******************************************************************************
Eurecom OpenAirInterface 2
Eurecom OpenAirInterface Copyright(c) 1999 - 2014 Eurecom
Copyright(c) 1999 - 2012 Eurecom
This program is free software; you can redistribute it and/or modify it
This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License,
under the terms and conditions of the GNU General Public License, version 2, as published by the Free Software Foundation.
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
This program is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
more details.
You should have received a copy of the GNU General Public License along with
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc.,
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
The full GNU General Public License is included in this distribution in the file called "COPYING".
the file called "COPYING".
Contact Information
Contact Information Openair Admin: openair_admin@eurecom.fr
Openair Admin: openair_admin@eurecom.fr Openair Tech : openair_tech@eurecom.fr
Openair Tech : openair_tech@eurecom.fr Forums : http://forums.eurecom.fsr/openairinterface
Forums : http://forums.eurecom.fr/openairinterface Address : EURECOM,
Address : EURECOM, Campus SophiaTech, 450 Route des Chappes Campus SophiaTech,
06410 Biot FRANCE 450 Route des Chappes,
CS 50193
06904 Biot Sophia Antipolis cedex,
FRANCE
*******************************************************************************/ *******************************************************************************/
/*
enb_app.h
-------------------
AUTHOR : Laurent Winckel, Sebastien ROUX, Lionel GAUTHIER
COMPANY : EURECOM
EMAIL : Lionel.Gauthier@eurecom.fr
*/
#ifndef ENB_APP_H_ #ifndef ENB_APP_H_
#define ENB_APP_H_ #define ENB_APP_H_
void *eNB_app_task(void *args_p); void *eNB_app_task(void *args_p);
#endif /* ENB_APP_H_ */ #endif /* ENB_APP_H_ */
...@@ -84,8 +84,12 @@ ...@@ -84,8 +84,12 @@
#define CCCH 0 // srb0 #define CCCH 0 // srb0
#define DCCH 1 // srb1 #define DCCH 1 // srb1
#define DCCH1 2 // srb2 #define DCCH1 2 // srb2
#define DTCH 3 // DTCH + lcid < 11
#ifdef EXMIMO_IOT
#define DTCH 5 // DTCH + lcid < 11
#else
#define DTCH 3
#endif
#define MCCH 4 // MCCH #define MCCH 4 // MCCH
#define MTCH 1 // MTCH #define MTCH 1 // MTCH
......
...@@ -2259,14 +2259,11 @@ void schedule_ulsch_rnti(module_id_t module_idP, ...@@ -2259,14 +2259,11 @@ void schedule_ulsch_rnti(module_id_t module_idP,
status = mac_get_rrc_status(module_idP,1,next_ue); status = mac_get_rrc_status(module_idP,1,next_ue);
#ifndef EXMIMO_IOT
if (status < RRC_CONNECTED) if (status < RRC_CONNECTED)
cqi_req = 0; cqi_req = 0;
else else
cqi_req = 1; cqi_req = 1;
#else
cqi_req = 0;
#endif
if (round > 0) { if (round > 0) {
ndi = eNB_mac_inst[module_idP].UE_template[ue_mod_id].oldNDI_UL[harq_pid]; ndi = eNB_mac_inst[module_idP].UE_template[ue_mod_id].oldNDI_UL[harq_pid];
......
...@@ -77,6 +77,9 @@ endif ...@@ -77,6 +77,9 @@ endif
RRC_OBJS += $(RRC_DIR)/rrc_eNB.o RRC_OBJS += $(RRC_DIR)/rrc_eNB.o
RRC_OBJS += $(RRC_DIR)/rrc_eNB_S1AP.o RRC_OBJS += $(RRC_DIR)/rrc_eNB_S1AP.o
ifdef USE_MME
RRC_OBJS += $(RRC_DIR)/rrc_eNB_GTPV1U.o
endif
RRC_OBJS += $(RRC_DIR)/rrc_common.o RRC_OBJS += $(RRC_DIR)/rrc_common.o
RRC_OBJS += $(RRC_DIR)/L2_interface.o RRC_OBJS += $(RRC_DIR)/L2_interface.o
......
...@@ -663,7 +663,7 @@ uint8_t do_SIB2_AT4(uint8_t Mod_id, ...@@ -663,7 +663,7 @@ uint8_t do_SIB2_AT4(uint8_t Mod_id,
(*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset = 0; (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset = 0;
// PDSCH-Config // PDSCH-Config
(*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=24; (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=-24;
(*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0; (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0;
// PUSCH-Config // PUSCH-Config
...@@ -1489,7 +1489,7 @@ uint8_t do_RRCConnectionSetup(uint8_t Mod_id, ...@@ -1489,7 +1489,7 @@ uint8_t do_RRCConnectionSetup(uint8_t Mod_id,
physicalConfigDedicated2->uplinkPowerControlDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->uplinkPowerControlDedicated)); physicalConfigDedicated2->uplinkPowerControlDedicated = CALLOC(1,sizeof(*physicalConfigDedicated2->uplinkPowerControlDedicated));
physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH)); physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUCCH));
physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH)); physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH = CALLOC(1,sizeof(*physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH));
physicalConfigDedicated2->cqi_ReportConfig = NULL;//CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig)); physicalConfigDedicated2->cqi_ReportConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig));
physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = NULL;//CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated)); physicalConfigDedicated2->soundingRS_UL_ConfigDedicated = NULL;//CALLOC(1,sizeof(*physicalConfigDedicated2->soundingRS_UL_ConfigDedicated));
physicalConfigDedicated2->antennaInfo = CALLOC(1,sizeof(*physicalConfigDedicated2->antennaInfo)); physicalConfigDedicated2->antennaInfo = CALLOC(1,sizeof(*physicalConfigDedicated2->antennaInfo));
physicalConfigDedicated2->schedulingRequestConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->schedulingRequestConfig)); physicalConfigDedicated2->schedulingRequestConfig = CALLOC(1,sizeof(*physicalConfigDedicated2->schedulingRequestConfig));
...@@ -1544,11 +1544,16 @@ uint8_t do_RRCConnectionSetup(uint8_t Mod_id, ...@@ -1544,11 +1544,16 @@ uint8_t do_RRCConnectionSetup(uint8_t Mod_id,
physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH->choice.setup.tpc_RNTI.bits_unused=0; physicalConfigDedicated2->tpc_PDCCH_ConfigPUSCH->choice.setup.tpc_RNTI.bits_unused=0;
// CQI ReportConfig // CQI ReportConfig
/*
physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic)); physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic));
assign_enum(physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic, #ifdef Rel10
CQI_ReportConfig__cqi_ReportModeAperiodic_rm30); // HLC CQI, no PMI *physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic= CQI_ReportModeAperiodic_rm30;
#else
*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportModeAperiodic=CQI_ReportConfig__cqi_ReportModeAperiodic_rm30; // HLC CQI, no PMI
#endif
physicalConfigDedicated2->cqi_ReportConfig->nomPDSCH_RS_EPRE_Offset = 0; // 0 dB physicalConfigDedicated2->cqi_ReportConfig->nomPDSCH_RS_EPRE_Offset = 0; // 0 dB
physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=NULL;
/*
physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic)); physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic=CALLOC(1,sizeof(*physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic));
physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = CQI_ReportPeriodic_PR_setup; physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->present = CQI_ReportPeriodic_PR_setup;
physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex = 0; // n2_pucch physicalConfigDedicated2->cqi_ReportConfig->cqi_ReportPeriodic->choice.setup.cqi_PUCCH_ResourceIndex = 0; // n2_pucch
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#if defined(ENABLE_USE_MME) #if defined(ENABLE_USE_MME)
# include "rrc_eNB_S1AP.h" # include "rrc_eNB_S1AP.h"
# include "rrc_eNB_GTPV1U.h"
# if defined(ENABLE_ITTI) # if defined(ENABLE_ITTI)
# else # else
# include "../../S1AP/s1ap_eNB.h" # include "../../S1AP/s1ap_eNB.h"
...@@ -709,7 +710,7 @@ static void rrc_eNB_generate_defaultRRCConnectionReconfiguration( ...@@ -709,7 +710,7 @@ static void rrc_eNB_generate_defaultRRCConnectionReconfiguration(
// NN: this is the 1st DRB for this ue, so set it to 1 // NN: this is the 1st DRB for this ue, so set it to 1
DRB_config->drb_Identity = (DRB_Identity_t) 1; // (ue_mod_idP+1); //allowed values 1..32 DRB_config->drb_Identity = (DRB_Identity_t) 1; // (ue_mod_idP+1); //allowed values 1..32
DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long)); DRB_config->logicalChannelIdentity = CALLOC(1, sizeof(long));
*(DRB_config->logicalChannelIdentity) = (long)3; *(DRB_config->logicalChannelIdentity) = (long)5;
DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config)); DRB_rlc_config = CALLOC(1, sizeof(*DRB_rlc_config));
DRB_config->rlc_Config = DRB_rlc_config; DRB_config->rlc_Config = DRB_rlc_config;
...@@ -3094,6 +3095,11 @@ void *rrc_enb_task( ...@@ -3094,6 +3095,11 @@ void *rrc_enb_task(
case S1AP_UE_CONTEXT_RELEASE_REQ: case S1AP_UE_CONTEXT_RELEASE_REQ:
rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance); rrc_eNB_process_S1AP_UE_CONTEXT_RELEASE_REQ(msg_p, msg_name_p, instance);
break; break;
case GTPV1U_ENB_CREATE_TUNNEL_RESP:
rrc_eNB_process_GTPV1U_CREATE_TUNNEL_RESP(msg_p, msg_name_p, instance);
break;
# endif # endif
/* Messages from eNB app */ /* Messages from eNB app */
......
/******************************************************************************* /*******************************************************************************
Eurecom OpenAirInterface 2
Eurecom OpenAirInterface 2 Copyright(c) 1999 - 2014 Eurecom
Copyright(c) 1999 - 2010 Eurecom
This program is free software; you can redistribute it and/or modify it
This program is free software; you can redistribute it and/or modify it under the terms and conditions of the GNU General Public License,
under the terms and conditions of the GNU General Public License, version 2, as published by the Free Software Foundation.
version 2, as published by the Free Software Foundation.
This program is distributed in the hope it will be useful, but WITHOUT
This program is distributed in the hope it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
more details.
You should have received a copy of the GNU General Public License along with
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc.,
this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
The full GNU General Public License is included in this distribution in
The full GNU General Public License is included in this distribution in the file called "COPYING".
the file called "COPYING".
Contact Information
Contact Information Openair Admin: openair_admin@eurecom.fr
Openair Admin: openair_admin@eurecom.fr Openair Tech : openair_tech@eurecom.fr
Openair Tech : openair_tech@eurecom.fr Forums : http://forums.eurecom.fsr/openairinterface
Forums : http://forums.eurecom.fsr/openairinterface Address : EURECOM,
Address : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France Campus SophiaTech,
450 Route des Chappes,
*******************************************************************************/ CS 50193
06904 Biot Sophia Antipolis cedex,
FRANCE
*******************************************************************************/
/*! \file rrc_eNB_S1AP.c /*! \file rrc_eNB_S1AP.c
* \brief rrc S1AP procedures for eNB * \brief rrc S1AP procedures for eNB
...@@ -263,7 +266,7 @@ static void process_eNB_security_key (uint8_t mod_id, uint8_t ue_index, uint8_t ...@@ -263,7 +266,7 @@ static void process_eNB_security_key (uint8_t mod_id, uint8_t ue_index, uint8_t
/*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/
void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t mod_id, uint8_t ue_index) { void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t mod_id, uint8_t ue_index) {
eNB_RRC_UE_INFO *UE_info = &eNB_rrc_inst[mod_id].Info.UE[ue_index]; eNB_RRC_UE_INFO *UE_info = &eNB_rrc_inst[mod_id].Info.UE[ue_index];
MessageDef *msg_p; MessageDef *msg_p = NULL;
int e_rab; int e_rab;
int e_rabs_done = 0; int e_rabs_done = 0;
int e_rabs_failed = 0; int e_rabs_failed = 0;
...@@ -275,6 +278,11 @@ void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t mod_id, uint8_t ue_ind ...@@ -275,6 +278,11 @@ void rrc_eNB_send_S1AP_INITIAL_CONTEXT_SETUP_RESP(uint8_t mod_id, uint8_t ue_ind
e_rabs_done++; e_rabs_done++;
S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id = UE_info->e_rab[e_rab].param.e_rab_id; S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].e_rab_id = UE_info->e_rab[e_rab].param.e_rab_id;
// TODO add other information from S1-U when it will be integrated // TODO add other information from S1-U when it will be integrated
S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].gtp_teid = UE_info->enb_gtp_teid[e_rab];
#warning "hardcoded address of S1U enb"
//S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr = UE_info->enb_gtp_addrs[e_rab];
inet_aton("192.168.13.10", S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.buffer);
S1AP_INITIAL_CONTEXT_SETUP_RESP (msg_p).e_rabs[e_rab].eNB_addr.length = 4;
} }
else { else {
e_rabs_failed++; e_rabs_failed++;
...@@ -500,6 +508,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char ...@@ -500,6 +508,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char
uint16_t ue_initial_id; uint16_t ue_initial_id;
uint32_t eNB_ue_s1ap_id; uint32_t eNB_ue_s1ap_id;
uint8_t ue_index; uint8_t ue_index;
MessageDef *message_gtpv1u_p = NULL;
ue_initial_id = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).ue_initial_id; ue_initial_id = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).ue_initial_id;
eNB_ue_s1ap_id = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).eNB_ue_s1ap_id; eNB_ue_s1ap_id = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).eNB_ue_s1ap_id;
...@@ -510,7 +519,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char ...@@ -510,7 +519,7 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char
if (ue_index == UE_INDEX_INVALID) { if (ue_index == UE_INDEX_INVALID) {
/* Can not associate this message to an UE index, send a failure to S1AP and discard it! */ /* Can not associate this message to an UE index, send a failure to S1AP and discard it! */
MessageDef *msg_fail_p; MessageDef *msg_fail_p = NULL;
LOG_W(RRC, "[eNB %d] In S1AP_INITIAL_CONTEXT_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id); LOG_W(RRC, "[eNB %d] In S1AP_INITIAL_CONTEXT_SETUP_REQ: unknown UE from S1AP ids (%d, %d)\n", instance, ue_initial_id, eNB_ue_s1ap_id);
...@@ -524,17 +533,31 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char ...@@ -524,17 +533,31 @@ int rrc_eNB_process_S1AP_INITIAL_CONTEXT_SETUP_REQ(MessageDef *msg_p, const char
return (-1); return (-1);
} }
else { else {
eNB_rrc_inst[instance].Info.UE[ue_index].eNB_ue_s1ap_id = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).eNB_ue_s1ap_id; eNB_rrc_inst[instance].Info.UE[ue_index].eNB_ue_s1ap_id = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).eNB_ue_s1ap_id;
/* Save e RAB information for later */ /* Save e RAB information for later */
{ {
int i; int i;
message_gtpv1u_p = itti_alloc_new_message(TASK_S1AP, GTPV1U_ENB_CREATE_TUNNEL_REQ);
eNB_rrc_inst[instance].Info.UE[ue_index].nb_of_e_rabs = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_e_rabs; eNB_rrc_inst[instance].Info.UE[ue_index].nb_of_e_rabs = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).nb_of_e_rabs;
for (i = 0; i < eNB_rrc_inst[instance].Info.UE[ue_index].nb_of_e_rabs; i++) { for (i = 0; i < eNB_rrc_inst[instance].Info.UE[ue_index].nb_of_e_rabs; i++) {
eNB_rrc_inst[instance].Info.UE[ue_index].e_rab[i].status = E_RAB_STATUS_NEW; eNB_rrc_inst[instance].Info.UE[ue_index].e_rab[i].status = E_RAB_STATUS_NEW;
eNB_rrc_inst[instance].Info.UE[ue_index].e_rab[i].param = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i]; eNB_rrc_inst[instance].Info.UE[ue_index].e_rab[i].param = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i];
GTPV1U_ENB_CREATE_TUNNEL_REQ(message_gtpv1u_p).eps_bearer_id[i] = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].e_rab_id;
GTPV1U_ENB_CREATE_TUNNEL_REQ(message_gtpv1u_p).sgw_S1u_teid[i] = S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].gtp_teid;
memcpy(&GTPV1U_ENB_CREATE_TUNNEL_REQ(message_gtpv1u_p).sgw_addr[i],
&S1AP_INITIAL_CONTEXT_SETUP_REQ (msg_p).e_rab_param[i].sgw_addr,
sizeof(transport_layer_addr_t));
} }
GTPV1U_ENB_CREATE_TUNNEL_REQ(message_gtpv1u_p).ue_index = ue_index; // warning put zero above
GTPV1U_ENB_CREATE_TUNNEL_REQ(message_gtpv1u_p).num_tunnels = i;
itti_send_msg_to_task(TASK_GTPV1_U, INSTANCE_DEFAULT, message_gtpv1u_p);
} }
/* TODO parameters yet to process ... */ /* TODO parameters yet to process ... */
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
# include "s1ap_eNB.h" # include "s1ap_eNB.h"
# include "nas_ue_task.h" # include "nas_ue_task.h"
# include "udp_eNB_task.h" # include "udp_eNB_task.h"
# include "gtpv1u_eNB_task.h"
# endif # endif
# if defined(ENABLE_RAL) # if defined(ENABLE_RAL)
# include "lteRALue.h" # include "lteRALue.h"
...@@ -74,6 +75,12 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) ...@@ -74,6 +75,12 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
LOG_E(EMU, "Create task for UDP failed\n"); LOG_E(EMU, "Create task for UDP failed\n");
return -1; return -1;
} }
if (itti_create_task (TASK_GTPV1_U, &gtpv1u_eNB_task, NULL) < 0)
{
LOG_E(EMU, "Create task for GTPV1U failed\n");
return -1;
}
} }
if (ue_nb > 0) if (ue_nb > 0)
......
...@@ -94,7 +94,8 @@ def execute(oai, user, pw, logfile,logdir): ...@@ -94,7 +94,8 @@ def execute(oai, user, pw, logfile,logdir):
name = 'Run oai.dlsim.perf.70%' name = 'Run oai.dlsim.perf.70%'
diag = 'no diagnostic is available, check the log file' diag = 'no diagnostic is available, check the log file'
for i in range(len(PRB)): for i in range(len(PRB)):
for j in range(len(MCS)): #for j in range(len(MCS)):
for j in range(0,28):
for k in range(1,ANT_TX): for k in range(1,ANT_TX):
for m in range (1,ANT_RX): for m in range (1,ANT_RX):
for n in range(1,PDCCH): for n in range(1,PDCCH):
...@@ -103,8 +104,10 @@ def execute(oai, user, pw, logfile,logdir): ...@@ -103,8 +104,10 @@ def execute(oai, user, pw, logfile,logdir):
for q in range(MIN_SNR,MAX_SNR): for q in range(MIN_SNR,MAX_SNR):
#if if PRB[i] : #if if PRB[i] :
conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -n500 -P -O80' #+ OPT #conf = '-B' + str(PRB[i]) + ' -m'+str(MCS[j]) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -n500 -P -O80' #+ OPT
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log' #trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(MCS[j])+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
conf = '-B' + str(PRB[i]) + ' -m'+str(j) + ' -y'+str(k) + ' -z'+str(m) +' -c'+str(n) + ' -g'+str(CHANNEL[o]) + ' -x'+str(p) + ' -s'+str(q) + ' -w1.0 -f.1 -n500 -P -O80' #+ OPT
trace = logdir + '/time_meas' + '_prb'+str(PRB[i])+'_mcs'+ str(j)+ '_anttx' + str(k)+ '_antrx' + str(m) + '_pdcch' + str(n) + '_channel' +str(CHANNEL[o]) + '_tx' +str(p) + '_snr' +str(q)+'.'+case+str(test)+ '.log'
tee = ' 2>&1 | tee ' + trace tee = ' 2>&1 | tee ' + trace
match = oai.send_expect_re('./dlsim.rel8 ' + conf + tee, 'passed', 0, 1000) match = oai.send_expect_re('./dlsim.rel8 ' + conf + tee, 'passed', 0, 1000)
#print conf #print conf
......
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