From 45e0f7723bf46dfaa1ff299ffd0943368e970fd6 Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Fri, 13 May 2016 16:11:48 -0400 Subject: [PATCH 1/2] DISPATCH-335 - Added code to balance link routes over remote routers --- src/router_core/forwarder.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c index 836bc02d87..15ebe24373 100644 --- a/src/router_core/forwarder.c +++ b/src/router_core/forwarder.c @@ -559,20 +559,34 @@ bool qdr_forward_link_balanced_CT(qdr_core_t *core, // // Look for a next-hop we can use to forward the link-attach. // - int router_bit; qdr_node_t *next_node; - if (qd_bitmask_first_set(addr->rnodes, &router_bit)) { - qdr_node_t *rnode = core->routers_by_mask_bit[router_bit]; - if (rnode) { - if (rnode->next_hop) - next_node = rnode->next_hop; - else - next_node = rnode; + if (addr->cost_epoch != core->cost_epoch) { + addr->next_remote = -1; + addr->cost_epoch = core->cost_epoch; + } - if (next_node && next_node->peer_data_link) - conn = next_node->peer_data_link->conn; - } + if (addr->next_remote < 0) { + qd_bitmask_first_set(addr->rnodes, &addr->next_remote); + } + + qdr_node_t *rnode = core->routers_by_mask_bit[addr->next_remote]; + + if (rnode) { + // + // Advance the addr->next_remote so there will be link balance across containers + // + _qdbm_next(addr->rnodes, &addr->next_remote); + if (addr->next_remote == -1) + qd_bitmask_first_set(addr->rnodes, &addr->next_remote); + + if (rnode->next_hop) + next_node = rnode->next_hop; + else + next_node = rnode; + + if (next_node && next_node->peer_data_link) + conn = next_node->peer_data_link->conn; } } From a2c4d2cf58f32af45dc9300471440c9348176243 Mon Sep 17 00:00:00 2001 From: Ganesh Murthy Date: Mon, 16 May 2016 09:04:49 -0400 Subject: [PATCH 2/2] DISPATCH-335 - Added code to balance link routes over remote routers --- src/router_core/forwarder.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c index 15ebe24373..43c966fd46 100644 --- a/src/router_core/forwarder.c +++ b/src/router_core/forwarder.c @@ -570,23 +570,26 @@ bool qdr_forward_link_balanced_CT(qdr_core_t *core, qd_bitmask_first_set(addr->rnodes, &addr->next_remote); } - qdr_node_t *rnode = core->routers_by_mask_bit[addr->next_remote]; + if (addr->next_remote >= 0) { - if (rnode) { - // - // Advance the addr->next_remote so there will be link balance across containers - // - _qdbm_next(addr->rnodes, &addr->next_remote); - if (addr->next_remote == -1) - qd_bitmask_first_set(addr->rnodes, &addr->next_remote); + qdr_node_t *rnode = core->routers_by_mask_bit[addr->next_remote]; - if (rnode->next_hop) - next_node = rnode->next_hop; - else - next_node = rnode; + if (rnode) { + // + // Advance the addr->next_remote so there will be link balance across containers + // + _qdbm_next(addr->rnodes, &addr->next_remote); + if (addr->next_remote == -1) + qd_bitmask_first_set(addr->rnodes, &addr->next_remote); + + if (rnode->next_hop) + next_node = rnode->next_hop; + else + next_node = rnode; - if (next_node && next_node->peer_data_link) - conn = next_node->peer_data_link->conn; + if (next_node && next_node->peer_data_link) + conn = next_node->peer_data_link->conn; + } } }