diff options
author | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-11-30 15:34:04 +0100 |
---|---|---|
committer | Sander Vrijders <sander.vrijders@intec.ugent.be> | 2016-11-30 15:34:04 +0100 |
commit | 8e0165c2ee9659ee57934947369659c093db621e (patch) | |
tree | 43d5bb68ac2c369f6e3122f33243bf013d3e3e5d /src/ipcpd/normal/main.c | |
parent | fb4cf92a8f2d2e074d302f4b94385e5e95d6a7d4 (diff) | |
download | ouroboros-8e0165c2ee9659ee57934947369659c093db621e.tar.gz ouroboros-8e0165c2ee9659ee57934947369659c093db621e.zip |
ipcpd: Split IPCP state PENDING_ENROL
This will split the IPCP state PENDING_ENROL into IPCP_CONFIG and
IPCP_BOOTING. IPCP_CONFIG is concerned only with configuring the IPCP
with the bare essence. When in IPCP_BOOTING, the IPCP will complete
its configuration by starting its policies, and thus making the IPCP
completely functioning.
Diffstat (limited to 'src/ipcpd/normal/main.c')
-rw-r--r-- | src/ipcpd/normal/main.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/ipcpd/normal/main.c b/src/ipcpd/normal/main.c index a5161718..810fbca5 100644 --- a/src/ipcpd/normal/main.c +++ b/src/ipcpd/normal/main.c @@ -100,8 +100,6 @@ static int normal_ipcp_name_query(char * name) { LOG_MISSING; - (void) name; - /* * NOTE: For the moment we just return -1, * for testing purposes we may return zero here @@ -135,18 +133,26 @@ static int normal_ipcp_enroll(char * dif_name) return -1; } - if (ipcp_wait_state(IPCP_ENROLLED, &timeout) == -ETIMEDOUT) { - LOG_ERR("Enrollment timed out."); + if (ribmgr_enrol()) { + LOG_ERR("Failed to enrol IPCP."); return -1; } - pthread_rwlock_rdlock(&ipcpi.state_lock); + if (ipcp_wait_state(IPCP_BOOTING, &timeout) == -ETIMEDOUT) { + LOG_ERR("Enrollment timed out."); + return -1; + } - if (ipcp_get_state() != IPCP_ENROLLED) { + if (ribmgr_start_policies()) { + pthread_rwlock_wrlock(&ipcpi.state_lock); + ipcp_set_state(IPCP_INIT); pthread_rwlock_unlock(&ipcpi.state_lock); + LOG_ERR("Failed to start policies."); return -1; } + pthread_rwlock_wrlock(&ipcpi.state_lock); + ipcp_set_state(IPCP_RUNNING); pthread_rwlock_unlock(&ipcpi.state_lock); /* FIXME: Remove once we obtain neighbors during enrollment */ @@ -174,8 +180,20 @@ static int normal_ipcp_bootstrap(struct dif_config * conf) return -1; } - ipcp_set_state(IPCP_ENROLLED); + ipcp_set_state(IPCP_BOOTING); + pthread_rwlock_unlock(&ipcpi.state_lock); + + if (ribmgr_start_policies()) { + pthread_rwlock_wrlock(&ipcpi.state_lock); + ipcp_set_state(IPCP_INIT); + pthread_rwlock_unlock(&ipcpi.state_lock); + LOG_ERR("Failed to start policies."); + return -1; + } + + pthread_rwlock_wrlock(&ipcpi.state_lock); + ipcp_set_state(IPCP_RUNNING); ipcpi.data->dif_name = conf->dif_name; pthread_rwlock_unlock(&ipcpi.state_lock); |