From af7441a66d1e3cfb43e0a00785b1636b927f40e6 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 24 Dec 2016 19:41:25 +0100 Subject: ipcpd: Use high resolution seed for flat policy This avoids normal ipcps using the flat address policy having a high probability for picking the same address when created from a script. --- src/ipcpd/normal/pol/flat.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ipcpd/normal/pol/flat.c b/src/ipcpd/normal/pol/flat.c index 0ab1e604..8a0570f8 100644 --- a/src/ipcpd/normal/pol/flat.c +++ b/src/ipcpd/normal/pol/flat.c @@ -133,9 +133,12 @@ int flat_init(void) { struct ro_attr rattr; pthread_condattr_t cattr; + struct timespec t; char * name; - srand(time(NULL)); + clock_gettime(CLOCK_REALTIME, &t); + + srand(t.tv_nsec); flat.addr_in_use = false; ro_attr_init(&rattr); -- cgit v1.2.3 From d937595df1211d6b575da8b7d135933f9a2987f8 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 24 Dec 2016 21:12:21 +0100 Subject: lib: Initialise qos cube to best effort The QoS cubes were not initialized in dev.c, which sometimes caused segfaults in the fmgr when calling ipcp_flow_get_qoscube. --- src/lib/dev.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/dev.c b/src/lib/dev.c index b35045f5..7aa27089 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -214,6 +214,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; } int ap_init(char * ap_name) @@ -268,6 +269,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.ports = malloc(sizeof(*ai.ports) * IRMD_MAX_FLOWS); -- cgit v1.2.3 From 23e29ee36bb032040bb5dab96e940f5348bcc0bf Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sat, 24 Dec 2016 20:50:44 +0100 Subject: lib: Fix shutdown in multithreaded programs If a thread with a pending flow terminates, ap_fini would wait for the condvar to destroy the flow indefinitely. --- src/lib/dev.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/lib/dev.c b/src/lib/dev.c index 7aa27089..8eb98506 100644 --- a/src/lib/dev.c +++ b/src/lib/dev.c @@ -101,7 +101,7 @@ static void port_set_state(struct port * p, enum port_state state) pthread_mutex_unlock(&p->state_lock); } -enum port_state port_wait_assign(struct port * p) +static enum port_state port_wait_assign(struct port * p) { enum port_state state; @@ -112,7 +112,7 @@ enum port_state port_wait_assign(struct port * p) return -1; } - while (!(p->state == PORT_ID_ASSIGNED || p->state == PORT_DESTROY)) + while (p->state == PORT_ID_PENDING) pthread_cond_wait(&p->state_cond, &p->state_lock); if (p->state == PORT_DESTROY) { @@ -313,16 +313,17 @@ void ap_fini() pthread_rwlock_rdlock(&ai.flows_lock); for (i = 0; i < AP_MAX_FLOWS; ++i) { - if (ai.flows[i].rx_rb != NULL) { + if (ai.flows[i].port_id != -1) { ssize_t idx; while ((idx = shm_rbuff_read(ai.flows[i].rx_rb)) >= 0) shm_rdrbuff_remove(ai.rdrb, idx); + port_set_state(&ai.ports[ai.flows[i].port_id], + PORT_NULL); + reset_flow(i); } - reset_flow(i); } for (i = 0; i < IRMD_MAX_FLOWS; ++i) { - ai.ports[i].state = PORT_NULL; pthread_mutex_destroy(&ai.ports[i].state_lock); pthread_cond_destroy(&ai.ports[i].state_cond); } @@ -1287,7 +1288,6 @@ int ipcp_flow_req_arr(pid_t api, char * dst_name, char * src_ae_name) if (ai.flows[fd].tx_rb == NULL) { irm_msg__free_unpacked(recv_msg, NULL); reset_flow(fd); - port_destroy(&ai.ports[port_id]); pthread_rwlock_unlock(&ai.flows_lock); pthread_rwlock_unlock(&ai.data_lock); return -1; -- cgit v1.2.3 From 5ae1fb3db5bf11ee2159b8461cdf1e54a2a0ef45 Mon Sep 17 00:00:00 2001 From: dimitri staessens Date: Sun, 25 Dec 2016 11:20:16 +0100 Subject: ipcpd: Check for duplicate RO in flat addr policy --- src/ipcpd/normal/pol/flat.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ipcpd/normal/pol/flat.c b/src/ipcpd/normal/pol/flat.c index 8a0570f8..82c7db93 100644 --- a/src/ipcpd/normal/pol/flat.c +++ b/src/ipcpd/normal/pol/flat.c @@ -238,12 +238,22 @@ uint64_t flat_address(void) } pthread_mutex_lock(&flat.lock); + + if (ro_exists(ro_name)) { + pthread_mutex_unlock(&flat.lock); + free(ro_name); + free(buf); + continue; + } + + if (ro_create(ro_name, &attr, buf, sizeof(*msg))) { pthread_mutex_unlock(&flat.lock); free(ro_name); free(buf); return INVALID_ADDR; } + free(ro_name); while (flat.addr_in_use == false) { @@ -253,6 +263,7 @@ uint64_t flat_address(void) if (ret == -ETIMEDOUT) break; } + pthread_mutex_unlock(&flat.lock); } -- cgit v1.2.3