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/03/02 18:20:39 UTC

[1/4] qpid-dispatch git commit: DISPATCH-179 - Renamed "provisioned" entity to "route".

Repository: qpid-dispatch
Updated Branches:
  refs/heads/tross-DISPATCH-179-1 27cc4020f -> dc675a38f


DISPATCH-179 - Renamed "provisioned" entity to "route".


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/43e3a49e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/43e3a49e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/43e3a49e

Branch: refs/heads/tross-DISPATCH-179-1
Commit: 43e3a49e1ea2aeeac99c0ec99e34a6dfe9717728
Parents: 27cc402
Author: Ted Ross <tr...@redhat.com>
Authored: Fri Feb 26 16:33:24 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Fri Feb 26 16:33:24 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h   |   2 +-
 src/CMakeLists.txt                    |   2 +-
 src/router_config.c                   |  63 +++---
 src/router_core/DESIGN                |   2 +-
 src/router_core/agent.c               |  18 +-
 src/router_core/agent_provisioned.c   | 344 -----------------------------
 src/router_core/agent_provisioned.h   |  35 ---
 src/router_core/agent_route.c         | 344 +++++++++++++++++++++++++++++
 src/router_core/agent_route.h         |  35 +++
 src/router_core/management_agent.c    |   6 +-
 src/router_core/router_core.c         |   2 +-
 src/router_core/router_core_private.h |  22 +-
 12 files changed, 439 insertions(+), 436 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 89b5e6f..602e67c 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -542,7 +542,7 @@ qd_message_t *qdr_delivery_message(const qdr_delivery_t *delivery);
  ******************************************************************************
  */
 typedef enum {
-    QD_ROUTER_PROVISIONED,
+    QD_ROUTER_ROUTE,
     QD_ROUTER_CONNECTION,
     QD_ROUTER_LINK,
     QD_ROUTER_ADDRESS,

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index c85b08b..f74babe 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -68,7 +68,7 @@ set(qpid_dispatch_SOURCES
   router_core/agent_address.c
   router_core/agent_waypoint.c
   router_core/agent_link.c
-  router_core/agent_provisioned.c
+  router_core/agent_route.c
   router_core/connections.c
   router_core/error.c
   router_core/forwarder.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 9064c2e..40453fd 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -30,50 +30,48 @@
 qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
 {
     qd_error_clear();
-    int   phase  = qd_entity_opt_long(entity, "phase", 0); QD_ERROR_RET();
-    qd_schema_fixedAddress_fanout_t fanout = qd_entity_get_long(entity, "fanout"); QD_ERROR_RET();
-    qd_schema_fixedAddress_bias_t bias   = qd_entity_get_long(entity, "bias"); QD_ERROR_RET();
-    char *prefix = qd_entity_get_string(entity, "prefix"); QD_ERROR_RET();
-
-    if (phase < 0 || phase > 9) {
-        qd_error_t err = qd_error(QD_ERROR_CONFIG,
-                                  "Invalid phase %d for prefix '%s' must be between 0 and 9.  Ignoring", phase, prefix);
+    int                             phase  = qd_entity_opt_long(entity, "phase", -1); QD_ERROR_RET();
+    qd_schema_fixedAddress_fanout_t fanout = qd_entity_get_long(entity, "fanout");    QD_ERROR_RET();
+    qd_schema_fixedAddress_bias_t   bias   = qd_entity_get_long(entity, "bias");      QD_ERROR_RET();
+    char                           *prefix = qd_entity_get_string(entity, "prefix");  QD_ERROR_RET();
+
+    if (phase != -1) {
+        qd_log(router->log_source, QD_LOG_WARNING,
+               "Address phases deprecated: Ignoring address configuration for '%s', phase %d", prefix, phase);
         free(prefix);
-        return err;
+        return qd_error_code();
     }
 
     if (prefix[0] == '/' && prefix[1] == '\0') {
         qd_log(router->log_source, QD_LOG_WARNING, "Ignoring address configuration for '/'");
+        free(prefix);
         return qd_error_code();
     }
 
     //
     // Convert fanout + bias to semantics
     //
-    const char *sem;
+    const char *trt;
 
     if (fanout == QD_SCHEMA_FIXEDADDRESS_FANOUT_MULTIPLE)
-        sem = "multi";
+        trt = "multicast";
     else {
         if (bias == QD_SCHEMA_FIXEDADDRESS_BIAS_CLOSEST)
-            sem = "anyClosest";
+            trt = "closest";
         else
-            sem = "anyBalanced";
+            trt = "balanced";
     }
 
     //
-    // Formulate this configuration as a router.provisioned and create it through the core management API.
+    // Formulate this configuration as a router.route and create it through the core management API.
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
-    qd_compose_insert_string(body, "objectType");
-    qd_compose_insert_string(body, "address");
-
     qd_compose_insert_string(body, "address");
     qd_compose_insert_string(body, prefix);
 
-    qd_compose_insert_string(body, "semantics");
-    qd_compose_insert_string(body, sem);
+    qd_compose_insert_string(body, "treatment");
+    qd_compose_insert_string(body, trt);
     qd_compose_end_map(body);
 
     int              length = 0;
@@ -91,7 +89,7 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_PROVISIONED, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
 
     free(prefix);
     return qd_error_code();
@@ -132,23 +130,28 @@ qd_error_t qd_router_configure_waypoint(qd_router_t *router, qd_entity_t *entity
 
 qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
 {
-    char *prefix    = qd_entity_get_string(entity, "prefix"); QD_ERROR_RET();
+    char *prefix    = qd_entity_get_string(entity, "prefix");    QD_ERROR_RET();
     char *connector = qd_entity_get_string(entity, "connector"); QD_ERROR_RET();
-    char *direction = qd_entity_get_string(entity, "dir"); QD_ERROR_RET();
+    char *direction = qd_entity_get_string(entity, "dir");       QD_ERROR_RET();
 
     //
-    // Formulate this configuration as a router.provisioned and create it through the core management API.
+    // Formulate this configuration as a router.route and create it through the core management API.
     //
     qd_composed_field_t *body = qd_compose_subfield(0);
     qd_compose_start_map(body);
-    qd_compose_insert_string(body, "objectType");
-    qd_compose_insert_string(body, "linkDestination");
-
     qd_compose_insert_string(body, "address");
     qd_compose_insert_string(body, prefix);
 
-    qd_compose_insert_string(body, "direction");
-    qd_compose_insert_string(body, direction);
+    qd_compose_insert_string(body, "path");
+    if      (strcmp("in", direction) == 0)
+        qd_compose_insert_string(body, "sink");
+    else if (strcmp("out", direction) == 0)
+        qd_compose_insert_string(body, "source");
+    else
+        qd_compose_insert_string(body, "waypoint");
+
+    qd_compose_insert_string(body, "treatment");
+    qd_compose_insert_string(body, "linkBalanced");
     qd_compose_end_map(body);
 
     int              length = 0;
@@ -163,10 +166,10 @@ qd_error_t qd_router_configure_lrp(qd_router_t *router, qd_entity_t *entity)
         buf = DEQ_NEXT(buf);
     }
 
-    qd_field_iterator_t *iter = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
+    qd_field_iterator_t *iter    = qd_field_iterator_buffer(DEQ_HEAD(buffers), 0, length);
     qd_parsed_field_t   *in_body = qd_parse(iter);
 
-    qdr_manage_create(router->router_core, 0, QD_ROUTER_PROVISIONED, 0, in_body, 0);
+    qdr_manage_create(router->router_core, 0, QD_ROUTER_ROUTE, 0, in_body, 0);
 
     free(prefix);
     free(connector);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/DESIGN
----------------------------------------------------------------------
diff --git a/src/router_core/DESIGN b/src/router_core/DESIGN
index c320976..5197a2f 100644
--- a/src/router_core/DESIGN
+++ b/src/router_core/DESIGN
@@ -253,7 +253,7 @@ org
           address
           link
           node
-          provisioned     (proposed)
+          route           (proposed)
           waypoint        (proposed)
         waypoint          (deprecated)
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index b5b9fc6..b0c5381 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -18,7 +18,7 @@
  */
 
 #include <qpid/dispatch/amqp.h>
-#include "agent_provisioned.h"
+#include "agent_route.h"
 #include "agent_address.h"
 #include "agent_waypoint.h"
 #include "agent_link.h"
@@ -173,8 +173,8 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
     qdr_query_t* query = qdr_query(core, context, type, attribute_names, body);
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED:
-        qdr_agent_set_columns(query, attribute_names, qdr_provisioned_columns, QDR_PROVISIONED_COLUMN_COUNT);
+    case QD_ROUTER_ROUTE:
+        qdr_agent_set_columns(query, attribute_names, qdr_route_columns, QDR_ROUTE_COLUMN_COUNT);
         break;
 
     case QD_ROUTER_CONNECTION:
@@ -205,7 +205,7 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
 void qdr_query_add_attribute_names(qdr_query_t *query)
 {
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: qdr_agent_emit_columns(query, qdr_provisioned_columns, QDR_PROVISIONED_COLUMN_COUNT); break;
+    case QD_ROUTER_ROUTE: qdr_agent_emit_columns(query, qdr_route_columns, QDR_ROUTE_COLUMN_COUNT); break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_ADDRESS:     qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
@@ -318,7 +318,7 @@ static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool disc
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: break;
+    case QD_ROUTER_ROUTE:       break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_get_CT(core, name, identity, query, qdr_address_columns); break;
@@ -336,7 +336,7 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qd_parsed_field_t       *in_body    = action->args.agent.in_body;
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: qdra_provisioned_create_CT(core, name, query, in_body); break;
+    case QD_ROUTER_ROUTE:       qdra_route_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     break;
@@ -354,7 +354,7 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     qdr_query_t             *query      = action->args.agent.query;
 
     switch (query->entity_type) {
-    case QD_ROUTER_PROVISIONED: break;
+    case QD_ROUTER_ROUTE:       break;
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_delete_CT(core, name, identity, query); break;
@@ -374,7 +374,7 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
 
     if (!discard) {
         switch (query->entity_type) {
-        case QD_ROUTER_PROVISIONED: qdra_provisioned_get_first_CT(core, query, offset); break;
+        case QD_ROUTER_ROUTE:       qdra_route_get_first_CT(core, query, offset); break;
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_first_CT(core, query, offset); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_first_CT(core, query, offset); break;
@@ -392,7 +392,7 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
 
     if (!discard) {
         switch (query->entity_type) {
-        case QD_ROUTER_PROVISIONED: qdra_provisioned_get_next_CT(core, query); break;
+        case QD_ROUTER_ROUTE:       qdra_route_get_next_CT(core, query); break;
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_next_CT(core, query); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_next_CT(core, query); break;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_provisioned.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_provisioned.c b/src/router_core/agent_provisioned.c
deleted file mode 100644
index 5b58c7f..0000000
--- a/src/router_core/agent_provisioned.c
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "agent_link.h"
-#include <stdio.h>
-
-#define QDR_PROV_NAME               0
-#define QDR_PROV_IDENTITY           1
-#define QDR_PROV_TYPE               2
-#define QDR_PROV_OBJECT_TYPE        3
-#define QDR_PROV_ADDRESS            4
-#define QDR_PROV_CONNECTOR          5
-#define QDR_PROV_DIRECTION          6
-#define QDR_PROV_SEMANTICS          7
-#define QDR_PROV_INGRESS_ADDRESS    8
-#define QDR_PROV_EGRESS_ADDRESS     9
-#define QDR_PROV_INGRESS_SEMANTICS  10
-#define QDR_PROV_EGRESS_SEMANTICS   11
-
-const char *qdr_provisioned_columns[] =
-    {"name",
-     "identity",
-     "type",
-     "objectType",
-     "address",
-     "connector",
-     "direction",
-     "semantics",
-     "ingressAddress",
-     "egressAddress",
-     "ingressSemantics",
-     "egressSemantics",
-     0};
-
-
-static void qdr_prov_insert_column_CT(qdr_provisioned_t *prov, int col, qd_composed_field_t *body, bool as_map)
-{
-    if (as_map)
-        qd_compose_insert_string(body, qdr_provisioned_columns[col]);
-
-    switch(col) {
-    case QDR_PROV_NAME:
-        if (prov->name) {
-            qd_compose_insert_string(body, prov->name);
-            break;
-        }
-        // else fall into IDENTITY
-
-    case QDR_PROV_IDENTITY:
-
-    case QDR_PROV_TYPE:
-        qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.provisioned");
-        break;
-
-    case QDR_PROV_OBJECT_TYPE:
-    case QDR_PROV_ADDRESS:
-    case QDR_PROV_CONNECTOR:
-    case QDR_PROV_DIRECTION:
-    case QDR_PROV_SEMANTICS:
-    case QDR_PROV_INGRESS_ADDRESS:
-    case QDR_PROV_EGRESS_ADDRESS:
-    case QDR_PROV_INGRESS_SEMANTICS:
-    case QDR_PROV_EGRESS_SEMANTICS:
-    default:
-        qd_compose_insert_null(body);
-        break;
-    }
-}
-
-
-static void qdr_agent_write_prov_CT(qdr_query_t *query,  qdr_provisioned_t *prov)
-{
-    qd_composed_field_t *body = query->body;
-
-    qd_compose_start_list(body);
-    int i = 0;
-    while (query->columns[i] >= 0) {
-        qdr_prov_insert_column_CT(prov, query->columns[i], body, false);
-        i++;
-    }
-    qd_compose_end_list(body);
-}
-
-static void qdr_manage_advance_prov_CT(qdr_query_t *query, qdr_provisioned_t *prov)
-{
-    query->next_offset++;
-    prov = DEQ_NEXT(prov);
-    query->more = !!prov;
-}
-
-
-void qdra_provisioned_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
-{
-    //
-    // Queries that get this far will always succeed.
-    //
-    query->status = &QD_AMQP_OK;
-
-    //
-    // If the offset goes beyond the set of objects, end the query now.
-    //
-    if (offset >= DEQ_SIZE(core->provisioned)) {
-        query->more = false;
-        qdr_agent_enqueue_response_CT(core, query);
-        return;
-    }
-
-    //
-    // Run to the object at the offset.
-    //
-    qdr_provisioned_t *prov = DEQ_HEAD(core->provisioned);
-    for (int i = 0; i < offset && prov; i++)
-        prov = DEQ_NEXT(prov);
-    assert(prov);
-
-    //
-    // Write the columns of the object into the response body.
-    //
-    qdr_agent_write_prov_CT(query, prov);
-
-    //
-    // Advance to the next address
-    //
-    query->next_offset = offset;
-    qdr_manage_advance_prov_CT(query, prov);
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-void qdra_provisioned_get_next_CT(qdr_core_t *core, qdr_query_t *query)
-{
-    qdr_provisioned_t *prov = 0;
-
-        if (query->next_offset < DEQ_SIZE(core->provisioned)) {
-            prov = DEQ_HEAD(core->provisioned);
-            for (int i = 0; i < query->next_offset && prov; i++)
-                prov = DEQ_NEXT(prov);
-        }
-
-    if (prov) {
-        //
-        // Write the columns of the provisioned entity into the response body.
-        //
-        qdr_agent_write_prov_CT(query, prov);
-
-        //
-        // Advance to the next object
-        //
-        qdr_manage_advance_prov_CT(query, prov);
-    } else
-        query->more = false;
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-static qd_address_semantics_t qdra_semantics(qd_parsed_field_t *field)
-{
-    if (field) {
-        qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_SEMANTICS_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_SEMANTICS_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_SEMANTICS_ANYCAST_BALANCED;
-    }
-    return QD_SEMANTICS_ANYCAST_BALANCED;
-}
-
-
-static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                              qd_address_semantics_t semantics)
-{
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_config_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
-
-    addr = new_qdr_address_config_t();
-    DEQ_ITEM_INIT(addr);
-    addr->semantics = semantics;
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addr_config, addr);
-    }
-
-    return addr;
-}
-
-
-static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                qd_address_semantics_t semantics)
-{
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
-
-    addr = qdr_address_CT(core, semantics);
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addrs, addr);
-    }
-
-    return addr;
-}
-
-
-void qdra_provisioned_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
-                                qdr_query_t *query, qd_parsed_field_t *in_body)
-{
-    // TODO - reject duplicate names
-
-    if (qd_parse_is_map(in_body)) {
-        qd_parsed_field_t *type_field     = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_OBJECT_TYPE]);
-        qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_ADDRESS]);
-        qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_CONNECTOR]);
-        qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_DIRECTION]);
-        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_SEMANTICS]);
-        //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_INGRESS_ADDRESS]);
-        //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_EGRESS_ADDRESS]);
-        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_INGRESS_SEMANTICS]);
-        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_provisioned_columns[QDR_PROV_EGRESS_SEMANTICS]);
-
-        bool still_good = true;
-        qdr_provisioned_t *prov = new_qdr_provisioned_t();
-        ZERO(prov);
-
-        prov->identity = qdr_identifier(core);
-        if (name)
-            prov->name = (char*) qd_field_iterator_copy(name);
-
-        if (!type_field)
-            prov->object_type = QDR_PROV_TYPE_ADDRESS;
-        else {
-            qd_field_iterator_t *type_iter = qd_parse_raw(type_field);
-            if      (qd_field_iterator_equal(type_iter, (unsigned char*) "address"))
-                prov->object_type = QDR_PROV_TYPE_ADDRESS;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "linkDestination"))
-                prov->object_type = QDR_PROV_TYPE_LINK_DEST;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "waypoint"))
-                prov->object_type = QDR_PROV_TYPE_WAYPOINT;
-            else
-                still_good = false;
-        }
-
-        prov->semantics = qdra_semantics(sem_field);
-
-        prov->direction_in  = true;
-        prov->direction_out = true;
-        if (dir_field) {
-            qd_field_iterator_t *dir_iter = qd_parse_raw(dir_field);
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "in"))
-                prov->direction_out = false;
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "out"))
-                prov->direction_in = false;
-        }
-
-        if (conn_field) {
-            qd_field_iterator_t *conn_iter  = qd_parse_raw(conn_field);
-            prov->connector_label = (char*) qd_field_iterator_copy(conn_iter);
-        }
-
-        switch (prov->object_type) {
-        case QDR_PROV_TYPE_ADDRESS:
-            prov->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', prov->semantics);
-            break;
-
-        case QDR_PROV_TYPE_LINK_DEST:
-            if (prov->direction_in)
-                prov->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', prov->semantics);
-            if (prov->direction_out)
-                prov->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', prov->semantics);
-            break;
-
-        case QDR_PROV_TYPE_WAYPOINT:
-            break;
-        }
-
-        if (still_good) {
-            // TODO - write response map
-            query->status = &QD_AMQP_CREATED;
-            DEQ_INSERT_TAIL(core->provisioned, prov);
-        } else {
-            query->status = &QD_AMQP_BAD_REQUEST;
-            if (prov->name)
-                free(prov->name);
-            free_qdr_provisioned_t(prov);
-        }
-    }
-    else
-        query->status = &QD_AMQP_BAD_REQUEST;
-
-    //
-    // Enqueue the response.
-    //
-    if (query->body)
-        qdr_agent_enqueue_response_CT(core, query);
-    else
-        free_qdr_query_t(query);
-}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_provisioned.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_provisioned.h b/src/router_core/agent_provisioned.h
deleted file mode 100644
index f97ec24..0000000
--- a/src/router_core/agent_provisioned.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef qdr_agent_provisioned
-#define qdr_agent_provisioned 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "router_core_private.h"
-
-void qdra_provisioned_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
-void qdra_provisioned_get_next_CT(qdr_core_t *core, qdr_query_t *query);
-void qdra_provisioned_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
-void qdra_provisioned_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
-void qdra_provisioned_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
-                                qd_field_iterator_t *identity);
-
-#define QDR_PROVISIONED_COLUMN_COUNT 12
-
-const char *qdr_provisioned_columns[QDR_PROVISIONED_COLUMN_COUNT + 1];
-
-#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
new file mode 100644
index 0000000..3cd9af5
--- /dev/null
+++ b/src/router_core/agent_route.c
@@ -0,0 +1,344 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "agent_link.h"
+#include <stdio.h>
+
+#define QDR_ROUTE_NAME               0
+#define QDR_ROUTE_IDENTITY           1
+#define QDR_ROUTE_TYPE               2
+#define QDR_ROUTE_OBJECT_TYPE        3
+#define QDR_ROUTE_ADDRESS            4
+#define QDR_ROUTE_CONNECTOR          5
+#define QDR_ROUTE_DIRECTION          6
+#define QDR_ROUTE_SEMANTICS          7
+#define QDR_ROUTE_INGRESS_ADDRESS    8
+#define QDR_ROUTE_EGRESS_ADDRESS     9
+#define QDR_ROUTE_INGRESS_SEMANTICS  10
+#define QDR_ROUTE_EGRESS_SEMANTICS   11
+
+const char *qdr_route_columns[] =
+    {"name",
+     "identity",
+     "type",
+     "objectType",
+     "address",
+     "connector",
+     "direction",
+     "semantics",
+     "ingressAddress",
+     "egressAddress",
+     "ingressSemantics",
+     "egressSemantics",
+     0};
+
+
+static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_field_t *body, bool as_map)
+{
+    if (as_map)
+        qd_compose_insert_string(body, qdr_route_columns[col]);
+
+    switch(col) {
+    case QDR_ROUTE_NAME:
+        if (route->name) {
+            qd_compose_insert_string(body, route->name);
+            break;
+        }
+        // else fall into IDENTITY
+
+    case QDR_ROUTE_IDENTITY:
+
+    case QDR_ROUTE_TYPE:
+        qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.route");
+        break;
+
+    case QDR_ROUTE_OBJECT_TYPE:
+    case QDR_ROUTE_ADDRESS:
+    case QDR_ROUTE_CONNECTOR:
+    case QDR_ROUTE_DIRECTION:
+    case QDR_ROUTE_SEMANTICS:
+    case QDR_ROUTE_INGRESS_ADDRESS:
+    case QDR_ROUTE_EGRESS_ADDRESS:
+    case QDR_ROUTE_INGRESS_SEMANTICS:
+    case QDR_ROUTE_EGRESS_SEMANTICS:
+    default:
+        qd_compose_insert_null(body);
+        break;
+    }
+}
+
+
+static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_t *route)
+{
+    qd_composed_field_t *body = query->body;
+
+    qd_compose_start_list(body);
+    int i = 0;
+    while (query->columns[i] >= 0) {
+        qdr_route_insert_column_CT(route, query->columns[i], body, false);
+        i++;
+    }
+    qd_compose_end_list(body);
+}
+
+static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_t *route)
+{
+    query->next_offset++;
+    route = DEQ_NEXT(route);
+    query->more = !!route;
+}
+
+
+void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
+{
+    //
+    // Queries that get this far will always succeed.
+    //
+    query->status = &QD_AMQP_OK;
+
+    //
+    // If the offset goes beyond the set of objects, end the query now.
+    //
+    if (offset >= DEQ_SIZE(core->routes)) {
+        query->more = false;
+        qdr_agent_enqueue_response_CT(core, query);
+        return;
+    }
+
+    //
+    // Run to the object at the offset.
+    //
+    qdr_route_t *route = DEQ_HEAD(core->routes);
+    for (int i = 0; i < offset && route; i++)
+        route = DEQ_NEXT(route);
+    assert(route);
+
+    //
+    // Write the columns of the object into the response body.
+    //
+    qdr_agent_write_route_CT(query, route);
+
+    //
+    // Advance to the next address
+    //
+    query->next_offset = offset;
+    qdr_manage_advance_route_CT(query, route);
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
+{
+    qdr_route_t *route = 0;
+
+        if (query->next_offset < DEQ_SIZE(core->routes)) {
+            route = DEQ_HEAD(core->routes);
+            for (int i = 0; i < query->next_offset && route; i++)
+                route = DEQ_NEXT(route);
+        }
+
+    if (route) {
+        //
+        // Write the columns of the route entity into the response body.
+        //
+        qdr_agent_write_route_CT(query, route);
+
+        //
+        // Advance to the next object
+        //
+        qdr_manage_advance_route_CT(query, route);
+    } else
+        query->more = false;
+
+    //
+    // Enqueue the response.
+    //
+    qdr_agent_enqueue_response_CT(core, query);
+}
+
+
+static qd_address_semantics_t qdra_semantics(qd_parsed_field_t *field)
+{
+    if (field) {
+        qd_field_iterator_t *iter = qd_parse_raw(field);
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_SEMANTICS_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_SEMANTICS_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_SEMANTICS_ANYCAST_BALANCED;
+    }
+    return QD_SEMANTICS_ANYCAST_BALANCED;
+}
+
+
+static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
+                                                              qd_address_semantics_t semantics)
+{
+    if (!addr_field)
+        return 0;
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_config_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr) {
+        // Log error TODO
+        return 0;
+    }
+
+    addr = new_qdr_address_config_t();
+    DEQ_ITEM_INIT(addr);
+    addr->semantics = semantics;
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addr_config, addr);
+    }
+
+    return addr;
+}
+
+
+static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
+                                                qd_address_semantics_t semantics)
+{
+    if (!addr_field)
+        return 0;
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr) {
+        // Log error TODO
+        return 0;
+    }
+
+    addr = qdr_address_CT(core, semantics);
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addrs, addr);
+    }
+
+    return addr;
+}
+
+
+void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
+                          qdr_query_t *query, qd_parsed_field_t *in_body)
+{
+    // TODO - reject duplicate names
+
+    if (qd_parse_is_map(in_body)) {
+        qd_parsed_field_t *type_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_OBJECT_TYPE]);
+        qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
+        qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTOR]);
+        qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_DIRECTION]);
+        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_SEMANTICS]);
+        //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_ADDRESS]);
+        //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_ADDRESS]);
+        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_SEMANTICS]);
+        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_SEMANTICS]);
+
+        bool still_good = true;
+        qdr_route_t *route = new_qdr_route_t();
+        ZERO(route);
+
+        route->identity = qdr_identifier(core);
+        if (name)
+            route->name = (char*) qd_field_iterator_copy(name);
+
+        if (!type_field)
+            route->object_type = QDR_ROUTE_TYPE_ADDRESS;
+        else {
+            qd_field_iterator_t *type_iter = qd_parse_raw(type_field);
+            if      (qd_field_iterator_equal(type_iter, (unsigned char*) "address"))
+                route->object_type = QDR_ROUTE_TYPE_ADDRESS;
+            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "linkDestination"))
+                route->object_type = QDR_ROUTE_TYPE_LINK_DEST;
+            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "waypoint"))
+                route->object_type = QDR_ROUTE_TYPE_WAYPOINT;
+            else
+                still_good = false;
+        }
+
+        route->semantics = qdra_semantics(sem_field);
+
+        route->direction_in  = true;
+        route->direction_out = true;
+        if (dir_field) {
+            qd_field_iterator_t *dir_iter = qd_parse_raw(dir_field);
+            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "in"))
+                route->direction_out = false;
+            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "out"))
+                route->direction_in = false;
+        }
+
+        if (conn_field) {
+            qd_field_iterator_t *conn_iter  = qd_parse_raw(conn_field);
+            route->connector_label = (char*) qd_field_iterator_copy(conn_iter);
+        }
+
+        switch (route->object_type) {
+        case QDR_ROUTE_TYPE_ADDRESS:
+            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->semantics);
+            break;
+
+        case QDR_ROUTE_TYPE_LINK_DEST:
+            if (route->direction_in)
+                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->semantics);
+            if (route->direction_out)
+                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->semantics);
+            break;
+
+        case QDR_ROUTE_TYPE_WAYPOINT:
+            break;
+        }
+
+        if (still_good) {
+            // TODO - write response map
+            query->status = &QD_AMQP_CREATED;
+            DEQ_INSERT_TAIL(core->routes, route);
+        } else {
+            query->status = &QD_AMQP_BAD_REQUEST;
+            if (route->name)
+                free(route->name);
+            free_qdr_route_t(route);
+        }
+    }
+    else
+        query->status = &QD_AMQP_BAD_REQUEST;
+
+    //
+    // Enqueue the response.
+    //
+    if (query->body)
+        qdr_agent_enqueue_response_CT(core, query);
+    else
+        free_qdr_query_t(query);
+}

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/agent_route.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.h b/src/router_core/agent_route.h
new file mode 100644
index 0000000..86ec69c
--- /dev/null
+++ b/src/router_core/agent_route.h
@@ -0,0 +1,35 @@
+#ifndef qdr_agent_route
+#define qdr_agent_route 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset);
+void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query);
+void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_route_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_t *in_body);
+void qdra_route_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
+                                qd_field_iterator_t *identity);
+
+#define QDR_ROUTE_COLUMN_COUNT 12
+
+const char *qdr_route_columns[QDR_ROUTE_COLUMN_COUNT + 1];
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index 76d25bc..e8823b4 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -39,7 +39,7 @@ const char *identity_key = "identity";
 const char *operation_type_key = "operation";
 const char *attribute_names_key = "attributeNames";
 
-const unsigned char *provisioned_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.provisioned";
+const unsigned char *route_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.route";
 const unsigned char *waypoint_entity_type = (unsigned char*) "org.apache.qpid.dispatch.waypoint";
 const unsigned char *address_entity_type = (unsigned char*) "org.apache.qpid.dispatch.router.address";
 const unsigned char *link_entity_type    = (unsigned char*) "org.apache.qpid.dispatch.router.link";
@@ -358,8 +358,8 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         *entity_type = QD_ROUTER_LINK;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), waypoint_entity_type))
         *entity_type = QD_ROUTER_WAYPOINT;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), provisioned_entity_type))
-        *entity_type = QD_ROUTER_PROVISIONED;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), route_entity_type))
+        *entity_type = QD_ROUTER_ROUTE;
     else
         return false;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index e6fe86c..82f3408 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -30,7 +30,7 @@ ALLOC_DEFINE(qdr_link_t);
 ALLOC_DEFINE(qdr_router_ref_t);
 ALLOC_DEFINE(qdr_link_ref_t);
 ALLOC_DEFINE(qdr_general_work_t);
-ALLOC_DEFINE(qdr_provisioned_t);
+ALLOC_DEFINE(qdr_route_t);
 
 static void qdr_general_handler(void *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/43e3a49e/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 e8d1508..c6307d3 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -33,7 +33,7 @@ typedef struct qdr_link_ref_t        qdr_link_ref_t;
 typedef struct qdr_lrp_t             qdr_lrp_t;
 typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
-typedef struct qdr_provisioned_t     qdr_provisioned_t;
+typedef struct qdr_route_t           qdr_route_t;
 
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_semantics_t semantics);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
@@ -398,16 +398,16 @@ ALLOC_DECLARE(qdr_connection_t);
 DEQ_DECLARE(qdr_connection_t, qdr_connection_list_t);
 
 typedef enum {
-    QDR_PROV_TYPE_ADDRESS,
-    QDR_PROV_TYPE_LINK_DEST,
-    QDR_PROV_TYPE_WAYPOINT
-} qdr_provisioned_type_t;
+    QDR_ROUTE_TYPE_ADDRESS,
+    QDR_ROUTE_TYPE_LINK_DEST,
+    QDR_ROUTE_TYPE_WAYPOINT
+} qdr_route_type_t;
 
-struct qdr_provisioned_t {
-    DEQ_LINKS(qdr_provisioned_t);
+struct qdr_route_t {
+    DEQ_LINKS(qdr_route_t);
     char                   *name;
     uint64_t                identity;
-    qdr_provisioned_type_t  object_type;
+    qdr_route_type_t        object_type;
     qdr_address_config_t   *addr_config;
     qdr_address_t          *addr;
     qdr_address_t          *ingress_addr;
@@ -420,8 +420,8 @@ struct qdr_provisioned_t {
     char                   *connector_label;
 };
 
-ALLOC_DECLARE(qdr_provisioned_t);
-DEQ_DECLARE(qdr_provisioned_t, qdr_provisioned_list_t);
+ALLOC_DECLARE(qdr_route_t);
+DEQ_DECLARE(qdr_route_t, qdr_route_list_t);
 
 
 struct qdr_core_t {
@@ -437,7 +437,7 @@ struct qdr_core_t {
     qdr_general_work_list_t  work_list;
     qd_timer_t              *work_timer;
 
-    qdr_provisioned_list_t provisioned;
+    qdr_route_list_t      routes;
 
     qdr_connection_list_t open_connections;
     qdr_link_list_t       open_links;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[3/4] qpid-dispatch git commit: DISPATCH-228 - Added named DEQ macros for multi-list membership.

Posted by tr...@apache.org.
DISPATCH-228 - Added named DEQ macros for multi-list membership.

Conflicts:
	include/qpid/dispatch/ctools.h


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/c72e179e
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/c72e179e
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/c72e179e

Branch: refs/heads/tross-DISPATCH-179-1
Commit: c72e179ef297d4b94ebda5c025d3eb2f87936bfe
Parents: 1dffeb6
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Feb 29 15:54:22 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Mon Feb 29 15:58:34 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/ctools.h | 128 ++++++++++++++++++++----------------
 tests/tool_test.c              |  56 ++++++++++++++++
 2 files changed, 126 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c72e179e/include/qpid/dispatch/ctools.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/ctools.h b/include/qpid/dispatch/ctools.h
index 3ac5998..9ab1c70 100644
--- a/include/qpid/dispatch/ctools.h
+++ b/include/qpid/dispatch/ctools.h
@@ -41,134 +41,146 @@
     size_t  size;       \
     } d
 
-#define DEQ_LINKS(t) t *prev; t *next
+#define DEQ_LINKS_N(n,t) t *prev##n; t *next##n
+#define DEQ_LINKS(t) DEQ_LINKS_N(,t)
 #define DEQ_EMPTY {0,0,0,0}
 
 #define DEQ_INIT(d) do { (d).head = 0; (d).tail = 0; (d).scratch = 0; (d).size = 0; } while (0)
 #define DEQ_IS_EMPTY(d) ((d).head == 0)
-#define DEQ_ITEM_INIT(i) do { (i)->next = 0; (i)->prev = 0; } while(0)
+#define DEQ_ITEM_INIT_N(n,i) do { (i)->next##n = 0; (i)->prev##n = 0; } while(0)
+#define DEQ_ITEM_INIT(i) DEQ_ITEM_INIT_N(,i)
 #define DEQ_HEAD(d) ((d).head)
 #define DEQ_TAIL(d) ((d).tail)
 #define DEQ_SIZE(d) ((d).size)
-#define DEQ_NEXT(i) (i)->next
-#define DEQ_PREV(i) (i)->prev
+#define DEQ_NEXT_N(n,i) (i)->next##n
+#define DEQ_NEXT(i) DEQ_NEXT_N(,i)
+#define DEQ_PREV_N(n,i) (i)->prev##n
+#define DEQ_PREV(i) DEQ_PREV_N(,i)
 #define DEQ_MOVE(d1,d2) do {d2 = d1; DEQ_INIT(d1);} while (0)
 /**
  *@pre ptr points to first element of deq
  *@post ptr points to first element of deq that passes test, or 0. Test should involve ptr.
  */
-#define DEQ_FIND(ptr,test) while((ptr) && !(test)) ptr = DEQ_NEXT(ptr);
+#define DEQ_FIND_N(n,ptr,test) while((ptr) && !(test)) ptr = DEQ_NEXT_N(n,ptr);
+#define DEQ_FIND(ptr,test) DEQ_FIND_N(,ptr,test)
 
-#define DEQ_INSERT_HEAD(d,i)      \
+#define DEQ_INSERT_HEAD_N(n,d,i)  \
 do {                              \
-    CT_ASSERT((i)->next == 0);    \
-    CT_ASSERT((i)->prev == 0);    \
+    CT_ASSERT((i)->next##n == 0); \
+    CT_ASSERT((i)->prev##n == 0); \
     if ((d).head) {               \
-        (i)->next = (d).head;     \
-        (d).head->prev = i;       \
+        (i)->next##n = (d).head;  \
+        (d).head->prev##n = i;    \
     } else {                      \
         (d).tail = i;             \
-        (i)->next = 0;            \
+        (i)->next##n = 0;         \
         CT_ASSERT((d).size == 0); \
     }                             \
-    (i)->prev = 0;                \
+    (i)->prev##n = 0;             \
     (d).head = i;                 \
     (d).size++;                   \
 } while (0)
+#define DEQ_INSERT_HEAD(d,i) DEQ_INSERT_HEAD_N(,d,i)
 
-#define DEQ_INSERT_TAIL(d,i)      \
+#define DEQ_INSERT_TAIL_N(n,d,i)  \
 do {                              \
-    CT_ASSERT((i)->next == 0);    \
-    CT_ASSERT((i)->prev == 0);    \
+    CT_ASSERT((i)->next##n == 0); \
+    CT_ASSERT((i)->prev##n == 0); \
     if ((d).tail) {               \
-        (i)->prev = (d).tail;     \
-        (d).tail->next = i;       \
+        (i)->prev##n = (d).tail;  \
+        (d).tail->next##n = i;    \
     } else {                      \
         (d).head = i;             \
-        (i)->prev = 0;            \
+        (i)->prev##n = 0;         \
         CT_ASSERT((d).size == 0); \
     }                             \
-    (i)->next = 0;                \
+    (i)->next##n = 0;             \
     (d).tail = i;                 \
     (d).size++;                   \
 } while (0)
+#define DEQ_INSERT_TAIL(d,i) DEQ_INSERT_TAIL_N(,d,i)
 
-#define DEQ_REMOVE_HEAD(d)        \
+#define DEQ_REMOVE_HEAD_N(n,d)    \
 do {                              \
     CT_ASSERT((d).head);          \
     if ((d).head) {               \
         (d).scratch = (d).head;   \
-        (d).head = (d).head->next;  \
+        (d).head = (d).head->next##n;  \
         if ((d).head == 0) {      \
             (d).tail = 0;         \
             CT_ASSERT((d).size == 1); \
-        } else                  \
-            (d).head->prev = 0; \
-        (d).size--;             \
-        (d).scratch->next = 0;  \
-        (d).scratch->prev = 0;  \
-    }                           \
+        } else                     \
+            (d).head->prev##n = 0; \
+        (d).size--;                \
+        (d).scratch->next##n = 0;  \
+        (d).scratch->prev##n = 0;  \
+    }                              \
 } while (0)
+#define DEQ_REMOVE_HEAD(d)  DEQ_REMOVE_HEAD_N(,d)
 
-#define DEQ_REMOVE_TAIL(d)      \
+#define DEQ_REMOVE_TAIL_N(n,d)  \
 do {                            \
     CT_ASSERT((d).tail);        \
     if ((d).tail) {             \
         (d).scratch = (d).tail; \
-        (d).tail = (d).tail->prev;  \
+        (d).tail = (d).tail->prev##n;  \
         if ((d).tail == 0) {    \
             (d).head = 0;       \
             CT_ASSERT((d).size == 1); \
         } else                  \
-            (d).tail->next = 0; \
+            (d).tail->next##n = 0; \
         (d).size--;             \
-        (d).scratch->next = 0;  \
-        (d).scratch->prev = 0;  \
+        (d).scratch->next##n = 0;  \
+        (d).scratch->prev##n = 0;  \
     }                           \
 } while (0)
-
-#define DEQ_INSERT_AFTER(d,i,a) \
-do {                            \
-    CT_ASSERT((i)->next == 0);  \
-    CT_ASSERT((i)->prev == 0);  \
-    CT_ASSERT(a);               \
-    if ((a)->next)              \
-        (a)->next->prev = (i);  \
-    else                        \
-        (d).tail = (i);         \
-    (i)->next = (a)->next;      \
-    (i)->prev = (a);            \
-    (a)->next = (i);            \
-    (d).size++;                 \
+#define DEQ_REMOVE_TAIL(d) DEQ_REMOVE_TAIL_N(,d)
+
+#define DEQ_INSERT_AFTER_N(n,d,i,a) \
+do {                                \
+    CT_ASSERT((i)->next##n == 0);   \
+    CT_ASSERT((i)->prev##n == 0);   \
+    CT_ASSERT(a);                   \
+    if ((a)->next##n)               \
+        (a)->next##n->prev##n = (i);  \
+    else                            \
+        (d).tail = (i);             \
+    (i)->next##n = (a)->next##n;    \
+    (i)->prev##n = (a);             \
+    (a)->next##n = (i);             \
+    (d).size++;                     \
 } while (0)
+#define DEQ_INSERT_AFTER(d,i,a) DEQ_INSERT_AFTER_N(,d,i,a)
 
-#define DEQ_REMOVE(d,i)                        \
+#define DEQ_REMOVE_N(n,d,i)                    \
 do {                                           \
-    if ((i)->next)                             \
-        (i)->next->prev = (i)->prev;           \
+    if ((i)->next##n)                          \
+        (i)->next##n->prev##n = (i)->prev##n;  \
     else                                       \
-        (d).tail = (i)->prev;                  \
-    if ((i)->prev)                             \
-        (i)->prev->next = (i)->next;           \
+        (d).tail = (i)->prev##n;               \
+    if ((i)->prev##n)                          \
+        (i)->prev##n->next##n = (i)->next##n;  \
     else                                       \
-        (d).head = (i)->next;                  \
+        (d).head = (i)->next##n;               \
     (d).size--;                                \
-    (i)->next = 0;                             \
-    (i)->prev = 0;                             \
+    (i)->next##n = 0;                          \
+    (i)->prev##n = 0;                          \
     CT_ASSERT((d).size || (!(d).head && !(d).tail)); \
 } while (0)
+#define DEQ_REMOVE(d,i) DEQ_REMOVE_N(,d,i)
 
-#define DEQ_APPEND(d1,d2)               \
+#define DEQ_APPEND_N(n,d1,d2)           \
 do {                                    \
     if (!(d1).head)                     \
         (d1) = (d2);                    \
     else if ((d2).head) {               \
-        (d1).tail->next = (d2).head;    \
-        (d2).head->prev = (d1).tail;    \
+        (d1).tail->next##n = (d2).head; \
+        (d2).head->prev##n = (d1).tail; \
         (d1).tail = (d2).tail;          \
         (d1).size += (d2).size;         \
     }                                   \
     DEQ_INIT(d2);                       \
 } while (0)
+#define DEQ_APPEND(d1,d2) DEQ_APPEND_N(,d1,d2)
 
 #endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/c72e179e/tests/tool_test.c
----------------------------------------------------------------------
diff --git a/tests/tool_test.c b/tests/tool_test.c
index a4ce830..4b68edc 100644
--- a/tests/tool_test.c
+++ b/tests/tool_test.c
@@ -32,6 +32,15 @@ typedef struct item_t {
 DEQ_DECLARE(item_t, item_list_t);
 
 
+typedef struct multi_item_t {
+    DEQ_LINKS(struct multi_item_t);
+    DEQ_LINKS_N(second, struct multi_item_t);
+    char letter;
+} multi_item_t;
+
+DEQ_DECLARE(multi_item_t, multi_item_list_t);
+
+
 static char* list_well_formed(item_list_t list, char *key)
 {
     item_t *ptr;
@@ -190,6 +199,52 @@ static char* test_deq_basic2(void *context)
 }
 
 
+static char* test_deq_multi(void *context)
+{
+    multi_item_list_t  list1;
+    multi_item_list_t  list2;
+    multi_item_t       item[10];
+    multi_item_t      *ptr;
+    int                idx;
+
+    DEQ_INIT(list1);
+    DEQ_INIT(list2);
+    if (DEQ_SIZE(list1) != 0) return "Expected zero initial size 1";
+    if (DEQ_SIZE(list2) != 0) return "Expected zero initial size 2";
+
+    for (idx = 0; idx < 10; idx++) {
+        DEQ_ITEM_INIT(&item[idx]);
+        DEQ_ITEM_INIT_N(second, &item[idx]);
+        item[idx].letter = '0' + idx;
+
+        DEQ_INSERT_TAIL(list1, &item[idx]);
+        if ((idx & 1) == 0) // even index
+            DEQ_INSERT_TAIL_N(second, list2, &item[idx]);
+    }
+
+    if (DEQ_SIZE(list1) != 10) return "Expected list 1 size to be 10";
+    if (DEQ_SIZE(list2) != 5)  return "Expected list 2 size to be 5";
+
+    idx = 0;
+    while (DEQ_HEAD(list1)) {
+        ptr = DEQ_HEAD(list1);
+        DEQ_REMOVE_HEAD(list1);
+        if (ptr->letter != '0' + idx) return "Incorrect value in list 1";
+        idx++;
+    }
+
+    idx = 0;
+    while (DEQ_HEAD(list2)) {
+        ptr = DEQ_HEAD(list2);
+        DEQ_REMOVE_HEAD_N(second, list2);
+        if (ptr->letter != '0' + idx) return "Incorrect value in list 2";
+        idx += 2;
+    }
+
+    return 0;
+}
+
+
 static char* test_bitmask(void *context)
 {
     qd_bitmask_t *bm;
@@ -257,6 +312,7 @@ int tool_tests(void)
 
     TEST_CASE(test_deq_basic, 0);
     TEST_CASE(test_deq_basic2, 0);
+    TEST_CASE(test_deq_multi, 0);
     TEST_CASE(test_bitmask, 0);
 
     return result;


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[4/4] qpid-dispatch git commit: DISPATCH-179 - Updated agent to handle updated router.route entity definition.

Posted by tr...@apache.org.
DISPATCH-179 - Updated agent to handle updated router.route entity definition.


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/dc675a38
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/dc675a38
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/dc675a38

Branch: refs/heads/tross-DISPATCH-179-1
Commit: dc675a38f24907566e9c575756e6be56ec82e0ef
Parents: c72e179
Author: Ted Ross <tr...@redhat.com>
Authored: Wed Mar 2 12:19:08 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Wed Mar 2 12:19:08 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router_core.h   |   1 -
 src/CMakeLists.txt                    |   2 +-
 src/router_core/DESIGN                |   7 +-
 src/router_core/agent.c               |  17 +-
 src/router_core/agent_address.c       |  10 +-
 src/router_core/agent_link.c          |   2 +-
 src/router_core/agent_route.c         | 315 ++++++++++++++---------------
 src/router_core/agent_route.h         |   2 +-
 src/router_core/agent_waypoint.c      | 165 ---------------
 src/router_core/agent_waypoint.h      |  39 ----
 src/router_core/connections.c         |   4 +-
 src/router_core/management_agent.c    |  62 +++---
 src/router_core/route_control.c       | 168 +++++++++++++++
 src/router_core/route_control.h       |  50 +++++
 src/router_core/route_tables.c        |   3 +-
 src/router_core/router_core.c         |   1 -
 src/router_core/router_core_private.h |  82 +++++---
 17 files changed, 488 insertions(+), 442 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index b38022f..338c88e 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -546,7 +546,6 @@ typedef enum {
     QD_ROUTER_CONNECTION,
     QD_ROUTER_LINK,
     QD_ROUTER_ADDRESS,
-    QD_ROUTER_WAYPOINT,
     QD_ROUTER_EXCHANGE,
     QD_ROUTER_BINDING
 } qd_router_entity_type_t;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index f74babe..472090d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -66,12 +66,12 @@ set(qpid_dispatch_SOURCES
   router_config.c
   router_core/agent.c
   router_core/agent_address.c
-  router_core/agent_waypoint.c
   router_core/agent_link.c
   router_core/agent_route.c
   router_core/connections.c
   router_core/error.c
   router_core/forwarder.c
+  router_core/route_control.c
   router_core/router_core.c
   router_core/router_core_thread.c
   router_core/route_tables.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/DESIGN
----------------------------------------------------------------------
diff --git a/src/router_core/DESIGN b/src/router_core/DESIGN
index dde7cb4..8114370 100644
--- a/src/router_core/DESIGN
+++ b/src/router_core/DESIGN
@@ -184,7 +184,7 @@ Forwarding Treatment
 
   Transition from fanout/bias to a one-dimensional list of treatment:
 
-    MULTICAST_FLOOD
+    MULTICAST_FLOOD (not available to users)
 
         Messages are delivered to all subscribers via all unique paths.  If there is
         redundancy in the router topology, multiple copies of each message will be
@@ -257,3 +257,8 @@ org
           waypoint        (proposed)
         waypoint          (deprecated)
 
+
+============================
+Route Control Data Structure
+============================
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent.c b/src/router_core/agent.c
index b0c5381..40db041 100644
--- a/src/router_core/agent.c
+++ b/src/router_core/agent.c
@@ -20,7 +20,6 @@
 #include <qpid/dispatch/amqp.h>
 #include "agent_route.h"
 #include "agent_address.h"
-#include "agent_waypoint.h"
 #include "agent_link.h"
 #include "router_core_private.h"
 #include <stdio.h>
@@ -48,7 +47,7 @@ static void qdr_agent_response_handler(void *context)
         sys_mutex_unlock(core->query_lock);
 
         if (query) {
-            core->agent_response_handler(query->context, query->status, query->more);
+            core->agent_response_handler(query->context, &query->status, query->more);
             if (!query->more) {
                 if (query->next_key)
                     qdr_field_free(query->next_key);
@@ -70,6 +69,7 @@ void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query)
         qd_timer_schedule(core->agent_timer, 0);
 }
 
+
 qdr_query_t *qdr_query(qdr_core_t              *core,
                        void                    *context,
                        qd_router_entity_type_t  type,
@@ -79,14 +79,12 @@ qdr_query_t *qdr_query(qdr_core_t              *core,
     qdr_query_t *query = new_qdr_query_t();
 
     DEQ_ITEM_INIT(query);
+    ZERO(query);
     query->core        = core;
     query->entity_type = type;
     query->context     = context;
     query->body        = body;
-    query->next_key    = 0;
-    query->next_offset = 0;
     query->more        = false;
-    query->status      = 0;
 
     return query;
 }
@@ -188,9 +186,6 @@ qdr_query_t *qdr_manage_query(qdr_core_t              *core,
         qdr_agent_set_columns(query, attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT);
         break;
 
-    case QD_ROUTER_WAYPOINT:
-        break;
-
     case QD_ROUTER_EXCHANGE:
         break;
 
@@ -209,7 +204,6 @@ void qdr_query_add_attribute_names(qdr_query_t *query)
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        qdr_agent_emit_columns(query, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
     case QD_ROUTER_ADDRESS:     qdr_agent_emit_columns(query, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
-    case QD_ROUTER_WAYPOINT:    break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
     }
@@ -322,7 +316,6 @@ static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool disc
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_get_CT(core, name, identity, query, qdr_address_columns); break;
-    case QD_ROUTER_WAYPOINT:    break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }
@@ -340,7 +333,6 @@ static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool di
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     break;
-    case QD_ROUTER_WAYPOINT:    qdra_waypoint_create_CT(core, name, query, in_body); break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }
@@ -358,7 +350,6 @@ static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool di
     case QD_ROUTER_CONNECTION:  break;
     case QD_ROUTER_LINK:        break;
     case QD_ROUTER_ADDRESS:     qdra_address_delete_CT(core, name, identity, query); break;
-    case QD_ROUTER_WAYPOINT:    qdra_waypoint_delete_CT(core, name, identity, query); break;
     case QD_ROUTER_EXCHANGE:    break;
     case QD_ROUTER_BINDING:     break;
    }
@@ -378,7 +369,6 @@ static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_first_CT(core, query, offset); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_first_CT(core, query, offset); break;
-        case QD_ROUTER_WAYPOINT:    break;
         case QD_ROUTER_EXCHANGE:    break;
         case QD_ROUTER_BINDING:     break;
         }
@@ -396,7 +386,6 @@ static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool
         case QD_ROUTER_CONNECTION:  break;
         case QD_ROUTER_LINK:        qdra_link_get_next_CT(core, query); break;
         case QD_ROUTER_ADDRESS:     qdra_address_get_next_CT(core, query); break;
-        case QD_ROUTER_WAYPOINT:    break;
         case QD_ROUTER_EXCHANGE:    break;
         case QD_ROUTER_BINDING:     break;
         }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index bc008ff..1ed1614 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -185,14 +185,14 @@ void qdra_address_get_CT(qdr_core_t          *core,
 
     if (addr == 0) {
         // Send back a 404
-        query->status = &QD_AMQP_NOT_FOUND;
+        query->status = QD_AMQP_NOT_FOUND;
     }
     else {
         //
         // Write the columns of the address entity into the response body.
         //
         qdr_manage_write_address_map_CT(addr, query->body, qdr_address_columns);
-        query->status = &QD_AMQP_OK;
+        query->status = QD_AMQP_OK;
     }
 
     //
@@ -208,7 +208,7 @@ void qdra_address_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Queries that get this far will always succeed.
     //
-    query->status = &QD_AMQP_OK;
+    query->status = QD_AMQP_OK;
 
     //
     // If the offset goes beyond the set of addresses, end the query now.
@@ -302,7 +302,7 @@ void qdra_address_delete_CT(qdr_core_t          *core,
        //TOOD - do something here
     }
     else {
-        query->status = &QD_AMQP_BAD_REQUEST;
+        query->status = QD_AMQP_BAD_REQUEST;
         success = false;
     }
 
@@ -310,7 +310,7 @@ void qdra_address_delete_CT(qdr_core_t          *core,
     // TODO - Add more logic here.
     if (success) {
         // If the request was successful then the statusCode MUST be 204 (No Content).
-        query->status = &QD_AMQP_NO_CONTENT;
+        query->status = QD_AMQP_NO_CONTENT;
     }
 
     //

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index 997b9e6..9eee88f 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -153,7 +153,7 @@ void qdra_link_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Queries that get this far will always succeed.
     //
-    query->status = &QD_AMQP_OK;
+    query->status = QD_AMQP_OK;
 
     //
     // If the offset goes beyond the set of links, end the query now.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index af042cd..a1586c0 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -17,40 +17,37 @@
  * under the License.
  */
 
-#include "agent_link.h"
+#include "agent_route.h"
+#include "route_control.h"
 #include <stdio.h>
 
-#define QDR_ROUTE_NAME               0
-#define QDR_ROUTE_IDENTITY           1
-#define QDR_ROUTE_TYPE               2
-#define QDR_ROUTE_OBJECT_TYPE        3
-#define QDR_ROUTE_ADDRESS            4
-#define QDR_ROUTE_CONNECTOR          5
-#define QDR_ROUTE_DIRECTION          6
-#define QDR_ROUTE_TREATMENT          7
-#define QDR_ROUTE_INGRESS_ADDRESS    8
-#define QDR_ROUTE_EGRESS_ADDRESS     9
-#define QDR_ROUTE_INGRESS_TREATMENT  10
-#define QDR_ROUTE_EGRESS_TREATMENT   11
+#define QDR_ROUTE_NAME          0
+#define QDR_ROUTE_IDENTITY      1
+#define QDR_ROUTE_TYPE          2
+#define QDR_ROUTE_ADDRESS       3
+#define QDR_ROUTE_PATH          4
+#define QDR_ROUTE_TREATMENT     5
+#define QDR_ROUTE_CONNECTORS    6
+#define QDR_ROUTE_CONTAINERS    7
+#define QDR_ROUTE_ROUTE_ADDRESS 8
 
 const char *qdr_route_columns[] =
     {"name",
      "identity",
      "type",
-     "objectType",
      "address",
-     "connector",
-     "direction",
+     "path",
      "treatment",
-     "ingressAddress",
-     "egressAddress",
-     "ingressTreatment",
-     "egressTreatment",
+     "connectors",
+     "containers",
+     "routeAddress",
      0};
 
 
-static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_field_t *body, bool as_map)
+static void qdr_route_insert_column_CT(qdr_route_config_t *route, int col, qd_composed_field_t *body, bool as_map)
 {
+    const char *text = 0;
+
     if (as_map)
         qd_compose_insert_string(body, qdr_route_columns[col]);
 
@@ -62,29 +59,55 @@ static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_
         }
         // else fall into IDENTITY
 
-    case QDR_ROUTE_IDENTITY:
+    case QDR_ROUTE_IDENTITY: {
+        char id_str[100];
+        snprintf(id_str, 100, "%ld", route->identity);
+        qd_compose_insert_string(body, id_str);
+        break;
+    }
 
     case QDR_ROUTE_TYPE:
         qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.route");
         break;
 
-    case QDR_ROUTE_OBJECT_TYPE:
     case QDR_ROUTE_ADDRESS:
-    case QDR_ROUTE_CONNECTOR:
-    case QDR_ROUTE_DIRECTION:
+        if (route->addr_config)
+            qd_compose_insert_string(body, (const char*) qd_hash_key_by_handle(route->addr_config->hash_handle));
+        else
+            qd_compose_insert_null(body);
+        break;
+
+    case QDR_ROUTE_PATH:
+        switch (route->path) {
+        case QDR_ROUTE_PATH_DIRECT:   text = "direct";  break;
+        case QDR_ROUTE_PATH_SOURCE:   text = "source";  break;
+        case QDR_ROUTE_PATH_SINK:     text = "sink";    break;
+        case QDR_ROUTE_PATH_WAYPOINT: text = "waypoint"; break;
+        }
+        qd_compose_insert_string(body, text);
+        break;
+
     case QDR_ROUTE_TREATMENT:
-    case QDR_ROUTE_INGRESS_ADDRESS:
-    case QDR_ROUTE_EGRESS_ADDRESS:
-    case QDR_ROUTE_INGRESS_TREATMENT:
-    case QDR_ROUTE_EGRESS_TREATMENT:
-    default:
+        switch (route->treatment) {
+        case QD_TREATMENT_MULTICAST_FLOOD:
+        case QD_TREATMENT_MULTICAST_ONCE:   text = "multicast";    break;
+        case QD_TREATMENT_ANYCAST_CLOSEST:  text = "closest";      break;
+        case QD_TREATMENT_ANYCAST_BALANCED: text = "balanced";     break;
+        case QD_TREATMENT_LINK_BALANCED:    text = "linkBalanced"; break;
+        }
+        qd_compose_insert_string(body, text);
+        break;
+
+    case QDR_ROUTE_CONNECTORS:
+    case QDR_ROUTE_CONTAINERS:
+    case QDR_ROUTE_ROUTE_ADDRESS:
         qd_compose_insert_null(body);
         break;
     }
 }
 
 
-static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_t *route)
+static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_config_t *route)
 {
     qd_composed_field_t *body = query->body;
 
@@ -97,7 +120,7 @@ static void qdr_agent_write_route_CT(qdr_query_t *query,  qdr_route_t *route)
     qd_compose_end_list(body);
 }
 
-static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_t *route)
+static void qdr_manage_advance_route_CT(qdr_query_t *query, qdr_route_config_t *route)
 {
     query->next_offset++;
     route = DEQ_NEXT(route);
@@ -110,12 +133,12 @@ void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Queries that get this far will always succeed.
     //
-    query->status = &QD_AMQP_OK;
+    query->status = QD_AMQP_OK;
 
     //
     // If the offset goes beyond the set of objects, end the query now.
     //
-    if (offset >= DEQ_SIZE(core->routes)) {
+    if (offset >= DEQ_SIZE(core->route_config)) {
         query->more = false;
         qdr_agent_enqueue_response_CT(core, query);
         return;
@@ -124,7 +147,7 @@ void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
     //
     // Run to the object at the offset.
     //
-    qdr_route_t *route = DEQ_HEAD(core->routes);
+    qdr_route_config_t *route = DEQ_HEAD(core->route_config);
     for (int i = 0; i < offset && route; i++)
         route = DEQ_NEXT(route);
     assert(route);
@@ -149,13 +172,13 @@ void qdra_route_get_first_CT(qdr_core_t *core, qdr_query_t *query, int offset)
 
 void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
 {
-    qdr_route_t *route = 0;
+    qdr_route_config_t *route = 0;
 
-        if (query->next_offset < DEQ_SIZE(core->routes)) {
-            route = DEQ_HEAD(core->routes);
-            for (int i = 0; i < query->next_offset && route; i++)
-                route = DEQ_NEXT(route);
-        }
+    if (query->next_offset < DEQ_SIZE(core->route_config)) {
+        route = DEQ_HEAD(core->route_config);
+        for (int i = 0; i < query->next_offset && route; i++)
+            route = DEQ_NEXT(route);
+    }
 
     if (route) {
         //
@@ -181,129 +204,97 @@ static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
 {
     if (field) {
         qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_TREATMENT_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_TREATMENT_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_TREATMENT_ANYCAST_BALANCED;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multicast"))    return QD_TREATMENT_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "closest"))      return QD_TREATMENT_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "balanced"))     return QD_TREATMENT_ANYCAST_BALANCED;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "linkBalanced")) return QD_TREATMENT_LINK_BALANCED;
     }
     return QD_TREATMENT_ANYCAST_BALANCED;
 }
 
 
-static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                              qd_address_treatment_t treatment)
-{
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_config_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
-
-    addr = new_qdr_address_config_t();
-    DEQ_ITEM_INIT(addr);
-    addr->treatment = treatment;
-
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addr_config, addr);
-    }
-
-    return addr;
-}
-
-
-static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                qd_address_treatment_t treatment)
+void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
+                          qdr_query_t *query, qd_parsed_field_t *in_body)
 {
-    if (!addr_field)
-        return 0;
-
-    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
-    qd_address_iterator_override_prefix(iter, cls);
-    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
-
-    qdr_address_t *addr = 0;
-    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
-    if (addr) {
-        // Log error TODO
-        return 0;
-    }
+    // TODO - reject duplicate names
 
-    addr = qdr_address_CT(core, treatment);
+    while (true) {
+        //
+        // Validation of the request occurs here.  Make sure the body is a map.
+        //
+        if (!qd_parse_is_map(in_body)) {
+            query->status = QD_AMQP_BAD_REQUEST;
+            break;
+        }
 
-    if (!!addr) {
-        qd_field_iterator_reset(iter);
-        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
-        DEQ_INSERT_TAIL(core->addrs, addr);
-    }
+        //
+        // Extract the fields from the request
+        //
+        qd_parsed_field_t *addr_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
+        qd_parsed_field_t *path_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_PATH]);
+        qd_parsed_field_t *conn_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTORS]);
+        qd_parsed_field_t *cont_field       = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONTAINERS]);
+        qd_parsed_field_t *treatment_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
+        qd_parsed_field_t *route_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ROUTE_ADDRESS]);
 
-    return addr;
-}
+        //
+        // Determine the path, which defaults to Direct
+        //
+        qdr_route_path_t path = QDR_ROUTE_PATH_DIRECT;
+        if (path_field) {
+            qd_field_iterator_t *path_iter = qd_parse_raw(path_field);
+            if      (qd_field_iterator_equal(path_iter, (unsigned char*) "direct"))
+                path = QDR_ROUTE_PATH_DIRECT;
+            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "source"))
+                path = QDR_ROUTE_PATH_SOURCE;
+            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "sink"))
+                path = QDR_ROUTE_PATH_SINK;
+            else if (qd_field_iterator_equal(path_iter, (unsigned char*) "waypoint"))
+                path = QDR_ROUTE_PATH_WAYPOINT;
+            else {
+                query->status = QD_AMQP_BAD_REQUEST;
+                break;
+            }
+        }
 
+        qd_address_treatment_t treatment = qdra_treatment(treatment_field);
 
-void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
-                          qdr_query_t *query, qd_parsed_field_t *in_body)
-{
-    // TODO - reject duplicate names
+        //
+        // Ask the route_control module to create the route object and put into effect any needed
+        // side effects.
+        //
+        qdr_route_config_t *route;
+        const char *error = qdr_route_create_CT(core, name, path, treatment, addr_field, route_addr_field, &route);
 
-    if (qd_parse_is_map(in_body)) {
-        qd_parsed_field_t *type_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_OBJECT_TYPE]);
-        qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
-        qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTOR]);
-        qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_DIRECTION]);
-        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
-        //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_ADDRESS]);
-        //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_ADDRESS]);
-        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_TREATMENT]);
-        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_TREATMENT]);
-
-        bool still_good = true;
-        qdr_route_t *route = new_qdr_route_t();
-        ZERO(route);
-
-        route->identity = qdr_identifier(core);
-        if (name)
-            route->name = (char*) qd_field_iterator_copy(name);
-
-        if (!type_field)
-            route->object_type = QDR_ROUTE_TYPE_ADDRESS;
-        else {
-            qd_field_iterator_t *type_iter = qd_parse_raw(type_field);
-            if      (qd_field_iterator_equal(type_iter, (unsigned char*) "address"))
-                route->object_type = QDR_ROUTE_TYPE_ADDRESS;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "linkDestination"))
-                route->object_type = QDR_ROUTE_TYPE_LINK_DEST;
-            else if (qd_field_iterator_equal(type_iter, (unsigned char*) "waypoint"))
-                route->object_type = QDR_ROUTE_TYPE_WAYPOINT;
-            else
-                still_good = false;
+        if (error) {
+            query->status.status      = 400;
+            query->status.description = error;
+            break;
         }
 
-        route->treatment = qdra_treatment(sem_field);
-
-        route->direction_in  = true;
-        route->direction_out = true;
-        if (dir_field) {
-            qd_field_iterator_t *dir_iter = qd_parse_raw(dir_field);
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "in"))
-                route->direction_out = false;
-            if (qd_field_iterator_equal(dir_iter, (unsigned char*) "out"))
-                route->direction_in = false;
+        //
+        // Add the initial list of connection labels to the route
+        //
+        if (conn_field && qd_parse_is_list(conn_field)) {
+            uint32_t count = qd_parse_sub_count(conn_field);
+            for (uint32_t i = 0; i < count; i++) {
+                qd_parsed_field_t *conn_label = qd_parse_sub_value(conn_field, i);
+                qdr_route_connection_add_CT(route, conn_label, false);
+            }
         }
 
-        if (conn_field) {
-            qd_field_iterator_t *conn_iter  = qd_parse_raw(conn_field);
-            route->connector_label = (char*) qd_field_iterator_copy(conn_iter);
+        //
+        // Add the initial list of container IDs to the route
+        //
+        if (cont_field && qd_parse_is_list(cont_field)) {
+            uint32_t count = qd_parse_sub_count(cont_field);
+            for (uint32_t i = 0; i < count; i++) {
+                qd_parsed_field_t *cont_id = qd_parse_sub_value(cont_field, i);
+                qdr_route_connection_add_CT(route, cont_id, true);
+            }
         }
 
+        /*
         switch (route->object_type) {
         case QDR_ROUTE_TYPE_ADDRESS:
             route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->treatment);
@@ -319,26 +310,30 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
         case QDR_ROUTE_TYPE_WAYPOINT:
             break;
         }
+        */
 
-        if (still_good) {
-            // TODO - write response map
-            query->status = &QD_AMQP_CREATED;
-            DEQ_INSERT_TAIL(core->routes, route);
-        } else {
-            query->status = &QD_AMQP_BAD_REQUEST;
-            if (route->name)
-                free(route->name);
-            free_qdr_route_t(route);
+        //
+        // Compose the result map for the response.
+        //
+        if (query->body) {
+            qd_compose_start_map(query->body);
+            for (int col = 0; col < QDR_ROUTE_COLUMN_COUNT; col++)
+                qdr_route_insert_column_CT(route, col, query->body, true);
+            qd_compose_end_map(query->body);
         }
+
+        query->status = QD_AMQP_CREATED;
+        break;
     }
-    else
-        query->status = &QD_AMQP_BAD_REQUEST;
 
     //
-    // Enqueue the response.
+    // Enqueue the response if there is a body. If there is no body, this is a management
+    // operation created internally by the configuration file parser.
     //
-    if (query->body)
+    if (query->body) {
+        if (query->status.status / 100 > 2)
+            qd_compose_insert_null(query->body);
         qdr_agent_enqueue_response_CT(core, query);
-    else
+    } else
         free_qdr_query_t(query);
 }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_route.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.h b/src/router_core/agent_route.h
index 86ec69c..ec8d6ba 100644
--- a/src/router_core/agent_route.h
+++ b/src/router_core/agent_route.h
@@ -28,7 +28,7 @@ void qdra_route_update_CT(qdr_core_t *core, qdr_query_t *query, qd_parsed_field_
 void qdra_route_delete_CT(qdr_core_t *core, qdr_query_t *query, qd_field_iterator_t *name,
                                 qd_field_iterator_t *identity);
 
-#define QDR_ROUTE_COLUMN_COUNT 12
+#define QDR_ROUTE_COLUMN_COUNT 9
 
 const char *qdr_route_columns[QDR_ROUTE_COLUMN_COUNT + 1];
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_waypoint.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_waypoint.c b/src/router_core/agent_waypoint.c
deleted file mode 100644
index aa5ec37..0000000
--- a/src/router_core/agent_waypoint.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "agent_waypoint.h"
-
-#define QDR_WAYPOINT_NAME         0
-#define QDR_WAYPOINT_ADDRESS      1
-#define QDR_WAYPOINT_CONNECTOR    2
-#define QDR_WAYPOINT_INPHASE      3
-#define QDR_WAYPOINT_OUTPHASE     4
-#define QDR_WAYPOINT_MODE         5
-
-#define QDR_WAYPOINT_COLUMN_COUNT  6
-
-static const char *qdr_waypoint_columns[] =
-    {"name",
-     "address",
-     "connector",
-     "inPhase",
-     "outPhase",
-     "mode",
-     0};
-
-static void qdr_insert_waypoint_columns_CT(qd_composed_field_t  *body,
-                                          int column_index)
-{
-    // TODO replace nulls with actual values.
-    switch(column_index) {
-        case QDR_WAYPOINT_NAME:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_ADDRESS:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_CONNECTOR:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_INPHASE:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_OUTPHASE:
-            qd_compose_insert_null(body);
-            break;
-
-        case QDR_WAYPOINT_MODE:
-            qd_compose_insert_null(body);  // TEMP
-            break;
-
-        default:
-            qd_compose_insert_null(body);
-            break;
-    }
-
-}
-
-static void qdr_manage_write_response_map_CT(qd_composed_field_t *body)
-{
-    qd_compose_start_map(body);
-
-    for(int i = 0; i < QDR_WAYPOINT_COLUMN_COUNT; i++) {
-        qd_compose_insert_string(body, qdr_waypoint_columns[i]);
-        qdr_insert_waypoint_columns_CT(body, i);
-    }
-
-    qd_compose_end_map(body);
-}
-
-void qdra_waypoint_create_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qdr_query_t         *query,
-                             qd_parsed_field_t   *in_body)
-{
-    // Get the map fields from the body
-    if (qd_parse_is_map(in_body)) {
-        qd_parsed_field_t *address_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[1]);
-        qd_parsed_field_t *connector_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[2]);
-        qd_parsed_field_t *inPhase_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[3]);
-        qd_parsed_field_t *outPhase_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[4]);
-        qd_parsed_field_t *mode_field = qd_parse_value_by_key(in_body, qdr_waypoint_columns[5]);
-
-        if ( address_field   &&
-             connector_field &&
-             inPhase_field   &&
-             outPhase_field  &&
-             mode_field) {
-            // TODO - Add code here that would actually create a waypoint.
-            // If the request was successful then the statusCode MUST be 201 (Created) and the body of the message
-            // MUST consist an amqp-value section that contains a Map containing the actual attributes of the entity created
-            qdr_manage_write_response_map_CT(query->body);
-            query->status = &QD_AMQP_CREATED;
-        }
-        else {
-            query->status = &QD_AMQP_BAD_REQUEST;
-        }
-    }
-    else {
-        query->status = &QD_AMQP_BAD_REQUEST;
-    }
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-
-
-}
-
-void qdra_waypoint_delete_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qd_field_iterator_t *identity,
-                             qdr_query_t          *query)
-{
-    bool success = true;
-
-    if (identity) {//If there is identity, ignore the name
-       //TOOD - do something here
-    }
-    else if (name) {
-       //TOOD - do something here
-    }
-    else {
-        query->status = &QD_AMQP_BAD_REQUEST;
-        success = false;
-    }
-
-
-    // TODO - Add more logic here.
-    if (success) {
-        // If the request was successful then the statusCode MUST be 204 (No Content).
-        query->status = &QD_AMQP_NO_CONTENT;
-    }
-
-    //
-    // Enqueue the response.
-    //
-    qdr_agent_enqueue_response_CT(core, query);
-}
-
-
-void qdra_waypoint_update_CT(qdr_core_t *core, qd_field_iterator_t *name, qdr_query_t *query)
-{
-
-}
-
-

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/agent_waypoint.h
----------------------------------------------------------------------
diff --git a/src/router_core/agent_waypoint.h b/src/router_core/agent_waypoint.h
deleted file mode 100644
index 7abc38f..0000000
--- a/src/router_core/agent_waypoint.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef qdr_agent_waypoint
-#define qdr_agent_waypoint 1
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-#include "router_core_private.h"
-
-void qdra_waypoint_create_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qdr_query_t         *query,
-                             qd_parsed_field_t   *in_body);
-
-void qdra_waypoint_delete_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qd_field_iterator_t *identity,
-                             qdr_query_t          *query);
-
-
-void qdra_waypoint_update_CT(qdr_core_t          *core,
-                             qd_field_iterator_t *name,
-                             qdr_query_t         *query);
-
-#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 40e2aaf..37876d4 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -76,7 +76,6 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
     conn->user_context          = 0;
     conn->incoming              = incoming;
     conn->role                  = role;
-    conn->label                 = label;
     conn->strip_annotations_in  = strip_annotations_in;
     conn->strip_annotations_out = strip_annotations_out;
     conn->mask_bit              = -1;
@@ -84,7 +83,8 @@ qdr_connection_t *qdr_connection_opened(qdr_core_t            *core,
     DEQ_INIT(conn->work_list);
     conn->work_lock = sys_mutex();
 
-    action->args.connection.conn = conn;
+    action->args.connection.conn  = conn;
+    action->args.connection.label = label;
     qdr_action_enqueue(core, action);
 
     return conn;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/management_agent.c
----------------------------------------------------------------------
diff --git a/src/router_core/management_agent.c b/src/router_core/management_agent.c
index e8823b4..2ad0249 100644
--- a/src/router_core/management_agent.c
+++ b/src/router_core/management_agent.c
@@ -52,11 +52,14 @@ const char * const status_code = "statusCode";
 const char * MANAGEMENT_INTERNAL = "_local/$_management_internal";
 
 //TODO - Move these to amqp.h
-const unsigned char *MANAGEMENT_QUERY = (unsigned char*) "QUERY";
-const unsigned char *MANAGEMENT_CREATE = (unsigned char*) "CREATE";
-const unsigned char *MANAGEMENT_READ = (unsigned char*) "READ";
-const unsigned char *MANAGEMENT_UPDATE = (unsigned char*) "UPDATE";
-const unsigned char *MANAGEMENT_DELETE = (unsigned char*) "DELETE";
+const unsigned char *MANAGEMENT_QUERY                  = (unsigned char*) "QUERY";
+const unsigned char *MANAGEMENT_CREATE                 = (unsigned char*) "CREATE";
+const unsigned char *MANAGEMENT_READ                   = (unsigned char*) "READ";
+const unsigned char *MANAGEMENT_UPDATE                 = (unsigned char*) "UPDATE";
+const unsigned char *MANAGEMENT_DELETE                 = (unsigned char*) "DELETE";
+const unsigned char *MANAGEMENT_ADD_CONTAINER          = (unsigned char*) "ADD-CONTAINER";
+const unsigned char *MANAGEMENT_REMOVE_CONTAINER_CLEAN = (unsigned char*) "REMOVE-CONTAINER-CLEAN";
+const unsigned char *MANAGEMENT_REMOVE_CONTAINER_HARD  = (unsigned char*) "REMOVE-CONTAINER-HARD";
 
 
 typedef enum {
@@ -65,6 +68,9 @@ typedef enum {
     QD_ROUTER_OPERATION_READ,
     QD_ROUTER_OPERATION_UPDATE,
     QD_ROUTER_OPERATION_DELETE,
+    QD_ROUTER_OPERATION_ADD_CONTAINER,
+    QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN,
+    QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD
 } qd_router_operation_type_t;
 
 
@@ -153,7 +159,7 @@ static void qd_manage_response_handler(void *context, const qd_amqp_error_t *sta
     qd_management_context_t *ctx = (qd_management_context_t*) context;
 
     if (ctx->operation_type == QD_ROUTER_OPERATION_QUERY) {
-        if (status == &QD_AMQP_OK) { // There is no error, proceed to conditionally call get_next
+        if (status->status / 100 == 2) { // There is no error, proceed to conditionally call get_next
             if (more) {
                //If there are no more rows to process or the status returned is something other than
                // QD_AMQP_OK, we will close the list, send the message and
@@ -356,8 +362,6 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         *entity_type = QD_ROUTER_ADDRESS;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), link_entity_type))
         *entity_type = QD_ROUTER_LINK;
-    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), waypoint_entity_type))
-        *entity_type = QD_ROUTER_WAYPOINT;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), route_entity_type))
         *entity_type = QD_ROUTER_ROUTE;
     else
@@ -379,6 +383,12 @@ static bool qd_can_handle_request(qd_field_iterator_t         *props,
         (*operation_type) = QD_ROUTER_OPERATION_UPDATE;
     else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_DELETE))
         (*operation_type) = QD_ROUTER_OPERATION_DELETE;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_ADD_CONTAINER) && *entity_type == QD_ROUTER_ROUTE)
+        (*operation_type) = QD_ROUTER_OPERATION_ADD_CONTAINER;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_REMOVE_CONTAINER_CLEAN) && *entity_type == QD_ROUTER_ROUTE)
+        (*operation_type) = QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN;
+    else if (qd_field_iterator_equal(qd_parse_raw(parsed_field), MANAGEMENT_REMOVE_CONTAINER_HARD) && *entity_type == QD_ROUTER_ROUTE)
+        (*operation_type) = QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD;
     else
         // This is an unknown operation type. cannot be handled, return false.
         return false;
@@ -423,22 +433,26 @@ void qdr_management_agent_on_message(void *context, qd_message_t *msg, int unuse
 
     if (qd_can_handle_request(app_properties_iter, &entity_type, &operation_type, &identity_iter, &name_iter, &count, &offset)) {
         switch (operation_type) {
-            case QD_ROUTER_OPERATION_QUERY:
-                qd_core_agent_query_handler(core, entity_type, operation_type, msg, &count, &offset);
-                break;
-            case QD_ROUTER_OPERATION_CREATE:
-                qd_core_agent_create_handler(core, msg, entity_type, operation_type, name_iter);
-                break;
-            case QD_ROUTER_OPERATION_READ:
-                qd_core_agent_read_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
-                break;
-            case QD_ROUTER_OPERATION_UPDATE:
-                qd_core_agent_update_handler();
-                break;
-            case QD_ROUTER_OPERATION_DELETE:
-                qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
-                break;
-       }
+        case QD_ROUTER_OPERATION_QUERY:
+            qd_core_agent_query_handler(core, entity_type, operation_type, msg, &count, &offset);
+            break;
+        case QD_ROUTER_OPERATION_CREATE:
+            qd_core_agent_create_handler(core, msg, entity_type, operation_type, name_iter);
+            break;
+        case QD_ROUTER_OPERATION_READ:
+            qd_core_agent_read_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
+            break;
+        case QD_ROUTER_OPERATION_UPDATE:
+            qd_core_agent_update_handler();
+            break;
+        case QD_ROUTER_OPERATION_DELETE:
+            qd_core_agent_delete_handler(core, msg, entity_type, operation_type, identity_iter, name_iter);
+            break;
+        case QD_ROUTER_OPERATION_ADD_CONTAINER:
+        case QD_ROUTER_OPERATION_REMOVE_CONTAINER_CLEAN:
+        case QD_ROUTER_OPERATION_REMOVE_CONTAINER_HARD:
+            break;
+        }
     } else {
         //
         // The C management agent is not going to handle this request. Forward it off to Python.

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/route_control.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.c b/src/router_core/route_control.c
new file mode 100644
index 0000000..634c1d2
--- /dev/null
+++ b/src/router_core/route_control.c
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "route_control.h"
+
+ALLOC_DEFINE(qdr_route_active_t);
+ALLOC_DEFINE(qdr_route_config_t);
+ALLOC_DEFINE(qdr_conn_identifier_t);
+
+
+
+static const char *qdr_configure_address_prefix_CT(qdr_core_t              *core,
+                                                   qd_parsed_field_t       *addr_field,
+                                                   char                     cls,
+                                                   qd_address_treatment_t   treatment,
+                                                   qdr_address_config_t   **_addr)
+{
+    if (!addr_field)
+        return "Missing address field";
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_config_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr)
+        return "Address prefix conflicts with existing prefix";
+
+    addr = new_qdr_address_config_t();
+    DEQ_ITEM_INIT(addr);
+    addr->treatment = treatment;
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addr_config, addr);
+    }
+
+    *_addr = addr;
+    return 0;
+}
+
+/*
+static const char *qdr_configure_address_CT(qdr_core_t              *core,
+                                            qd_parsed_field_t       *addr_field,
+                                            char                     cls,
+                                            qd_address_treatment_t   treatment,
+                                            qdr_address_t          **_addr)
+{
+    if (!addr_field)
+        return "Missing address field";
+
+    qd_field_iterator_t *iter = qd_parse_raw(addr_field);
+    qd_address_iterator_override_prefix(iter, cls);
+    qd_address_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+
+    qdr_address_t *addr = 0;
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (addr)
+        return "Address conflicts with existing address";
+
+    addr = qdr_address_CT(core, treatment);
+
+    if (!!addr) {
+        qd_field_iterator_reset(iter);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addrs, addr);
+    }
+
+    *_addr = addr;
+    return 0;
+}
+*/
+
+const char *qdr_route_create_CT(qdr_core_t             *core,
+                                qd_field_iterator_t    *name,
+                                qdr_route_path_t        path,
+                                qd_address_treatment_t  treatment,
+                                qd_parsed_field_t      *addr_field,
+                                qd_parsed_field_t      *route_addr_field,
+                                qdr_route_config_t    **_route)
+{
+    const char *error = 0;
+
+    qdr_route_config_t *route = new_qdr_route_config_t();
+    ZERO(route);
+
+    if (name)
+        route->name = (char*) qd_field_iterator_copy(name);
+    route->identity  = qdr_identifier(core);
+    route->path      = path;
+    route->treatment = treatment;
+
+    switch (path) {
+    case QDR_ROUTE_PATH_DIRECT:
+        error = qdr_configure_address_prefix_CT(core, addr_field, 'Z', treatment, &route->addr_config);
+        break;
+
+    case QDR_ROUTE_PATH_SOURCE:
+    case QDR_ROUTE_PATH_SINK:
+    case QDR_ROUTE_PATH_WAYPOINT:
+        break;
+    }
+
+    if (error) {
+        if (route->name) free(route->name);
+        free_qdr_route_config_t(route);
+    } else {
+        DEQ_INSERT_TAIL(core->route_config, route);
+        *_route = route;
+    }
+
+    return error;
+}
+
+
+void qdr_route_delete_CT(qdr_route_config_t *route)
+{
+}
+
+
+void qdr_route_connection_add_CT(qdr_route_config_t *route,
+                                 qd_parsed_field_t  *conn_id,
+                                 bool                is_container)
+{
+}
+
+
+void qdr_route_connection_delete_CT(qdr_route_config_t *route,
+                                    qd_parsed_field_t  *conn_id,
+                                    bool                is_container)
+{
+}
+
+
+void qdr_route_connection_kill_CT(qdr_route_config_t *route,
+                                  qd_parsed_field_t  *conn_id,
+                                  bool                is_container)
+{
+}
+
+
+void qdr_route_connection_opened_CT(qdr_core_t *core, qdr_connection_t *conn)
+{
+}
+
+
+void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn)
+{
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/route_control.h
----------------------------------------------------------------------
diff --git a/src/router_core/route_control.h b/src/router_core/route_control.h
new file mode 100644
index 0000000..7e86721
--- /dev/null
+++ b/src/router_core/route_control.h
@@ -0,0 +1,50 @@
+#ifndef qd_router_core_route_control
+#define qd_router_core_route_control 1
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "router_core_private.h"
+
+const char *qdr_route_create_CT(qdr_core_t             *core,
+                                qd_field_iterator_t    *name,
+                                qdr_route_path_t        path,
+                                qd_address_treatment_t  treatment,
+                                qd_parsed_field_t      *addr_field,
+                                qd_parsed_field_t      *route_addr_field,
+                                qdr_route_config_t    **route);
+
+void qdr_route_delete_CT(qdr_route_config_t *route);
+
+void qdr_route_connection_add_CT(qdr_route_config_t *route,
+                                 qd_parsed_field_t  *conn_id,
+                                 bool                is_container);
+
+void qdr_route_connection_delete_CT(qdr_route_config_t *route,
+                                    qd_parsed_field_t  *conn_id,
+                                    bool                is_container);
+
+void qdr_route_connection_kill_CT(qdr_route_config_t *route,
+                                  qd_parsed_field_t  *conn_id,
+                                  bool                is_container);
+
+void qdr_route_connection_opened_CT(qdr_core_t *core, qdr_connection_t *conn);
+
+void qdr_route_connection_closed_CT(qdr_core_t *core, qdr_connection_t *conn);
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index db139a9..0529a84 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -171,7 +171,8 @@ void qdr_route_table_setup_CT(qdr_core_t *core)
 {
     DEQ_INIT(core->addrs);
     DEQ_INIT(core->routers);
-    core->addr_hash = qd_hash(10, 32, 0);
+    core->addr_hash    = qd_hash(12, 32, 0);
+    core->conn_id_hash = qd_hash(6, 4, 0);
 
     if (core->router_mode == QD_ROUTER_MODE_INTERIOR) {
         core->hello_addr      = qdr_add_local_address_CT(core, 'L', "qdhello",     QD_TREATMENT_MULTICAST_FLOOD);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index d4a937d..4603555 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -30,7 +30,6 @@ ALLOC_DEFINE(qdr_link_t);
 ALLOC_DEFINE(qdr_router_ref_t);
 ALLOC_DEFINE(qdr_link_ref_t);
 ALLOC_DEFINE(qdr_general_work_t);
-ALLOC_DEFINE(qdr_route_t);
 
 static void qdr_general_handler(void *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/dc675a38/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 8dc2fac..e58e31d 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -33,7 +33,9 @@ typedef struct qdr_link_ref_t        qdr_link_ref_t;
 typedef struct qdr_lrp_t             qdr_lrp_t;
 typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
-typedef struct qdr_route_t           qdr_route_t;
+typedef struct qdr_route_config_t    qdr_route_config_t;
+typedef struct qdr_route_active_t    qdr_route_active_t;
+typedef struct qdr_conn_identifier_t qdr_conn_identifier_t;
 
 qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
@@ -81,6 +83,7 @@ struct qdr_action_t {
         //
         struct {
             qdr_connection_t *conn;
+            const char       *label;
             qdr_link_t       *link;
             qdr_delivery_t   *delivery;
             qd_message_t     *msg;
@@ -147,7 +150,7 @@ struct qdr_query_t {
     qdr_field_t             *next_key;
     int                      next_offset;
     bool                     more;
-    const qd_amqp_error_t   *status;
+    qd_amqp_error_t          status;
 };
 
 ALLOC_DECLARE(qdr_query_t);
@@ -383,7 +386,7 @@ struct qdr_connection_t {
     void                       *user_context;
     bool                        incoming;
     qdr_connection_role_t       role;
-    const char                 *label;
+    qdr_conn_identifier_t      *conn_id;
     bool                        strip_annotations_in;
     bool                        strip_annotations_out;
     int                         mask_bit;
@@ -398,30 +401,55 @@ ALLOC_DECLARE(qdr_connection_t);
 DEQ_DECLARE(qdr_connection_t, qdr_connection_list_t);
 
 typedef enum {
-    QDR_ROUTE_TYPE_ADDRESS,
-    QDR_ROUTE_TYPE_LINK_DEST,
-    QDR_ROUTE_TYPE_WAYPOINT
-} qdr_route_type_t;
-
-struct qdr_route_t {
-    DEQ_LINKS(qdr_route_t);
-    char                   *name;
-    uint64_t                identity;
-    qdr_route_type_t        object_type;
-    qdr_address_config_t   *addr_config;
-    qdr_address_t          *addr;
-    qdr_address_t          *ingress_addr;
-    qdr_address_t          *egress_addr;
-    bool                    direction_in;
-    bool                    direction_out;
-    qd_address_treatment_t  treatment;
-    qd_address_treatment_t  ingress_treatment;
-    qd_address_treatment_t  egress_treatment;
-    char                   *connector_label;
+    QDR_ROUTE_PATH_DIRECT,
+    QDR_ROUTE_PATH_SOURCE,
+    QDR_ROUTE_PATH_SINK,
+    QDR_ROUTE_PATH_WAYPOINT
+} qdr_route_path_t;
+
+typedef enum {
+    QDR_ROUTE_STATE_DOWN,
+    QDR_ROUTE_STATE_UP,
+    QDR_ROUTE_STATE_QUIESCING
+} qdr_route_state_t;
+
+struct qdr_route_active_t {
+    DEQ_LINKS(qdr_route_active_t);
+    DEQ_LINKS_N(REF, qdr_route_active_t);
+    qdr_route_config_t    *config;
+    qdr_conn_identifier_t *conn_id;
+    qd_direction_t         dir;
+    qdr_route_state_t      state;
+    qdr_link_t            *link;
 };
 
-ALLOC_DECLARE(qdr_route_t);
-DEQ_DECLARE(qdr_route_t, qdr_route_list_t);
+ALLOC_DECLARE(qdr_route_active_t);
+DEQ_DECLARE(qdr_route_active_t, qdr_route_active_list_t);
+
+struct qdr_route_config_t {
+    DEQ_LINKS(qdr_route_config_t);
+    char                    *name;
+    uint64_t                 identity;
+    qdr_route_path_t         path;
+    qdr_address_config_t    *addr_config;
+    qdr_address_t           *addr;
+    qdr_address_t           *ingress_addr;
+    qdr_address_t           *egress_addr;
+    qd_address_treatment_t   treatment;
+
+    qdr_route_active_list_t  active_list;
+};
+
+ALLOC_DECLARE(qdr_route_config_t);
+DEQ_DECLARE(qdr_route_config_t, qdr_route_config_list_t);
+
+struct qdr_conn_identifier_t {
+    qd_hash_handle_t        *hash_handle;
+    qdr_connection_t        *open_connection;
+    qdr_route_active_list_t  active_refs;
+};
+
+ALLOC_DECLARE(qdr_conn_identifier_t);
 
 
 struct qdr_core_t {
@@ -437,7 +465,7 @@ struct qdr_core_t {
     qdr_general_work_list_t  work_list;
     qd_timer_t              *work_timer;
 
-    qdr_route_list_t      routes;
+    qdr_route_config_list_t  route_config;
 
     qdr_connection_list_t open_connections;
     qdr_link_list_t       open_links;
@@ -498,6 +526,8 @@ struct qdr_core_t {
     uint64_t              next_identifier;
     sys_mutex_t          *id_lock;
 
+    qd_hash_t            *conn_id_hash;
+
     qdr_forwarder_t      *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
 };
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[2/4] qpid-dispatch git commit: DISPATCH-179 - Bulk rename of "semantics" -> "treatment"

Posted by tr...@apache.org.
DISPATCH-179 - Bulk rename of "semantics" -> "treatment"


Project: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/commit/1dffeb6a
Tree: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/tree/1dffeb6a
Diff: http://git-wip-us.apache.org/repos/asf/qpid-dispatch/diff/1dffeb6a

Branch: refs/heads/tross-DISPATCH-179-1
Commit: 1dffeb6a7e3e6139d56fb88f7c34abfbff9c7635
Parents: 43e3a49
Author: Ted Ross <tr...@redhat.com>
Authored: Mon Feb 29 11:45:44 2016 -0500
Committer: Ted Ross <tr...@redhat.com>
Committed: Mon Feb 29 11:45:44 2016 -0500

----------------------------------------------------------------------
 include/qpid/dispatch/router.h                  | 20 ++++----
 include/qpid/dispatch/router_core.h             |  2 +-
 python/qpid_dispatch/management/qdrouter.json   |  6 +--
 .../qpid_dispatch_internal/management/agent.py  |  4 +-
 python/qpid_dispatch_internal/router/engine.py  | 12 ++---
 src/python_embedded.c                           | 14 +++---
 src/router_config.c                             |  2 +-
 src/router_core/DESIGN                          |  4 +-
 src/router_core/agent_address.c                 | 18 +++----
 src/router_core/agent_route.c                   | 50 ++++++++++----------
 src/router_core/connections.c                   |  8 ++--
 src/router_core/forwarder.c                     | 16 +++----
 src/router_core/route_tables.c                  | 20 ++++----
 src/router_core/router_core.c                   | 14 +++---
 src/router_core/router_core_private.h           | 20 ++++----
 src/router_forwarders.c                         | 16 +++----
 tools/qdstat                                    | 12 ++---
 17 files changed, 119 insertions(+), 119 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/include/qpid/dispatch/router.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router.h b/include/qpid/dispatch/router.h
index 499e808..f050775 100644
--- a/include/qpid/dispatch/router.h
+++ b/include/qpid/dispatch/router.h
@@ -37,12 +37,12 @@ typedef struct qd_address_t qd_address_t;
 typedef struct qd_router_delivery_t qd_router_delivery_t;
 
 typedef enum {
-    QD_SEMANTICS_MULTICAST_FLOOD  = 0,
-    QD_SEMANTICS_MULTICAST_ONCE   = 1,
-    QD_SEMANTICS_ANYCAST_CLOSEST  = 2,
-    QD_SEMANTICS_ANYCAST_BALANCED = 3,
-    QD_SEMANTICS_LINK_BALANCED    = 4
-} qd_address_semantics_t;
+    QD_TREATMENT_MULTICAST_FLOOD  = 0,
+    QD_TREATMENT_MULTICAST_ONCE   = 1,
+    QD_TREATMENT_ANYCAST_CLOSEST  = 2,
+    QD_TREATMENT_ANYCAST_BALANCED = 3,
+    QD_TREATMENT_LINK_BALANCED    = 4
+} qd_address_treatment_t;
 
 #include <qpid/dispatch/router_core.h>
 
@@ -96,17 +96,17 @@ qdr_core_t *qd_router_core(qd_dispatch_t *qd);
  * @param on_message Optional callback to be called when a message is received
  * for the address.
  * @param context Context to be passed to the on_message handler.
- * @param semantics Semantics for the address.
+ * @param treatment Treatment for the address.
  * @param global True if the address is global.
  * @param forwarder Optional custom forwarder to use when a message is received
- * for the address.  If null, a default forwarder based on the semantics will
+ * for the address.  If null, a default forwarder based on the treatment will
  * be used.
  */
 qd_address_t *qd_router_register_address(qd_dispatch_t          *qd,
                                          const char             *address,
                                          qd_router_message_cb_t  on_message,
                                          void                   *context,
-                                         qd_address_semantics_t  semantics,
+                                         qd_address_treatment_t  treatment,
                                          bool                    global,
                                          qd_router_forwarder_t  *forwarder);
 
@@ -134,7 +134,7 @@ void qd_router_build_node_list(qd_dispatch_t *qd, qd_composed_field_t *field);
 const char* qd_address_logstr(qd_address_t* address);
 
 /** Retrieve the proper forwarder for a given semantic */
-qd_router_forwarder_t *qd_router_get_forwarder(qd_address_semantics_t s);
+qd_router_forwarder_t *qd_router_get_forwarder(qd_address_treatment_t t);
 
 ///@}
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 602e67c..b38022f 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -94,7 +94,7 @@ qdr_subscription_t *qdr_core_subscribe(qdr_core_t             *core,
                                        const char             *address,
                                        char                    aclass,
                                        char                    phase,
-                                       qd_address_semantics_t  semantics,
+                                       qd_address_treatment_t  treatment,
                                        qdr_receive_t           on_message,
                                        void                   *context);
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/python/qpid_dispatch/management/qdrouter.json
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch/management/qdrouter.json b/python/qpid_dispatch/management/qdrouter.json
index dec2d82..e1ee1b7 100644
--- a/python/qpid_dispatch/management/qdrouter.json
+++ b/python/qpid_dispatch/management/qdrouter.json
@@ -732,7 +732,7 @@
         },
 
         "fixedAddress": {
-            "description":"(DEPRECATED) Establishes semantics for addresses starting with a prefix.",
+            "description":"(DEPRECATED) Establishes treatment for addresses starting with a prefix.",
             "extends": "configurationEntity",
             "operations": ["CREATE"],
             "attributes": {
@@ -928,9 +928,9 @@
             "description": "AMQP address managed by the router.",
             "extends": "operationalEntity",
             "attributes": {
-                "semantics": {
+                "treatment": {
                     "type": ["flood", "multi", "anyClosest", "anyBalanced", "linkBalanced"],
-                    "description": "Forwarding semantics for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multi - one copy of each message delivered to all subscribers; anyClosest - messages delivered to only the closest subscriber; anyBalanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations."
+                    "description": "Forwarding treatment for the address: flood - messages delivered to all subscribers along all available paths (this will cause duplicate deliveries if there are redundant paths); multi - one copy of each message delivered to all subscribers; anyClosest - messages delivered to only the closest subscriber; anyBalanced - messages delivered to one subscriber with load balanced across subscribers; linkBalanced - for link-routing, link attaches balanced across destinations."
                 },
                 "inProcess": {
                     "type": "integer",

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/python/qpid_dispatch_internal/management/agent.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/management/agent.py b/python/qpid_dispatch_internal/management/agent.py
index 4d75f8b..886157d 100644
--- a/python/qpid_dispatch_internal/management/agent.py
+++ b/python/qpid_dispatch_internal/management/agent.py
@@ -73,7 +73,7 @@ from cProfile import Profile
 from cStringIO import StringIO
 from ctypes import c_void_p, py_object, c_long
 from subprocess import Popen
-from ..dispatch import IoAdapter, LogAdapter, LOG_INFO, LOG_DEBUG, LOG_ERROR, SEMANTICS_ANYCAST_CLOSEST
+from ..dispatch import IoAdapter, LogAdapter, LOG_INFO, LOG_DEBUG, LOG_ERROR, TREATMENT_ANYCAST_CLOSEST
 from qpid_dispatch.management.error import ManagementError, OK, CREATED, NO_CONTENT, STATUS_TEXT, \
     BadRequestStatus, InternalServerErrorStatus, NotImplementedStatus, NotFoundStatus
 from qpid_dispatch.management.entity import camelcase
@@ -603,7 +603,7 @@ class Agent(object):
         """Register the management address to receive management requests"""
         self.entities.refresh_from_c()
         self.log(LOG_INFO, "Activating management agent on %s" % address)
-        self.io = IoAdapter(self.receive, address, 'L', '0', SEMANTICS_ANYCAST_CLOSEST)
+        self.io = IoAdapter(self.receive, address, 'L', '0', TREATMENT_ANYCAST_CLOSEST)
 
     def entity_class(self, entity_type):
         """Return the class that implements entity_type"""

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/python/qpid_dispatch_internal/router/engine.py
----------------------------------------------------------------------
diff --git a/python/qpid_dispatch_internal/router/engine.py b/python/qpid_dispatch_internal/router/engine.py
index b3fa1a1..8905bac 100644
--- a/python/qpid_dispatch_internal/router/engine.py
+++ b/python/qpid_dispatch_internal/router/engine.py
@@ -33,7 +33,7 @@ import time
 ## (i.e. we are in a test bench, etc.), load the stub versions.
 ##
 from ..dispatch import IoAdapter, LogAdapter, LOG_TRACE, LOG_INFO, LOG_ERROR, LOG_STACK_LIMIT
-from ..dispatch import SEMANTICS_MULTICAST_FLOOD, SEMANTICS_MULTICAST_ONCE
+from ..dispatch import TREATMENT_MULTICAST_FLOOD, TREATMENT_MULTICAST_ONCE
 
 class RouterEngine:
     """
@@ -53,11 +53,11 @@ class RouterEngine:
         self._log_ls        = LogAdapter("ROUTER_LS")
         self._log_ma        = LogAdapter("ROUTER_MA")
         self._log_general   = LogAdapter("ROUTER")
-        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', SEMANTICS_MULTICAST_FLOOD),
-                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', SEMANTICS_MULTICAST_ONCE),
-                               IoAdapter(self.receive, "qdrouter",    'T', '0', SEMANTICS_MULTICAST_FLOOD),
-                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', SEMANTICS_MULTICAST_ONCE),
-                               IoAdapter(self.receive, "qdhello",     'L', '0', SEMANTICS_MULTICAST_FLOOD)]
+        self.io_adapter     = [IoAdapter(self.receive, "qdrouter",    'L', '0', TREATMENT_MULTICAST_FLOOD),
+                               IoAdapter(self.receive, "qdrouter.ma", 'L', '0', TREATMENT_MULTICAST_ONCE),
+                               IoAdapter(self.receive, "qdrouter",    'T', '0', TREATMENT_MULTICAST_FLOOD),
+                               IoAdapter(self.receive, "qdrouter.ma", 'T', '0', TREATMENT_MULTICAST_ONCE),
+                               IoAdapter(self.receive, "qdhello",     'L', '0', TREATMENT_MULTICAST_FLOOD)]
         self.max_routers    = max_routers
         self.id             = router_id
         self.instance       = long(time.time())

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/python_embedded.c
----------------------------------------------------------------------
diff --git a/src/python_embedded.c b/src/python_embedded.c
index 669288a..d9b8069 100644
--- a/src/python_embedded.c
+++ b/src/python_embedded.c
@@ -527,8 +527,8 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
     PyObject *addr;
     char aclass    = 'L';
     char phase     = '0';
-    int  semantics = QD_SEMANTICS_ANYCAST_BALANCED;
-    if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &semantics))
+    int  treatment = QD_TREATMENT_ANYCAST_BALANCED;
+    if (!PyArg_ParseTuple(args, "OO|cci", &self->handler, &addr, &aclass, &phase, &treatment))
         return -1;
     if (!PyCallable_Check(self->handler)) {
         PyErr_SetString(PyExc_TypeError, "IoAdapter.__init__ handler is not callable");
@@ -540,7 +540,7 @@ static int IoAdapter_init(IoAdapter *self, PyObject *args, PyObject *kwds)
     const char *address = PyString_AsString(addr);
     if (!address) return -1;
     qd_error_clear();
-    self->sub = qdr_core_subscribe(self->core, address, aclass, phase, semantics, qd_io_rx_handler, self);
+    self->sub = qdr_core_subscribe(self->core, address, aclass, phase, treatment, qd_io_rx_handler, self);
     if (qd_error_code()) {
         PyErr_SetString(PyExc_RuntimeError, qd_error_message());
         return -1;
@@ -732,10 +732,10 @@ static void qd_python_setup(void)
         Py_INCREF(ioaType);
         PyModule_AddObject(m, "IoAdapter", (PyObject*) &IoAdapterType);
 
-        qd_register_constant(m, "SEMANTICS_MULTICAST_FLOOD",  QD_SEMANTICS_MULTICAST_FLOOD);
-        qd_register_constant(m, "SEMANTICS_MULTICAST_ONCE",   QD_SEMANTICS_MULTICAST_ONCE);
-        qd_register_constant(m, "SEMANTICS_ANYCAST_CLOSEST",  QD_SEMANTICS_ANYCAST_CLOSEST);
-        qd_register_constant(m, "SEMANTICS_ANYCAST_BALANCED", QD_SEMANTICS_ANYCAST_BALANCED);
+        qd_register_constant(m, "TREATMENT_MULTICAST_FLOOD",  QD_TREATMENT_MULTICAST_FLOOD);
+        qd_register_constant(m, "TREATMENT_MULTICAST_ONCE",   QD_TREATMENT_MULTICAST_ONCE);
+        qd_register_constant(m, "TREATMENT_ANYCAST_CLOSEST",  QD_TREATMENT_ANYCAST_CLOSEST);
+        qd_register_constant(m, "TREATMENT_ANYCAST_BALANCED", QD_TREATMENT_ANYCAST_BALANCED);
 
         Py_INCREF(m);
         dispatch_module = m;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_config.c
----------------------------------------------------------------------
diff --git a/src/router_config.c b/src/router_config.c
index 40453fd..8039efe 100644
--- a/src/router_config.c
+++ b/src/router_config.c
@@ -49,7 +49,7 @@ qd_error_t qd_router_configure_address(qd_router_t *router, qd_entity_t *entity)
     }
 
     //
-    // Convert fanout + bias to semantics
+    // Convert fanout + bias to treatment
     //
     const char *trt;
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/DESIGN
----------------------------------------------------------------------
diff --git a/src/router_core/DESIGN b/src/router_core/DESIGN
index 5197a2f..dde7cb4 100644
--- a/src/router_core/DESIGN
+++ b/src/router_core/DESIGN
@@ -179,10 +179,10 @@ Core APIs
 
 
 ====================
-Forwarding Semantics
+Forwarding Treatment
 ====================
 
-  Transition from fanout/bias to a one-dimensional list of semantics:
+  Transition from fanout/bias to a one-dimensional list of treatment:
 
     MULTICAST_FLOOD
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/agent_address.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_address.c b/src/router_core/agent_address.c
index 0256593..bc008ff 100644
--- a/src/router_core/agent_address.c
+++ b/src/router_core/agent_address.c
@@ -24,7 +24,7 @@
 #define QDR_ADDRESS_IDENTITY                  1
 #define QDR_ADDRESS_TYPE                      2
 #define QDR_ADDRESS_KEY                       3
-#define QDR_ADDRESS_SEMANTICS                 4
+#define QDR_ADDRESS_TREATMENT                 4
 #define QDR_ADDRESS_IN_PROCESS                5
 #define QDR_ADDRESS_SUBSCRIBER_COUNT          6
 #define QDR_ADDRESS_REMOTE_COUNT              7
@@ -40,7 +40,7 @@ const char *qdr_address_columns[] =
      "identity",
      "type",
      "key",
-     "semantics",
+     "treatment",
      "inProcess",
      "subscriberCount",
      "remoteCount",
@@ -71,13 +71,13 @@ static void qdr_insert_address_columns_CT(qdr_address_t        *addr,
         qd_compose_insert_string(body, "org.apache.qpid.dispatch.router.address");
         break;
 
-    case QDR_ADDRESS_SEMANTICS: {
-        switch (addr->semantics) {
-        case QD_SEMANTICS_MULTICAST_FLOOD:  qd_compose_insert_string(body, "flood");       break;
-        case QD_SEMANTICS_MULTICAST_ONCE:   qd_compose_insert_string(body, "multi");       break;
-        case QD_SEMANTICS_ANYCAST_CLOSEST:  qd_compose_insert_string(body, "anyClosest");  break;
-        case QD_SEMANTICS_ANYCAST_BALANCED: qd_compose_insert_string(body, "anyBalanced"); break;
-        case QD_SEMANTICS_LINK_BALANCED:    qd_compose_insert_string(body, "linkBalanced"); break;
+    case QDR_ADDRESS_TREATMENT: {
+        switch (addr->treatment) {
+        case QD_TREATMENT_MULTICAST_FLOOD:  qd_compose_insert_string(body, "flood");       break;
+        case QD_TREATMENT_MULTICAST_ONCE:   qd_compose_insert_string(body, "multi");       break;
+        case QD_TREATMENT_ANYCAST_CLOSEST:  qd_compose_insert_string(body, "anyClosest");  break;
+        case QD_TREATMENT_ANYCAST_BALANCED: qd_compose_insert_string(body, "anyBalanced"); break;
+        case QD_TREATMENT_LINK_BALANCED:    qd_compose_insert_string(body, "linkBalanced"); break;
         }
         break;
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/agent_route.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_route.c b/src/router_core/agent_route.c
index 3cd9af5..af042cd 100644
--- a/src/router_core/agent_route.c
+++ b/src/router_core/agent_route.c
@@ -27,11 +27,11 @@
 #define QDR_ROUTE_ADDRESS            4
 #define QDR_ROUTE_CONNECTOR          5
 #define QDR_ROUTE_DIRECTION          6
-#define QDR_ROUTE_SEMANTICS          7
+#define QDR_ROUTE_TREATMENT          7
 #define QDR_ROUTE_INGRESS_ADDRESS    8
 #define QDR_ROUTE_EGRESS_ADDRESS     9
-#define QDR_ROUTE_INGRESS_SEMANTICS  10
-#define QDR_ROUTE_EGRESS_SEMANTICS   11
+#define QDR_ROUTE_INGRESS_TREATMENT  10
+#define QDR_ROUTE_EGRESS_TREATMENT   11
 
 const char *qdr_route_columns[] =
     {"name",
@@ -41,11 +41,11 @@ const char *qdr_route_columns[] =
      "address",
      "connector",
      "direction",
-     "semantics",
+     "treatment",
      "ingressAddress",
      "egressAddress",
-     "ingressSemantics",
-     "egressSemantics",
+     "ingressTreatment",
+     "egressTreatment",
      0};
 
 
@@ -72,11 +72,11 @@ static void qdr_route_insert_column_CT(qdr_route_t *route, int col, qd_composed_
     case QDR_ROUTE_ADDRESS:
     case QDR_ROUTE_CONNECTOR:
     case QDR_ROUTE_DIRECTION:
-    case QDR_ROUTE_SEMANTICS:
+    case QDR_ROUTE_TREATMENT:
     case QDR_ROUTE_INGRESS_ADDRESS:
     case QDR_ROUTE_EGRESS_ADDRESS:
-    case QDR_ROUTE_INGRESS_SEMANTICS:
-    case QDR_ROUTE_EGRESS_SEMANTICS:
+    case QDR_ROUTE_INGRESS_TREATMENT:
+    case QDR_ROUTE_EGRESS_TREATMENT:
     default:
         qd_compose_insert_null(body);
         break;
@@ -177,20 +177,20 @@ void qdra_route_get_next_CT(qdr_core_t *core, qdr_query_t *query)
 }
 
 
-static qd_address_semantics_t qdra_semantics(qd_parsed_field_t *field)
+static qd_address_treatment_t qdra_treatment(qd_parsed_field_t *field)
 {
     if (field) {
         qd_field_iterator_t *iter = qd_parse_raw(field);
-        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_SEMANTICS_MULTICAST_ONCE;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_SEMANTICS_ANYCAST_CLOSEST;
-        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_SEMANTICS_ANYCAST_BALANCED;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "multi"))       return QD_TREATMENT_MULTICAST_ONCE;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyClosest"))  return QD_TREATMENT_ANYCAST_CLOSEST;
+        if (qd_field_iterator_equal(iter, (unsigned char*) "anyBalanced")) return QD_TREATMENT_ANYCAST_BALANCED;
     }
-    return QD_SEMANTICS_ANYCAST_BALANCED;
+    return QD_TREATMENT_ANYCAST_BALANCED;
 }
 
 
 static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                              qd_address_semantics_t semantics)
+                                                              qd_address_treatment_t treatment)
 {
     if (!addr_field)
         return 0;
@@ -208,7 +208,7 @@ static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core,
 
     addr = new_qdr_address_config_t();
     DEQ_ITEM_INIT(addr);
-    addr->semantics = semantics;
+    addr->treatment = treatment;
 
     if (!!addr) {
         qd_field_iterator_reset(iter);
@@ -221,7 +221,7 @@ static qdr_address_config_t *qdra_configure_address_prefix_CT(qdr_core_t *core,
 
 
 static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_field_t *addr_field, char cls,
-                                                qd_address_semantics_t semantics)
+                                                qd_address_treatment_t treatment)
 {
     if (!addr_field)
         return 0;
@@ -237,7 +237,7 @@ static qdr_address_t *qdra_configure_address_CT(qdr_core_t *core, qd_parsed_fiel
         return 0;
     }
 
-    addr = qdr_address_CT(core, semantics);
+    addr = qdr_address_CT(core, treatment);
 
     if (!!addr) {
         qd_field_iterator_reset(iter);
@@ -259,11 +259,11 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
         qd_parsed_field_t *addr_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_ADDRESS]);
         qd_parsed_field_t *conn_field     = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_CONNECTOR]);
         qd_parsed_field_t *dir_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_DIRECTION]);
-        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_SEMANTICS]);
+        qd_parsed_field_t *sem_field      = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_TREATMENT]);
         //qd_parsed_field_t *in_addr_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_ADDRESS]);
         //qd_parsed_field_t *out_addr_field = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_ADDRESS]);
-        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_SEMANTICS]);
-        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_SEMANTICS]);
+        //qd_parsed_field_t *in_sem_field   = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_INGRESS_TREATMENT]);
+        //qd_parsed_field_t *out_sem_field  = qd_parse_value_by_key(in_body, qdr_route_columns[QDR_ROUTE_EGRESS_TREATMENT]);
 
         bool still_good = true;
         qdr_route_t *route = new_qdr_route_t();
@@ -287,7 +287,7 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
                 still_good = false;
         }
 
-        route->semantics = qdra_semantics(sem_field);
+        route->treatment = qdra_treatment(sem_field);
 
         route->direction_in  = true;
         route->direction_out = true;
@@ -306,14 +306,14 @@ void qdra_route_create_CT(qdr_core_t *core, qd_field_iterator_t *name,
 
         switch (route->object_type) {
         case QDR_ROUTE_TYPE_ADDRESS:
-            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->semantics);
+            route->addr_config = qdra_configure_address_prefix_CT(core, addr_field, 'Z', route->treatment);
             break;
 
         case QDR_ROUTE_TYPE_LINK_DEST:
             if (route->direction_in)
-                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->semantics);
+                route->ingress_addr = qdra_configure_address_CT(core, addr_field, 'C', route->treatment);
             if (route->direction_out)
-                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->semantics);
+                route->egress_addr  = qdra_configure_address_CT(core, addr_field, 'D', route->treatment);
             break;
 
         case QDR_ROUTE_TYPE_WAYPOINT:

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index ab9f545..40e2aaf 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -525,7 +525,7 @@ static char qdr_prefix_for_dir(qd_direction_t dir)
 }
 
 
-static qd_address_semantics_t qdr_semantics_for_address(qdr_core_t *core, qd_field_iterator_t *iter)
+static qd_address_treatment_t qdr_treatment_for_address(qdr_core_t *core, qd_field_iterator_t *iter)
 {
     qdr_address_config_t *addr = 0;
 
@@ -536,7 +536,7 @@ static qd_address_semantics_t qdr_semantics_for_address(qdr_core_t *core, qd_fie
     qd_address_iterator_override_prefix(iter, 'Z');
     qd_hash_retrieve_prefix(core->addr_hash, iter, (void**) &addr);
     qd_address_iterator_override_prefix(iter, '\0');
-    return addr ? addr->semantics : QD_SEMANTICS_ANYCAST_CLOSEST;
+    return addr ? addr->treatment : QD_TREATMENT_ANYCAST_CLOSEST;
 }
 
 
@@ -639,7 +639,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
             qd_field_iterator_t *temp_iter = qd_address_iterator_string(temp_addr, ITER_VIEW_ADDRESS_HASH);
             qd_hash_retrieve(core->addr_hash, temp_iter, (void**) &addr);
             if (!addr) {
-                addr = qdr_address_CT(core, QD_SEMANTICS_ANYCAST_CLOSEST);
+                addr = qdr_address_CT(core, QD_TREATMENT_ANYCAST_CLOSEST);
                 qd_hash_insert(core->addr_hash, temp_iter, addr, &addr->hash_handle);
                 DEQ_INSERT_TAIL(core->addrs, addr);
                 qdr_terminus_set_address(terminus, temp_addr);
@@ -675,7 +675,7 @@ static qdr_address_t *qdr_lookup_terminus_address_CT(qdr_core_t     *core,
     qd_address_iterator_override_prefix(iter, '\0'); // Cancel previous override
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr && create_if_not_found) {
-        qd_address_semantics_t sem = qdr_semantics_for_address(core, iter);
+        qd_address_treatment_t sem = qdr_treatment_for_address(core, iter);
         addr = qdr_address_CT(core, sem);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/forwarder.c
----------------------------------------------------------------------
diff --git a/src/router_core/forwarder.c b/src/router_core/forwarder.c
index fc3f4c1..678fc5d 100644
--- a/src/router_core/forwarder.c
+++ b/src/router_core/forwarder.c
@@ -367,22 +367,22 @@ void qdr_forwarder_setup_CT(qdr_core_t *core)
     //
     // Create message forwarders
     //
-    core->forwarders[QD_SEMANTICS_MULTICAST_FLOOD]  = qdr_new_forwarder(qdr_forward_multicast_CT, 0, true);
-    core->forwarders[QD_SEMANTICS_MULTICAST_ONCE]   = qdr_new_forwarder(qdr_forward_multicast_CT, 0, false);
-    core->forwarders[QD_SEMANTICS_ANYCAST_CLOSEST]  = qdr_new_forwarder(qdr_forward_closest_CT,   0, false);
-    core->forwarders[QD_SEMANTICS_ANYCAST_BALANCED] = qdr_new_forwarder(qdr_forward_balanced_CT,  0, false);
+    core->forwarders[QD_TREATMENT_MULTICAST_FLOOD]  = qdr_new_forwarder(qdr_forward_multicast_CT, 0, true);
+    core->forwarders[QD_TREATMENT_MULTICAST_ONCE]   = qdr_new_forwarder(qdr_forward_multicast_CT, 0, false);
+    core->forwarders[QD_TREATMENT_ANYCAST_CLOSEST]  = qdr_new_forwarder(qdr_forward_closest_CT,   0, false);
+    core->forwarders[QD_TREATMENT_ANYCAST_BALANCED] = qdr_new_forwarder(qdr_forward_balanced_CT,  0, false);
 
     //
     // Create link forwarders
     //
-    core->forwarders[QD_SEMANTICS_LINK_BALANCED] = qdr_new_forwarder(0, qdr_forward_link_balanced_CT, false);
+    core->forwarders[QD_TREATMENT_LINK_BALANCED] = qdr_new_forwarder(0, qdr_forward_link_balanced_CT, false);
 }
 
 
-qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_semantics_t semantics)
+qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment)
 {
-    if (semantics <= QD_SEMANTICS_LINK_BALANCED)
-        return core->forwarders[semantics];
+    if (treatment <= QD_TREATMENT_LINK_BALANCED)
+        return core->forwarders[treatment];
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index cbd0a11..db139a9 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -131,7 +131,7 @@ qdr_subscription_t *qdr_core_subscribe(qdr_core_t             *core,
                                        const char             *address,
                                        char                    aclass,
                                        char                    phase,
-                                       qd_address_semantics_t  semantics,
+                                       qd_address_treatment_t  treatment,
                                        qdr_receive_t           on_message,
                                        void                   *context)
 {
@@ -146,7 +146,7 @@ qdr_subscription_t *qdr_core_subscribe(qdr_core_t             *core,
     action->args.io.address_class = aclass;
     action->args.io.address_phase = phase;
     action->args.io.subscription  = sub;
-    action->args.io.semantics     = semantics;
+    action->args.io.treatment     = treatment;
     qdr_action_enqueue(core, action);
 
     return sub;
@@ -174,11 +174,11 @@ void qdr_route_table_setup_CT(qdr_core_t *core)
     core->addr_hash = qd_hash(10, 32, 0);
 
     if (core->router_mode == QD_ROUTER_MODE_INTERIOR) {
-        core->hello_addr      = qdr_add_local_address_CT(core, 'L', "qdhello",     QD_SEMANTICS_MULTICAST_FLOOD);
-        core->router_addr_L   = qdr_add_local_address_CT(core, 'L', "qdrouter",    QD_SEMANTICS_MULTICAST_FLOOD);
-        core->routerma_addr_L = qdr_add_local_address_CT(core, 'L', "qdrouter.ma", QD_SEMANTICS_MULTICAST_ONCE);
-        core->router_addr_T   = qdr_add_local_address_CT(core, 'T', "qdrouter",    QD_SEMANTICS_MULTICAST_FLOOD);
-        core->routerma_addr_T = qdr_add_local_address_CT(core, 'T', "qdrouter.ma", QD_SEMANTICS_MULTICAST_ONCE);
+        core->hello_addr      = qdr_add_local_address_CT(core, 'L', "qdhello",     QD_TREATMENT_MULTICAST_FLOOD);
+        core->router_addr_L   = qdr_add_local_address_CT(core, 'L', "qdrouter",    QD_TREATMENT_MULTICAST_FLOOD);
+        core->routerma_addr_L = qdr_add_local_address_CT(core, 'L', "qdrouter.ma", QD_TREATMENT_MULTICAST_ONCE);
+        core->router_addr_T   = qdr_add_local_address_CT(core, 'T', "qdrouter",    QD_TREATMENT_MULTICAST_FLOOD);
+        core->routerma_addr_T = qdr_add_local_address_CT(core, 'T', "qdrouter.ma", QD_TREATMENT_MULTICAST_ONCE);
 
         core->neighbor_free_mask = qd_bitmask(1);
 
@@ -235,7 +235,7 @@ static void qdr_add_router_CT(qdr_core_t *core, qdr_action_t *action, bool disca
         // This record will be found whenever a "foreign" topological address to this
         // remote router is looked up.
         //
-        addr = qdr_address_CT(core, QD_SEMANTICS_ANYCAST_CLOSEST);
+        addr = qdr_address_CT(core, QD_TREATMENT_ANYCAST_CLOSEST);
         qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
         DEQ_INSERT_TAIL(core->addrs, addr);
 
@@ -500,7 +500,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 - Semantics
+            addr = qdr_address_CT(core, 0); // FIXME - Treatment
             qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
             DEQ_ITEM_INIT(addr);
             DEQ_INSERT_TAIL(core->addrs, addr);
@@ -586,7 +586,7 @@ static void qdr_subscribe_CT(qdr_core_t *core, qdr_action_t *action, bool discar
 
         qd_hash_retrieve(core->addr_hash, address->iterator, (void**) &addr);
         if (!addr) {
-            addr = qdr_address_CT(core, action->args.io.semantics);
+            addr = qdr_address_CT(core, action->args.io.treatment);
             qd_hash_insert(core->addr_hash, address->iterator, 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/1dffeb6a/src/router_core/router_core.c
----------------------------------------------------------------------
diff --git a/src/router_core/router_core.c b/src/router_core/router_core.c
index 82f3408..d4a937d 100644
--- a/src/router_core/router_core.c
+++ b/src/router_core/router_core.c
@@ -76,10 +76,10 @@ qdr_core_t *qdr_core(qd_dispatch_t *qd, qd_router_mode_t mode, const char *area,
     // Perform outside-of-thread setup for the management agent
     //
     core->agent_subscription_mobile = qdr_core_subscribe(core, "$management", 'M', '0',
-                                                         QD_SEMANTICS_ANYCAST_CLOSEST,
+                                                         QD_TREATMENT_ANYCAST_CLOSEST,
                                                          qdr_management_agent_on_message, core);
     core->agent_subscription_local = qdr_core_subscribe(core, "$management", 'L', '0',
-                                                        QD_SEMANTICS_ANYCAST_CLOSEST,
+                                                        QD_TREATMENT_ANYCAST_CLOSEST,
                                                         qdr_management_agent_on_message, core);
 
     return core;
@@ -206,18 +206,18 @@ void qdr_action_enqueue(qdr_core_t *core, qdr_action_t *action)
 }
 
 
-qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_semantics_t semantics)
+qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_treatment_t treatment)
 {
     qdr_address_t *addr = new_qdr_address_t();
     ZERO(addr);
-    addr->semantics = semantics;
-    addr->forwarder = qdr_forwarder_CT(core, semantics);
+    addr->treatment = treatment;
+    addr->forwarder = qdr_forwarder_CT(core, treatment);
     addr->rnodes    = qd_bitmask(0);
     return addr;
 }
 
 
-qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *address, qd_address_semantics_t semantics)
+qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *address, qd_address_treatment_t treatment)
 {
     char                 addr_string[1000];
     qdr_address_t       *addr = 0;
@@ -228,7 +228,7 @@ qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const cha
 
     qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
     if (!addr) {
-        addr = qdr_address_CT(core, semantics);
+        addr = qdr_address_CT(core, treatment);
         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/1dffeb6a/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 c6307d3..8dc2fac 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -35,7 +35,7 @@ typedef struct qdr_lrp_ref_t         qdr_lrp_ref_t;
 typedef struct qdr_forwarder_t       qdr_forwarder_t;
 typedef struct qdr_route_t           qdr_route_t;
 
-qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_semantics_t semantics);
+qdr_forwarder_t *qdr_forwarder_CT(qdr_core_t *core, qd_address_treatment_t treatment);
 int qdr_forward_message_CT(qdr_core_t *core, qdr_address_t *addr, qd_message_t *msg, qdr_delivery_t *in_delivery,
                            bool exclude_inprocess, bool control, qd_bitmask_t *link_exclusion);
 void qdr_forward_attach_CT(qdr_core_t *core, qdr_forwarder_t *forwarder, qdr_link_t *in_link);
@@ -110,7 +110,7 @@ struct qdr_action_t {
             qdr_field_t            *address;
             char                    address_class;
             char                    address_phase;
-            qd_address_semantics_t  semantics;
+            qd_address_treatment_t  treatment;
             qdr_subscription_t     *subscription;
             qd_message_t           *message;
             bool                    exclude_inprocess;
@@ -287,7 +287,7 @@ struct qdr_address_t {
     qdr_link_ref_list_t      inlinks;       ///< Locally-Connected Producers
     qd_bitmask_t            *rnodes;        ///< Bitmask of remote routers with connected consumers
     qd_hash_handle_t        *hash_handle;   ///< Linkage back to the hash table entry
-    qd_address_semantics_t   semantics;
+    qd_address_treatment_t   treatment;
     qdr_forwarder_t         *forwarder;
     bool                     toggle;
     bool                     waypoint;
@@ -307,8 +307,8 @@ struct qdr_address_t {
 ALLOC_DECLARE(qdr_address_t);
 DEQ_DECLARE(qdr_address_t, qdr_address_list_t);
 
-qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_semantics_t semantics);
-qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *addr, qd_address_semantics_t semantics);
+qdr_address_t *qdr_address_CT(qdr_core_t *core, qd_address_treatment_t treatment);
+qdr_address_t *qdr_add_local_address_CT(qdr_core_t *core, char aclass, const char *addr, qd_address_treatment_t treatment);
 
 void qdr_add_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
 void qdr_del_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
@@ -316,7 +316,7 @@ void qdr_del_node_ref(qdr_router_ref_list_t *ref_list, qdr_node_t *rnode);
 struct qdr_address_config_t {
     DEQ_LINKS(qdr_address_config_t);
     qd_hash_handle_t       *hash_handle;
-    qd_address_semantics_t  semantics;
+    qd_address_treatment_t  treatment;
 };
 
 ALLOC_DECLARE(qdr_address_config_t);
@@ -414,9 +414,9 @@ struct qdr_route_t {
     qdr_address_t          *egress_addr;
     bool                    direction_in;
     bool                    direction_out;
-    qd_address_semantics_t  semantics;
-    qd_address_semantics_t  ingress_semantics;
-    qd_address_semantics_t  egress_semantics;
+    qd_address_treatment_t  treatment;
+    qd_address_treatment_t  ingress_treatment;
+    qd_address_treatment_t  egress_treatment;
     char                   *connector_label;
 };
 
@@ -498,7 +498,7 @@ struct qdr_core_t {
     uint64_t              next_identifier;
     sys_mutex_t          *id_lock;
 
-    qdr_forwarder_t      *forwarders[QD_SEMANTICS_LINK_BALANCED + 1];
+    qdr_forwarder_t      *forwarders[QD_TREATMENT_LINK_BALANCED + 1];
 };
 
 typedef enum {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/src/router_forwarders.c
----------------------------------------------------------------------
diff --git a/src/router_forwarders.c b/src/router_forwarders.c
index 5c6fe37..db686fe 100644
--- a/src/router_forwarders.c
+++ b/src/router_forwarders.c
@@ -19,7 +19,7 @@
 
 #include "dispatch_private.h"
 
-/** defines a default set of forwarding behaviors based on the semantics of an
+/** defines a default set of forwarding behaviors based on the treatment of an
  * address.
  */
 
@@ -51,7 +51,7 @@ static void forward_to_direct_subscribers_LH(qd_address_t *addr,
         //
         // If the fanout is single, exit the loop here.  We only want to send one message copy.
         //
-        if (QD_FANOUT(addr->semantics) == QD_FANOUT_SINGLE)
+        if (QD_FANOUT(addr->treatment) == QD_FANOUT_SINGLE)
             break;
 
         dest_link_ref = DEQ_NEXT(dest_link_ref);
@@ -83,7 +83,7 @@ static void forward_to_remote_subscribers_LH(qd_router_t *router,
     // candidate destination router.
     //
     int origin = -1;
-    if (ingress_iter && !(addr->semantics & QD_BYPASS_VALID_ORIGINS)) {
+    if (ingress_iter && !(addr->treatment & QD_BYPASS_VALID_ORIGINS)) {
         qd_address_iterator_reset_view(ingress_iter, ITER_VIEW_NODE_HASH);
         qd_address_t *origin_addr;
         qd_hash_retrieve(router->addr_hash, ingress_iter, (void*) &origin_addr);
@@ -257,22 +257,22 @@ static qd_router_forwarder_t anycast_balanced_forwarder = {
 };
 
 
-/** Get the proper default forwarder for an address of the given semantics:
+/** Get the proper default forwarder for an address of the given treatment:
  */
-qd_router_forwarder_t *qd_router_get_forwarder(qd_address_semantics_t semantics)
+qd_router_forwarder_t *qd_router_get_forwarder(qd_address_treatment_t treatment)
 {
-    switch (QD_FANOUT(semantics)) {
+    switch (QD_FANOUT(treatment)) {
     case QD_FANOUT_MULTIPLE:
         return &multicast_forwarder;
     case QD_FANOUT_SINGLE:
-        switch (QD_BIAS(semantics)) {
+        switch (QD_BIAS(treatment)) {
         case QD_BIAS_CLOSEST:
             return &anycast_closest_forwarder;
         case QD_BIAS_SPREAD:
             return &anycast_balanced_forwarder;
         }
     }
-    assert(false);  // invalid semantics? need new forwarder?
+    assert(false);  // invalid treatment? need new forwarder?
     return 0;
 }
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/1dffeb6a/tools/qdstat
----------------------------------------------------------------------
diff --git a/tools/qdstat b/tools/qdstat
index fc8b32c..fd941cf 100755
--- a/tools/qdstat
+++ b/tools/qdstat
@@ -187,14 +187,14 @@ class BusManager(Node):
             outlist.append(str(i))
         return outlist
 
-    def _sem_text(self, sem):
-        sem_map = {'flood'        : 'flood',
+    def _trt_text(self, trt):
+        trt_map = {'flood'        : 'flood',
                    'multi'        : 'multi',
                    'anyClosest'   : 'closest',
                    'anyBalanced'  : 'balanced',
                    'linkBalanced' : 'linkBalanced'}
-        if sem in sem_map:
-            return sem_map[sem]
+        if trt in trt_map:
+            return trt_map[trt]
         return '-'
 
     def displayGeneral(self):
@@ -289,7 +289,7 @@ class BusManager(Node):
         disp = Display(prefix="  ")
         heads = []
         heads.append(Header("addr"))
-        heads.append(Header("sem"))
+        heads.append(Header("treatment"))
         heads.append(Header("in-proc", Header.COMMAS))
         heads.append(Header("local", Header.COMMAS))
         heads.append(Header("remote", Header.COMMAS))
@@ -305,7 +305,7 @@ class BusManager(Node):
         for addr in objects:
             row = []
             row.append(self._addr_summary(addr.name))
-            row.append(self._sem_text(addr.semantics))
+            row.append(self._trt_text(addr.treatment))
             row.append(addr.inProcess)
             row.append(addr.subscriberCount)
             row.append(addr.remoteCount)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org