DISPATCH-179 - Added proper lookup for treatment of addresses advertised by other routers.
Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/6dfb3dc1 Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/6dfb3dc1 Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/6dfb3dc1 Branch: refs/heads/tross-DISPATCH-179-1 Commit: 6dfb3dc18913668915eedcf50aeade3ceeb1ec75 Parents: 17ebf68 Author: Ted Ross <[email protected]> Authored: Thu Mar 17 14:28:28 2016 -0400 Committer: Ted Ross <[email protected]> Committed: Thu Mar 17 14:28:28 2016 -0400 ---------------------------------------------------------------------- src/router_core/connections.c | 44 ++++++++++++++++++++++++++++++ src/router_core/route_tables.c | 2 +- src/router_core/router_core_private.h | 1 + 3 files changed, 46 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6dfb3dc1/src/router_core/connections.c ---------------------------------------------------------------------- diff --git a/src/router_core/connections.c b/src/router_core/connections.c index 4f38dcb..d014bf3 100644 --- a/src/router_core/connections.c +++ b/src/router_core/connections.c @@ -548,6 +548,50 @@ qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_i } +qd_address_treatment_t qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_field_iterator_t *iter) +{ +#define HASH_STORAGE_SIZE 1000 + char storage[HASH_STORAGE_SIZE + 1]; + char *copy = storage; + bool on_heap = false; + int length = qd_field_iterator_length(iter); + qd_address_treatment_t trt = QD_TREATMENT_ANYCAST_CLOSEST; + + if (length > HASH_STORAGE_SIZE) { + copy = (char*) malloc(length + 1); + on_heap = true; + } + + qd_field_iterator_strncpy(iter, copy, length + 1); + + if (copy[0] == 'C' || copy[0] == 'D') + // + // Handle the link-route address case + // TODO - put link-routes into the config table with a different prefix from 'Z' + // + trt = QD_TREATMENT_LINK_BALANCED; + + else if (copy[0] == 'M') { + // + // Handle the mobile address case + // + copy[1] = 'Z'; + qd_field_iterator_t *config_iter = qd_field_iterator_string(©[1]); + qdr_address_config_t *addr = 0; + + qd_hash_retrieve_prefix(core->addr_hash, config_iter, (void**) &addr); + if (addr) + trt = addr->treatment; + qd_field_iterator_free(config_iter); + } + + if (on_heap) + free(copy); + + return trt; +} + + /** * Check an address to see if it no longer has any associated destinations. * Depending on its policy, the address may be eligible for being closed out http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6dfb3dc1/src/router_core/route_tables.c ---------------------------------------------------------------------- diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c index 0529a84..7f715a5 100644 --- a/src/router_core/route_tables.c +++ b/src/router_core/route_tables.c @@ -501,7 +501,7 @@ static void qdr_map_destination_CT(qdr_core_t *core, qdr_action_t *action, bool qd_hash_retrieve(core->addr_hash, iter, (void**) &addr); if (!addr) { - addr = qdr_address_CT(core, 0); // FIXME - Treatment + addr = qdr_address_CT(core, qdr_treatment_for_address_hash_CT(core, iter)); qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle); DEQ_ITEM_INIT(addr); DEQ_INSERT_TAIL(core->addrs, addr); http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/6dfb3dc1/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 1e5eb44..dadebc9 100644 --- a/src/router_core/router_core_private.h +++ b/src/router_core/router_core_private.h @@ -563,6 +563,7 @@ qdr_delivery_t *qdr_forward_new_delivery_CT(qdr_core_t *core, qdr_delivery_t *pe void qdr_forward_deliver_CT(qdr_core_t *core, qdr_link_t *link, qdr_delivery_t *dlv); void qdr_connection_activate_CT(qdr_core_t *core, qdr_connection_t *conn); qd_address_treatment_t qdr_treatment_for_address_CT(qdr_core_t *core, qd_field_iterator_t *iter, int *in_phase, int *out_phase); +qd_address_treatment_t qdr_treatment_for_address_hash_CT(qdr_core_t *core, qd_field_iterator_t *iter); void qdr_connection_enqueue_work_CT(qdr_core_t *core, qdr_connection_t *conn, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
