blob: 8ef8272b45e9e62b08aea3a871d11a3adedab3aa [file] [log] [blame]
/*
* 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 <qpid/dispatch/amqp.h>
#include "agent_config_address.h"
#include "agent_config_link_route.h"
#include "agent_config_auto_link.h"
#include "agent_address.h"
#include "agent_link.h"
#include "agent_connection.h"
#include "router_core_private.h"
#include "exchange_bindings.h"
#include <stdio.h>
#include "agent_router.h"
#include "agent_conn_link_route.h"
#include "adaptors/tcp_adaptor.h"
#include "adaptors/http1/http1_private.h"
static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_manage_update_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
ALLOC_DECLARE(qdr_query_t);
ALLOC_DEFINE(qdr_query_t);
struct qdr_agent_t {
qdr_query_list_t outgoing_query_list;
sys_mutex_t *query_lock;
qd_timer_t *timer;
qdr_manage_response_t response_handler;
qdr_subscription_t *subscription_mobile;
qdr_subscription_t *subscription_local;
qd_log_source_t *log_source;
};
//==================================================================================
// Internal Functions
//==================================================================================
static void qdr_agent_response_handler(void *context)
{
qdr_core_t *core = (qdr_core_t*) context;
qdr_agent_t *agent = core->mgmt_agent;
qdr_query_t *query;
bool done = false;
while (!done) {
sys_mutex_lock(agent->query_lock);
query = DEQ_HEAD(agent->outgoing_query_list);
if (query)
DEQ_REMOVE_HEAD(agent->outgoing_query_list);
done = DEQ_SIZE(agent->outgoing_query_list) == 0;
sys_mutex_unlock(agent->query_lock);
if (query) {
bool more = query->more;
agent->response_handler(query->context, &query->status, more);
if (!more)
qdr_query_free(query);
}
}
}
void qdr_agent_enqueue_response_CT(qdr_core_t *core, qdr_query_t *query)
{
qdr_agent_t *agent = core->mgmt_agent;
sys_mutex_lock(agent->query_lock);
DEQ_INSERT_TAIL(agent->outgoing_query_list, query);
bool notify = DEQ_SIZE(agent->outgoing_query_list) == 1;
sys_mutex_unlock(agent->query_lock);
if (notify)
qd_timer_schedule(agent->timer, 0);
}
qdr_query_t *qdr_query(qdr_core_t *core,
void *context,
qd_router_entity_type_t type,
qd_composed_field_t *body,
uint64_t in_conn)
{
qdr_query_t *query = new_qdr_query_t();
ZERO(query);
query->core = core;
query->entity_type = type;
query->context = context;
query->body = body;
query->more = false;
query->in_conn = in_conn;
return query;
}
static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool discard);
static void qdr_agent_emit_columns(qdr_query_t *query, const char *qdr_columns[], int column_count);
static void qdr_agent_set_columns(qdr_query_t *query, qd_parsed_field_t *attribute_names, const char *qdr_columns[], int column_count);
//==================================================================================
// Interface Functions
//==================================================================================
// called prior to core thread start
qdr_agent_t *qdr_agent(qdr_core_t *core)
{
qdr_agent_t *agent = NEW(qdr_agent_t);
ZERO(agent);
DEQ_INIT(agent->outgoing_query_list);
agent->query_lock = sys_mutex();
agent->timer = qd_timer(core->qd, qdr_agent_response_handler, core);
agent->log_source = qd_log_source("AGENT");
return agent;
}
// called after core thread has shutdown
void qdr_agent_free(qdr_agent_t *agent)
{
if (agent) {
qd_timer_free(agent->timer);
if (agent->query_lock)
sys_mutex_free(agent->query_lock);
//we can't call qdr_core_unsubscribe on the subscriptions because the action processing thread has
//already been shut down. But, all the action would have done at this point is free the subscriptions
//so we just do that directly.
free(agent->subscription_mobile);
free(agent->subscription_local);
free(agent);
}
}
// create management subscriptions
// (called after core thread starts)
void qdr_agent_setup_subscriptions(qdr_agent_t *agent, qdr_core_t *core)
{
agent->subscription_mobile = qdr_core_subscribe(core, "$management", 'M', '0',
QD_TREATMENT_ANYCAST_CLOSEST, false,
qdr_management_agent_on_message, core);
agent->subscription_local = qdr_core_subscribe(core, "$management", 'L', '0',
QD_TREATMENT_ANYCAST_CLOSEST, false,
qdr_management_agent_on_message, core);
}
void qdr_manage_create(qdr_core_t *core,
void *context,
qd_router_entity_type_t type,
qd_iterator_t *name,
qd_parsed_field_t *in_body,
qd_composed_field_t *out_body,
qd_buffer_list_t body_buffers,
uint64_t in_conn_id)
{
qdr_action_t *action = qdr_action(qdr_manage_create_CT, "manage_create");
// Create a query object here
action->args.agent.query = qdr_query(core, context, type, out_body, in_conn_id);
action->args.agent.name = qdr_field_from_iter(name);
action->args.agent.in_body = in_body;
action->args.agent.body_buffers = body_buffers;
qdr_action_enqueue(core, action);
}
void qdr_manage_delete(qdr_core_t *core,
void *context,
qd_router_entity_type_t type,
qd_iterator_t *name,
qd_iterator_t *identity,
uint64_t in_conn_id)
{
qdr_action_t *action = qdr_action(qdr_manage_delete_CT, "manage_delete");
// Create a query object here
action->args.agent.query = qdr_query(core, context, type, 0, in_conn_id);
action->args.agent.name = qdr_field_from_iter(name);
action->args.agent.identity = qdr_field_from_iter(identity);
qdr_action_enqueue(core, action);
}
void qdr_manage_read(qdr_core_t *core,
void *context,
qd_router_entity_type_t entity_type,
qd_iterator_t *name,
qd_iterator_t *identity,
qd_composed_field_t *body,
uint64_t in_conn_id)
{
qdr_action_t *action = qdr_action(qdr_manage_read_CT, "manage_read");
// Create a query object here
action->args.agent.query = qdr_query(core, context, entity_type, body, in_conn_id);
action->args.agent.identity = qdr_field_from_iter(identity);
action->args.agent.name = qdr_field_from_iter(name);
qdr_action_enqueue(core, action);
}
void qdr_manage_update(qdr_core_t *core,
void *context,
qd_router_entity_type_t type,
qd_iterator_t *name,
qd_iterator_t *identity,
qd_parsed_field_t *in_body,
qd_composed_field_t *out_body,
uint64_t in_conn_id)
{
qdr_action_t *action = qdr_action(qdr_manage_update_CT, "manage_update");
action->args.agent.query = qdr_query(core, context, type, out_body, in_conn_id);
action->args.agent.name = qdr_field_from_iter(name);
action->args.agent.identity = qdr_field_from_iter(identity);
action->args.agent.in_body = in_body;
qdr_action_enqueue(core, action);
}
qdr_query_t *qdr_manage_query(qdr_core_t *core,
void *context,
qd_router_entity_type_t type,
qd_parsed_field_t *attribute_names,
qd_composed_field_t *body,
uint64_t in_conn_id)
{
qdr_query_t* query = qdr_query(core, context, type, body, in_conn_id);
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdr_agent_set_columns(query, attribute_names, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_set_columns(query, attribute_names, qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdr_agent_set_columns(query, attribute_names, qdr_config_auto_link_columns, QDR_CONFIG_AUTO_LINK_COLUMN_COUNT); break;
case QD_ROUTER_ROUTER: qdr_agent_set_columns(query, attribute_names, qdr_router_columns, QDR_ROUTER_COLUMN_COUNT); break;
case QD_ROUTER_CONNECTION: qdr_agent_set_columns(query, attribute_names, qdr_connection_columns, QDR_CONNECTION_COLUMN_COUNT); break;
case QD_ROUTER_TCP_CONNECTION: qdr_agent_set_columns(query, attribute_names, qdr_tcp_connection_columns, QDR_TCP_CONNECTION_COLUMN_COUNT); break;
case QD_ROUTER_HTTP_REQUEST_INFO: qdr_agent_set_columns(query, attribute_names, qdr_http_request_info_columns, QDR_HTTP_REQUEST_INFO_COLUMN_COUNT); break;
case QD_ROUTER_LINK: qdr_agent_set_columns(query, attribute_names, qdr_link_columns, QDR_LINK_COLUMN_COUNT); break;
case QD_ROUTER_ADDRESS: qdr_agent_set_columns(query, attribute_names, qdr_address_columns, QDR_ADDRESS_COLUMN_COUNT); break;
case QD_ROUTER_FORBIDDEN: break;
case QD_ROUTER_EXCHANGE: qdr_agent_set_columns(query, attribute_names, qdr_config_exchange_columns, QDR_CONFIG_EXCHANGE_COLUMN_COUNT); break;
case QD_ROUTER_BINDING: qdr_agent_set_columns(query, attribute_names, qdr_config_binding_columns, QDR_CONFIG_BINDING_COLUMN_COUNT); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdr_agent_set_columns(query, attribute_names, qdr_conn_link_route_columns,
QDR_CONN_LINK_ROUTE_COLUMN_COUNT); break;
}
return query;
}
void qdr_query_add_attribute_names(qdr_query_t *query)
{
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdr_agent_emit_columns(query, qdr_config_address_columns, QDR_CONFIG_ADDRESS_COLUMN_COUNT); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdr_agent_emit_columns(query, qdr_config_link_route_columns, QDR_CONFIG_LINK_ROUTE_COLUMN_COUNT); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdr_agent_emit_columns(query, qdr_config_auto_link_columns, QDR_CONFIG_AUTO_LINK_COLUMN_COUNT); break;
case QD_ROUTER_ROUTER: qdr_agent_emit_columns(query, qdr_router_columns, QDR_ROUTER_COLUMN_COUNT); break;
case QD_ROUTER_CONNECTION: qdr_agent_emit_columns(query, qdr_connection_columns, QDR_CONNECTION_COLUMN_COUNT); break;
case QD_ROUTER_TCP_CONNECTION: qdr_agent_emit_columns(query, qdr_tcp_connection_columns, QDR_TCP_CONNECTION_COLUMN_COUNT); break;
case QD_ROUTER_HTTP_REQUEST_INFO: qdr_agent_emit_columns(query, qdr_http_request_info_columns, QDR_HTTP_REQUEST_INFO_COLUMN_COUNT); 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_FORBIDDEN: qd_compose_empty_list(query->body); break;
case QD_ROUTER_EXCHANGE: qdr_agent_emit_columns(query, qdr_config_exchange_columns, QDR_CONFIG_EXCHANGE_COLUMN_COUNT); break;
case QD_ROUTER_BINDING: qdr_agent_emit_columns(query, qdr_config_binding_columns, QDR_CONFIG_BINDING_COLUMN_COUNT); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdr_agent_emit_columns(query, qdr_conn_link_route_columns, QDR_CONN_LINK_ROUTE_COLUMN_COUNT); break;
}
}
void qdr_query_get_first(qdr_query_t *query, int offset)
{
qdr_action_t *action = qdr_action(qdrh_query_get_first_CT, "query_get_first");
action->args.agent.query = query;
action->args.agent.offset = offset;
qdr_action_enqueue(query->core, action);
}
void qdr_query_get_next(qdr_query_t *query)
{
qdr_action_t *action = qdr_action(qdrh_query_get_next_CT, "query_get_next");
action->args.agent.query = query;
qdr_action_enqueue(query->core, action);
}
void qdr_query_free(qdr_query_t *query)
{
if (!query)
return;
if (query->next_key)
qdr_field_free(query->next_key);
free_qdr_query_t(query);
}
static void qdr_agent_emit_columns(qdr_query_t *query, const char *qdr_columns[], int column_count)
{
qd_compose_start_list(query->body);
int i = 0;
while (query->columns[i] >= 0) {
if (query->columns[i] < column_count)
qd_compose_insert_string(query->body, qdr_columns[query->columns[i]]);
i++;
}
qd_compose_end_list(query->body);
}
static void qdr_agent_set_columns(qdr_query_t *query,
qd_parsed_field_t *attribute_names,
const char *qdr_columns[],
int column_count)
{
if (!attribute_names ||
(qd_parse_tag(attribute_names) != QD_AMQP_LIST8 &&
qd_parse_tag(attribute_names) != QD_AMQP_LIST32) ||
qd_parse_sub_count(attribute_names) == 0 ||
qd_parse_sub_count(attribute_names) >= QDR_AGENT_MAX_COLUMNS) {
//
// Either the attribute_names field is absent, it's not a list, or it's an empty list.
// In this case, we will include all available attributes.
//
if (column_count >= QDR_AGENT_MAX_COLUMNS)
column_count = QDR_AGENT_MAX_COLUMNS - 1;
int i;
for (i = 0; i < column_count; i++)
query->columns[i] = i;
query->columns[i] = -1;
return;
}
//
// We have a valid, non-empty attribute list. Set the columns appropriately.
//
uint32_t count = qd_parse_sub_count(attribute_names);
uint32_t idx;
for (idx = 0; idx < count; idx++) {
qd_parsed_field_t *name = qd_parse_sub_value(attribute_names, idx);
if (!name || (qd_parse_tag(name) != QD_AMQP_STR8_UTF8 && qd_parse_tag(name) != QD_AMQP_STR32_UTF8))
query->columns[idx] = QDR_AGENT_COLUMN_NULL;
else {
int j = 0;
while (qdr_columns[j]) {
qd_iterator_t *iter = qd_parse_raw(name);
if (qd_iterator_equal(iter, (const unsigned char*) qdr_columns[j])) {
query->columns[idx] = j;
break;
}
j+=1;
}
}
}
if ((count == 1 && idx == 1) || idx==count)
query->columns[idx] = -1;
else
query->columns[idx+1] = -1;
}
void qdr_manage_handler(qdr_core_t *core, qdr_manage_response_t response_handler)
{
assert(core->mgmt_agent); // expect: management agent must already be present
core->mgmt_agent->response_handler = response_handler;
}
//==================================================================================
// In-Thread Functions
//==================================================================================
static void qdr_agent_forbidden(qdr_core_t *core, qdr_query_t *query, bool op_query)
{
query->status = QD_AMQP_FORBIDDEN;
if (query->body && !op_query)
qd_compose_insert_null(query->body);
qdr_agent_enqueue_response_CT(core, query);
}
static void qdr_manage_read_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
qd_iterator_t *identity = qdr_field_iterator(action->args.agent.identity);
qd_iterator_t *name = qdr_field_iterator(action->args.agent.name);
qdr_query_t *query = action->args.agent.query;
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdra_config_address_get_CT(core, name, identity, query, qdr_config_address_columns); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_CT(core, name, identity, query, qdr_config_link_route_columns); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdra_config_auto_link_get_CT(core, name, identity, query, qdr_config_auto_link_columns); break;
case QD_ROUTER_ROUTER: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_CONNECTION: qdra_connection_get_CT(core, name, identity, query, qdr_connection_columns); break;
case QD_ROUTER_TCP_CONNECTION: qdra_tcp_connection_get_CT(core, name, identity, query, qdr_tcp_connection_columns); break;
case QD_ROUTER_HTTP_REQUEST_INFO: qdra_http_request_info_get_CT(core, name, identity, query, qdr_http_request_info_columns); 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_FORBIDDEN: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_EXCHANGE: qdra_config_exchange_get_CT(core, name, identity, query, qdr_config_exchange_columns); break;
case QD_ROUTER_BINDING: qdra_config_binding_get_CT(core, name, identity, query, qdr_config_binding_columns); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdra_conn_link_route_get_CT(core, name, identity, query, qdr_conn_link_route_columns); break;
}
qdr_field_free(action->args.agent.name);
qdr_field_free(action->args.agent.identity);
}
static void qdr_manage_create_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
qd_iterator_t *name = qdr_field_iterator(action->args.agent.name);
qdr_query_t *query = action->args.agent.query;
qd_parsed_field_t *in_body = action->args.agent.in_body;
qd_buffer_list_t body_buffers = action->args.agent.body_buffers;
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdra_config_address_create_CT(core, name, query, in_body); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_create_CT(core, name, query, in_body); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdra_config_auto_link_create_CT(core, name, query, in_body); break;
case QD_ROUTER_CONNECTION: break;
case QD_ROUTER_TCP_CONNECTION: break;
case QD_ROUTER_HTTP_REQUEST_INFO: break;
case QD_ROUTER_ROUTER: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_LINK: break;
case QD_ROUTER_ADDRESS: break;
case QD_ROUTER_FORBIDDEN: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_EXCHANGE: qdra_config_exchange_create_CT(core, name, query, in_body); break;
case QD_ROUTER_BINDING: qdra_config_binding_create_CT(core, name, query, in_body); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdra_conn_link_route_create_CT(core, name, query, in_body); break;
}
qdr_field_free(action->args.agent.name);
qd_parse_free(in_body);
qd_buffer_list_free_buffers(&body_buffers);
}
static void qdr_manage_delete_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
qd_iterator_t *name = qdr_field_iterator(action->args.agent.name);
qd_iterator_t *identity = qdr_field_iterator(action->args.agent.identity);
qdr_query_t *query = action->args.agent.query;
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdra_config_address_delete_CT(core, query, name, identity); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_delete_CT(core, query, name, identity); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdra_config_auto_link_delete_CT(core, query, name, identity); break;
case QD_ROUTER_CONNECTION: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_TCP_CONNECTION: break;
case QD_ROUTER_HTTP_REQUEST_INFO: break;
case QD_ROUTER_ROUTER: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_LINK: break;
case QD_ROUTER_ADDRESS: break;
case QD_ROUTER_FORBIDDEN: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_EXCHANGE: qdra_config_exchange_delete_CT(core, query, name, identity); break;
case QD_ROUTER_BINDING: qdra_config_binding_delete_CT(core, query, name, identity); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdra_conn_link_route_delete_CT(core, query, name, identity); break;
}
qdr_field_free(action->args.agent.name);
qdr_field_free(action->args.agent.identity);
}
static void qdr_manage_update_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
qd_iterator_t *identity = qdr_field_iterator(action->args.agent.identity);
qd_iterator_t *name = qdr_field_iterator(action->args.agent.name);
qdr_query_t *query = action->args.agent.query;
qd_parsed_field_t *in_body = action->args.agent.in_body;
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: break;
case QD_ROUTER_CONFIG_LINK_ROUTE: break;
case QD_ROUTER_CONFIG_AUTO_LINK: break;
case QD_ROUTER_CONNECTION: qdra_connection_update_CT(core, name, identity, query, in_body); break;
case QD_ROUTER_TCP_CONNECTION: break;
case QD_ROUTER_HTTP_REQUEST_INFO: break;
case QD_ROUTER_ROUTER: break;
case QD_ROUTER_LINK: qdra_link_update_CT(core, name, identity, query, in_body); break;
case QD_ROUTER_ADDRESS: break;
case QD_ROUTER_FORBIDDEN: qdr_agent_forbidden(core, query, false); break;
case QD_ROUTER_EXCHANGE: break;
case QD_ROUTER_BINDING: break;
case QD_ROUTER_CONN_LINK_ROUTE: break;
}
qdr_field_free(action->args.agent.name);
qdr_field_free(action->args.agent.identity);
qd_parse_free(in_body);
}
static void qdrh_query_get_first_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
qdr_query_t *query = action->args.agent.query;
int offset = action->args.agent.offset;
if (!discard) {
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdra_config_address_get_first_CT(core, query, offset); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_first_CT(core, query, offset); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdra_config_auto_link_get_first_CT(core, query, offset); break;
case QD_ROUTER_ROUTER: qdra_router_get_first_CT(core, query, offset); break;
case QD_ROUTER_CONNECTION: qdra_connection_get_first_CT(core, query, offset); break;
case QD_ROUTER_TCP_CONNECTION: qdra_tcp_connection_get_first_CT(core, query, offset); break;
case QD_ROUTER_HTTP_REQUEST_INFO: qdra_http_request_info_get_first_CT(core, query, offset); 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_FORBIDDEN: qdr_agent_forbidden(core, query, true); break;
case QD_ROUTER_EXCHANGE: qdra_config_exchange_get_first_CT(core, query, offset); break;
case QD_ROUTER_BINDING: qdra_config_binding_get_first_CT(core, query, offset); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdra_conn_link_route_get_first_CT(core, query, offset); break;
}
}
}
static void qdrh_query_get_next_CT(qdr_core_t *core, qdr_action_t *action, bool discard)
{
qdr_query_t *query = action->args.agent.query;
if (!discard) {
switch (query->entity_type) {
case QD_ROUTER_CONFIG_ADDRESS: qdra_config_address_get_next_CT(core, query); break;
case QD_ROUTER_CONFIG_LINK_ROUTE: qdra_config_link_route_get_next_CT(core, query); break;
case QD_ROUTER_CONFIG_AUTO_LINK: qdra_config_auto_link_get_next_CT(core, query); break;
case QD_ROUTER_ROUTER: qdra_router_get_next_CT(core, query); break;
case QD_ROUTER_CONNECTION: qdra_connection_get_next_CT(core, query); break;
case QD_ROUTER_TCP_CONNECTION: qdra_tcp_connection_get_next_CT(core, query); break;
case QD_ROUTER_HTTP_REQUEST_INFO: qdra_http_request_info_get_next_CT(core, query); 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_FORBIDDEN: break;
case QD_ROUTER_EXCHANGE: qdra_config_exchange_get_next_CT(core, query); break;
case QD_ROUTER_BINDING: qdra_config_binding_get_next_CT(core, query); break;
case QD_ROUTER_CONN_LINK_ROUTE: qdra_conn_link_route_get_next_CT(core, query); break;
}
}
}