Commit b43c6cbf authored by Frédéric Leroy's avatar Frédéric Leroy

nas_ue_task: add support for multiple UE

parent 8bc36c3b
...@@ -72,3 +72,16 @@ void hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int si ...@@ -72,3 +72,16 @@ void hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int si
hex_value[i] = (hex_char_to_hex_value(hex_string[2 * i]) << 4) | hex_char_to_hex_value(hex_string[2 * i + 1]); hex_value[i] = (hex_char_to_hex_value(hex_string[2 * i]) << 4) | hex_char_to_hex_value(hex_string[2 * i + 1]);
} }
} }
char *itoa(int i) {
char buffer[64];
int ret;
ret = snprintf(buffer, sizeof(buffer), "%d",i);
if ( ret <= 0 ) {
return NULL;
}
return strdup(buffer);
}
...@@ -12,4 +12,6 @@ uint8_t hex_char_to_hex_value (char c); ...@@ -12,4 +12,6 @@ uint8_t hex_char_to_hex_value (char c);
// Converts an hexadecimal ASCII coded string into its value.** // Converts an hexadecimal ASCII coded string into its value.**
void hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size); void hex_string_to_hex_value (uint8_t *hex_value, const char *hex_string, int size);
char *itoa(int i);
#endif #endif
...@@ -42,7 +42,9 @@ ...@@ -42,7 +42,9 @@
extern unsigned char NB_eNB_INST; extern unsigned char NB_eNB_INST;
extern unsigned char NB_UE_INST; extern unsigned char NB_UE_INST;
static int nas_ue_process_events(nas_user_t *user, struct epoll_event *events, int nb_events) char *make_port_str_from_ueid(const char *base_port_str, int ueid);
static int nas_ue_process_events(nas_user_container_t *users, struct epoll_event *events, int nb_events)
{ {
int event; int event;
int exit_loop = FALSE; int exit_loop = FALSE;
...@@ -52,7 +54,8 @@ static int nas_ue_process_events(nas_user_t *user, struct epoll_event *events, i ...@@ -52,7 +54,8 @@ static int nas_ue_process_events(nas_user_t *user, struct epoll_event *events, i
for (event = 0; event < nb_events; event++) { for (event = 0; event < nb_events; event++) {
if (events[event].events != 0) { if (events[event].events != 0) {
/* If the event has not been yet been processed (not an itti message) */ /* If the event has not been yet been processed (not an itti message) */
if (events[event].data.fd == user_api_get_fd(user->user_api_id)) { nas_user_t *user = find_user_from_fd(users, events[event].data.fd);
if ( user != NULL ) {
exit_loop = nas_user_receive_and_process(user, NULL); exit_loop = nas_user_receive_and_process(user, NULL);
} else { } else {
LOG_E(NAS, "[UE] Received an event from an unknown fd %d!\n", events[event].data.fd); LOG_E(NAS, "[UE] Received an event from an unknown fd %d!\n", events[event].data.fd);
...@@ -67,13 +70,17 @@ static int nas_ue_process_events(nas_user_t *user, struct epoll_event *events, i ...@@ -67,13 +70,17 @@ static int nas_ue_process_events(nas_user_t *user, struct epoll_event *events, i
void nas_user_api_id_initialize(nas_user_t *user) { void nas_user_api_id_initialize(nas_user_t *user) {
user_api_id_t *user_api_id = calloc_or_fail(sizeof(user_api_id_t)); user_api_id_t *user_api_id = calloc_or_fail(sizeof(user_api_id_t));
user->user_api_id = user_api_id; user->user_api_id = user_api_id;
char *port = make_port_str_from_ueid(NAS_PARSER_DEFAULT_USER_PORT_NUMBER, user->ueid);
if (user_api_initialize (user_api_id, NAS_PARSER_DEFAULT_USER_HOSTNAME, NAS_PARSER_DEFAULT_USER_PORT_NUMBER, NULL, if ( port == NULL ) {
LOG_E(NAS, "[UE %d] can't get port from ueid %d !", user->ueid);
exit (EXIT_FAILURE);
}
if (user_api_initialize (user_api_id, NAS_PARSER_DEFAULT_USER_HOSTNAME, port, NULL,
NULL) != RETURNok) { NULL) != RETURNok) {
LOG_E(NAS, "[UE %d] user interface initialization failed!", user->ueid); LOG_E(NAS, "[UE %d] user interface initialization failed!", user->ueid);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
free(port);
itti_subscribe_event_fd (TASK_NAS_UE, user_api_get_fd(user_api_id)); itti_subscribe_event_fd (TASK_NAS_UE, user_api_get_fd(user_api_id));
} }
...@@ -86,15 +93,16 @@ void *nas_ue_task(void *args_p) ...@@ -86,15 +93,16 @@ void *nas_ue_task(void *args_p)
instance_t instance; instance_t instance;
unsigned int Mod_id; unsigned int Mod_id;
int result; int result;
nas_user_t user_value = {}; nas_user_container_t *users=args_p;
nas_user_t *user = &user_value;
user->ueid = 0;
itti_mark_task_ready (TASK_NAS_UE); itti_mark_task_ready (TASK_NAS_UE);
MSC_START_USE(); MSC_START_USE();
/* Initialize UE NAS (EURECOM-NAS) */ /* Initialize UE NAS (EURECOM-NAS) */
for (int i=0; i < users->count; i++)
{ {
nas_user_t *user = &users->item[i];
user->ueid=i;
/* Get USIM data application filename */ /* Get USIM data application filename */
user->usim_data_store = memory_get_path(USIM_API_NVRAM_DIRNAME, USIM_API_NVRAM_FILENAME); user->usim_data_store = memory_get_path(USIM_API_NVRAM_DIRNAME, USIM_API_NVRAM_FILENAME);
if ( user->usim_data_store == NULL ) { if ( user->usim_data_store == NULL ) {
...@@ -118,6 +126,7 @@ void *nas_ue_task(void *args_p) ...@@ -118,6 +126,7 @@ void *nas_ue_task(void *args_p)
/* Initialize user interface (to exchange AT commands with user process) */ /* Initialize user interface (to exchange AT commands with user process) */
nas_user_api_id_initialize(user); nas_user_api_id_initialize(user);
/* allocate needed structures */
user->user_at_commands = calloc_or_fail(sizeof(user_at_commands_t)); user->user_at_commands = calloc_or_fail(sizeof(user_at_commands_t));
user->at_response = calloc_or_fail(sizeof(at_response_t)); user->at_response = calloc_or_fail(sizeof(at_response_t));
user->lowerlayer_data = calloc_or_fail(sizeof(lowerlayer_data_t)); user->lowerlayer_data = calloc_or_fail(sizeof(lowerlayer_data_t));
...@@ -141,6 +150,7 @@ void *nas_ue_task(void *args_p) ...@@ -141,6 +150,7 @@ void *nas_ue_task(void *args_p)
msg_name = ITTI_MSG_NAME (msg_p); msg_name = ITTI_MSG_NAME (msg_p);
instance = ITTI_MSG_INSTANCE (msg_p); instance = ITTI_MSG_INSTANCE (msg_p);
Mod_id = instance - NB_eNB_INST; Mod_id = instance - NB_eNB_INST;
nas_user_t *user = &users->item[Mod_id];
switch (ITTI_MSG_ID(msg_p)) { switch (ITTI_MSG_ID(msg_p)) {
case INITIALIZE_MESSAGE: case INITIALIZE_MESSAGE:
...@@ -251,10 +261,38 @@ void *nas_ue_task(void *args_p) ...@@ -251,10 +261,38 @@ void *nas_ue_task(void *args_p)
nb_events = itti_get_events(TASK_NAS_UE, &events); nb_events = itti_get_events(TASK_NAS_UE, &events);
if ((nb_events > 0) && (events != NULL)) { if ((nb_events > 0) && (events != NULL)) {
if (nas_ue_process_events(user, events, nb_events) == TRUE) { if (nas_ue_process_events(users, events, nb_events) == TRUE) {
LOG_E(NAS, "[UE] Received exit loop\n"); LOG_E(NAS, "[UE] Received exit loop\n");
} }
} }
} }
} }
nas_user_t *find_user_from_fd(nas_user_container_t *users, int fd) {
for (int i=0; i<users->count; i++) {
nas_user_t *user = &users->item[i];
if (fd == user_api_get_fd(user->user_api_id)) {
return user;
}
}
return NULL;
}
char *make_port_str_from_ueid(const char *base_port_str, int ueid) {
int port;
int base_port;
char *endptr = NULL;
base_port = strtol(base_port_str, &endptr, 10);
if ( base_port_str == endptr ) {
return NULL;
}
port = base_port + ueid;
if ( port<1 || port > 65535 ) {
return NULL;
}
return itoa(port);
}
#endif #endif
...@@ -22,6 +22,18 @@ ...@@ -22,6 +22,18 @@
#ifndef NAS_UE_TASK_H_ #ifndef NAS_UE_TASK_H_
#define NAS_UE_TASK_H_ #define NAS_UE_TASK_H_
// FIXME There is multiple definition of NUMBER_OF_UE_MAX
#include "defs.h"
#include "user_defs.h"
// XXX simple array container for multiple users
typedef struct {
size_t count;
nas_user_t item[NUMBER_OF_UE_MAX];
} nas_user_container_t;
nas_user_t *find_user_from_fd(nas_user_container_t *users, int fd);
# if defined(ENABLE_ITTI) # if defined(ENABLE_ITTI)
void *nas_ue_task(void *args_p); void *nas_ue_task(void *args_p);
# endif # endif
......
...@@ -85,7 +85,9 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb) ...@@ -85,7 +85,9 @@ int create_tasks(uint32_t enb_nb, uint32_t ue_nb)
# if defined(NAS_BUILT_IN_UE) # if defined(NAS_BUILT_IN_UE)
if (ue_nb > 0) { if (ue_nb > 0) {
if (itti_create_task (TASK_NAS_UE, nas_ue_task, NULL) < 0) { nas_user_container_t users;
users.count = ue_nb;
if (itti_create_task (TASK_NAS_UE, nas_ue_task, &users) < 0) {
LOG_E(NAS, "Create task for NAS UE failed\n"); LOG_E(NAS, "Create task for NAS UE failed\n");
return -1; return -1;
} }
......
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