void qdr_core_bind_address_link_CT(qdr_core_t *core, qdr_address_t *addr, qdr_link_t *link) { const char *key = (const char*) qd_hash_key_by_handle(addr->hash_handle); link->owning_addr = addr; if (key && (*key == QD_ITER_HASH_PREFIX_MOBILE)) link->phase = (int) (key[1] - '0'); if (link->link_direction == QD_OUTGOING) { qdr_add_link_ref(&addr->rlinks, link, QDR_LINK_LIST_CLASS_ADDRESS); if (DEQ_SIZE(addr->rlinks) == 1) { if (key && (*key == QD_ITER_HASH_PREFIX_EDGE_SUMMARY || *key == QD_ITER_HASH_PREFIX_MOBILE)) qdr_post_mobile_added_CT(core, key, addr->treatment); qdr_addr_start_inlinks_CT(core, addr); qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_LOCAL_DEST, addr); } else if (DEQ_SIZE(addr->rlinks) == 2 && qd_bitmask_cardinality(addr->rnodes) == 0) qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_DEST, addr); } else { // link->link_direction == QD_INCOMING qdr_add_link_ref(&addr->inlinks, link, QDR_LINK_LIST_CLASS_ADDRESS); if (DEQ_SIZE(addr->inlinks) == 1) { qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_SOURCE, addr); if (!!addr->fallback && !link->fallback) qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_BECAME_SOURCE, addr->fallback); } else if (DEQ_SIZE(addr->inlinks) == 2) { qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_SOURCE, addr); if (!!addr->fallback && !link->fallback) qdrc_event_addr_raise(core, QDRC_EVENT_ADDR_TWO_SOURCE, addr->fallback); } } }
static void qdr_map_destination_CT(qdr_core_t *core, qdr_action_t *action, bool discard) { // // TODO - handle the class-prefix and phase explicitly // 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, "map_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, "map_destination: Router not found"); break; } qd_field_iterator_t *iter = address->iterator; qdr_address_t *addr = 0; qd_hash_retrieve(core->addr_hash, iter, (void**) &addr); if (!addr) { addr = qdr_address_CT(core, qdr_treatment_for_address_hash_CT(core, iter)); qd_hash_insert(core->addr_hash, iter, addr, &addr->hash_handle); DEQ_ITEM_INIT(addr); DEQ_INSERT_TAIL(core->addrs, addr); } qdr_node_t *rnode = core->routers_by_mask_bit[router_maskbit]; qd_bitmask_set_bit(addr->rnodes, router_maskbit); rnode->ref_count++; qdr_addr_start_inlinks_CT(core, addr); // // TODO - If this affects a waypoint, create the proper side effects // } while (false); qdr_field_free(address); }
static void qdr_subscribe_CT(qdr_core_t *core, qdr_action_t *action, bool discard) { qdr_field_t *address = action->args.io.address; qdr_subscription_t *sub = action->args.io.subscription; if (!discard) { char aclass = action->args.io.address_class; char phase = action->args.io.address_phase; qdr_address_t *addr = 0; char *astring = (char*) qd_field_iterator_copy(address->iterator); qd_log(core->log, QD_LOG_INFO, "In-process subscription %c/%s", aclass, astring); free(astring); qd_address_iterator_override_prefix(address->iterator, aclass); if (aclass == 'M') qd_address_iterator_set_phase(address->iterator, phase); qd_address_iterator_reset_view(address->iterator, ITER_VIEW_ADDRESS_HASH); qd_hash_retrieve(core->addr_hash, address->iterator, (void**) &addr); if (!addr) { addr = qdr_address_CT(core, action->args.io.treatment); qd_hash_insert(core->addr_hash, address->iterator, addr, &addr->hash_handle); DEQ_ITEM_INIT(addr); DEQ_INSERT_TAIL(core->addrs, addr); } sub->addr = addr; DEQ_ITEM_INIT(sub); DEQ_INSERT_TAIL(addr->subscriptions, sub); qdr_addr_start_inlinks_CT(core, addr); } else free(sub); qdr_field_free(address); }