/** Parse a file containing router descriptors and load them to our routerlist. This function is used to setup an artificial network so that we can conduct tests on it. */ void helper_setup_fake_routerlist(void) { int retval; routerlist_t *our_routerlist = NULL; smartlist_t *our_nodelist = NULL; /* Read the file that contains our test descriptors. */ /* We need to mock this function otherwise the descriptors will not accepted as they are too old. */ MOCK(router_descriptor_is_older_than, router_descriptor_is_older_than_replacement); /* Load all the test descriptors to the routerlist. */ retval = router_load_routers_from_string(TEST_DESCRIPTORS, NULL, SAVED_IN_JOURNAL, NULL, 0, NULL); tt_int_op(retval, ==, HELPER_NUMBER_OF_DESCRIPTORS); /* Sanity checking of routerlist and nodelist. */ our_routerlist = router_get_routerlist(); tt_int_op(smartlist_len(our_routerlist->routers), ==, HELPER_NUMBER_OF_DESCRIPTORS); routerlist_assert_ok(our_routerlist); our_nodelist = nodelist_get_list(); tt_int_op(smartlist_len(our_nodelist), ==, HELPER_NUMBER_OF_DESCRIPTORS); /* Mark all routers as non-guards but up and running! */ SMARTLIST_FOREACH_BEGIN(our_nodelist, node_t *, node) { node->is_running = 1; node->is_valid = 1; node->is_possible_guard = 0; } SMARTLIST_FOREACH_END(node);
/* replacement for torflow in Tor. for now just grab the bandwidth we configured * in the XML and use that as the measured bandwidth value. since our configured * bandwidth doesnt change over time, this could just be run once (by setting the * time far in the future so the file is not seen as outdated). but we need to * run it after all routers are loaded, so its best to re-run periodically. * * eventually we will want an option to run something similar to the actual * torflow scripts that download files over Tor and computes bandwidth values. * in that case it needs to run more often to keep monitoring the actual state * of the network. * * torflow writes a few things to the v3bwfile. all Tor currently uses is: * * 0123456789 * node_id=$0123456789ABCDEF0123456789ABCDEF01234567 bw=12345 * ... * * where 0123456789 is the time, 0123456789ABCDEF0123456789ABCDEF01234567 is * the relay's fingerprint, and 12345 is the measured bandwidth in ?. */ void scalliontor_init_v3bw(ScallionTor* stor) { /* open the bw file, clearing it if it exists */ FILE *v3bw = fopen(stor->v3bw_name, "w"); if(v3bw == NULL) { stor->shadowlibFuncs->log(SHADOW_LOG_LEVEL_MESSAGE, __FUNCTION__, "v3bandwidth file not updated: can not open file '%s'\n", stor->v3bw_name); return; } time_t maxtime = -1; /* print time part on first line */ if(fprintf(v3bw, "%lu\n", maxtime) < 0) { /* uhhhh... */ stor->shadowlibFuncs->log(SHADOW_LOG_LEVEL_MESSAGE, __FUNCTION__, "v3bandwidth file not updated: can write time '%u' to file '%s'\n", maxtime, stor->v3bw_name); return; } routerlist_t *rlist = router_get_routerlist(); routerinfo_t *rinfo; /* print an entry for each router */ for (int i=0; i < smartlist_len(rlist->routers); i++) { rinfo = smartlist_get(rlist->routers, i); /* get the fingerprint from its digest */ char node_id[HEX_DIGEST_LEN+1]; base16_encode(node_id, HEX_DIGEST_LEN+1, rinfo->cache_info.identity_digest, DIGEST_LEN); /* the network address */ in_addr_t netaddr = htonl(rinfo->addr); /* ask shadow for this node's configured bandwidth */ guint bwdown = 0, bwup = 0; stor->shadowlibFuncs->getBandwidth(netaddr, &bwdown, &bwup); /* XXX careful here! shadow bandwidth may be different than the consensus * right now i believe this v3bw file is not used to compute the consensus * "w Bandwidth" line, and * intercept_rep_hist_bandwidth_assess and * intercept_router_get_advertised_bandwidth_capped * takes care of things. so leave it for now. */ guint bw = MIN(bwup, bwdown); if(fprintf(v3bw, "node_id=$%s bw=%u\n", node_id, bw) < 0) { /* uhhhh... */ stor->shadowlibFuncs->log(SHADOW_LOG_LEVEL_MESSAGE, __FUNCTION__, "v3bandwidth file not updated: can write line 'node_id=$%s bw=%u\n' to file '%s'\n", node_id, bw, stor->v3bw_name); return; } } fclose(v3bw); /* reschedule */ stor->shadowlibFuncs->createCallback((ShadowPluginCallbackFunc)scalliontor_init_v3bw, (gpointer)stor, VTORFLOW_SCHED_PERIOD); }
/** As dirserv_get_routerdescs(), but instead of getting signed_descriptor_t * pointers, adds copies of digests to fps_out, and doesn't use the * /tor/server/ prefix. For a /d/ request, adds descriptor digests; for other * requests, adds identity digests. */ int dirserv_get_routerdesc_spool(smartlist_t *spool_out, const char *key, dir_spool_source_t source, int conn_is_encrypted, const char **msg_out) { *msg_out = NULL; if (!strcmp(key, "all")) { const routerlist_t *rl = router_get_routerlist(); SMARTLIST_FOREACH_BEGIN(rl->routers, const routerinfo_t *, r) { spooled_resource_t *spooled; spooled = spooled_resource_new(source, (const uint8_t *)r->cache_info.identity_digest, DIGEST_LEN); /* Treat "all" requests as if they were unencrypted */ conn_is_encrypted = 0; smartlist_add(spool_out, spooled); } SMARTLIST_FOREACH_END(r); } else if (!strcmp(key, "authority")) {