Repository: qpid-dispatch
Updated Branches:
  refs/heads/master c2c678a0d -> 99d0377f0


DISPATCH-1145 - Implemented the addr_proxy component of the edge router.  
Responsibilities 1 and 2 are complete.


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

Branch: refs/heads/master
Commit: 99d0377f0866c5355150864cffcb1daed350ab07
Parents: c2c678a
Author: Ted Ross <[email protected]>
Authored: Fri Oct 12 09:42:21 2018 -0400
Committer: Ted Ross <[email protected]>
Committed: Fri Oct 12 10:07:30 2018 -0400

----------------------------------------------------------------------
 include/qpid/dispatch/amqp.h                    |   1 +
 include/qpid/dispatch/router_core.h             |   7 +-
 src/CMakeLists.txt                              |   1 +
 src/amqp.c                                      |   1 +
 src/router_core/agent_link.c                    |   7 +-
 src/router_core/connections.c                   |  95 +++++------
 .../modules/edge_router/addr_proxy.c            | 156 +++++++++++++++++++
 .../modules/edge_router/addr_proxy.h            |  35 +++++
 src/router_core/modules/edge_router/module.c    |   8 +-
 src/router_core/route_tables.c                  |   4 -
 src/router_core/router_core_private.h           |   1 -
 tests/system_tests_edge_router.py               |   6 +-
 12 files changed, 258 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/include/qpid/dispatch/amqp.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/amqp.h b/include/qpid/dispatch/amqp.h
index 3820726..5a65c80 100644
--- a/include/qpid/dispatch/amqp.h
+++ b/include/qpid/dispatch/amqp.h
@@ -126,6 +126,7 @@ extern const char * const QD_CAPABILITY_ANONYMOUS_RELAY;
 /// @{
 extern const char * const QD_CAPABILITY_ROUTER_CONTROL;
 extern const char * const QD_CAPABILITY_ROUTER_DATA;
+extern const char * const QD_CAPABILITY_EDGE_DOWNLINK;
 /// @}
 
 /** @name Dynamic Node Properties */

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/include/qpid/dispatch/router_core.h
----------------------------------------------------------------------
diff --git a/include/qpid/dispatch/router_core.h 
b/include/qpid/dispatch/router_core.h
index 695e7e5..6deee88 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -142,9 +142,10 @@ void qdr_send_to2(qdr_core_t *core, qd_message_t *msg, 
const char *addr,
  */
 
 typedef enum {
-    QD_LINK_ENDPOINT,   ///< A link to a connected endpoint
-    QD_LINK_CONTROL,    ///< A link to a peer router for control messages
-    QD_LINK_ROUTER      ///< A link to a peer router for routed messages
+    QD_LINK_ENDPOINT,      ///< A link to a connected endpoint
+    QD_LINK_CONTROL,       ///< A link to a peer router for control messages
+    QD_LINK_ROUTER,        ///< A link to a peer router for routed messages
+    QD_LINK_EDGE_DOWNLINK  ///< Default link from an interior router to an 
edge router
 } qd_link_type_t;
 
 typedef enum {

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 93a779f..da47242 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -100,6 +100,7 @@ set(qpid_dispatch_SOURCES
   router_core/transfer.c
   router_core/core_timer.c
   router_core/modules/edge_router/module.c
+  router_core/modules/edge_router/addr_proxy.c
   router_core/modules/edge_router/connection_manager.c
   router_core/modules/test_hooks/core_test_hooks.c
   router_node.c

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/amqp.c
----------------------------------------------------------------------
diff --git a/src/amqp.c b/src/amqp.c
index 16550a7..08ce122 100644
--- a/src/amqp.c
+++ b/src/amqp.c
@@ -34,6 +34,7 @@ const int          QD_MA_FILTER_LEN  = 5;  // N tailing 
inbound entries to searc
 
 const char * const QD_CAPABILITY_ROUTER_CONTROL  = "qd.router";
 const char * const QD_CAPABILITY_ROUTER_DATA     = "qd.router-data";
+const char * const QD_CAPABILITY_EDGE_DOWNLINK   = "qd.router-edge-downlink";
 const char * const QD_CAPABILITY_ANONYMOUS_RELAY = "ANONYMOUS-RELAY";
 
 const char * const QD_DYNAMIC_NODE_PROPERTY_ADDRESS = "x-opt-qd.address";

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/router_core/agent_link.c
----------------------------------------------------------------------
diff --git a/src/router_core/agent_link.c b/src/router_core/agent_link.c
index 5ca0f25..9600aca 100644
--- a/src/router_core/agent_link.c
+++ b/src/router_core/agent_link.c
@@ -74,9 +74,10 @@ const char *qdr_link_columns[] =
 static const char *qd_link_type_name(qd_link_type_t lt)
 {
     switch (lt) {
-    case QD_LINK_ENDPOINT : return "endpoint";
-    case QD_LINK_CONTROL  : return "router-control";
-    case QD_LINK_ROUTER   : return "inter-router";
+    case QD_LINK_ENDPOINT      : return "endpoint";
+    case QD_LINK_CONTROL       : return "router-control";
+    case QD_LINK_ROUTER        : return "inter-router";
+    case QD_LINK_EDGE_DOWNLINK : return "edge-downlink";
     }
 
     return "";

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/router_core/connections.c
----------------------------------------------------------------------
diff --git a/src/router_core/connections.c b/src/router_core/connections.c
index 71bd354..041e0f0 100644
--- a/src/router_core/connections.c
+++ b/src/router_core/connections.c
@@ -482,6 +482,12 @@ qdr_link_t *qdr_link_first_attach(qdr_connection_t *conn,
         link->link_type = QD_LINK_CONTROL;
     else if (qdr_terminus_has_capability(local_terminus, 
QD_CAPABILITY_ROUTER_DATA))
         link->link_type = QD_LINK_ROUTER;
+    else if (qdr_terminus_has_capability(local_terminus, 
QD_CAPABILITY_EDGE_DOWNLINK)) {
+        if (conn->core->router_mode == QD_ROUTER_MODE_INTERIOR &&
+            conn->role == QDR_ROLE_EDGE_UPLINK &&
+            dir == QD_OUTGOING)
+            link->link_type = QD_LINK_EDGE_DOWNLINK;
+    }
 
     qdr_link_setup_histogram(conn, dir, link);
 
@@ -1471,38 +1477,6 @@ static void qdr_attach_link_data_CT(qdr_core_t *core, 
qdr_connection_t *conn, qd
         link->priority = next_slot;
         core->data_links_by_mask_bit[conn->mask_bit].links[next_slot] = link;
     }
-
-    //
-    // TODO - This needs to be refactored in terms of a non-inter-router link 
type
-    //
-    else if (conn->role == QDR_ROLE_EDGE_UPLINK) {
-        if (core->router_mode == QD_ROUTER_MODE_EDGE) {
-            //
-            // Associate this link with the uplink address.
-            //
-            link->owning_addr = core->uplink_addr;
-            qdr_add_link_ref(&core->uplink_addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-            qd_log(core->log, QD_LOG_INFO, "Edge-uplink established to 
interior router: %s", conn->connection_info->container);
-        } else if (core->router_mode == QD_ROUTER_MODE_INTERIOR) {
-            //
-            // This is a down-link to an edge router.  Create a mobile address 
of the form
-            // H<edge-router-id>, associate the link to that address, and 
advertise
-            // the address on the network.
-            //
-            const char    *edge_id = conn->connection_info->container;
-            qdr_address_t *addr    = qdr_add_mobile_address_CT(core, "", 
edge_id, QD_TREATMENT_ANYCAST_BALANCED, true);
-            link->owning_addr = addr;
-            qdr_add_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
-            if (DEQ_SIZE(addr->rlinks) == 1) {
-                const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
-                if (key && (*key == QD_ITER_HASH_PREFIX_MOBILE || *key == 
QD_ITER_HASH_PREFIX_EDGE_SUMMARY))
-                    qdr_post_mobile_added_CT(core, key);
-                qdr_addr_start_inlinks_CT(core, addr);
-            }
-
-            qd_log(core->log, QD_LOG_INFO, "Downlink established to edge 
router: %s", edge_id);
-        }
-    }
 }
 
 
@@ -1510,18 +1484,33 @@ static void qdr_detach_link_data_CT(qdr_core_t *core, 
qdr_connection_t *conn, qd
 {
     if (conn->role == QDR_ROLE_INTER_ROUTER)
         core->data_links_by_mask_bit[conn->mask_bit].links[link->priority] = 0;
-    //
-    // TODO - This needs to be refactored in terms of a non-inter-router link 
type
-    //
-    else if (conn->role == QDR_ROLE_EDGE_UPLINK) {
-        if (core->router_mode == QD_ROUTER_MODE_EDGE) {
-            qdr_del_link_ref(&core->uplink_addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-            qd_log(core->log, QD_LOG_INFO, "Edge-uplink lost");
-        } else if (core->router_mode == QD_ROUTER_MODE_INTERIOR) {
-            qdr_del_link_ref(&link->owning_addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
-            qd_log(core->log, QD_LOG_INFO, "Downlink lost to edge router: %s", 
conn->connection_info->container);
-        }
+}
+
+
+static void qdr_attach_link_downlink_CT(qdr_core_t *core, qdr_connection_t 
*conn, qdr_link_t *link, qdr_terminus_t *source)
+{
+    qdr_address_t *addr;
+    qd_iterator_t *iter = qd_iterator_dup(qdr_terminus_get_address(source));
+    qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH);
+    qd_iterator_annotate_prefix(iter, QD_ITER_HASH_PREFIX_EDGE_SUMMARY);
+
+    qd_hash_retrieve(core->addr_hash, iter, (void**) &addr);
+    if (!addr) {
+        addr = qdr_address_CT(core, QD_TREATMENT_ANYCAST_BALANCED);
+        qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle);
+        DEQ_INSERT_TAIL(core->addrs, addr);
+    }
+
+    qdr_add_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS);
+    link->owning_addr = addr;
+    if (DEQ_SIZE(addr->rlinks) == 1) {
+        const char *key = (const char*) 
qd_hash_key_by_handle(addr->hash_handle);
+        if (key && *key == QD_ITER_HASH_PREFIX_EDGE_SUMMARY)
+            qdr_post_mobile_added_CT(core, key);
+        qdr_addr_start_inlinks_CT(core, addr);
     }
+
+    qd_iterator_free(iter);
 }
 
 
@@ -1673,13 +1662,12 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t 
*core, qdr_action_t *act
         }
 
         case QD_LINK_CONTROL:
+        case QD_LINK_ROUTER:
             qdr_link_outbound_second_attach_CT(core, link, source, target);
             qdr_link_issue_credit_CT(core, link, link->capacity, false);
             break;
 
-        case QD_LINK_ROUTER:
-            qdr_link_outbound_second_attach_CT(core, link, source, target);
-            qdr_link_issue_credit_CT(core, link, link->capacity, false);
+        case QD_LINK_EDGE_DOWNLINK:
             break;
         }
     } else {
@@ -1759,6 +1747,11 @@ static void qdr_link_inbound_first_attach_CT(qdr_core_t 
*core, qdr_action_t *act
             qdr_attach_link_data_CT(core, conn, link);
             qdr_link_outbound_second_attach_CT(core, link, source, target);
             break;
+
+        case QD_LINK_EDGE_DOWNLINK:
+            qdr_attach_link_downlink_CT(core, conn, link, source);
+            qdr_link_outbound_second_attach_CT(core, link, source, target);
+            break;
         }
     }
 }
@@ -1827,6 +1820,9 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t 
*core, qdr_action_t *ac
         case QD_LINK_ROUTER:
             qdr_link_issue_credit_CT(core, link, link->capacity, false);
             break;
+
+        case QD_LINK_EDGE_DOWNLINK:
+            break;
         }
     } else {
         //
@@ -1860,6 +1856,9 @@ static void qdr_link_inbound_second_attach_CT(qdr_core_t 
*core, qdr_action_t *ac
         case QD_LINK_ROUTER:
             qdr_attach_link_data_CT(core, conn, link);
             break;
+
+        case QD_LINK_EDGE_DOWNLINK:
+            break;
         }
     }
 
@@ -1960,6 +1959,9 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, 
qdr_action_t *action, b
 
             case QD_LINK_ROUTER:
                 break;
+
+            case QD_LINK_EDGE_DOWNLINK:
+                break;
             }
         } else {
             //
@@ -1967,6 +1969,7 @@ static void qdr_link_inbound_detach_CT(qdr_core_t *core, 
qdr_action_t *action, b
             //
             switch (link->link_type) {
             case QD_LINK_ENDPOINT:
+            case QD_LINK_EDGE_DOWNLINK:
                 if (addr) {
                     qdr_del_link_ref(&addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
                     was_local = true;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/router_core/modules/edge_router/addr_proxy.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/edge_router/addr_proxy.c 
b/src/router_core/modules/edge_router/addr_proxy.c
new file mode 100644
index 0000000..a71f304
--- /dev/null
+++ b/src/router_core/modules/edge_router/addr_proxy.c
@@ -0,0 +1,156 @@
+/*
+ * 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 "addr_proxy.h"
+#include "core_events.h"
+#include "router_core_private.h"
+#include <stdio.h>
+#include <inttypes.h>
+
+//
+// This is the Address Proxy component of the Edge Router module.
+//
+// Address Proxy has three main responsibilities:
+//  1) When an uplink becomes active, the "_uplink" address is properly linked 
to an
+//     outgoing anonymous link on the active uplink connection.
+//  2) When an uplink becomes active, an incoming link is established over the 
uplink
+//     connection that is used to transfer deliveries to topological (dynamic) 
addresses
+//     on the edge router.
+//  3) Ensure that if there is an active uplink, that uplink should have one 
incoming
+//     link for every address for which there is at least one local consumer.
+//
+
+struct qcm_edge_addr_proxy_t {
+    qdr_core_t                *core;
+    qdrc_event_subscription_t *event_sub;
+    bool                       uplink_established;
+    qdr_address_t             *uplink_addr;
+};
+
+
+static qdr_terminus_t *qdr_terminus_edge_downlink(const char *addr)
+{
+    qdr_terminus_t *term = qdr_terminus(0);
+    qdr_terminus_add_capability(term, QD_CAPABILITY_EDGE_DOWNLINK);
+    if (addr)
+        qdr_terminus_set_address(term, addr);
+    return term;
+}
+
+
+static void on_conn_event(void *context, qdrc_event_t event, qdr_connection_t 
*conn)
+{
+    qcm_edge_addr_proxy_t *ap = (qcm_edge_addr_proxy_t*) context;
+
+    switch (event) {
+    case QDRC_EVENT_CONN_EDGE_ESTABLISHED : {
+        //
+        // Flag the uplink as being established.
+        //
+        ap->uplink_established = true;
+
+        //
+        // Attach an anonymous sending link to the interior router.
+        //
+        qdr_link_t *link = qdr_create_link_CT(ap->core, conn,
+                                              QD_LINK_ENDPOINT, QD_OUTGOING,
+                                              qdr_terminus(0), 
qdr_terminus(0));
+
+        //
+        // Associate the anonymous sender with the uplink address.  This will 
cause
+        // all deliveries destined off-edge to be sent to the interior via the 
uplink.
+        //
+        qdr_add_link_ref(&ap->uplink_addr->rlinks, link, 
QDR_LINK_LIST_CLASS_ADDRESS);
+        link->owning_addr = ap->uplink_addr;
+
+        //
+        // Attach a receiving link for edge summary.  This will cause all 
deliveries
+        // destined for this router to be delivered via the uplink.
+        //
+        link = qdr_create_link_CT(ap->core, conn,
+                                  QD_LINK_ENDPOINT, QD_INCOMING,
+                                  
qdr_terminus_edge_downlink(ap->core->router_id),
+                                  qdr_terminus_edge_downlink(0));
+        break;
+    }
+
+    case QDRC_EVENT_CONN_EDGE_LOST :
+        ap->uplink_established = false;
+        break;
+
+    default:
+        assert(false);
+        break;
+    }
+}
+
+
+static void on_addr_event(void *context, qdrc_event_t event, qdr_address_t 
*addr)
+{
+    //qcm_edge_addr_proxy_t *ap = (qcm_edge_addr_proxy_t*) context;
+
+    switch (event) {
+    case QDRC_EVENT_ADDR_BECAME_LOCAL_DEST :
+        break;
+
+    case QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST :
+        break;
+
+    default:
+        assert(false);
+        break;
+    }
+}
+
+
+qcm_edge_addr_proxy_t *qcm_edge_addr_proxy(qdr_core_t *core)
+{
+    qcm_edge_addr_proxy_t *ap = NEW(qcm_edge_addr_proxy_t);
+
+    ap->core = core;
+    ap->uplink_established = false;
+
+    //
+    // Establish the uplink address to represent destinations reachable via 
the edge uplink
+    //
+    ap->uplink_addr = qdr_add_local_address_CT(core, 'L', "_uplink", 
QD_TREATMENT_ANYCAST_CLOSEST);
+
+    //
+    // Subscribe to the core events we'll need to drive this component
+    //
+    ap->event_sub = qdrc_event_subscribe_CT(core,
+                                            QDRC_EVENT_CONN_EDGE_ESTABLISHED
+                                            | QDRC_EVENT_CONN_EDGE_LOST
+                                            | QDRC_EVENT_ADDR_BECAME_LOCAL_DEST
+                                            | 
QDRC_EVENT_ADDR_NO_LONGER_LOCAL_DEST,
+                                            on_conn_event,
+                                            0,
+                                            on_addr_event,
+                                            ap);
+
+    return ap;
+}
+
+
+void qcm_edge_addr_proxy_final(qcm_edge_addr_proxy_t *ap)
+{
+    qdrc_event_unsubscribe_CT(ap->core, ap->event_sub);
+    free(ap);
+}
+

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/router_core/modules/edge_router/addr_proxy.h
----------------------------------------------------------------------
diff --git a/src/router_core/modules/edge_router/addr_proxy.h 
b/src/router_core/modules/edge_router/addr_proxy.h
new file mode 100644
index 0000000..0f5416b
--- /dev/null
+++ b/src/router_core/modules/edge_router/addr_proxy.h
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+#ifndef qcm_edge_router_addr_proxy_types
+#define qcm_edge_router_addr_proxy_types 1
+
+typedef struct qcm_edge_addr_proxy_t qcm_edge_addr_proxy_t;
+#include "router_core_private.h"
+
+#endif
+
+
+#ifndef qcm_edge_router_addr_proxy
+#define qcm_edge_router_addr_proxy 1
+
+qcm_edge_addr_proxy_t *qcm_edge_addr_proxy(qdr_core_t *core);
+void qcm_edge_addr_proxy_final(qcm_edge_addr_proxy_t *cm);
+
+#endif

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/router_core/modules/edge_router/module.c
----------------------------------------------------------------------
diff --git a/src/router_core/modules/edge_router/module.c 
b/src/router_core/modules/edge_router/module.c
index 8e14307..d115d2b 100644
--- a/src/router_core/modules/edge_router/module.c
+++ b/src/router_core/modules/edge_router/module.c
@@ -19,9 +19,11 @@
 
 #include "module.h"
 #include "connection_manager.h"
+#include "addr_proxy.h"
 
 typedef struct {
-    qcm_edge_conn_mgr_t *conn_mgr;
+    qcm_edge_conn_mgr_t   *conn_mgr;
+    qcm_edge_addr_proxy_t *addr_proxy;
     // TODO - Add pointers to other edge-router state here
 } qcm_edge_t;
 
@@ -30,7 +32,8 @@ static void qcm_edge_router_init_CT(qdr_core_t *core, void 
**module_context)
 {
     if (core->router_mode == QD_ROUTER_MODE_EDGE) {
         qcm_edge_t *edge = NEW(qcm_edge_t);
-        edge->conn_mgr = qcm_edge_conn_mgr(core);
+        edge->conn_mgr   = qcm_edge_conn_mgr(core);
+        edge->addr_proxy = qcm_edge_addr_proxy(core);
         // TODO - Add initialization of other edge-router functions here
         *module_context = edge;
     } else
@@ -44,6 +47,7 @@ static void qcm_edge_router_final_CT(void *module_context)
 
     if (edge) {
         qcm_edge_conn_mgr_final(edge->conn_mgr);
+        qcm_edge_addr_proxy_final(edge->addr_proxy);
         // TODO - Add finalization of other edge-router functions here
         free(edge);
     }

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/src/router_core/route_tables.c
----------------------------------------------------------------------
diff --git a/src/router_core/route_tables.c b/src/router_core/route_tables.c
index a4d3bc1..f9bb1f6 100644
--- a/src/router_core/route_tables.c
+++ b/src/router_core/route_tables.c
@@ -252,10 +252,6 @@ void qdr_route_table_setup_CT(qdr_core_t *core)
 
         }
     }
-
-    if (core->router_mode == QD_ROUTER_MODE_EDGE) {
-        core->uplink_addr = qdr_add_local_address_CT(core, 'L', "_uplink", 
QD_TREATMENT_ANYCAST_CLOSEST);
-    }
 }
 
 

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/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 985328d..d1ea32a 100644
--- a/src/router_core/router_core_private.h
+++ b/src/router_core/router_core_private.h
@@ -764,7 +764,6 @@ struct qdr_core_t {
     qdr_address_t             *routerma_addr_L;
     qdr_address_t             *router_addr_T;
     qdr_address_t             *routerma_addr_T;
-    qdr_address_t             *uplink_addr;
 
     qdr_node_list_t       routers;            ///< List of routers, in order 
of cost, from lowest to highest
     qd_bitmask_t         *neighbor_free_mask;

http://git-wip-us.apache.org/repos/asf/qpid-dispatch/blob/99d0377f/tests/system_tests_edge_router.py
----------------------------------------------------------------------
diff --git a/tests/system_tests_edge_router.py 
b/tests/system_tests_edge_router.py
index 9819a53..1a70f2f 100644
--- a/tests/system_tests_edge_router.py
+++ b/tests/system_tests_edge_router.py
@@ -108,28 +108,24 @@ class RouterTest(TestCase):
         self.assertEqual(None, test.error)
 
     def test_06_dynamic_address_interior_to_edge(self):
-        self.skipTest("Temporarily disabled")
         test = DynamicAddressTest(self.routers[2].addresses[0],
                                   self.routers[0].addresses[0])
         test.run()
         self.assertEqual(None, test.error)
 
     def test_07_dynamic_address_edge_to_interior(self):
-        self.skipTest("Temporarily disabled")
         test = DynamicAddressTest(self.routers[0].addresses[0],
                                   self.routers[2].addresses[0])
         test.run()
         self.assertEqual(None, test.error)
 
     def test_08_dynamic_address_edge_to_edge_one_interior(self):
-        self.skipTest("Temporarily disabled")
         test = DynamicAddressTest(self.routers[2].addresses[0],
                                   self.routers[3].addresses[0])
         test.run()
         self.assertEqual(None, test.error)
 
     def test_09_dynamic_address_edge_to_edge_two_interior(self):
-        self.skipTest("Temporarily disabled")
         test = DynamicAddressTest(self.routers[2].addresses[0],
                                   self.routers[4].addresses[0])
         test.run()
@@ -253,7 +249,7 @@ class DynamicAddressTest(MessagingHandler):
         self.sender_conn   = None
         self.receiver      = None
         self.address       = None
-        self.count         = 10
+        self.count         = 300
         self.n_rcvd        = 0
         self.n_sent        = 0
         self.error         = None


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to