diff options
author | dimitri staessens <[email protected]> | 2017-08-25 17:19:17 +0200 |
---|---|---|
committer | dimitri staessens <[email protected]> | 2017-08-28 15:24:16 +0200 |
commit | 176698e8c2fd7ab8007b8074515d6144e7177d8e (patch) | |
tree | 6fa097b57aaafe3143b1f17e528479aa0624a005 /src/ipcpd/normal/dir.c | |
parent | a4bff697871c8cc7252d029d77b180e41e821f7e (diff) | |
download | ouroboros-176698e8c2fd7ab8007b8074515d6144e7177d8e.tar.gz ouroboros-176698e8c2fd7ab8007b8074515d6144e7177d8e.zip |
ipcpd: Deprecate gam as autonomous component
The graph adjacency manager has been deprecated in favor of providing
an external interface into the connectivity manager so that
adjacencies can be controlled from the command line, user scripts or
user applications.
The gam and its associated policies were removed from the normal IPCP
and the IRM configuration tools. The "/members" part of the RIB was
deprecated. Removal of the gam means that initial connectivity based
on changes in the RIB can't be provided, so some changes were
required throughout the normal IPCP.
The enrollment procedure was revised to establish its own
connectivity. First, it gets boot information from a peer by
establishing a connection to the remote enrollment component and
downloading the IPCP configuratoin. This is now done using its own
protocol buffers message in anticipation of deprecation of the RIB and
CDAP for communication within a DIF.
After the boot information is downloaded, it establishes a data
transfer flow for enrolling the directory (DHT). After the DHT has
enrolled, it signals the peer to that enrollment is done, and the data
transfer connection is torn down.
Signaling connections is done via the nbs struct, which is now passed
to the connmgr, which enables control of the connectivity graph from
external sources.
Diffstat (limited to 'src/ipcpd/normal/dir.c')
-rw-r--r-- | src/ipcpd/normal/dir.c | 92 |
1 files changed, 22 insertions, 70 deletions
diff --git a/src/ipcpd/normal/dir.c b/src/ipcpd/normal/dir.c index feae7013..2e2c113a 100644 --- a/src/ipcpd/normal/dir.c +++ b/src/ipcpd/normal/dir.c @@ -46,80 +46,21 @@ struct dht * dht; -static uint64_t find_peer_addr(void) +int dir_init(void) { - ssize_t i; - char ** members; - ssize_t n_members; - size_t reset; - char path[RIB_MAX_PATH_LEN + 1]; - - strcpy(path, MEMBERS_PATH); - - reset = strlen(path); - - n_members = rib_children(path, &members); - if (n_members == 1) { - freepp(ssize_t, members, n_members); - return 0; - } - - for (i = 0; i < n_members; ++i) { - uint64_t addr; - rib_path_append(path, members[i]); - if (rib_read(path, &addr, sizeof(addr)) != sizeof(addr)) { - log_err("Failed to read address from RIB."); - freepp(ssize_t, members, n_members); - return ipcpi.dt_addr; - } - - if (addr != ipcpi.dt_addr) { - freepp(ssize_t, members, n_members); - return addr; - } - - path[reset] = '\0'; - } - - freepp(ssize_t, members, n_members); - - return 0; -} - -int dir_init() -{ - uint64_t addr; - dht = dht_create(ipcpi.dt_addr); if (dht == NULL) return -ENOMEM; - addr = find_peer_addr(); - if (addr == ipcpi.dt_addr) { - log_err("Failed to get peer address."); - dht_destroy(dht); - return -EPERM; - } - - if (addr != 0) { - size_t retr = 0; - log_dbg("Enrolling directory with peer %" PRIu64 ".", addr); - /* NOTE: we could try other members if dht_enroll times out. */ - while (dht_enroll(dht, addr)) { - if (retr++ == ENROL_RETR) { - dht_destroy(dht); - return -EPERM; - } - - log_dbg("Directory enrollment failed, retrying..."); - sleep(ENROL_INTV); - } - - log_dbg("Directory enrolled."); + return 0; +} - return 0; - } +void dir_fini(void) +{ + dht_destroy(dht); +} +int dir_bootstrap(void) { log_dbg("Bootstrapping directory."); /* TODO: get parameters for bootstrap from IRM tool. */ @@ -133,9 +74,20 @@ int dir_init() return 0; } -void dir_fini(void) -{ - dht_destroy(dht); +int dir_enroll(uint64_t addr) { + size_t retr = 0; + log_dbg("Enrolling directory with peer %" PRIu64 ".", addr); + while (dht_enroll(dht, addr)) { + if (retr++ == ENROL_RETR) + return -EPERM; + + log_dbg("Directory enrollment failed, retrying..."); + sleep(ENROL_INTV); + } + + log_dbg("Directory enrolled."); + + return 0; } int dir_reg(const uint8_t * hash) |