WIP
diff --git a/include/qpid/dispatch/router_core.h b/include/qpid/dispatch/router_core.h
index 6967303..b2e4aac 100644
--- a/include/qpid/dispatch/router_core.h
+++ b/include/qpid/dispatch/router_core.h
@@ -23,6 +23,7 @@
#include <qpid/dispatch/bitmask.h>
typedef struct qdr_core_t qdr_core_t;
+typedef struct qdr_connection_t qdr_connection_t;
typedef struct qdr_link_t qdr_link_t;
typedef struct qdr_delivery_t qdr_delivery_t;
@@ -34,51 +35,113 @@
/**
* Stop and deallocate an instance of the router core.
*/
-void qdr_core_free(qdr_core_t *rt);
+void qdr_core_free(qdr_core_t *core);
/**
+ ******************************************************************************
* Route table maintenance functions
- */
-void qdr_core_add_router(qdr_core_t *rt, const char *address, int router_maskbit);
-void qdr_core_del_router(qdr_core_t *rt, int router_maskbit);
-void qdr_core_set_link(qdr_core_t *rt, int router_maskbit, int link_maskbit);
-void qdr_core_remove_link(qdr_core_t *rt, int router_maskbit);
-void qdr_core_set_next_hop(qdr_core_t *rt, int router_maskbit, int nh_router_maskbit);
-void qdr_core_remove_next_hop(qdr_core_t *rt, int router_maskbit);
-void qdr_core_set_valid_origins(qdr_core_t *rt, const qd_bitmask_t *routers);
-void qdr_core_map_destination(qdr_core_t *rt, int router_maskbit, const char *address, char phase);
-void qdr_core_unmap_destination(qdr_core_t *rt, int router_maskbit, const char *address, char phase);
-
-typedef void (*qdr_mobile_added_t) (void *context, qd_field_iterator_t *address);
-typedef void (*qdr_mobile_removed_t) (void *context, qd_field_iterator_t *address);
-typedef void (*qdr_link_lost_t) (void *context, int link_maskbit);
-
-void qdr_core_route_table_handlers(void *context,
- qdr_mobile_added_t mobile_added,
- qdr_mobile_removed_t mobile_removed,
- qdr_link_lost_t link_lost);
-
-/**
- * Link functions
- */
-qdr_link_t *qdr_link(qdr_core_t *rt, qd_direction_t dir, bool dynamic, const char *address);
-void qdr_link_detach(qdr_link_t *link, qd_link_t *link);
-
-/**
- * Delivery functions
- */
-void qdr_core_delivery(qdr_core_t *rt, qd_link_t *in_link, pn_delivery_t *delivery, qd_message_t *msg,
- qd_field_iterator_t *effective_address);
-
-
-/**
- * Management instrumentation functions
+ ******************************************************************************
*/
typedef enum {
- QD_ROUTER_ADDRESS,
- QD_ROUTER_LINK
+ QD_WAYPOINT_SOURCE,
+ QD_WAYPOINT_SINK,
+ QD_WAYPOINT_THROUGH,
+ QD_WAYPOINT_BYPASS,
+ QD_WAYPOINT_TAP
+} qd_waypoint_style_t;
+
+void qdr_core_add_router(qdr_core_t *core, const char *address, int router_maskbit);
+void qdr_core_del_router(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_link(qdr_core_t *core, int router_maskbit, int link_maskbit);
+void qdr_core_remove_link(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_next_hop(qdr_core_t *core, int router_maskbit, int nh_router_maskbit);
+void qdr_core_remove_next_hop(qdr_core_t *core, int router_maskbit);
+void qdr_core_set_valid_origins(qdr_core_t *core, const qd_bitmask_t *routers);
+void qdr_core_map_destination(qdr_core_t *core, int router_maskbit, const char *address, char phase);
+void qdr_core_unmap_destination(qdr_core_t *core, int router_maskbit, const char *address, char phase);
+
+void qdr_core_add_link_route(qdr_core_t *core, qd_field_iterator_t *conn_label, qd_field_iterator_t *prefix);
+void qdr_core_del_link_route(qdr_core_t *core, qd_field_iterator_t *conn_label, qd_field_iterator_t *prefix);
+
+void qdr_core_add_waypoint(qdr_core_t *core, qd_field_iterator_t *conn_label, qd_field_iterator_t *address, qd_waypoint_style_t style, char in_phase, char out_phase);
+
+//
+// The following callbacks shall be invoked on a connection thread from the server thread pool.
+//
+typedef void (*qdr_mobile_added_t) (void *context, qd_field_iterator_t *address);
+typedef void (*qdr_mobile_removed_t) (void *context, qd_field_iterator_t *address);
+typedef void (*qdr_link_lost_t) (void *context, int link_maskbit);
+typedef void (*qdr_connection_activate_t) (void *context, const qdr_connection_t *connection);
+typedef void (*qdr_receive_t) (void *context, qd_message_t *msg, int link_maskbit);
+
+void qdr_core_route_table_handlers(void *context,
+ qdr_mobile_added_t mobile_added,
+ qdr_mobile_removed_t mobile_removed,
+ qdr_link_lost_t link_lost,
+ qdr_connection_activate_t connection_activate);
+
+void qdr_core_subscribe(qdr_core_t *core, const char *address, bool local, bool mobile, qdr_receive_t on_message, void *context);
+
+
+/**
+ ******************************************************************************
+ * Connection functions
+ ******************************************************************************
+ */
+typedef enum {
+ QDR_WORK_FIRST_ATTACH, // Core is initiating a first-attach
+ QDR_WORK_SECOND_ATTACH, // Core is sending a second-attach
+ QDR_WORK_DETACH, // Core is sending a detach
+ QDR_WORK_DELIVERY // Core is updating a delivery for in-thread processing
+} qdr_work_type_t;
+
+typedef struct {
+ qdr_work_type_t work_type;
+ pn_terminus_t *source; // For FIRST_ATTACH
+ pn_terminus_t *target; // For FIRST_ATTACH
+ qdr_link_t *link; // For SECOND_ATTACH, DETACH
+ qdr_delivery_t *delivery; // For DELIVERY
+} qdr_work_t;
+
+qdr_connection_t *qdr_connection_opened(qdr_core_t *core, qd_field_iterator_t *label);
+void qdr_connection_closed(qdr_connection_t *conn);
+void qdr_connection_set_context(qdr_connection_t *conn, void *context);
+void *qdr_connection_get_context(qdr_connection_t *conn);
+qdr_work_t *qdr_connection_work(qdr_connection_t *conn);
+
+/**
+ ******************************************************************************
+ * Link functions
+ ******************************************************************************
+ */
+qdr_link_t *qdr_link_first_attach(qdr_connection_t *conn, qd_direction_t dir, pn_terminus_t *source, pn_terminus_t *target);
+void qdr_link_second_attach(qdr_link_t *link, pn_terminus_t *source, pn_terminus_t *target);
+void qdr_link_detach(qdr_link_t *link, pn_condition_t *condition);
+
+qdr_delivery_t *qdr_link_deliver(qdr_link_t *link, pn_delivery_t *delivery, qd_message_t *msg);
+qdr_delivery_t *qdr_link_deliver_to(qdr_link_t *link, pn_delivery_t *delivery, qd_message_t *msg, qd_field_iterator_t *addr);
+
+
+/**
+ ******************************************************************************
+ * Delivery functions
+ ******************************************************************************
+ */
+void qdr_delivery_update_disposition(qdr_delivery_t *delivery);
+void qdr_delivery_update_flow(qdr_delivery_t *delivery);
+void qdr_delivery_process(qdr_delivery_t *delivery);
+
+/**
+ ******************************************************************************
+ * Management instrumentation functions
+ ******************************************************************************
+ */
+typedef enum {
+ QD_ROUTER_CONNECTION,
+ QD_ROUTER_LINK,
+ QD_ROUTER_ADDRESS
} qd_router_entity_type_t;
-void qdr_core_query(qdr_core_t *rt, qd_router_entity_type_t type, const char *filter, void *context);
+void qdr_core_query(qdr_core_t *core, qd_router_entity_type_t type, const char *filter, void *context);
#endif