diff options
author | Sander Vrijders <[email protected]> | 2017-03-13 16:09:45 +0100 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2017-03-13 16:09:45 +0100 |
commit | 25ddfa73bf24734765e892cfa1c4304b714fd9cc (patch) | |
tree | 6b7cdf38253b4b416f185a50470cc6ad8ffbfb74 /src/ipcpd/normal/fmgr.c | |
parent | 80dcc9aae225de1228347b91eb114b3e40022623 (diff) | |
download | ouroboros-25ddfa73bf24734765e892cfa1c4304b714fd9cc.tar.gz ouroboros-25ddfa73bf24734765e892cfa1c4304b714fd9cc.zip |
ipcpd: normal: Add Flow State Objects to RIB
This makes the routing component create a Flow State Database
(FSDB). An FSDB contains Flow State Objects (FSOs). An FSO is created
when a neighbor is added, it is deleted when a neighbor is removed and
its QoS is updated when a neighbor's QoS changes.
Diffstat (limited to 'src/ipcpd/normal/fmgr.c')
-rw-r--r-- | src/ipcpd/normal/fmgr.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/ipcpd/normal/fmgr.c b/src/ipcpd/normal/fmgr.c index 2593e8fd..184baf82 100644 --- a/src/ipcpd/normal/fmgr.c +++ b/src/ipcpd/normal/fmgr.c @@ -68,7 +68,7 @@ struct { pthread_t nm1_sdu_reader; struct pff * pff[QOS_CUBE_MAX]; - struct routing * routing[QOS_CUBE_MAX]; + struct routing_i * routing[QOS_CUBE_MAX]; struct gam * gam; struct nbs * nbs; @@ -238,7 +238,7 @@ static void fmgr_destroy_routing(void) int i; for (i = 0; i < QOS_CUBE_MAX; ++i) - routing_destroy(fmgr.routing[i]); + routing_i_destroy(fmgr.routing[i]); } static void fmgr_destroy_pff(void) @@ -316,9 +316,18 @@ int fmgr_init(void) return -1; } + if (routing_init(fmgr.nbs)) { + log_err("Failed to init routing."); + nbs_destroy(fmgr.nbs); + fmgr_destroy_flows(); + connmgr_ae_destroy(fmgr.ae); + return -1; + } + fmgr.nb_notifier.notify_call = fmgr_neighbor_event; if (nbs_reg_notifier(fmgr.nbs, &fmgr.nb_notifier)) { log_err("Failed to register notifier."); + routing_fini(); nbs_destroy(fmgr.nbs); fmgr_destroy_flows(); connmgr_ae_destroy(fmgr.ae); @@ -328,6 +337,7 @@ int fmgr_init(void) if (pthread_rwlock_init(&fmgr.np1_flows_lock, NULL)) { gam_destroy(fmgr.gam); nbs_unreg_notifier(fmgr.nbs, &fmgr.nb_notifier); + routing_fini(); nbs_destroy(fmgr.nbs); fmgr_destroy_flows(); connmgr_ae_destroy(fmgr.ae); @@ -341,19 +351,21 @@ int fmgr_init(void) pff_destroy(fmgr.pff[j]); pthread_rwlock_destroy(&fmgr.np1_flows_lock); nbs_unreg_notifier(fmgr.nbs, &fmgr.nb_notifier); + routing_fini(); nbs_destroy(fmgr.nbs); fmgr_destroy_flows(); connmgr_ae_destroy(fmgr.ae); return -1; } - fmgr.routing[i] = routing_create(fmgr.pff[i], fmgr.nbs); + fmgr.routing[i] = routing_i_create(fmgr.pff[i]); if (fmgr.routing[i] == NULL) { for (j = 0; j < i; ++j) - routing_destroy(fmgr.routing[j]); + routing_i_destroy(fmgr.routing[j]); fmgr_destroy_pff(); pthread_rwlock_destroy(&fmgr.np1_flows_lock); nbs_unreg_notifier(fmgr.nbs, &fmgr.nb_notifier); + routing_fini(); nbs_destroy(fmgr.nbs); fmgr_destroy_flows(); connmgr_ae_destroy(fmgr.ae); @@ -368,6 +380,7 @@ int fmgr_init(void) fmgr_destroy_pff(); pthread_rwlock_destroy(&fmgr.np1_flows_lock); nbs_unreg_notifier(fmgr.nbs, &fmgr.nb_notifier); + routing_fini(); nbs_destroy(fmgr.nbs); fmgr_destroy_flows(); connmgr_ae_destroy(fmgr.ae); @@ -396,6 +409,8 @@ void fmgr_fini() fmgr_destroy_pff(); + routing_fini(); + fmgr_destroy_flows(); connmgr_ae_destroy(fmgr.ae); |