diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2017-01-03 13:43:40 +0100 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2017-01-03 13:43:40 +0100 |
commit | 004b586fd6b381fd1292aa276342163123be560a (patch) | |
tree | 4734c9872a5b9b4b4cb12e9fab82bdb255a6591a | |
parent | 4ccd3e2c8af00963ac6d88aac587de016300ed90 (diff) | |
parent | 5ab96126078cb9166356beaff3458404664274ed (diff) | |
download | ouroboros-004b586fd6b381fd1292aa276342163123be560a.tar.gz ouroboros-004b586fd6b381fd1292aa276342163123be560a.zip |
Merged in dstaesse/ouroboros/be-qos (pull request #332)
lib, ipcpd, irmd: Proof of concept QoS
-rw-r--r-- | include/ouroboros/dev.h | 4 | ||||
-rw-r--r-- | include/ouroboros/ipcp-dev.h | 3 | ||||
-rw-r--r-- | include/ouroboros/qos.h | 4 | ||||
-rw-r--r-- | include/ouroboros/shared.h | 3 | ||||
-rw-r--r-- | src/ipcpd/ipcp.c | 2 | ||||
-rw-r--r-- | src/ipcpd/local/main.c | 7 | ||||
-rw-r--r-- | src/ipcpd/normal/flow_alloc.proto | 2 | ||||
-rw-r--r-- | src/ipcpd/normal/fmgr.c | 11 | ||||
-rw-r--r-- | src/ipcpd/shim-eth-llc/main.c | 24 | ||||
-rw-r--r-- | src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto | 3 | ||||
-rw-r--r-- | src/ipcpd/shim-udp/main.c | 32 | ||||
-rw-r--r-- | src/ipcpd/shim-udp/shim_udp_messages.proto | 17 | ||||
-rw-r--r-- | src/irmd/ipcp.c | 6 | ||||
-rw-r--r-- | src/irmd/main.c | 33 | ||||
-rw-r--r-- | src/irmd/registry.h | 2 | ||||
-rw-r--r-- | src/lib/dev.c | 60 | ||||
-rw-r--r-- | src/lib/ipcpd_messages.proto | 2 | ||||
-rw-r--r-- | src/lib/irmd_messages.proto | 9 |
18 files changed, 139 insertions, 85 deletions
diff --git a/include/ouroboros/dev.h b/include/ouroboros/dev.h index 048d890e..9bb55529 100644 --- a/include/ouroboros/dev.h +++ b/include/ouroboros/dev.h @@ -36,7 +36,7 @@ void ap_fini(void); /* Returns flow descriptor (> 0), client AE name and qos spec. */ int flow_accept(char ** ae_name, - qosspec_t * qos); + qosspec_t * spec); int flow_alloc_resp(int fd, int response); @@ -47,7 +47,7 @@ int flow_alloc_resp(int fd, */ int flow_alloc(char * dst_name, char * src_ae_name, - qosspec_t * qos); + qosspec_t * spec); int flow_alloc_res(int fd); diff --git a/include/ouroboros/ipcp-dev.h b/include/ouroboros/ipcp-dev.h index 61c1582b..fe6a99bd 100644 --- a/include/ouroboros/ipcp-dev.h +++ b/include/ouroboros/ipcp-dev.h @@ -30,7 +30,8 @@ int ipcp_create_r(pid_t api); int ipcp_flow_req_arr(pid_t api, char * dst_name, - char * src_ae_name); + char * src_ae_name, + qoscube_t cube); int ipcp_flow_alloc_reply(int fd, int response); diff --git a/include/ouroboros/qos.h b/include/ouroboros/qos.h index c301e61b..74e898da 100644 --- a/include/ouroboros/qos.h +++ b/include/ouroboros/qos.h @@ -25,10 +25,12 @@ #include <stdint.h> -/* FIXME: may need revision */ typedef struct qos_spec { uint32_t delay; uint32_t jitter; + + /* FIXME: define qosspecs */ + int cube; } qosspec_t; #endif diff --git a/include/ouroboros/shared.h b/include/ouroboros/shared.h index 86dc3ede..2592134a 100644 --- a/include/ouroboros/shared.h +++ b/include/ouroboros/shared.h @@ -24,7 +24,8 @@ /* FIXME: To be decided which QoS cubes we support */ typedef enum qos_cube { - QOS_CUBE_BE = 0, + QOS_CUBE_FRC = 0, + QOS_CUBE_BE, QOS_CUBE_VIDEO, QOS_CUBE_MAX } qoscube_t; diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c index 8c0bd0bf..a2dc9e8f 100644 --- a/src/ipcpd/ipcp.c +++ b/src/ipcpd/ipcp.c @@ -198,7 +198,7 @@ static void * ipcp_main_loop(void * o) ipcpi.ops->ipcp_flow_alloc(fd, msg->dst_name, msg->src_ae_name, - msg->qos_cube); + msg->qoscube); break; case IPCP_MSG_CODE__IPCP_FLOW_ALLOC_RESP: if (ipcpi.ops->ipcp_flow_alloc_resp == NULL) { diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c index dc4e84ca..de8c72c2 100644 --- a/src/ipcpd/local/main.c +++ b/src/ipcpd/local/main.c @@ -219,13 +219,10 @@ static int ipcp_local_name_query(char * name) static int ipcp_local_flow_alloc(int fd, char * dst_name, char * src_ae_name, - qoscube_t qos) + qoscube_t cube) { int out_fd = -1; - /* This ipcpd has all QoS */ - (void) qos; - LOG_DBG("Allocating flow to %s on fd %d.", dst_name, fd); assert(dst_name); @@ -241,7 +238,7 @@ static int ipcp_local_flow_alloc(int fd, pthread_rwlock_wrlock(&local_data.lock); - out_fd = ipcp_flow_req_arr(getpid(), dst_name, src_ae_name); + out_fd = ipcp_flow_req_arr(getpid(), dst_name, src_ae_name, cube); local_data.in_out[fd] = out_fd; local_data.in_out[out_fd] = fd; diff --git a/src/ipcpd/normal/flow_alloc.proto b/src/ipcpd/normal/flow_alloc.proto index 5041d31a..02be47a0 100644 --- a/src/ipcpd/normal/flow_alloc.proto +++ b/src/ipcpd/normal/flow_alloc.proto @@ -32,6 +32,6 @@ message flow_alloc_msg { required flow_alloc_code code = 1; optional string dst_name = 2; optional string src_ae_name = 3; - optional uint32 qos_cube = 4; + optional uint32 qoscube = 4; optional sint32 response = 5; }; diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index d8190572..4b24d5a1 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -351,7 +351,7 @@ int fmgr_fini() int fmgr_np1_alloc(int fd, char * dst_ap_name, char * src_ae_name, - qoscube_t qos) + qoscube_t cube) { cep_id_t cep_id; buffer_t buf; @@ -391,8 +391,8 @@ int fmgr_np1_alloc(int fd, msg.code = FLOW_ALLOC_CODE__FLOW_REQ; msg.dst_name = dst_ap_name; msg.src_ae_name = src_ae_name; - msg.qos_cube = qos; - msg.has_qos_cube = true; + msg.has_qoscube = true; + msg.qoscube = cube; buf.len = flow_alloc_msg__get_packed_size(&msg); if (buf.len == 0) { @@ -410,7 +410,7 @@ int fmgr_np1_alloc(int fd, pthread_rwlock_wrlock(&fmgr.np1_flows_lock); - cep_id = frct_i_create(addr, &buf, qos); + cep_id = frct_i_create(addr, &buf, cube); if (cep_id == INVALID_CEP_ID) { free(ro_data); free(buf.data); @@ -535,7 +535,8 @@ int fmgr_np1_post_buf(cep_id_t cep_id, buffer_t * buf) case FLOW_ALLOC_CODE__FLOW_REQ: fd = ipcp_flow_req_arr(getpid(), msg->dst_name, - msg->src_ae_name); + msg->src_ae_name, + msg->qoscube); if (fd < 0) { flow_alloc_msg__free_unpacked(msg, NULL); LOG_ERR("Failed to get fd for flow."); diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c index da0bf97e..ab25ffb1 100644 --- a/src/ipcpd/shim-eth-llc/main.c +++ b/src/ipcpd/shim-eth-llc/main.c @@ -315,7 +315,8 @@ static int eth_llc_ipcp_send_mgmt_frame(shim_eth_llc_msg_t * msg, static int eth_llc_ipcp_sap_alloc(uint8_t * dst_addr, uint8_t ssap, char * dst_name, - char * src_ae_name) + char * src_ae_name, + qoscube_t cube) { shim_eth_llc_msg_t msg = SHIM_ETH_LLC_MSG__INIT; @@ -324,6 +325,8 @@ static int eth_llc_ipcp_sap_alloc(uint8_t * dst_addr, msg.ssap = ssap; msg.dst_name = dst_name; msg.src_ae_name = src_ae_name; + msg.has_qoscube = true; + msg.qoscube = cube; return eth_llc_ipcp_send_mgmt_frame(&msg, dst_addr); } @@ -349,7 +352,8 @@ static int eth_llc_ipcp_sap_alloc_resp(uint8_t * dst_addr, static int eth_llc_ipcp_sap_req(uint8_t r_sap, uint8_t * r_addr, char * dst_name, - char * src_ae_name) + char * src_ae_name, + qoscube_t cube) { int fd; @@ -357,7 +361,7 @@ static int eth_llc_ipcp_sap_req(uint8_t r_sap, pthread_rwlock_wrlock(ð_llc_data.flows_lock); /* reply to IRM */ - fd = ipcp_flow_req_arr(getpid(), dst_name, src_ae_name); + fd = ipcp_flow_req_arr(getpid(), dst_name, src_ae_name, cube); if (fd < 0) { pthread_rwlock_unlock(ð_llc_data.flows_lock); pthread_rwlock_unlock(&ipcpi.state_lock); @@ -464,7 +468,8 @@ static int eth_llc_ipcp_mgmt_frame(uint8_t * buf, size_t len, uint8_t * r_addr) eth_llc_ipcp_sap_req(msg->ssap, r_addr, msg->dst_name, - msg->src_ae_name); + msg->src_ae_name, + msg->qoscube); } break; case SHIM_ETH_LLC_MSG_CODE__FLOW_REPLY: @@ -934,7 +939,7 @@ static int eth_llc_ipcp_name_query(char * name) static int eth_llc_ipcp_flow_alloc(int fd, char * dst_name, char * src_ae_name, - qoscube_t qos) + qoscube_t cube) { uint8_t ssap = 0; uint8_t r_addr[MAC_SIZE]; @@ -945,8 +950,10 @@ static int eth_llc_ipcp_flow_alloc(int fd, if (dst_name == NULL || src_ae_name == NULL) return -1; - if (qos != QOS_CUBE_BE) - LOG_DBG("QoS requested. Ethernet LLC can't do that. For now."); + if (cube != QOS_CUBE_BE && cube != QOS_CUBE_FRC) { + LOG_DBG("Unsupported QoS requested."); + return -1; + } pthread_rwlock_rdlock(&ipcpi.state_lock); @@ -983,7 +990,8 @@ static int eth_llc_ipcp_flow_alloc(int fd, if (eth_llc_ipcp_sap_alloc(r_addr, ssap, dst_name, - src_ae_name) < 0) { + src_ae_name, + cube) < 0) { pthread_rwlock_rdlock(&ipcpi.state_lock); pthread_rwlock_wrlock(ð_llc_data.flows_lock); bmp_release(eth_llc_data.saps, eth_llc_data.fd_to_ef[fd].sap); diff --git a/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto b/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto index 9eebf610..63ab4519 100644 --- a/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto +++ b/src/ipcpd/shim-eth-llc/shim_eth_llc_messages.proto @@ -35,5 +35,6 @@ message shim_eth_llc_msg { optional string src_ae_name = 3; optional uint32 ssap = 4; optional uint32 dsap = 5; - optional sint32 response = 6; + optional uint32 qoscube = 6; + optional sint32 response = 7; }; diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c index cdd02c49..12f586f0 100644 --- a/src/ipcpd/shim-udp/main.c +++ b/src/ipcpd/shim-udp/main.c @@ -196,10 +196,11 @@ static int send_shim_udp_msg(shim_udp_msg_t * msg, uint32_t dst_ip_addr) return 0; } -static int ipcp_udp_port_alloc(uint32_t dst_ip_addr, - uint16_t src_udp_port, - char * dst_name, - char * src_ae_name) +static int ipcp_udp_port_alloc(uint32_t dst_ip_addr, + uint16_t src_udp_port, + char * dst_name, + char * src_ae_name, + qoscube_t cube) { shim_udp_msg_t msg = SHIM_UDP_MSG__INIT; @@ -207,6 +208,8 @@ static int ipcp_udp_port_alloc(uint32_t dst_ip_addr, msg.src_udp_port = src_udp_port; msg.dst_name = dst_name; msg.src_ae_name = src_ae_name; + msg.has_qoscube = true; + msg.qoscube = cube; return send_shim_udp_msg(&msg, dst_ip_addr); } @@ -229,8 +232,9 @@ static int ipcp_udp_port_alloc_resp(uint32_t dst_ip_addr, } static int ipcp_udp_port_req(struct sockaddr_in * c_saddr, - char * dst_name, - char * src_ae_name) + char * dst_name, + char * src_ae_name, + qoscube_t cube) { int skfd; int fd; @@ -273,7 +277,7 @@ static int ipcp_udp_port_req(struct sockaddr_in * c_saddr, pthread_rwlock_wrlock(&udp_data.flows_lock); /* reply to IRM */ - fd = ipcp_flow_req_arr(getpid(), dst_name, src_ae_name); + fd = ipcp_flow_req_arr(getpid(), dst_name, src_ae_name, cube); if (fd < 0) { pthread_rwlock_unlock(&udp_data.flows_lock); pthread_rwlock_unlock(&ipcpi.state_lock); @@ -395,7 +399,8 @@ static void * ipcp_udp_listener(void * o) c_saddr.sin_port = msg->src_udp_port; ipcp_udp_port_req(&c_saddr, msg->dst_name, - msg->src_ae_name); + msg->src_ae_name, + msg->qoscube); break; case SHIM_UDP_MSG_CODE__FLOW_REPLY: ipcp_udp_port_alloc_reply(msg->src_udp_port, @@ -947,7 +952,7 @@ static int ipcp_udp_name_query(char * name) static int ipcp_udp_flow_alloc(int fd, char * dst_name, char * src_ae_name, - qoscube_t qos) + qoscube_t cube) { struct sockaddr_in r_saddr; /* server address */ struct sockaddr_in f_saddr; /* flow */ @@ -966,8 +971,10 @@ static int ipcp_udp_flow_alloc(int fd, return -1; } - if (qos != QOS_CUBE_BE) - LOG_DBG("QoS requested. UDP/IP can't do that."); + if (cube != QOS_CUBE_BE && cube != QOS_CUBE_FRC) { + LOG_DBG("Unsupported QoS requested."); + return -1; + } skfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -1030,7 +1037,8 @@ static int ipcp_udp_flow_alloc(int fd, if (ipcp_udp_port_alloc(ip_addr, f_saddr.sin_port, dst_name, - src_ae_name) < 0) { + src_ae_name, + cube) < 0) { pthread_rwlock_rdlock(&ipcpi.state_lock); pthread_rwlock_wrlock(&udp_data.flows_lock); diff --git a/src/ipcpd/shim-udp/shim_udp_messages.proto b/src/ipcpd/shim-udp/shim_udp_messages.proto index f5a23b82..cc535a60 100644 --- a/src/ipcpd/shim-udp/shim_udp_messages.proto +++ b/src/ipcpd/shim-udp/shim_udp_messages.proto @@ -23,15 +23,16 @@ syntax = "proto2"; enum shim_udp_msg_code { - FLOW_REQ = 1; - FLOW_REPLY = 2; + FLOW_REQ = 1; + FLOW_REPLY = 2; }; message shim_udp_msg { - required shim_udp_msg_code code = 1; - optional string dst_name = 2; - optional string src_ae_name = 4; - required uint32 src_udp_port = 5; - optional uint32 dst_udp_port = 6; - optional sint32 response = 7; + required shim_udp_msg_code code = 1; + optional string dst_name = 2; + optional string src_ae_name = 4; + required uint32 src_udp_port = 5; + optional uint32 dst_udp_port = 6; + optional uint32 qoscube = 7; + optional sint32 response = 8; }; diff --git a/src/irmd/ipcp.c b/src/irmd/ipcp.c index a3e6eff8..07ae0dc2 100644 --- a/src/irmd/ipcp.c +++ b/src/irmd/ipcp.c @@ -330,7 +330,7 @@ int ipcp_flow_alloc(pid_t api, pid_t n_api, char * dst_name, char * src_ae_name, - qoscube_t qos) + qoscube_t cube) { ipcp_msg_t msg = IPCP_MSG__INIT; ipcp_msg_t * recv_msg = NULL; @@ -346,8 +346,8 @@ int ipcp_flow_alloc(pid_t api, msg.api = n_api; msg.src_ae_name = src_ae_name; msg.dst_name = dst_name; - msg.has_qos_cube = true; - msg.qos_cube = qos; + msg.has_qoscube = true; + msg.qoscube = cube; recv_msg = send_recv_ipcp_msg(api, &msg); if (recv_msg == NULL) diff --git a/src/irmd/main.c b/src/irmd/main.c index c42f2d3c..30602123 100644 --- a/src/irmd/main.c +++ b/src/irmd/main.c @@ -944,7 +944,9 @@ static int api_announce(pid_t api, char * apn) return 0; } -static struct irm_flow * flow_accept(pid_t api, char ** dst_ae_name) +static struct irm_flow * flow_accept(pid_t api, + char ** dst_ae_name, + qoscube_t * cube) { struct irm_flow * f = NULL; struct api_entry * e = NULL; @@ -1028,6 +1030,8 @@ static struct irm_flow * flow_accept(pid_t api, char ** dst_ae_name) return NULL; } + *cube = re->qos; + if (dst_ae_name != NULL) *dst_ae_name = re->req_ae_name; @@ -1110,18 +1114,15 @@ static int flow_alloc_resp(pid_t n_api, return ret; } -static struct irm_flow * flow_alloc(pid_t api, - char * dst_name, - char * src_ae_name, - qosspec_t * qos) +static struct irm_flow * flow_alloc(pid_t api, + char * dst_name, + char * src_ae_name, + qoscube_t cube) { struct irm_flow * f; pid_t ipcp; int port_id; - /* FIXME: Map qosspec to qos_cube */ - (void) qos; - pthread_rwlock_rdlock(&irmd->state_lock); if (irmd->state != IRMD_RUNNING) { @@ -1164,7 +1165,7 @@ static struct irm_flow * flow_alloc(pid_t api, pthread_rwlock_unlock(&irmd->state_lock); if (ipcp_flow_alloc(ipcp, port_id, api, - dst_name, src_ae_name, QOS_CUBE_BE) < 0) { + dst_name, src_ae_name, cube) < 0) { pthread_rwlock_rdlock(&irmd->state_lock); pthread_rwlock_wrlock(&irmd->flows_lock); list_del(&f->next); @@ -1314,7 +1315,8 @@ static pid_t auto_execute(char ** argv) static struct irm_flow * flow_req_arr(pid_t api, char * dst_name, - char * ae_name) + char * ae_name, + qoscube_t cube) { struct reg_entry * re = NULL; struct apn_entry * a = NULL; @@ -1425,6 +1427,7 @@ static struct irm_flow * flow_req_arr(pid_t api, pthread_rwlock_rdlock(&irmd->reg_lock); re->req_ae_name = ae_name; + re->qos = cube; reg_entry_set_state(re, REG_NAME_FLOW_ARRIVED); e = api_table_get(&irmd->api_table, h_api); @@ -1872,7 +1875,10 @@ void * mainloop(void * o) msg->n_dif_name); break; case IRM_MSG_CODE__IRM_FLOW_ACCEPT: - e = flow_accept(msg->api, &ret_msg.ae_name); + ret_msg.has_qoscube = true; + e = flow_accept(msg->api, + &ret_msg.ae_name, + (qoscube_t *) &ret_msg.qoscube); if (e == NULL) { ret_msg.has_result = true; ret_msg.result = -1; @@ -1893,7 +1899,7 @@ void * mainloop(void * o) e = flow_alloc(msg->api, msg->dst_name, msg->ae_name, - NULL); + msg->qoscube); if (e == NULL) { ret_msg.has_result = true; ret_msg.result = -1; @@ -1915,7 +1921,8 @@ void * mainloop(void * o) case IRM_MSG_CODE__IPCP_FLOW_REQ_ARR: e = flow_req_arr(msg->api, msg->dst_name, - msg->ae_name); + msg->ae_name, + msg->qoscube); if (e == NULL) { ret_msg.has_result = true; ret_msg.result = -1; diff --git a/src/irmd/registry.h b/src/irmd/registry.h index 1cb1d921..20c06a51 100644 --- a/src/irmd/registry.h +++ b/src/irmd/registry.h @@ -25,6 +25,7 @@ #include <ouroboros/config.h> #include <ouroboros/list.h> #include <ouroboros/irm_config.h> +#include <ouroboros/shared.h> #include "api_table.h" #include "apn_table.h" @@ -62,6 +63,7 @@ struct reg_entry { enum reg_name_state state; char * req_ae_name; + qoscube_t qos; int response; pthread_cond_t state_cond; pthread_mutex_t state_lock; diff --git a/src/lib/dev.c b/src/lib/dev.c index 3a1df16d..91fc3c0a 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -133,7 +133,7 @@ struct flow { struct shm_flow_set * set; int port_id; int oflags; - qoscube_t qos; + qoscube_t cube; pid_t api; @@ -158,6 +158,23 @@ struct { pthread_rwlock_t flows_lock; } ai; +/* FIXME: translate real spec to cube */ +static qoscube_t spec_to_cube(qosspec_t * spec) +{ + if (spec == NULL) + return QOS_CUBE_BE; + + return spec->cube; +} + +/* FIXME: fill real spec */ +static void fill_qosspec(qosspec_t * spec, qoscube_t cube) +{ + assert(spec); + + spec->cube = cube; +} + static int api_announce(char * ap_name) { irm_msg_t msg = IRM_MSG__INIT; @@ -214,7 +231,7 @@ static void reset_flow(int fd) ai.flows[fd].oflags = 0; ai.flows[fd].api = -1; ai.flows[fd].timesout = false; - ai.flows[fd].qos = QOS_CUBE_BE; + ai.flows[fd].cube = QOS_CUBE_BE; } int ap_init(char * ap_name) @@ -269,7 +286,7 @@ int ap_init(char * ap_name) ai.flows[i].oflags = 0; ai.flows[i].api = -1; ai.flows[i].timesout = false; - ai.flows[i].qos = QOS_CUBE_BE; + ai.flows[i].cube = QOS_CUBE_BE; } ai.ports = malloc(sizeof(*ai.ports) * IRMD_MAX_FLOWS); @@ -340,14 +357,12 @@ void ap_fini() pthread_rwlock_destroy(&ai.data_lock); } -int flow_accept(char ** ae_name, qosspec_t * qos) +int flow_accept(char ** ae_name, qosspec_t * spec) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; int fd = -1; - (void) qos; - msg.code = IRM_MSG_CODE__IRM_FLOW_ACCEPT; msg.has_api = true; @@ -420,6 +435,10 @@ int flow_accept(char ** ae_name, qosspec_t * qos) ai.flows[fd].port_id = recv_msg->port_id; ai.flows[fd].oflags = FLOW_O_DEFAULT; ai.flows[fd].api = recv_msg->api; + ai.flows[fd].cube = recv_msg->qoscube; + + if (spec != NULL) + fill_qosspec(spec, ai.flows[fd].cube); ai.ports[recv_msg->port_id].fd = fd; ai.ports[recv_msg->port_id].state = PORT_ID_ASSIGNED; @@ -479,15 +498,12 @@ int flow_alloc_resp(int fd, int response) return ret; } -int flow_alloc(char * dst_name, char * src_ae_name, qosspec_t * qos) +int flow_alloc(char * dst_name, char * src_ae_name, qosspec_t * spec) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; int fd = -1; - /* FIXME: add qos support */ - (void) qos; - if (dst_name == NULL) return -EINVAL; @@ -498,6 +514,8 @@ int flow_alloc(char * dst_name, char * src_ae_name, qosspec_t * qos) msg.dst_name = dst_name; msg.ae_name = src_ae_name; msg.has_api = true; + msg.has_qoscube = true; + msg.qoscube = spec_to_cube(spec); pthread_rwlock_rdlock(&ai.data_lock); @@ -553,6 +571,7 @@ int flow_alloc(char * dst_name, char * src_ae_name, qosspec_t * qos) ai.flows[fd].port_id = recv_msg->port_id; ai.flows[fd].oflags = FLOW_O_DEFAULT; ai.flows[fd].api = recv_msg->api; + ai.flows[fd].cube = recv_msg->qoscube; ai.ports[recv_msg->port_id].fd = fd; ai.ports[recv_msg->port_id].state = PORT_ID_ASSIGNED; @@ -779,7 +798,7 @@ int flow_get_qosspec(int fd, qosspec_t * spec) return -ENOTALLOC; } - /* FIXME: map cube to spec */ + fill_qosspec(spec, ai.flows[fd].cube); pthread_rwlock_unlock(&ai.flows_lock); pthread_rwlock_unlock(&ai.data_lock); @@ -1201,7 +1220,10 @@ int ipcp_create_r(pid_t api) return ret; } -int ipcp_flow_req_arr(pid_t api, char * dst_name, char * src_ae_name) +int ipcp_flow_req_arr(pid_t api, + char * dst_name, + char * src_ae_name, + qoscube_t cube) { irm_msg_t msg = IRM_MSG__INIT; irm_msg_t * recv_msg = NULL; @@ -1211,11 +1233,13 @@ int ipcp_flow_req_arr(pid_t api, char * dst_name, char * src_ae_name) if (dst_name == NULL || src_ae_name == NULL) return -EINVAL; - msg.code = IRM_MSG_CODE__IPCP_FLOW_REQ_ARR; - msg.has_api = true; - msg.api = api; - msg.dst_name = dst_name; - msg.ae_name = src_ae_name; + msg.code = IRM_MSG_CODE__IPCP_FLOW_REQ_ARR; + msg.has_api = true; + msg.api = api; + msg.dst_name = dst_name; + msg.ae_name = src_ae_name; + msg.has_qoscube = true; + msg.qoscube = cube; pthread_rwlock_rdlock(&ai.data_lock); pthread_rwlock_wrlock(&ai.flows_lock); @@ -1432,7 +1456,7 @@ int ipcp_flow_get_qoscube(int fd, qoscube_t * cube) return -ENOTALLOC; } - *cube = ai.flows[fd].qos; + *cube = ai.flows[fd].cube; pthread_rwlock_unlock(&ai.flows_lock); pthread_rwlock_unlock(&ai.data_lock); diff --git a/src/lib/ipcpd_messages.proto b/src/lib/ipcpd_messages.proto index b5dd5370..09e959fa 100644 --- a/src/lib/ipcpd_messages.proto +++ b/src/lib/ipcpd_messages.proto @@ -45,7 +45,7 @@ message ipcp_msg { optional sint32 port_id = 6; optional string dst_name = 7; optional string src_ae_name = 8; - optional sint32 qos_cube = 9; + optional sint32 qoscube = 9; optional dif_config_msg conf = 10; optional sint32 fd = 11; optional sint32 api = 12; diff --git a/src/lib/irmd_messages.proto b/src/lib/irmd_messages.proto index fad6fbf1..74d08f9b 100644 --- a/src/lib/irmd_messages.proto +++ b/src/lib/irmd_messages.proto @@ -59,8 +59,9 @@ message irm_msg { optional sint32 response = 8; optional string dst_name = 9; optional sint32 port_id = 10; - optional dif_config_msg conf = 11; - optional uint32 opts = 12; - repeated sint32 apis = 13; - optional sint32 result = 14; + optional sint32 qoscube = 11; + optional dif_config_msg conf = 12; + optional uint32 opts = 13; + repeated sint32 apis = 14; + optional sint32 result = 15; }; |