You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by tr...@apache.org on 2016/04/22 23:55:25 UTC
[4/7] qpid-dispatch git commit: DISPATCH-10 Communicate the router
node costs to the router core.
DISPATCH-10 Communicate the router node costs to the router core.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/2cb107b9
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/2cb107b9
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/2cb107b9
Branch: refs/heads/master
Commit: 2cb107b93002a1e0d24309f915d45cf41ca2ee0a
Parents: faf0eef
Author: Ted Ross <tr...@redhat.com>
Authored: Thu Apr 21 13:42:38 2016 -0400
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Apr 22 17:50:56 2016 -0400
----------------------------------------------------------------------
include/qpid/dispatch/router_core.h | 1 +
python/qpid_dispatch_internal/router/node.py | 15 ++++++++++--
src/router_core/route_tables.c | 30 +++++++++++++++++++++++
src/router_core/router_core_private.h | 2 ++
src/router_pynode.c | 18 ++++++++++++++
5 files changed, 64 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 81dd2f9..951bb21 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -69,6 +69,7 @@ void qdr_core_set_link(qdr_core_t *core, int router_maskbit, int link_maskbit);
void qdr_core_remove_link(qdr_core_t *core, int router_maskbit);
void qdr_core_set_next_hop(qdr_core_t *core, int router_maskbit, int nh_router_maskbit);
void qdr_core_remove_next_hop(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_cost(qdr_core_t *core, int router_maskbit, int cost);
void qdr_core_set_valid_origins(qdr_core_t *core, int router_maskbit, qd_bitmask_t *routers);
void qdr_core_map_destination(qdr_core_t *core, int router_maskbit, const char *address_hash);
void qdr_core_unmap_destination(qdr_core_t *core, int router_maskbit, const char *address_hash);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/python/qpid_dispatch_internal/router/node.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/router/node.py b/python/qpid_dispatch_internal/router/node.py
index 2dfcbcf..5c53adf 100644
--- a/python/qpid_dispatch_internal/router/node.py
+++ b/python/qpid_dispatch_internal/router/node.py
@@ -146,9 +146,9 @@ class NodeTracker(object):
collection = {self.my_id : self.link_state}
for node_id, node in self.nodes.items():
collection[node_id] = node.link_state
- next_hops, cost, valid_origins = self.container.path_engine.calculate_routes(collection)
+ next_hops, costs, valid_origins = self.container.path_engine.calculate_routes(collection)
self.container.log_ls(LOG_TRACE, "Computed next hops: %r" % next_hops)
- self.container.log_ls(LOG_TRACE, "Computed costs: %r" % cost)
+ self.container.log_ls(LOG_TRACE, "Computed costs: %r" % costs)
self.container.log_ls(LOG_TRACE, "Computed valid origins: %r" % valid_origins)
##
@@ -158,8 +158,10 @@ class NodeTracker(object):
node = self.nodes[node_id]
next_hop = self.nodes[next_hop_id]
vo = valid_origins[node_id]
+ cost = costs[node_id]
node.set_next_hop(next_hop)
node.set_valid_origins(vo)
+ node.set_cost(cost)
##
## Send link-state requests and mobile-address requests to the nodes
@@ -367,6 +369,7 @@ class RouterNode(object):
self.peer_link_id = None
self.link_state = LinkState(None, self.id, 0, {})
self.next_hop_router = None
+ self.cost = None
self.valid_origins = None
self.mobile_addresses = []
self.mobile_address_sequence = 0
@@ -443,6 +446,14 @@ class RouterNode(object):
self.log(LOG_TRACE, "Node %s valid origins: %r" % (self.id, valid_origins))
+ def set_cost(self, cost):
+ if self.cost == cost:
+ return
+ self.cost = cost
+ self.adapter.set_cost(self.maskbit, cost)
+ self.log(LOG_TRACE, "Node %s cost: %d" % (self.id, cost))
+
+
def remove_next_hop(self):
if self.next_hop_router:
self.next_hop_router = None
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index 0e27408..02c2c65 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -26,6 +26,7 @@ static void qdr_set_link_CT (qdr_core_t *core, qdr_action_t *action, bo
static void qdr_remove_link_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_set_next_hop_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_remove_next_hop_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
+static void qdr_set_cost_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_set_valid_origins_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_map_destination_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_unmap_destination_CT (qdr_core_t *core, qdr_action_t *action, bool discard);
@@ -88,6 +89,15 @@ void qdr_core_remove_next_hop(qdr_core_t *core, int router_maskbit)
}
+void qdr_core_set_cost(qdr_core_t *core, int router_maskbit, int cost)
+{
+ qdr_action_t *action = qdr_action(qdr_set_cost_CT, "set_cost");
+ action->args.route_table.router_maskbit = router_maskbit;
+ action->args.route_table.cost = cost;
+ qdr_action_enqueue(core, action);
+}
+
+
void qdr_core_set_valid_origins(qdr_core_t *core, int router_maskbit, qd_bitmask_t *routers)
{
qdr_action_t *action = qdr_action(qdr_set_valid_origins_CT, "set_valid_origins");
@@ -438,6 +448,26 @@ static void qdr_remove_next_hop_CT(qdr_core_t *core, qdr_action_t *action, bool
}
+static void qdr_set_cost_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
+{
+ int router_maskbit = action->args.route_table.router_maskbit;
+ int cost = action->args.route_table.cost;
+
+ if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) {
+ qd_log(core->log, QD_LOG_CRITICAL, "set_cost: Router maskbit out of range: %d", router_maskbit);
+ return;
+ }
+
+ if (cost < 1) {
+ qd_log(core->log, QD_LOG_CRITICAL, "set_cost: Invalid cost %d for maskbit: %d", cost, router_maskbit);
+ return;
+ }
+
+ qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit];
+ rnode->cost = cost;
+}
+
+
static void qdr_set_valid_origins_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
int router_maskbit = action->args.route_table.router_maskbit;
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/src/router_core/router_core_private.h
----------------------------------------------------------------------
diff --git a/src/router_core/router_core_private.h b/src/router_core/router_core_private.h
index 8abfba8..49f7257 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -81,6 +81,7 @@ struct qdr_action_t {
int link_maskbit;
int router_maskbit;
int nh_router_maskbit;
+ int cost;
qd_bitmask_t *router_set;
qdr_field_t *address;
} route_table;
@@ -174,6 +175,7 @@ struct qdr_node_t {
qdr_link_t *peer_data_link; ///< Outgoing data link _if_ this is a neighbor node
uint32_t ref_count;
qd_bitmask_t *valid_origins;
+ int cost;
};
ALLOC_DECLARE(qdr_node_t);
http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/2cb107b9/src/router_pynode.c
----------------------------------------------------------------------
diff --git a/src/router_pynode.c b/src/router_pynode.c
index 6b0cda8..3984f74 100644
--- a/src/router_pynode.c
+++ b/src/router_pynode.c
@@ -143,6 +143,23 @@ static PyObject* qd_remove_next_hop(PyObject *self, PyObject *args)
}
+static PyObject* qd_set_cost(PyObject *self, PyObject *args)
+{
+ RouterAdapter *adapter = (RouterAdapter*) self;
+ qd_router_t *router = adapter->router;
+ int router_maskbit;
+ int cost;
+
+ if (!PyArg_ParseTuple(args, "ii", &router_maskbit, &cost))
+ return 0;
+
+ qdr_core_set_cost(router->router_core, router_maskbit, cost);
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+
static PyObject* qd_set_valid_origins(PyObject *self, PyObject *args)
{
RouterAdapter *adapter = (RouterAdapter*) self;
@@ -262,6 +279,7 @@ static PyMethodDef RouterAdapter_methods[] = {
{"remove_link", qd_remove_link, METH_VARARGS, "Remove the link for a neighbor router"},
{"set_next_hop", qd_set_next_hop, METH_VARARGS, "Set the next hop for a remote router"},
{"remove_next_hop", qd_remove_next_hop, METH_VARARGS, "Remove the next hop for a remote router"},
+ {"set_cost", qd_set_cost, METH_VARARGS, "Set the cost to reach a remote router"},
{"set_valid_origins", qd_set_valid_origins, METH_VARARGS, "Set the valid origins for a remote router"},
{"map_destination", qd_map_destination, METH_VARARGS, "Add a newly discovered destination mapping"},
{"unmap_destination", qd_unmap_destination, METH_VARARGS, "Delete a destination mapping"},
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org