From d3393da62009e49b5724f8ff3d901c244ab8d557 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Sat, 25 Mar 2017 13:16:11 +0100 Subject: ipcpd: normal: Fix compilation issue --- src/ipcpd/normal/fmgr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index d2966d0c..a8a9ba58 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -494,7 +494,7 @@ int fmgr_np1_alloc(int fd, return -1; } - free(buf->data); + free(buf.data); fmgr.np1_fd_to_cep_id[fd] = cep_id; fmgr.np1_cep_id_to_fd[cep_id] = fd; -- cgit v1.2.3 From c0bfc1752df3530570a24c930220b94a4e3afabb Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Sat, 25 Mar 2017 18:48:30 +0100 Subject: lib, ipcpd: Fix bugs in ro sets This fixes several bugs in the ro sets, rib. And it fixes several bugs in the graph and routing component of the normal IPCP. --- src/ipcpd/normal/graph.c | 14 ++++++++------ src/ipcpd/normal/routing.c | 4 ++-- src/lib/rib.c | 10 +++++++++- 3 files changed, 19 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/graph.c b/src/ipcpd/normal/graph.c index b3e105e3..272576bb 100644 --- a/src/ipcpd/normal/graph.c +++ b/src/ipcpd/normal/graph.c @@ -106,15 +106,15 @@ static void del_edge(struct edge * edge) free(edge); } -static int add_vertex(struct graph * graph, - uint64_t addr) +static struct vertex * add_vertex(struct graph * graph, + uint64_t addr) { struct vertex * vertex; struct list_head * p; vertex = malloc(sizeof(*vertex)); if (vertex == NULL) - return -1; + return NULL; list_head_init(&vertex->next); list_head_init(&vertex->edges); @@ -130,7 +130,7 @@ static int add_vertex(struct graph * graph, graph->nr_vertices++; - return 0; + return vertex; } static void del_vertex(struct graph * graph, @@ -206,7 +206,8 @@ int graph_add_edge(struct graph * graph, v = find_vertex_by_addr(graph, s_addr); if (v == NULL) { - if (add_vertex(graph, s_addr)) { + v = add_vertex(graph, s_addr); + if (v == NULL) { pthread_mutex_unlock(&graph->lock); return -ENOMEM; } @@ -221,7 +222,8 @@ int graph_add_edge(struct graph * graph, nb = find_vertex_by_addr(graph, d_addr); if (nb == NULL) { - if (add_vertex(graph, d_addr)) { + nb = add_vertex(graph, d_addr); + if (nb == NULL) { pthread_mutex_unlock(&graph->lock); return -ENOMEM; } diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c index b750ca84..998b294a 100644 --- a/src/ipcpd/normal/routing.c +++ b/src/ipcpd/normal/routing.c @@ -291,12 +291,12 @@ static void * rib_listener(void * o) } } - while (rib_event_wait(routing.set, routing.queue, NULL)) { + while (rib_event_wait(routing.set, routing.queue, NULL) == 0) { flag = rqueue_next(routing.queue, path); if (flag < 0) continue; - if (read_fso(children[i], flag)) { + if (read_fso(path, flag)) { log_err("Failed to parse FSO."); continue; } diff --git a/src/lib/rib.c b/src/lib/rib.c index 8468e88c..fc58f266 100644 --- a/src/lib/rib.c +++ b/src/lib/rib.c @@ -177,6 +177,8 @@ static struct revent * revent_dup(struct revent * ev) re->flags = ev->flags; + list_head_init(&re->next); + return re; } @@ -196,7 +198,13 @@ static void rnode_notify_subs(struct rnode * node, struct rn_sub * s = list_entry(p, struct rn_sub, next); if (s->flags & ev->flags) { struct revent * e = revent_dup(ev); + if (e == NULL) + continue; + + pthread_mutex_lock(&s->sub->lock); list_add_tail(&e->next, &s->sub->events); + pthread_cond_signal(&s->sub->cond); + pthread_mutex_unlock(&s->sub->lock); } if (ev->flags & RO_DELETE) @@ -1130,7 +1138,7 @@ int rib_event_wait(ro_set_t * set, while (list_is_empty(&sub->events) && ret != -ETIMEDOUT) { if (timeout != NULL) - ret = -pthread_cond_timedwait(&sub->cond , + ret = -pthread_cond_timedwait(&sub->cond, &sub->lock, &abstime); else -- cgit v1.2.3 From 53384bdca4f5e80f626e68e71ad2b82100b22735 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 11:07:27 +0200 Subject: lib: Revise list_move operation This revises the list_move operation, which was giving weird behaviour. --- src/lib/list.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/lib/list.c b/src/lib/list.c index b6b4bbd2..52270fe8 100644 --- a/src/lib/list.c +++ b/src/lib/list.c @@ -71,13 +71,9 @@ bool list_is_empty(struct list_head * h) return h->nxt == h; } -void list_move(struct list_head * dst, - struct list_head * src) +void list_move(struct list_head * n, + struct list_head * h) { - dst->nxt = src->nxt; - dst->prv = src->prv; - dst->nxt->prv = src->nxt->prv; - dst->prv->nxt = src->prv->nxt; - - list_head_init(src); + del_list(n->prv, n->nxt); + list_add(n, h); } -- cgit v1.2.3 From 8f88486a5a549e1b6644670e5eb011a9309f176b Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 11:08:01 +0200 Subject: ipcpd: normal: Remove graph_add_edge operation This removes the graph_add_edge operation of the graph component. The routing component now only listens to RO_MODIFY events, and updates the graph accordingly. --- src/ipcpd/normal/graph.c | 86 ++++++++++++++++------------------------------ src/ipcpd/normal/graph.h | 5 --- src/ipcpd/normal/routing.c | 15 ++------ 3 files changed, 33 insertions(+), 73 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/graph.c b/src/ipcpd/normal/graph.c index 272576bb..dd6b0e7a 100644 --- a/src/ipcpd/normal/graph.c +++ b/src/ipcpd/normal/graph.c @@ -81,29 +81,31 @@ static struct vertex * find_vertex_by_addr(struct graph * graph, return NULL; } -static int add_edge(struct vertex * vertex, - struct vertex * nb, - qosspec_t qs) +static struct edge * add_edge(struct vertex * vertex, + struct vertex * nb) { struct edge * edge; edge = malloc(sizeof(*edge)); if (edge == NULL) - return -ENOMEM; + return NULL; list_head_init(&edge->next); edge->nb = nb; - edge->qs = qs; list_add(&edge->next, &vertex->edges); - return 0; + log_dbg("Added a new edge to the graph."); + + return edge; } static void del_edge(struct edge * edge) { list_del(&edge->next); free(edge); + + log_dbg("Removed an edge of the graph."); } static struct vertex * add_vertex(struct graph * graph, @@ -130,6 +132,8 @@ static struct vertex * add_vertex(struct graph * graph, graph->nr_vertices++; + log_dbg("Added new vertex."); + return vertex; } @@ -148,6 +152,8 @@ static void del_vertex(struct graph * graph, free(vertex); + log_dbg("Removed a vertex from the graph."); + graph->nr_vertices--; } @@ -191,10 +197,10 @@ void graph_destroy(struct graph * graph) free(graph); } -int graph_add_edge(struct graph * graph, - uint64_t s_addr, - uint64_t d_addr, - qosspec_t qs) +int graph_update_edge(struct graph * graph, + uint64_t s_addr, + uint64_t d_addr, + qosspec_t qs) { struct vertex * v; struct edge * e; @@ -209,71 +215,41 @@ int graph_add_edge(struct graph * graph, v = add_vertex(graph, s_addr); if (v == NULL) { pthread_mutex_unlock(&graph->lock); + log_err("Failed to add vertex."); return -ENOMEM; } } - e = find_edge_by_addr(v, d_addr); - if (e != NULL) { - pthread_mutex_unlock(&graph->lock); - log_err("Edge already exists."); - return -1; - } - nb = find_vertex_by_addr(graph, d_addr); if (nb == NULL) { nb = add_vertex(graph, d_addr); if (nb == NULL) { + if (list_is_empty(&v->edges)) + del_vertex(graph, v); pthread_mutex_unlock(&graph->lock); + log_err("Failed to add vertex."); return -ENOMEM; } } - if (add_edge(v, nb, qs)) { - pthread_mutex_unlock(&graph->lock); - log_err("Failed to add edge."); - return -1; - } - - pthread_mutex_unlock(&graph->lock); - - log_dbg("Added an edge to the graph."); - - return 0; -} - -int graph_update_edge(struct graph * graph, - uint64_t s_addr, - uint64_t d_addr, - qosspec_t qs) -{ - struct vertex * v; - struct edge * e; - - assert(graph); - - pthread_mutex_lock(&graph->lock); - - v = find_vertex_by_addr(graph, s_addr); - if (v == NULL) { - pthread_mutex_unlock(&graph->lock); - log_err("No such vertex."); - return -1; - } - e = find_edge_by_addr(v, d_addr); if (e == NULL) { - pthread_mutex_unlock(&graph->lock); - log_err("No such edge."); - return -1; + e = add_edge(v, nb); + if (e == NULL) { + if (list_is_empty(&v->edges)) + del_vertex(graph, v); + if (list_is_empty(&nb->edges)) + del_vertex(graph, v); + pthread_mutex_unlock(&graph->lock); + log_err("Failed to add edge."); + return -ENOMEM; + } } e->qs = qs; pthread_mutex_unlock(&graph->lock); - log_dbg("Updated an edge of the graph."); - return 0; } @@ -321,8 +297,6 @@ int graph_del_edge(struct graph * graph, pthread_mutex_unlock(&graph->lock); - log_dbg("Removed an edge of the graph."); - return 0; } diff --git a/src/ipcpd/normal/graph.h b/src/ipcpd/normal/graph.h index 226092c7..70be8626 100644 --- a/src/ipcpd/normal/graph.h +++ b/src/ipcpd/normal/graph.h @@ -37,11 +37,6 @@ struct graph * graph_create(void); void graph_destroy(struct graph * graph); -int graph_add_edge(struct graph * graph, - uint64_t s_addr, - uint64_t d_addr, - qosspec_t qs); - int graph_update_edge(struct graph * graph, uint64_t s_addr, uint64_t d_addr, diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c index 998b294a..bf736311 100644 --- a/src/ipcpd/normal/routing.c +++ b/src/ipcpd/normal/routing.c @@ -235,23 +235,14 @@ static int read_fso(char * path, return -1; } - if (flag & RO_CREATE) { - if (graph_add_edge(routing.graph, - fso->s_addr, fso->d_addr, qs)) { - log_err("Failed to add edge to graph."); - fso__free_unpacked(fso, NULL); - return -1; - } - } else if (flag & RO_MODIFY) { + if (flag & RO_MODIFY) { if (graph_update_edge(routing.graph, fso->s_addr, fso->d_addr, qs)) { - log_err("Failed to update edge of graph."); fso__free_unpacked(fso, NULL); return -1; } } else if (flag & RO_DELETE) { if (graph_del_edge(routing.graph, fso->s_addr, fso->d_addr)) { - log_err("Failed to del edge of graph."); fso__free_unpacked(fso, NULL); return -1; } @@ -272,8 +263,7 @@ static void * rib_listener(void * o) (void) o; - if (ro_set_add(routing.set, ROUTING_PATH, - RO_MODIFY | RO_CREATE | RO_DELETE)) { + if (ro_set_add(routing.set, ROUTING_PATH, RO_MODIFY | RO_DELETE)) { log_err("Failed to add to RO set"); return (void * ) -1; } @@ -292,6 +282,7 @@ static void * rib_listener(void * o) } while (rib_event_wait(routing.set, routing.queue, NULL) == 0) { + path[0] = '\0'; flag = rqueue_next(routing.queue, path); if (flag < 0) continue; -- cgit v1.2.3 From 8fd39fd9e1cc65147a6f1a3fa5027c9ab2cb4a68 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 11:51:53 +0200 Subject: lib: Fix list_move on wrong list The list move was being done on the whole list of sub events, whereas it should only be done on the first entry. A cleanup handler was also added. --- src/lib/rib.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/lib/rib.c b/src/lib/rib.c index fc58f266..d39a17d2 100644 --- a/src/lib/rib.c +++ b/src/lib/rib.c @@ -1114,6 +1114,7 @@ int rib_event_wait(ro_set_t * set, { struct rib_sub * sub; struct timespec abstime; + struct revent * ev; ssize_t ret = 0; @@ -1136,6 +1137,9 @@ int rib_event_wait(ro_set_t * set, pthread_mutex_lock(&sub->lock); + pthread_cleanup_push((void(*)(void *)) pthread_mutex_unlock, + (void *) &sub->lock); + while (list_is_empty(&sub->events) && ret != -ETIMEDOUT) { if (timeout != NULL) ret = -pthread_cond_timedwait(&sub->cond, @@ -1145,12 +1149,14 @@ int rib_event_wait(ro_set_t * set, ret = -pthread_cond_wait(&sub->cond, &sub->lock); } - pthread_mutex_unlock(&sub->lock); + pthread_cleanup_pop(true); pthread_rwlock_wrlock(&rib.lock); - if (ret != -ETIMEDOUT) - list_move(&rq->events, &sub->events); + if (ret != -ETIMEDOUT) { + ev = list_first_entry(&sub->events, struct revent, next); + list_move(&ev->next, &rq->events); + } pthread_rwlock_unlock(&rib.lock); -- cgit v1.2.3 From 9e3dffb25570fc12dd43f8fad721be40374ea35b Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 11:53:20 +0200 Subject: ipcpd: normal: Fix locking of PFF This adds fixes the locking of the PFF which was externalized, but not yet correctly updated within the PFF component itself and within the flow manager. --- src/ipcpd/normal/fmgr.c | 9 +++++++++ src/ipcpd/normal/pff.c | 20 +------------------- 2 files changed, 10 insertions(+), 19 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index a8a9ba58..f78d390a 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -198,13 +198,16 @@ void * fmgr_nm1_sdu_reader(void * o) continue; } + pff_lock(fmgr.pff[i]); fd = pff_nhop(fmgr.pff[i], pci.dst_addr); if (fd < 0) { + pff_unlock(fmgr.pff[i]); log_err("No next hop for %lu", pci.dst_addr); ipcp_flow_del(sdb); continue; } + pff_unlock(fmgr.pff[i]); if (ipcp_flow_write(fd, sdb)) { log_err("Failed to write SDU to fd %d.", @@ -689,12 +692,15 @@ int fmgr_nm1_write_sdu(struct pci * pci, if (pci == NULL || sdb == NULL) return -EINVAL; + pff_lock(fmgr.pff[pci->qos_id]); fd = pff_nhop(fmgr.pff[pci->qos_id], pci->dst_addr); if (fd < 0) { + pff_unlock(fmgr.pff[pci->qos_id]); log_err("Could not get nhop for address %lu", pci->dst_addr); ipcp_flow_del(sdb); return -1; } + pff_unlock(fmgr.pff[pci->qos_id]); if (shm_pci_ser(sdb, pci)) { log_err("Failed to serialize PDU."); @@ -720,11 +726,14 @@ int fmgr_nm1_write_buf(struct pci * pci, if (pci == NULL || buf == NULL || buf->data == NULL) return -EINVAL; + pff_lock(fmgr.pff[pci->qos_id]); fd = pff_nhop(fmgr.pff[pci->qos_id], pci->dst_addr); if (fd < 0) { + pff_unlock(fmgr.pff[pci->qos_id]); log_err("Could not get nhop for address %lu", pci->dst_addr); return -1; } + pff_unlock(fmgr.pff[pci->qos_id]); buffer = shm_pci_ser_buf(buf, pci); if (buffer == NULL) { diff --git a/src/ipcpd/normal/pff.c b/src/ipcpd/normal/pff.c index 77c2c551..c26c2263 100644 --- a/src/ipcpd/normal/pff.c +++ b/src/ipcpd/normal/pff.c @@ -60,9 +60,7 @@ void pff_destroy(struct pff * instance) { assert(instance); - pthread_mutex_lock(&instance->lock); htable_destroy(instance->table); - pthread_mutex_unlock(&instance->lock); pthread_mutex_destroy(&instance->lock); free(instance); @@ -89,13 +87,10 @@ int pff_add(struct pff * instance, uint64_t addr, int fd) return -ENOMEM; *val = fd; - pthread_mutex_lock(&instance->lock); if (htable_insert(instance->table, addr, val)) { - pthread_mutex_unlock(&instance->lock); free(val); return -1; } - pthread_mutex_unlock(&instance->lock); return 0; } @@ -111,19 +106,15 @@ int pff_update(struct pff * instance, uint64_t addr, int fd) return -ENOMEM; *val = fd; - pthread_mutex_lock(&instance->lock); if (htable_delete(instance->table, addr)) { - pthread_mutex_unlock(&instance->lock); free(val); return -1; } if (htable_insert(instance->table, addr, val)) { - pthread_mutex_unlock(&instance->lock); free(val); return -1; } - pthread_mutex_unlock(&instance->lock); return 0; } @@ -132,12 +123,8 @@ int pff_remove(struct pff * instance, uint64_t addr) { assert(instance); - pthread_mutex_lock(&instance->lock); - if (htable_delete(instance->table, addr)) { - pthread_mutex_unlock(&instance->lock); + if (htable_delete(instance->table, addr)) return -1; - } - pthread_mutex_unlock(&instance->lock); return 0; } @@ -146,9 +133,7 @@ void pff_flush(struct pff * instance) { assert(instance); - pthread_mutex_lock(&instance->lock); htable_flush(instance->table); - pthread_mutex_unlock(&instance->lock); } int pff_nhop(struct pff * instance, uint64_t addr) @@ -158,14 +143,11 @@ int pff_nhop(struct pff * instance, uint64_t addr) assert(instance); - pthread_mutex_lock(&instance->lock); j = (int *) htable_lookup(instance->table, addr); if (j == NULL) { - pthread_mutex_unlock(&instance->lock); return -1; } fd = *j; - pthread_mutex_unlock(&instance->lock); return fd; } -- cgit v1.2.3 From ad6a813edab5a14866b045d37fe2ce7e1f9a126d Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 12:47:20 +0200 Subject: ipcpd: normal: Fix wrong update to index The index j in the function that transforms the list of predecessors to a routing table was incremented at the wrong time. --- src/ipcpd/normal/graph.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/graph.c b/src/ipcpd/normal/graph.c index dd6b0e7a..5fd6fcb6 100644 --- a/src/ipcpd/normal/graph.c +++ b/src/ipcpd/normal/graph.c @@ -475,7 +475,7 @@ ssize_t graph_routing_table(struct graph * graph, index = get_vertex_index(graph, prev); } - (*table)[++j] = malloc(sizeof(***table)); + (*table)[j] = malloc(sizeof(***table)); if ((*table)[j] == NULL) { pthread_mutex_unlock(&graph->lock); for (k = 0; k < j; ++k) @@ -487,7 +487,7 @@ ssize_t graph_routing_table(struct graph * graph, (*table)[j]->dst = v->addr; (*table)[j]->nhop = nhop->addr; - + j++; i++; } -- cgit v1.2.3 From 48f12c6466c14f51bc3a2bba9b06772207e9ef33 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 14:12:41 +0200 Subject: ipcpd: normal: Call shm_pci_init on fmgr init The shm PCI was never initialized during flow manager init. This commit will do that, and initialize the pdu length correctly as well, since it was not being written into the RIB, nor read in shm_pci_init. --- src/ipcpd/normal/fmgr.c | 6 ++++++ src/ipcpd/normal/main.c | 13 ++++++++++++- src/ipcpd/normal/shm_pci.c | 20 +++++++++++--------- 3 files changed, 29 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index f78d390a..5a1bd842 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -296,6 +296,12 @@ int fmgr_init(void) } } + if (shm_pci_init()) { + log_err("Failed to init shm pci."); + fmgr_destroy_flows(); + return -1; + } + memset(&info, 0, sizeof(info)); strcpy(info.ae_name, DT_AE); diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index 41e0544d..ef7f07cf 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -85,6 +85,7 @@ static int boot_components(void) char buf[256]; ssize_t len; enum pol_addr_auth pa; + char path[RIB_MAX_PATH_LEN + 1]; len = rib_read(DIF_PATH, &buf, 256); if (len < 0) { @@ -108,7 +109,6 @@ static int boot_components(void) if (rib_read(BOOT_PATH "/addr_auth/type", &pa, sizeof(pa)) != sizeof(pa)) { log_err("Failed to read policy for address authority."); - connmgr_fini(); return -1; } @@ -124,6 +124,14 @@ static int boot_components(void) return -1; } + path[0] = '\0'; + rib_path_append(rib_path_append(path, MEMBERS_NAME), ipcpi.name); + if (rib_write(path, &ipcpi.dt_addr, sizeof(&ipcpi.dt_addr))) { + log_err("Failed to write address to member object."); + addr_auth_fini(); + return -1; + } + log_dbg("IPCP got address %" PRIu64 ".", ipcpi.dt_addr); log_dbg("Starting ribmgr."); @@ -342,6 +350,9 @@ static int normal_ipcp_bootstrap(struct dif_config * conf) rib_write(BOOT_PATH "/dt/const/seqno_size", &conf->seqno_size, sizeof(conf->seqno_size)) || + rib_write(BOOT_PATH "/dt/const/pdu_length_size", + &conf->pdu_length_size, + sizeof(conf->pdu_length_size)) || rib_write(BOOT_PATH "/dt/const/has_ttl", &conf->has_ttl, sizeof(conf->has_ttl)) || diff --git a/src/ipcpd/normal/shm_pci.c b/src/ipcpd/normal/shm_pci.c index 001463eb..e6cd1042 100644 --- a/src/ipcpd/normal/shm_pci.c +++ b/src/ipcpd/normal/shm_pci.c @@ -88,30 +88,32 @@ int shm_pci_init(void) /* read dt constants from the RIB */ if (rib_read(BOOT_PATH "/dt/const/addr_size", &pci_info.dtc.addr_size, - sizeof(pci_info.dtc.addr_size)) || + sizeof(pci_info.dtc.addr_size)) < 0 || rib_read(BOOT_PATH "/dt/const/cep_id_size", &pci_info.dtc.cep_id_size, - sizeof(pci_info.dtc.cep_id_size)) || + sizeof(pci_info.dtc.cep_id_size)) < 0 || rib_read(BOOT_PATH "/dt/const/seqno_size", &pci_info.dtc.seqno_size, - sizeof(pci_info.dtc.seqno_size)) || + sizeof(pci_info.dtc.seqno_size)) < 0 || + rib_read(BOOT_PATH "/dt/const/pdu_length_size", + &pci_info.dtc.pdu_length_size, + sizeof(pci_info.dtc.pdu_length_size)) < 0 || rib_read(BOOT_PATH "/dt/const/has_ttl", &pci_info.dtc.has_ttl, - sizeof(pci_info.dtc.has_ttl)) || + sizeof(pci_info.dtc.has_ttl)) < 0 || rib_read(BOOT_PATH "/dt/const/has_chk", &pci_info.dtc.has_chk, - sizeof(pci_info.dtc.has_chk)) || + sizeof(pci_info.dtc.has_chk)) < 0 || rib_read(BOOT_PATH "/dt/const/min_pdu_size", &pci_info.dtc.min_pdu_size, - sizeof(pci_info.dtc.min_pdu_size)) || + sizeof(pci_info.dtc.min_pdu_size)) < 0 || rib_read(BOOT_PATH "/dt/const/max_pdu_size", &pci_info.dtc.max_pdu_size, - sizeof(pci_info.dtc.max_pdu_size))) + sizeof(pci_info.dtc.max_pdu_size)) < 0) return -1; pci_info.dst_addr_o = PDU_TYPE_SIZE; pci_info.src_addr_o = pci_info.dst_addr_o + pci_info.dtc.addr_size; - pci_info.dst_cep_id_o = pci_info.dst_addr_o + pci_info.dtc.addr_size; pci_info.dst_cep_id_o = pci_info.src_addr_o + pci_info.dtc.addr_size; pci_info.src_cep_id_o = pci_info.dst_cep_id_o + pci_info.dtc.cep_id_size; @@ -132,7 +134,7 @@ int shm_pci_init(void) } void shm_pci_fini(void) { - return ; + return; } int shm_pci_ser(struct shm_du_buff * sdb, -- cgit v1.2.3 From 8b99f1648c3bf7fe395ba4d194dbd56f766754ac Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Mon, 27 Mar 2017 14:19:05 +0200 Subject: ipcpd: normal: Fix invalid free of pci The PCI was being freed by frct, but it was stack memory which was created in the fmgr, resulting in an illegal free. --- src/ipcpd/normal/frct.c | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src') diff --git a/src/ipcpd/normal/frct.c b/src/ipcpd/normal/frct.c index 8bf080ce..01bdb660 100644 --- a/src/ipcpd/normal/frct.c +++ b/src/ipcpd/normal/frct.c @@ -227,7 +227,6 @@ int frct_nm1_post_sdu(struct pci * pci, if (fmgr_np1_post_buf(id, &buf)) { log_err("Failed to hand buffer to FMGR."); - free(pci); return -1; } } else if (pci->pdu_type == PDU_TYPE_MGMT) { @@ -246,20 +245,16 @@ int frct_nm1_post_sdu(struct pci * pci, 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)) { log_err("Failed to hand SDU to FMGR."); - free(pci); return -1; } } - free(pci); - return 0; } -- cgit v1.2.3 From 6d080d9b9ee2e480717935e4ce94870fc87ea5f7 Mon Sep 17 00:00:00 2001 From: Sander Vrijders Date: Tue, 28 Mar 2017 10:34:26 +0200 Subject: lib: Use internal ops for list_move --- src/lib/list.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/list.c b/src/lib/list.c index 52270fe8..d5aba058 100644 --- a/src/lib/list.c +++ b/src/lib/list.c @@ -75,5 +75,5 @@ void list_move(struct list_head * n, struct list_head * h) { del_list(n->prv, n->nxt); - list_add(n, h); + add_list(n, h, h->nxt); } -- cgit v1.2.3