void qdr_route_del_link_route_CT(qdr_core_t *core, qdr_link_route_t *lr) { // // Disassociate from the connection identifier. Check to see if the identifier // should be removed. // qdr_conn_identifier_t *cid = lr->conn_id; if (cid) { if (!!cid->open_connection) qdr_link_route_deactivate_CT(core, lr, cid->open_connection); DEQ_REMOVE_N(REF, cid->link_route_refs, lr); qdr_route_check_id_for_deletion_CT(core, cid); } // // Disassociate the link route from its address. Check to see if the address // should be removed. // qdr_address_t *addr = lr->addr; if (addr && --addr->ref_count == 0) qdr_check_addr_CT(core, addr, false); // // Remove the link route from the core list. // DEQ_REMOVE(core->link_routes, lr); free(lr->name); free_qdr_link_route_t(lr); }
void qdr_route_del_auto_link_CT(qdr_core_t *core, qdr_auto_link_t *al) { // // Disassociate from the connection identifier. Check to see if the identifier // should be removed. // qdr_conn_identifier_t *cid = al->conn_id; if (cid) { qdr_connection_ref_t * cref = DEQ_HEAD(cid->connection_refs); while (cref) { qdr_auto_link_deactivate_CT(core, al, cref->conn); cref = DEQ_NEXT(cref); } DEQ_REMOVE_N(REF, cid->auto_link_refs, al); qdr_route_check_id_for_deletion_CT(core, cid); } // // Disassociate the auto link from its address. Check to see if the address // should be removed. // qdr_address_t *addr = al->addr; if (addr && --addr->ref_count == 0) qdr_check_addr_CT(core, addr, false); // // Remove the auto link from the core list. // DEQ_REMOVE(core->auto_links, al); free(al->name); free(al->external_addr); free_qdr_auto_link_t(al); }
void qdr_core_remove_address(qdr_core_t *core, qdr_address_t *addr) { qdr_address_config_t *config = addr->config; if (config && --config->ref_count == 0) free_address_config(config); // Remove the address from the list, hash index, and parse tree DEQ_REMOVE(core->addrs, addr); if (addr->hash_handle) { const char *a_str = (const char *)qd_hash_key_by_handle(addr->hash_handle); if (QDR_IS_LINK_ROUTE(a_str[0])) { qd_iterator_t *iter = qd_iterator_string(a_str, ITER_VIEW_ALL); qdr_link_route_unmap_pattern_CT(core, iter); qd_iterator_free(iter); } qd_hash_remove_by_handle(core->addr_hash, addr->hash_handle); qd_hash_handle_free(addr->hash_handle); } // Free resources associated with this address DEQ_APPEND(addr->rlinks, addr->inlinks); qdr_link_ref_t *lref = DEQ_HEAD(addr->rlinks); while (lref) { qdr_link_t *link = lref->link; assert(link->owning_addr == addr); link->owning_addr = 0; qdr_del_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS); lref = DEQ_HEAD(addr->rlinks); } qd_bitmask_free(addr->rnodes); if (addr->treatment == QD_TREATMENT_ANYCAST_CLOSEST) { qd_bitmask_free(addr->closest_remotes); } else if (addr->treatment == QD_TREATMENT_ANYCAST_BALANCED) { free(addr->outstanding_deliveries); } qdr_connection_ref_t *cr = DEQ_HEAD(addr->conns); while (cr) { qdr_del_connection_ref(&addr->conns, cr->conn); cr = DEQ_HEAD(addr->conns); } if (!!addr->fallback) { addr->fallback->fallback_for = 0; qdr_check_addr_CT(core, addr->fallback); } free(addr->add_prefix); free(addr->del_prefix); free_qdr_address_t(addr); }
static void qdr_unsubscribe_CT(qdr_core_t *core, qdr_action_t *action, bool discard) { qdr_subscription_t *sub = action->args.io.subscription; if (!discard) { DEQ_REMOVE(sub->addr->subscriptions, sub); sub->addr = 0; qdr_check_addr_CT(sub->core, sub->addr, false); } free(sub); }
void qdr_core_delete_auto_link(qdr_core_t *core, qdr_auto_link_t *al) { if (al->conn_id) { DEQ_REMOVE_N(REF, al->conn_id->auto_link_refs, al); qdr_route_check_id_for_deletion_CT(core, al->conn_id); } qdr_address_t *addr = al->addr; if (addr && --addr->ref_count == 0) qdr_check_addr_CT(core, addr); free(al->name); free(al->external_addr); qdr_core_timer_free_CT(core, al->retry_timer); free_qdr_auto_link_t(al); }
static void qdr_unmap_destination_CT(qdr_core_t *core, qdr_action_t *action, bool discard) { int router_maskbit = action->args.route_table.router_maskbit; qdr_field_t *address = action->args.route_table.address; if (discard) { qdr_field_free(address); return; } do { if (router_maskbit >= qd_bitmask_width() || router_maskbit < 0) { qd_log(core->log, QD_LOG_CRITICAL, "unmap_destination: Router maskbit out of range: %d", router_maskbit); break; } if (core->routers_by_mask_bit[router_maskbit] == 0) { qd_log(core->log, QD_LOG_CRITICAL, "unmap_destination: Router not found"); break; } qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit]; qd_field_iterator_t *iter = address->iterator; qdr_address_t *addr = 0; qd_hash_retrieve(core->addr_hash, iter, (void**) &addr); if (!addr) { qd_log(core->log, QD_LOG_CRITICAL, "unmap_destination: Address not found"); break; } qd_bitmask_clear_bit(addr->rnodes, router_maskbit); rnode->ref_count--; // // TODO - If this affects a waypoint, create the proper side effects // qdr_check_addr_CT(core, addr, false); } while (false); qdr_field_free(address); }
void qdr_core_delete_link_route(qdr_core_t *core, qdr_link_route_t *lr) { if (lr->conn_id) { DEQ_REMOVE_N(REF, lr->conn_id->link_route_refs, lr); qdr_route_check_id_for_deletion_CT(core, lr->conn_id); } if (lr->addr) { if (--lr->addr->ref_count == 0) { qdr_check_addr_CT(core, lr->addr); } } free(lr->add_prefix); free(lr->del_prefix); free(lr->name); free(lr->pattern); free_qdr_link_route_t(lr); }