diff options
| author | Sander Vrijders <sander.vrijders@ugent.be> | 2017-03-24 13:36:48 +0000 | 
|---|---|---|
| committer | dimitri staessens <dimitri.staessens@ugent.be> | 2017-03-24 13:36:48 +0000 | 
| commit | 25d262cb383039b1d97a5b41ec477d6a40957398 (patch) | |
| tree | 1967a00bfe73a11cafbee7a5e97173abd7699add /src | |
| parent | e7f439e31aa8cd972b567da8c0421faa1ca09e59 (diff) | |
| parent | 0ed6ef2567a8355013e2cd61a1a31df6be67ae01 (diff) | |
| download | ouroboros-25d262cb383039b1d97a5b41ec477d6a40957398.tar.gz ouroboros-25d262cb383039b1d97a5b41ec477d6a40957398.zip | |
Merged in sandervrijders/ouroboros/be-full-pff (pull request #421)
ipcpd: normal: Fill in forwarding table
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipcpd/normal/pff.c | 19 | ||||
| -rw-r--r-- | src/ipcpd/normal/pff.h | 6 | ||||
| -rw-r--r-- | src/ipcpd/normal/routing.c | 42 | ||||
| -rw-r--r-- | src/lib/hashtable.c | 18 | ||||
| -rw-r--r-- | src/lib/tests/hashtable_test.c | 10 | 
5 files changed, 75 insertions, 20 deletions
| diff --git a/src/ipcpd/normal/pff.c b/src/ipcpd/normal/pff.c index 8cab7936..77c2c551 100644 --- a/src/ipcpd/normal/pff.c +++ b/src/ipcpd/normal/pff.c @@ -68,6 +68,16 @@ void pff_destroy(struct pff * instance)          free(instance);  } +void pff_lock(struct pff * instance) +{ +        pthread_mutex_lock(&instance->lock); +} + +void pff_unlock(struct pff * instance) +{ +        pthread_mutex_unlock(&instance->lock); +} +  int pff_add(struct pff * instance, uint64_t addr, int fd)  {          int * val; @@ -132,6 +142,15 @@ int pff_remove(struct pff * instance, uint64_t addr)          return 0;  } +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)  {          int * j; diff --git a/src/ipcpd/normal/pff.h b/src/ipcpd/normal/pff.h index 667c341e..7d8ce469 100644 --- a/src/ipcpd/normal/pff.h +++ b/src/ipcpd/normal/pff.h @@ -34,6 +34,10 @@ struct pff * pff_create(void);  void         pff_destroy(struct pff * instance); +void         pff_lock(struct pff * instance); + +void         pff_unlock(struct pff * instance); +  int          pff_add(struct pff * instance,                       uint64_t     addr,                       int          fd); @@ -45,6 +49,8 @@ int          pff_update(struct pff * instance,  int          pff_remove(struct pff * instance,                          uint64_t     addr); +void         pff_flush(struct pff * instance); +  /* Returns fd towards next hop */  int          pff_nhop(struct pff * instance,                        uint64_t     addr); diff --git a/src/ipcpd/normal/routing.c b/src/ipcpd/normal/routing.c index f8705991..b750ca84 100644 --- a/src/ipcpd/normal/routing.c +++ b/src/ipcpd/normal/routing.c @@ -35,6 +35,7 @@  #include "ribconfig.h"  #include "ipcp.h"  #include "graph.h" +#include "neighbors.h"  #include <assert.h>  #include <stdlib.h> @@ -63,14 +64,32 @@ struct {          pthread_t          rib_listener;  } routing; +/* Take under neighbors lock */ +static int addr_to_fd(uint64_t addr) +{ +        struct list_head * p = NULL; + +        list_for_each(p, &routing.nbs->list) { +                struct nb * e = list_entry(p, struct nb, next); +                if (e->conn.conn_info.addr == addr) +                        return e->conn.flow_info.fd; +        } + +        return -1; +} +  static void * calculate_pff(void * o)  { +        struct routing_i *      instance;          struct routing_table ** table;          ssize_t                 n_table; +        int                     i; +        int                     fd; -        (void) o; +        instance = (struct routing_i *) o;          while (true) { +                table = NULL;                  n_table = graph_routing_table(routing.graph,                                                ipcpi.dt_addr, &table);                  if (table == NULL) { @@ -78,10 +97,21 @@ static void * calculate_pff(void * o)                          continue;                  } -                /* -                 * FIXME: Calculate address to fd here -                 * and fill in PFF -                 */ +                pthread_mutex_lock(&routing.nbs->list_lock); +                pff_lock(instance->pff); + +                pff_flush(instance->pff); + +                for (i = 0; i < n_table; i++) { +                        fd = addr_to_fd(table[i]->nhop); +                        if (fd == -1) +                                continue; + +                        pff_add(instance->pff, table[i]->dst, fd); +                } + +                pff_unlock(instance->pff); +                pthread_mutex_unlock(&routing.nbs->list_lock);                  freepp(struct routing_table, table, n_table);                  sleep(RECALC_TIME); @@ -102,7 +132,7 @@ struct routing_i * routing_i_create(struct pff * pff)          tmp->pff = pff; -        pthread_create(&tmp->calculator, NULL, calculate_pff, NULL); +        pthread_create(&tmp->calculator, NULL, calculate_pff, (void *) tmp);          return tmp;  } diff --git a/src/lib/hashtable.c b/src/lib/hashtable.c index 0a534da7..77b56075 100644 --- a/src/lib/hashtable.c +++ b/src/lib/hashtable.c @@ -76,7 +76,17 @@ struct htable * htable_create(uint64_t buckets, bool hash_key)          return tmp;  } -int htable_destroy(struct htable * table) +void htable_destroy(struct htable * table) +{ +        assert(table); +        assert(table->buckets); + +        htable_flush(table); +        free(table->buckets); +        free(table); +} + +void htable_flush(struct htable * table)  {          unsigned int          i;          struct list_head *    pos = NULL; @@ -88,15 +98,11 @@ int htable_destroy(struct htable * table)          for (i = 0; i < table->buckets_size; i++) {                  list_for_each_safe(pos, n, &(table->buckets[i])) {                          entry = list_entry(pos, struct htable_entry, next); +                        list_del(&entry->next);                          free(entry->val);                          free(entry);                  }          } - -        free(table->buckets); -        free(table); - -        return 0;  }  static uint64_t hash(uint64_t x) diff --git a/src/lib/tests/hashtable_test.c b/src/lib/tests/hashtable_test.c index a5b0e469..1160e34d 100644 --- a/src/lib/tests/hashtable_test.c +++ b/src/lib/tests/hashtable_test.c @@ -42,10 +42,7 @@ int hashtable_test(int argc, char ** argv)                  return -1;          } -        if (htable_destroy(table)) { -                printf("Failed to destroy.\n"); -                return -1; -        } +        htable_destroy(table);          table = htable_create(HASHTABLE_SIZE, false);          if (table == NULL) { @@ -124,10 +121,7 @@ int hashtable_test(int argc, char ** argv)                  return -1;          } -        if (htable_destroy(table)) { -                printf("Failed to destroy.\n"); -                return -1; -        } +        htable_destroy(table);          return 0;  } | 
