static qdr_conn_identifier_t *qdr_route_declare_id_CT(qdr_core_t *core, qd_iterator_t *container, qd_iterator_t *connection) { qdr_conn_identifier_t *cid = 0; if (container && connection) { qd_iterator_reset_view(container, ITER_VIEW_ADDRESS_HASH); qd_iterator_annotate_prefix(container, CONTAINER_PREFIX); qd_hash_retrieve(core->conn_id_hash, container, (void**) &cid); if (!cid) { qd_iterator_reset_view(connection, ITER_VIEW_ADDRESS_HASH); qd_iterator_annotate_prefix(connection, CONNECTION_PREFIX); qd_hash_retrieve(core->conn_id_hash, connection, (void**) &cid); } if (!cid) { cid = new_qdr_conn_identifier_t(); ZERO(cid); // // The container and the connection will represent the same connection. // qd_hash_insert(core->conn_id_hash, container, cid, &cid->container_hash_handle); qd_hash_insert(core->conn_id_hash, connection, cid, &cid->connection_hash_handle); } } else if (container) { qd_iterator_reset_view(container, ITER_VIEW_ADDRESS_HASH); qd_iterator_annotate_prefix(container, CONTAINER_PREFIX); qd_hash_retrieve(core->conn_id_hash, container, (void**) &cid); if (!cid) { cid = new_qdr_conn_identifier_t(); ZERO(cid); qd_hash_insert(core->conn_id_hash, container, cid, &cid->container_hash_handle); } } else if (connection) { qd_iterator_reset_view(connection, ITER_VIEW_ADDRESS_HASH); qd_iterator_annotate_prefix(connection, CONNECTION_PREFIX); qd_hash_retrieve(core->conn_id_hash, connection, (void**) &cid); if (!cid) { cid = new_qdr_conn_identifier_t(); ZERO(cid); qd_hash_insert(core->conn_id_hash, connection, cid, &cid->connection_hash_handle); } } return cid; }
static char* test_view_address_hash_override(void *context) { struct {const char *addr; const char *view;} cases[] = { {"amqp:/link-target", "Clink-target"}, {"amqp:/domain/link-target", "Cdomain/link-target"}, {"domain/link-target", "Cdomain/link-target"}, {"bbc79fb3-e1fd-4a08-92b2-9a2de232b558", "Cbbc79fb3-e1fd-4a08-92b2-9a2de232b558"}, {0, 0} }; int idx; for (idx = 0; cases[idx].addr; idx++) { qd_iterator_t *iter = qd_iterator_string(cases[idx].addr, ITER_VIEW_ADDRESS_HASH); qd_iterator_annotate_prefix(iter, 'C'); if (!qd_iterator_equal(iter, (unsigned char*) cases[idx].view)) { char *got = (char*) qd_iterator_copy(iter); snprintf(fail_text, FAIL_TEXT_SIZE, "Addr '%s' failed. Expected '%s', got '%s'", cases[idx].addr, cases[idx].view, got); return fail_text; } qd_iterator_free(iter); } return 0; }
qdr_link_route_t *qdr_route_add_link_route_CT(qdr_core_t *core, qd_iterator_t *name, qd_parsed_field_t *prefix_field, qd_parsed_field_t *container_field, qd_parsed_field_t *connection_field, qd_address_treatment_t treatment, qd_direction_t dir) { qdr_link_route_t *lr = new_qdr_link_route_t(); // // Set up the link_route structure // ZERO(lr); lr->identity = qdr_identifier(core); lr->name = name ? (char*) qd_iterator_copy(name) : 0; lr->dir = dir; lr->treatment = treatment; // // Find or create an address for link-attach routing // qd_iterator_t *iter = qd_parse_raw(prefix_field); qd_iterator_reset_view(iter, ITER_VIEW_ADDRESS_HASH); qd_iterator_annotate_prefix(iter, dir == QD_INCOMING ? 'C' : 'D'); qd_hash_retrieve(core->addr_hash, iter, (void*) &lr->addr); if (!lr->addr) { lr->addr = qdr_address_CT(core, treatment); DEQ_INSERT_TAIL(core->addrs, lr->addr); qd_hash_insert(core->addr_hash, iter, lr->addr, &lr->addr->hash_handle); } lr->addr->ref_count++; // // Find or create a connection identifier structure for this link route // if (container_field || connection_field) { lr->conn_id = qdr_route_declare_id_CT(core, qd_parse_raw(container_field), qd_parse_raw(connection_field)); DEQ_INSERT_TAIL_N(REF, lr->conn_id->link_route_refs, lr); qdr_connection_ref_t * cref = DEQ_HEAD(lr->conn_id->connection_refs); while (cref) { qdr_link_route_activate_CT(core, lr, cref->conn); cref = DEQ_NEXT(cref); } } // // Add the link route to the core list // DEQ_INSERT_TAIL(core->link_routes, lr); return lr; }