diff --git a/openair3/NAS/UE/API/USER/user_api.c b/openair3/NAS/UE/API/USER/user_api.c index dd5b5758f1fad084d675b2939614350e18f999b8..9fa6ebc0a92afbcb7244976882d87e0246fdee5e 100644 --- a/openair3/NAS/UE/API/USER/user_api.c +++ b/openair3/NAS/UE/API/USER/user_api.c @@ -110,23 +110,16 @@ static struct { * The buffer used to receive data from the user application layer */ #define USER_API_RECV_BUFFER_SIZE 4096 +// FIXME not reentrant static char _user_api_recv_buffer[USER_API_RECV_BUFFER_SIZE]; /* * The buffer used to send data to the user application layer */ #define USER_API_SEND_BUFFER_SIZE USER_API_RECV_BUFFER_SIZE +// FIXME not reentrant static char _user_api_send_buffer[USER_API_SEND_BUFFER_SIZE]; -/* - * The decoded data received from the user application layer - */ -static struct { - int n_cmd; /* number of user data to be processed */ -#define USER_DATA_MAX 10 - at_command_t cmd[USER_DATA_MAX]; /* user data to be processed */ -} _user_data = {}; - /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ @@ -261,12 +254,12 @@ int user_api_get_fd(void) ** Others: None ** ** ** ***************************************************************************/ -const void* user_api_get_data(int index) +const void* user_api_get_data(user_at_commands_t *commands, int index) { LOG_FUNC_IN; - if (index < _user_data.n_cmd) { - LOG_FUNC_RETURN ((void*)(&_user_data.cmd[index])); + if (index < commands->n_cmd) { + LOG_FUNC_RETURN ((void*)(&commands->cmd[index])); } LOG_FUNC_RETURN (NULL); @@ -458,22 +451,22 @@ void user_api_close(int fd) ** Others: _user_api_send_buffer, _user_data ** ** ** ***************************************************************************/ -int user_api_decode_data(int length) +int user_api_decode_data(user_at_commands_t *commands, int length) { LOG_FUNC_IN; /* Parse the AT command line */ LOG_TRACE(INFO, "USR-API - Decode user data: %s", _user_api_recv_buffer); - _user_data.n_cmd = at_command_decode(_user_api_recv_buffer, length, - _user_data.cmd); + commands->n_cmd = at_command_decode(_user_api_recv_buffer, length, + commands->cmd); - if (_user_data.n_cmd > 0) { + if (commands->n_cmd > 0) { /* AT command data received from the user application layer * has been successfully decoded */ LOG_TRACE(INFO, "USR-API - %d AT command%s ha%s been successfully " - "decoded", _user_data.n_cmd, - (_user_data.n_cmd > 1) ? "s" : "", - (_user_data.n_cmd > 1) ? "ve" : "s"); + "decoded", commands->n_cmd, + (commands->n_cmd > 1) ? "s" : "", + (commands->n_cmd > 1) ? "ve" : "s"); } else { int bytes; @@ -490,7 +483,7 @@ int user_api_decode_data(int length) (void) _user_api_send_data(bytes); } - LOG_FUNC_RETURN (_user_data.n_cmd); + LOG_FUNC_RETURN (commands->n_cmd); } /**************************************************************************** diff --git a/openair3/NAS/UE/API/USER/user_api.h b/openair3/NAS/UE/API/USER/user_api.h index 9597c0f1d1bbcedb1908abf4bde53cf9247fb2cd..b3325417c66978c5bf354e682e9c39c6eabda3cf 100644 --- a/openair3/NAS/UE/API/USER/user_api.h +++ b/openair3/NAS/UE/API/USER/user_api.h @@ -42,6 +42,7 @@ Description Implements the API used by the NAS layer running in the UE #include "commonDef.h" #include "networkDef.h" +#include "at_command.h" /****************************************************************************/ /********************* G L O B A L C O N S T A N T S *******************/ @@ -51,6 +52,16 @@ Description Implements the API used by the NAS layer running in the UE /************************ G L O B A L T Y P E S ************************/ /****************************************************************************/ +/* + * The decoded data received from the user application layer + */ +typedef struct { + int n_cmd; /* number of user data to be processed */ +#define USER_DATA_MAX 10 + at_command_t cmd[USER_DATA_MAX]; /* user data to be processed */ +} user_at_commands_t; + + /****************************************************************************/ /******************** G L O B A L V A R I A B L E S ********************/ /****************************************************************************/ @@ -65,14 +76,14 @@ int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, const char int user_api_esm_callback(int cid, network_pdn_state_t state); int user_api_get_fd(void); -const void* user_api_get_data(int index); +const void* user_api_get_data(user_at_commands_t *commands, int index); int user_api_read_data(int fd); int user_api_set_data(char *message); int user_api_send_data(int fd, int length); void user_api_close(int fd); -int user_api_decode_data(int length); +int user_api_decode_data(user_at_commands_t *commands, int length); int user_api_encode_data(const void* data, int add_success_code); #endif /* __USER_API_H__ */ diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c index aa96a97b739623501c897fa2eb9b1ca2053c5c9a..18756fe4b4b7f60b781bcfa0a771c2281d680212 100644 --- a/openair3/NAS/UE/UEprocess.c +++ b/openair3/NAS/UE/UEprocess.c @@ -74,6 +74,7 @@ static void _nas_clean(int usr_fd, int net_fd); uint8_t usim_test = 0; // FIXME user must be set up with right itti message instance +// FIXME allocate user and initialize its fields nas_user_t *user = NULL; /****************************************************************************/ diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c index 8373a6f15bdcf429e68f199b49dfbdf394aa5d21..ece175bd05c75cfef6840428ec5469a77e3da6d4 100644 --- a/openair3/NAS/UE/nas_ue_task.c +++ b/openair3/NAS/UE/nas_ue_task.c @@ -88,6 +88,12 @@ void *nas_ue_task(void *args_p) itti_subscribe_event_fd (TASK_NAS_UE, user->fd); } + user->user_at_commands = calloc(1, sizeof(user_at_commands_t)); + if ( user->user_at_commands == NULL ) { + LOG_E(NAS, "[UE %d] Can't allocate memory for user_at_commands\n", 0); + // FIXME stop here + } + user->at_response = calloc(1, sizeof(at_response_t)); if ( user->at_response == NULL ) { LOG_E(NAS, "[UE %d] Can't allocate memory for user_at_commands\n", 0); diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c index ef95fd052aa4a9227680b215039f6c100718e563..36ba0b7706aaa29d0de0be99e30b0f5808d68aae 100644 --- a/openair3/NAS/UE/nas_user.c +++ b/openair3/NAS/UE/nas_user.c @@ -239,11 +239,11 @@ int nas_user_receive_and_process(nas_user_t *user, char *message) } /* Decode the user data message */ - nb_command = user_api_decode_data (bytes); + nb_command = user_api_decode_data (user->user_at_commands, bytes); for (i = 0; i < nb_command; i++) { /* Get the user data to be processed */ - const void *data = user_api_get_data (i); + const void *data = user_api_get_data (user->user_at_commands, i); if (data == NULL) { /* Failed to get user data at the given index; diff --git a/openair3/NAS/UE/user_defs.h b/openair3/NAS/UE/user_defs.h index 0661543047770fb27f12c65c010aae7d15cc5e03..00e713a7d382215dcb2b5da119d28a7199dd9f06 100644 --- a/openair3/NAS/UE/user_defs.h +++ b/openair3/NAS/UE/user_defs.h @@ -53,6 +53,7 @@ Description NAS type definition to manage a user equipment #include "EMM/Authentication.h" #include "EMM/IdleMode_defs.h" #include "API/USIM/usim_api.h" +#include "API/USER/user_api.h" #include "SecurityModeControl.h" #include "userDef.h" #include "at_response.h" @@ -77,6 +78,8 @@ typedef struct { // nas_user_context_t *nas_user_context; at_response_t *at_response; // data structure returned to the user as the result of NAS procedure function call + // + user_at_commands_t *user_at_commands; //decoded data received from the user application layer } nas_user_t; #endif