Commit f63cf659 authored by Robert Schmidt's avatar Robert Schmidt

FlexRAN: Improve handling of received shared objects

parent 5d9c61ea
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
#include <stdio.h> #include <stdio.h>
#include <time.h> #include <time.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <dlfcn.h>
#include <fcntl.h>
#include <errno.h>
#include "flexran_agent_common.h" #include "flexran_agent_common.h"
#include "flexran_agent_common_internal.h" #include "flexran_agent_common_internal.h"
...@@ -424,26 +427,49 @@ long timer_end(struct timespec start_time) { ...@@ -424,26 +427,49 @@ long timer_end(struct timespec start_time) {
int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) {
Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params;
Protocol__FlexControlDelegation *control_delegation_msg = input->control_delegation_msg; Protocol__FlexControlDelegation *control_delegation_msg = input->control_delegation_msg;
// struct timespec vartime = timer_start(); *msg = NULL;
//Write the payload lib into a file in the cache and load the lib
char lib_name[120];
char target[512]; char target[512];
snprintf(lib_name, sizeof(lib_name), "/%s.so", control_delegation_msg->name); int len = snprintf(target, sizeof(target), "%s/libflex.%s.so",
strcpy(target, RC.flexran[mod_id]->cache_name); RC.flexran[mod_id]->cache_name,
strcat(target, lib_name); control_delegation_msg->name);
FILE *f; if (len >= sizeof(target)) {
f = fopen(target, "wb"); LOG_E(FLEXRAN_AGENT, "target has been truncated, cannot write file\n");
return 0;
if (f) { }
fwrite(control_delegation_msg->payload.data, control_delegation_msg->payload.len, 1, f);
fclose(f); /* use low-level API: check whether exists while creating so we can abort if
* it exists to not overwrite anything */
int fd = open(target, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR);
if (fd >= 0) {
ssize_t l = write(fd,
control_delegation_msg->payload.data,
control_delegation_msg->payload.len);
close(fd);
if (l < control_delegation_msg->payload.len) {
LOG_E(FLEXRAN_AGENT,
"could not write complete control delegation to %s: only %ld out of "
"%ld bytes\n",
target,
l,
control_delegation_msg->payload.len);
return 0;
} else if (l < 0) {
LOG_E(FLEXRAN_AGENT, "can not write control delegation data to %s: %s\n",
target, strerror(errno));
return 0;
}
LOG_I(FLEXRAN_AGENT, "wrote shared object %s\n", target);
} else { } else {
LOG_W(FLEXRAN_AGENT, "[%d] can not write control delegation data to %s\n", if (errno == EEXIST) {
mod_id, target); LOG_I(FLEXRAN_AGENT, "file %s already exists, remove it first\n", target);
} else {
LOG_E(FLEXRAN_AGENT, "can not write control delegation data to %s: %s\n",
target, strerror(errno));
return 0;
}
} }
// long time_elapsed_nanos = timer_end(vartime);
*msg = NULL;
return 0; return 0;
} }
...@@ -452,6 +478,22 @@ int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg) { ...@@ -452,6 +478,22 @@ int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg) {
return 0; return 0;
} }
void *flexran_agent_load_delegated_code(mid_t mod_id, const char *name) {
char target[512];
int len = snprintf(target, sizeof(target), "%s/libflex.%s.so",
RC.flexran[mod_id]->cache_name, name);
if (len >= sizeof(target)) {
LOG_E(FLEXRAN_AGENT, "target has been truncated, cannot read object\n");
return 0;
}
LOG_I(FLEXRAN_AGENT, "Opening pushed code: %s\n", target);
void *lib = dlopen(target, RTLD_NOW);
if (lib == NULL)
LOG_E(FLEXRAN_AGENT, "Could not load library: %s\n", dlerror());
return lib;
}
int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) { int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg) {
Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params; Protocol__FlexranMessage *input = (Protocol__FlexranMessage *)params;
Protocol__FlexAgentReconfiguration *agent_reconfiguration_msg = input->agent_reconfiguration_msg; Protocol__FlexAgentReconfiguration *agent_reconfiguration_msg = input->agent_reconfiguration_msg;
......
...@@ -131,6 +131,7 @@ int flexran_agent_destroy_lc_config_request(Protocol__FlexranMessage *msg); ...@@ -131,6 +131,7 @@ int flexran_agent_destroy_lc_config_request(Protocol__FlexranMessage *msg);
/* Control delegation message constructor and destructor */ /* Control delegation message constructor and destructor */
int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); int flexran_agent_control_delegation(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg); int flexran_agent_destroy_control_delegation(Protocol__FlexranMessage *msg);
void *flexran_agent_load_delegated_code(mid_t mod_id, const char *name);
/* Policy reconfiguration message constructor and destructor */ /* Policy reconfiguration message constructor and destructor */
int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg); int flexran_agent_reconfiguration(mid_t mod_id, const void *params, Protocol__FlexranMessage **msg);
......
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