summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2016-10-27 16:40:39 +0200
committerSander Vrijders <[email protected]>2016-10-27 18:40:31 +0200
commit09a348b325e2b819e3deb952c1b3a6b141d75572 (patch)
tree8b9a093c36db09513dfb333cc1c90763c3112df9
parent6a61274c2289a06b4c23d5c8b2e36d924eb72a48 (diff)
downloadouroboros-09a348b325e2b819e3deb952c1b3a6b141d75572.tar.gz
ouroboros-09a348b325e2b819e3deb952c1b3a6b141d75572.zip
ipcpd: normal: Fix bugs in connection establishment
This fixes some bugs in connection establishment over the normal IPCP.
-rw-r--r--src/ipcpd/normal/fmgr.c59
-rw-r--r--src/ipcpd/normal/frct.c24
-rw-r--r--src/ipcpd/normal/main.c10
-rw-r--r--src/ipcpd/normal/shm_pci.c11
4 files changed, 58 insertions, 46 deletions
diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c
index b5ae40dd..607308c0 100644
--- a/src/ipcpd/normal/fmgr.c
+++ b/src/ipcpd/normal/fmgr.c
@@ -44,7 +44,7 @@
#include "flow_alloc.pb-c.h"
typedef FlowAllocMsg flow_alloc_msg_t;
-#define FD_UPDATE_TIMEOUT 100 /* microseconds */
+#define FD_UPDATE_TIMEOUT 100000 /* nanoseconds */
struct np1_flow {
int fd;
@@ -54,7 +54,6 @@ struct np1_flow {
struct nm1_flow {
int fd;
- char * ae_name;
enum qos_cube qos;
};
@@ -63,6 +62,7 @@ struct {
struct nm1_flow ** nm1_flows;
pthread_rwlock_t nm1_flows_lock;
flow_set_t * nm1_set;
+ pthread_t nm1_sdu_reader;
struct np1_flow ** np1_flows;
struct np1_flow ** np1_flows_cep;
@@ -75,26 +75,23 @@ struct {
} fmgr;
static int add_nm1_fd(int fd,
- char * ae_name,
enum qos_cube qos)
{
struct nm1_flow * tmp;
- if (ae_name == NULL)
- return -1;
-
tmp = malloc(sizeof(*tmp));
if (tmp == NULL)
return -1;
tmp->fd = fd;
- tmp->ae_name = ae_name;
tmp->qos = qos;
pthread_rwlock_wrlock(&fmgr.nm1_flows_lock);
fmgr.nm1_flows[fd] = tmp;
pthread_rwlock_unlock(&fmgr.nm1_flows_lock);
+ flow_set_add(fmgr.nm1_set, fd);
+
/* FIXME: Temporary, until we have a PFF */
fmgr.fd = fd;
@@ -116,7 +113,7 @@ static int add_np1_fd(int fd,
flow->fd = fd;
fmgr.np1_flows[fd] = flow;
- fmgr.np1_flows_cep[fd] = flow;
+ fmgr.np1_flows_cep[cep_id] = flow;
return 0;
}
@@ -170,14 +167,16 @@ static void * fmgr_nm1_acceptor(void * o)
flow_dealloc(fd);
continue;
}
+ } else {
+ /* FIXME: Pass correct QoS cube */
+ if (add_nm1_fd(fd, QOS_CUBE_BE)) {
+ LOG_ERR("Failed to add fd to list.");
+ flow_dealloc(fd);
+ continue;
+ }
}
- /* FIXME: Pass correct QoS cube */
- if (add_nm1_fd(fd, ae_name, QOS_CUBE_BE)) {
- LOG_ERR("Failed to add file descriptor to list.");
- flow_dealloc(fd);
- continue;
- }
+ free(ae_name);
}
return (void *) 0;
@@ -365,6 +364,7 @@ int fmgr_init()
pthread_create(&fmgr.nm1_flow_acceptor, NULL, fmgr_nm1_acceptor, NULL);
pthread_create(&fmgr.np1_sdu_reader, NULL, fmgr_np1_sdu_reader, NULL);
+ pthread_create(&fmgr.nm1_sdu_reader, NULL, fmgr_nm1_sdu_reader, NULL);
return 0;
}
@@ -375,15 +375,15 @@ int fmgr_fini()
pthread_cancel(fmgr.nm1_flow_acceptor);
pthread_cancel(fmgr.np1_sdu_reader);
+ pthread_cancel(fmgr.nm1_sdu_reader);
pthread_join(fmgr.nm1_flow_acceptor, NULL);
pthread_join(fmgr.np1_sdu_reader, NULL);
+ pthread_join(fmgr.nm1_sdu_reader, NULL);
for (i = 0; i < IRMD_MAX_FLOWS; i++) {
if (fmgr.nm1_flows[i] == NULL)
continue;
- if (fmgr.nm1_flows[i]->ae_name != NULL)
- free(fmgr.nm1_flows[i]->ae_name);
if (ribmgr_remove_flow(fmgr.nm1_flows[i]->fd))
LOG_ERR("Failed to remove management flow.");
}
@@ -447,8 +447,6 @@ int fmgr_np1_alloc(int fd,
return -1;
}
- free(buf.data);
-
if (add_np1_fd(fd, cep_id, qos)) {
pthread_rwlock_unlock(&fmgr.np1_flows_lock);
return -1;
@@ -671,17 +669,11 @@ int fmgr_nm1_mgmt_flow(char * dst_name)
{
int fd;
int result;
- char * ae_name;
-
- ae_name = strdup(MGMT_AE);
- if (ae_name == NULL)
- return -1;
/* FIXME: Request retransmission. */
fd = flow_alloc(dst_name, MGMT_AE, NULL);
if (fd < 0) {
LOG_ERR("Failed to allocate flow to %s", dst_name);
- free(ae_name);
return -1;
}
@@ -689,21 +681,12 @@ int fmgr_nm1_mgmt_flow(char * dst_name)
if (result < 0) {
LOG_ERR("Result of flow allocation to %s is %d",
dst_name, result);
- free(ae_name);
return -1;
}
if (ribmgr_add_flow(fd)) {
LOG_ERR("Failed to hand file descriptor to RIB manager");
flow_dealloc(fd);
- free(ae_name);
- return -1;
- }
-
- /* FIXME: Pass correct QoS cube */
- if (add_nm1_fd(fd, ae_name, QOS_CUBE_BE)) {
- LOG_ERR("Failed to add file descriptor to list.");
- flow_dealloc(fd);
return -1;
}
@@ -715,17 +698,11 @@ int fmgr_nm1_dt_flow(char * dst_name,
{
int fd;
int result;
- char * ae_name;
-
- ae_name = strdup(DT_AE);
- if (ae_name == NULL)
- return -1;
/* FIXME: Map qos cube on correct QoS. */
fd = flow_alloc(dst_name, DT_AE, NULL);
if (fd < 0) {
LOG_ERR("Failed to allocate flow to %s", dst_name);
- free(ae_name);
return -1;
}
@@ -733,14 +710,12 @@ int fmgr_nm1_dt_flow(char * dst_name,
if (result < 0) {
LOG_ERR("Result of flow allocation to %s is %d",
dst_name, result);
- free(ae_name);
return -1;
}
- if (add_nm1_fd(fd, ae_name, qos)) {
+ if (add_nm1_fd(fd, qos)) {
LOG_ERR("Failed to add file descriptor to list.");
flow_dealloc(fd);
- free(ae_name);
return -1;
}
diff --git a/src/ipcpd/normal/frct.c b/src/ipcpd/normal/frct.c
index 3f80f91e..ff980772 100644
--- a/src/ipcpd/normal/frct.c
+++ b/src/ipcpd/normal/frct.c
@@ -156,7 +156,8 @@ int frct_nm1_post_sdu(struct pci * pci,
if (pci == NULL || sdb == NULL)
return -1;
- if (pci->dst_cep_id == INVALID_CEP_ID) {
+ if (pci->dst_cep_id == INVALID_CEP_ID &&
+ pci->pdu_type == PDU_TYPE_MGMT) {
pthread_mutex_lock(&frct.instances_lock);
instance = create_frct_i(pci->src_addr,
pci->src_cep_id);
@@ -176,6 +177,25 @@ int frct_nm1_post_sdu(struct pci * pci,
free(pci);
return -1;
}
+ } else if (pci->pdu_type == PDU_TYPE_MGMT) {
+ pthread_mutex_lock(&frct.instances_lock);
+ instance = frct.instances[pci->dst_cep_id];
+ if (instance == NULL) {
+ pthread_mutex_unlock(&frct.instances_lock);
+ return -1;
+ }
+ instance->r_cep_id = pci->src_cep_id;
+ instance->state = CONN_ESTABLISHED;
+ pthread_mutex_unlock(&frct.instances_lock);
+
+ buf.len = shm_du_buff_tail(sdb) - shm_du_buff_head(sdb);
+ buf.data = shm_du_buff_head(sdb);
+
+ if (fmgr_np1_post_buf(pci->dst_cep_id, &buf)) {
+ LOG_ERR("Failed to hand buffer to Flow Manager.");
+ free(pci);
+ return -1;
+ }
} else {
/* FIXME: Known cep-ids are delivered to FMGR (minimal DTP) */
if (fmgr_np1_post_sdu(pci->dst_cep_id, sdb)) {
@@ -357,5 +377,7 @@ int frct_i_write_sdu(cep_id_t id,
return -1;
}
+ pthread_mutex_unlock(&frct.instances_lock);
+
return 0;
}
diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c
index 2402972f..a5161718 100644
--- a/src/ipcpd/normal/main.c
+++ b/src/ipcpd/normal/main.c
@@ -108,6 +108,10 @@ static int normal_ipcp_name_query(char * name)
* for certain names.
*/
+ /* FIXME: Here for testing purposes */
+ if (strcmp(name, "normal.app") == 0)
+ return 0;
+
return -1;
}
@@ -145,6 +149,12 @@ static int normal_ipcp_enroll(char * dif_name)
pthread_rwlock_unlock(&ipcpi.state_lock);
+ /* FIXME: Remove once we obtain neighbors during enrollment */
+ if (fmgr_nm1_dt_flow(dif_name, QOS_CUBE_BE)) {
+ LOG_ERR("Failed to establish data transfer flow.");
+ return -1;
+ }
+
return 0;
}
diff --git a/src/ipcpd/normal/shm_pci.c b/src/ipcpd/normal/shm_pci.c
index aa18fa38..3c55d081 100644
--- a/src/ipcpd/normal/shm_pci.c
+++ b/src/ipcpd/normal/shm_pci.c
@@ -34,6 +34,7 @@
#include "crc32.h"
#include "ribmgr.h"
+#define PDU_TYPE_SIZE 1
#define QOS_ID_SIZE 1
#define DEFAULT_TTL 60
#define TTL_SIZE 1
@@ -43,7 +44,7 @@ static size_t shm_pci_head_size(struct dt_const * dtc)
{
size_t len = 0;
- len = dtc->addr_size * 2 + dtc->cep_id_size * 2
+ len = PDU_TYPE_SIZE + dtc->addr_size * 2 + dtc->cep_id_size * 2
+ dtc->pdu_length_size + dtc->seqno_size + QOS_ID_SIZE;
if (dtc->has_ttl)
@@ -64,7 +65,9 @@ static void ser_pci_head(uint8_t * head,
int offset = 0;
uint8_t ttl = DEFAULT_TTL;
- memcpy(head, &pci->dst_addr, dtc->addr_size);
+ memcpy(head, &pci->pdu_type, PDU_TYPE_SIZE);
+ offset += PDU_TYPE_SIZE;
+ memcpy(head + offset, &pci->dst_addr, dtc->addr_size);
offset += dtc->addr_size;
memcpy(head + offset, &pci->src_addr, dtc->addr_size);
offset += dtc->addr_size;
@@ -174,7 +177,9 @@ struct pci * shm_pci_des(struct shm_du_buff * sdb)
if (pci == NULL)
return NULL;
- memcpy(&pci->dst_addr, head, dtc->addr_size);
+ memcpy(&pci->pdu_type, head, PDU_TYPE_SIZE);
+ offset += PDU_TYPE_SIZE;
+ memcpy(&pci->dst_addr, head + offset, dtc->addr_size);
offset += dtc->addr_size;
memcpy(&pci->src_addr, head + offset, dtc->addr_size);
offset += dtc->addr_size;