diff options
Diffstat (limited to 'src/ipcpd')
| -rw-r--r-- | src/ipcpd/normal/neighbors.c | 22 | ||||
| -rw-r--r-- | src/ipcpd/normal/neighbors.h | 3 | ||||
| -rw-r--r-- | src/ipcpd/normal/pol/complete.c | 71 | ||||
| -rw-r--r-- | src/ipcpd/normal/ribmgr.c | 3 | 
4 files changed, 78 insertions, 21 deletions
| diff --git a/src/ipcpd/normal/neighbors.c b/src/ipcpd/normal/neighbors.c index f52a2319..0dbc22f2 100644 --- a/src/ipcpd/normal/neighbors.c +++ b/src/ipcpd/normal/neighbors.c @@ -177,6 +177,28 @@ int nbs_del(struct nbs * nbs,          return -1;  } +bool nbs_has(struct nbs * nbs, +             uint64_t     addr) +{ +        struct list_head * p = NULL; + +        assert(nbs); + +        pthread_mutex_lock(&nbs->list_lock); + +        list_for_each(p, &nbs->list) { +                struct nb * e = list_entry(p, struct nb, next); +                if (e->conn.conn_info.addr == addr) { +                        pthread_mutex_unlock(&nbs->list_lock); +                        return true; +                } +        } + +        pthread_mutex_unlock(&nbs->list_lock); + +        return false; +} +  int nbs_reg_notifier(struct nbs *         nbs,                       struct nb_notifier * notify)  { diff --git a/src/ipcpd/normal/neighbors.h b/src/ipcpd/normal/neighbors.h index c958affc..b9fa1405 100644 --- a/src/ipcpd/normal/neighbors.h +++ b/src/ipcpd/normal/neighbors.h @@ -72,6 +72,9 @@ int          nbs_update_qos(struct nbs * nbs,  int          nbs_del(struct nbs * nbs,                       int          fd); +bool         nbs_has(struct nbs * nbs, +                     uint64_t     addr); +  int          nbs_reg_notifier(struct nbs *         nbs,                                struct nb_notifier * notify); diff --git a/src/ipcpd/normal/pol/complete.c b/src/ipcpd/normal/pol/complete.c index 6c0be9ec..20a2dafb 100644 --- a/src/ipcpd/normal/pol/complete.c +++ b/src/ipcpd/normal/pol/complete.c @@ -40,6 +40,8 @@  #include <stdlib.h>  #include <assert.h> +#define COMPLETE_REFRESH 1000 /* ms */ +  struct complete {          struct nbs * nbs;          struct ae *  ae; @@ -69,6 +71,11 @@ static void * listener(void * o)          return (void *) 0;  } +static void path_reset(char * path) +{ +        path[strlen(MEMBERS_PATH)] = '\0'; +} +  static void * allocator(void * o)  {          qosspec_t         qs; @@ -77,6 +84,12 @@ static void * allocator(void * o)          ssize_t           i;          struct complete * complete;          struct conn       conn; +        uint64_t          addr; +        char              path[RIB_MAX_PATH_LEN]; +        struct timespec   to = {(COMPLETE_REFRESH / 1000), +                                (COMPLETE_REFRESH % 1000) * 1000000}; + +        strcpy(path, MEMBERS_PATH);          complete = (struct complete *) o; @@ -86,31 +99,47 @@ static void * allocator(void * o)          /* FIXME: implement QoS specs */          qs.cube = QOS_CUBE_BE; -        /* FIXME: subscribe to members to keep the graph complete. */ -        len = rib_children("/" MEMBERS_NAME, &children); -        for (i = 0; i < len; ++i) { -                if (strcmp(children[i], ipcpi.name) != 0) { -                        if (connmgr_alloc(complete->ae, -                                          children[i], -                                          &qs, -                                          &conn)) { -                                log_warn("Failed to get a conn to neighbor."); -                                free(children[i]); -                                continue; -                        } - -                        if (nbs_add(complete->nbs, conn)) { -                                log_err("Failed to add neighbor."); -                                free(children[i]); -                                continue; +        while (true) { +                len = rib_children(MEMBERS_PATH, &children); +                for (i = 0; i < len; ++i) { +                        if (strcmp(children[i], ipcpi.name) != 0) { +                                path_reset(path); +                                rib_path_append(path, children[i]); +                                if (rib_read(path, &addr, +                                             sizeof(addr)) != +                                    sizeof(addr)) { +                                        log_err("Failed to read address."); +                                        free(children[i]); +                                        continue; +                                } + +                                if (nbs_has(complete->nbs, addr)) { +                                        free(children[i]); +                                        continue; +                                } + +                                if (connmgr_alloc(complete->ae, children[i], +                                                  &qs, &conn)) { +                                        log_warn("Failed conn to neighbor."); +                                        free(children[i]); +                                        continue; +                                } + +                                if (nbs_add(complete->nbs, conn)) { +                                        log_err("Failed to add neighbor."); +                                        free(children[i]); +                                        continue; +                                }                          } +                        free(children[i]);                  } -                free(children[i]); -        } -        if (len > 0) -                free(children); +                if (len > 0) +                        free(children); + +                nanosleep(&to, NULL); +        }          return (void *) 0;  } diff --git a/src/ipcpd/normal/ribmgr.c b/src/ipcpd/normal/ribmgr.c index 772269ae..266a628d 100644 --- a/src/ipcpd/normal/ribmgr.c +++ b/src/ipcpd/normal/ribmgr.c @@ -37,6 +37,7 @@  #include "gam.h"  #include "ribconfig.h"  #include "ribmgr.h" +#include "ipcp.h"  #include <stdlib.h>  #include <pthread.h> @@ -322,6 +323,8 @@ int ribmgr_init(void)          strcpy(info.protocol, CDAP_PROTO);          info.pref_version = 1;          info.pref_syntax = PROTO_GPB; +        /* NOTE: Use the same name as the DT AE of this IPCP */ +        info.addr = ipcpi.dt_addr;          ribmgr.nbs = nbs_create();          if (ribmgr.nbs == NULL) { | 
