summaryrefslogtreecommitdiff
path: root/src/irmd
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri.staessens@ugent.be>2018-10-04 18:06:32 +0200
committerSander Vrijders <sander.vrijders@ugent.be>2018-10-05 09:07:47 +0200
commitb802b25ddfe6f1b6ecabe3ba70e3dac2e99e7a50 (patch)
tree94e787f0f0ca1f0254b3728b0156b2e3283d8518 /src/irmd
parent937adca2a718b160b6d42bb8a3f28d96321fdb49 (diff)
downloadouroboros-b802b25ddfe6f1b6ecabe3ba70e3dac2e99e7a50.tar.gz
ouroboros-b802b25ddfe6f1b6ecabe3ba70e3dac2e99e7a50.zip
lib: Pass qosspec at flow allocation
The flow allocator now passes the full qos specification to the endpoint, instead of just a cube. This is a more flexible architecture, as it makes QoS cubes internal to the layers. Adds endianness transforms for the flow allocator protocol in the normal IPCP. Signed-off-by: Dimitri Staessens <dimitri.staessens@ugent.be> Signed-off-by: Sander Vrijders <sander.vrijders@ugent.be>
Diffstat (limited to 'src/irmd')
-rw-r--r--src/irmd/ipcp.c13
-rw-r--r--src/irmd/ipcp.h2
-rw-r--r--src/irmd/irm_flow.c4
-rw-r--r--src/irmd/irm_flow.h5
-rw-r--r--src/irmd/main.c22
5 files changed, 26 insertions, 20 deletions
diff --git a/src/irmd/ipcp.c b/src/irmd/ipcp.c
index dc8f1c6e..0bdf674b 100644
--- a/src/irmd/ipcp.c
+++ b/src/irmd/ipcp.c
@@ -433,11 +433,12 @@ int ipcp_flow_alloc(pid_t pid,
pid_t n_pid,
const uint8_t * dst,
size_t len,
- qoscube_t cube)
+ qosspec_t qs)
{
- ipcp_msg_t msg = IPCP_MSG__INIT;
- ipcp_msg_t * recv_msg = NULL;
- int ret = -1;
+ ipcp_msg_t msg = IPCP_MSG__INIT;
+ qosspec_msg_t qs_msg;
+ ipcp_msg_t * recv_msg = NULL;
+ int ret = -1;
assert(dst);
@@ -449,8 +450,8 @@ int ipcp_flow_alloc(pid_t pid,
msg.has_hash = true;
msg.hash.len = len;
msg.hash.data = (uint8_t *) dst;
- msg.has_qoscube = true;
- msg.qoscube = cube;
+ qs_msg = spec_to_msg(&qs);
+ msg.qosspec = &qs_msg;
recv_msg = send_recv_ipcp_msg(pid, &msg);
if (recv_msg == NULL)
diff --git a/src/irmd/ipcp.h b/src/irmd/ipcp.h
index 8ff062b2..28396333 100644
--- a/src/irmd/ipcp.h
+++ b/src/irmd/ipcp.h
@@ -67,7 +67,7 @@ int ipcp_flow_alloc(pid_t pid,
pid_t n_pid,
const uint8_t * dst,
size_t len,
- qoscube_t qos);
+ qosspec_t qs);
int ipcp_flow_alloc_resp(pid_t pid,
int port_id,
diff --git a/src/irmd/irm_flow.c b/src/irmd/irm_flow.c
index dfbe5e95..a5a9f28c 100644
--- a/src/irmd/irm_flow.c
+++ b/src/irmd/irm_flow.c
@@ -39,7 +39,7 @@
struct irm_flow * irm_flow_create(pid_t n_pid,
pid_t n_1_pid,
int port_id,
- qoscube_t qc)
+ qosspec_t qs)
{
pthread_condattr_t cattr;
struct irm_flow * f = malloc(sizeof(*f));
@@ -61,7 +61,7 @@ struct irm_flow * irm_flow_create(pid_t n_pid,
f->n_pid = n_pid;
f->n_1_pid = n_1_pid;
f->port_id = port_id;
- f->qc = qc;
+ f->qs = qs;
f->n_rb = shm_rbuff_create(n_pid, port_id);
if (f->n_rb == NULL) {
diff --git a/src/irmd/irm_flow.h b/src/irmd/irm_flow.h
index d53984e8..f4de8187 100644
--- a/src/irmd/irm_flow.h
+++ b/src/irmd/irm_flow.h
@@ -43,11 +43,12 @@ struct irm_flow {
struct list_head next;
int port_id;
- qoscube_t qc;
pid_t n_pid;
pid_t n_1_pid;
+ qosspec_t qs;
+
struct shm_rbuff * n_rb;
struct shm_rbuff * n_1_rb;
@@ -61,7 +62,7 @@ struct irm_flow {
struct irm_flow * irm_flow_create(pid_t n_pid,
pid_t n_1_pid,
int port_id,
- qoscube_t qc);
+ qosspec_t qs);
void irm_flow_destroy(struct irm_flow * f);
diff --git a/src/irmd/main.c b/src/irmd/main.c
index 634bf4de..9504f3b5 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -1264,7 +1264,7 @@ static int flow_accept(pid_t pid,
static int flow_alloc(pid_t pid,
const char * dst,
- qoscube_t cube,
+ qosspec_t qs,
struct timespec * timeo,
struct irm_flow ** e)
{
@@ -1288,7 +1288,7 @@ static int flow_alloc(pid_t pid,
return -EBADF;
}
- f = irm_flow_create(pid, ipcp->pid, port_id, cube);
+ f = irm_flow_create(pid, ipcp->pid, port_id, qs);
if (f == NULL) {
bmp_release(irmd.port_ids, port_id);
pthread_rwlock_unlock(&irmd.flows_lock);
@@ -1310,7 +1310,7 @@ static int flow_alloc(pid_t pid,
str_hash(ipcp->dir_hash_algo, hash, dst);
if (ipcp_flow_alloc(ipcp->pid, port_id, pid, hash,
- IPCP_HASH_LEN(ipcp), cube)) {
+ IPCP_HASH_LEN(ipcp), qs)) {
/* sanitizer cleans this */
log_info("Flow_allocation failed.");
free(hash);
@@ -1418,7 +1418,7 @@ static pid_t auto_execute(char ** argv)
static struct irm_flow * flow_req_arr(pid_t pid,
const uint8_t * hash,
- qoscube_t cube)
+ qosspec_t qs)
{
struct reg_entry * re = NULL;
struct prog_entry * a = NULL;
@@ -1521,7 +1521,7 @@ static struct irm_flow * flow_req_arr(pid_t pid,
return NULL;
}
- f = irm_flow_create(h_pid, pid, port_id, cube);
+ f = irm_flow_create(h_pid, pid, port_id, qs);
if (f == NULL) {
bmp_release(irmd.port_ids, port_id);
pthread_rwlock_unlock(&irmd.flows_lock);
@@ -1993,17 +1993,19 @@ static void * mainloop(void * o)
case IRM_MSG_CODE__IRM_FLOW_ACCEPT:
result = flow_accept(msg->pid, timeo, &e);
if (result == 0) {
+ qosspec_msg_t qs_msg;
ret_msg->has_port_id = true;
ret_msg->port_id = e->port_id;
ret_msg->has_pid = true;
ret_msg->pid = e->n_1_pid;
- ret_msg->has_qoscube = true;
- ret_msg->qoscube = e->qc;
+ qs_msg = spec_to_msg(&e->qs);
+ ret_msg->qosspec = &qs_msg;
}
break;
case IRM_MSG_CODE__IRM_FLOW_ALLOC:
result = flow_alloc(msg->pid, msg->dst,
- msg->qoscube, timeo, &e);
+ msg_to_spec(msg->qosspec),
+ timeo, &e);
if (result == 0) {
ret_msg->has_port_id = true;
ret_msg->port_id = e->port_id;
@@ -2017,7 +2019,7 @@ static void * mainloop(void * o)
case IRM_MSG_CODE__IPCP_FLOW_REQ_ARR:
e = flow_req_arr(msg->pid,
msg->hash.data,
- msg->qoscube);
+ msg_to_spec(msg->qosspec));
result = (e == NULL ? -1 : 0);
if (result == 0) {
ret_msg->has_port_id = true;
@@ -2061,6 +2063,8 @@ static void * mainloop(void * o)
irm_msg__pack(ret_msg, buffer.data);
+ /* Can't free the qosspec. */
+ ret_msg->qosspec = NULL;
irm_msg__free_unpacked(ret_msg, NULL);
pthread_cleanup_push(close_ptr, &sfd);