diff options
Diffstat (limited to 'src/ipcpd')
| -rw-r--r-- | src/ipcpd/normal/graph.c | 86 | ||||
| -rw-r--r-- | src/ipcpd/normal/graph.h | 5 | ||||
| -rw-r--r-- | src/ipcpd/normal/routing.c | 15 | 
3 files changed, 33 insertions, 73 deletions
| 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; | 
