diff options
author | Nick Mathewson <nickm@torproject.org> | 2004-03-20 01:48:05 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2004-03-20 01:48:05 +0000 |
commit | da9d5ccfdada2b7f306b3da047b1871e117ac5fe (patch) | |
tree | fb7c828a6096626b8aaeab75a73e579e1225a97e | |
parent | b0ef4e1143619e0beb2388f523c7dce39d5bc6ed (diff) | |
download | tor-da9d5ccfdada2b7f306b3da047b1871e117ac5fe.tar tor-da9d5ccfdada2b7f306b3da047b1871e117ac5fe.tar.gz |
Add initial history-tracking backend code for reputation module. Not called or tested yet.
svn:r1310
-rw-r--r-- | src/common/util.h | 9 | ||||
-rw-r--r-- | src/or/Makefile.am | 2 | ||||
-rw-r--r-- | src/or/or.h | 12 | ||||
-rw-r--r-- | src/or/rephist.c | 175 |
4 files changed, 194 insertions, 4 deletions
diff --git a/src/common/util.h b/src/common/util.h index 5bdcaed96..46792b84b 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -41,6 +41,7 @@ void *tor_realloc(void *ptr, size_t size); char *tor_strdup(const char *s); char *tor_strndup(const char *s, size_t n); #define tor_free(p) do {if(p) {free(p); (p)=NULL;}} while(0) +void tor_strlower(char *s); typedef struct { void **list; @@ -66,9 +67,11 @@ strmap_t* strmap_new(void); void* strmap_set(strmap_t *map, const char *key, void *val); void* strmap_get(strmap_t *map, const char *key); void* strmap_remove(strmap_t *map, const char *key); -void strmap_foreach(strmap_t *map, - void* (*fn)(const char *key, void *val, void *data), - void *data); +void* strmap_set_lc(strmap_t *map, const char *key, void *val); +void* strmap_get_lc(strmap_t *map, const char *key); +void* strmap_remove_lc(strmap_t *map, const char *key); +typedef void* (*strmap_foreach_fn)(const char *key, void *val, void *data); +void strmap_foreach(strmap_t *map, strmap_foreach_fn fn, void *data); void strmap_free(strmap_t *map, void (*free_val)(void*)); strmap_iter_t *strmap_iter_init(strmap_t *map); diff --git a/src/or/Makefile.am b/src/or/Makefile.am index f79381a82..c056fa20f 100644 --- a/src/or/Makefile.am +++ b/src/or/Makefile.am @@ -7,7 +7,7 @@ bin_PROGRAMS = tor tor_SOURCES = buffers.c circuit.c command.c connection.c \ connection_or.c config.c dirserv.c \ onion.c router.c routerlist.c directory.c dns.c connection_edge.c \ - cpuworker.c main.c tor_main.c + rephist.c cpuworker.c main.c tor_main.c tor_LDADD = ../common/libor.a diff --git a/src/or/or.h b/src/or/or.h index 8efbba62f..154df4a58 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -900,6 +900,18 @@ void directory_set_dirty(); size_t dirserv_get_directory(const char **cp); +/********************************* rephist.c ***************************/ + +void rep_hist_init(void); +void rep_hist_note_connect_failed(const char* nickname, time_t when); +void rep_hist_note_connect_succeeded(const char* nickname, time_t when); +void rep_hist_note_connection_died(const char* nickname, time_t when); +void rep_hist_note_extend_succeeded(const char *from_name, + const char *to_name); +void rep_hist_note_extend_failed(const char *from_name, const char *to_name); +void rep_hist_dump_status(time_t now); + + #endif /* diff --git a/src/or/rephist.c b/src/or/rephist.c new file mode 100644 index 000000000..7fa5c5a54 --- /dev/null +++ b/src/or/rephist.c @@ -0,0 +1,175 @@ +/* Copyright 2004 Roger Dingledine */ +/* See LICENSE for licensing information */ +/* $Id$ */ + +#include "or.h" + +typedef struct link_history_t { + time_t since; + unsigned long n_extend_ok; + unsigned long n_extend_fail; +} link_history_t; + +typedef struct or_history_t { + time_t since; + unsigned long n_conn_ok; + unsigned long n_conn_fail; + unsigned long uptime; + unsigned long downtime; + time_t up_since; + time_t down_since; + strmap_t *link_history_map; +} or_history_t; + +static strmap_t *history_map; + +static or_history_t *get_or_history(const char* nickname) +{ + or_history_t *hist; + hist = (or_history_t*) strmap_get(history_map, nickname); + if (!hist) { + hist = tor_malloc_zero(sizeof(or_history_t)); + hist->link_history_map = strmap_new(); + hist->since = time(NULL); + strmap_set(history_map, nickname, hist); + } + return hist; +} + +static link_history_t *get_link_history(const char *from_name, + const char *to_name) +{ + or_history_t *orhist; + link_history_t *lhist; + orhist = get_or_history(from_name); + lhist = (link_history_t*) strmap_get(orhist->link_history_map, to_name); + if (!lhist) { + lhist = tor_malloc_zero(sizeof(link_history_t)); + lhist->since = time(NULL); + strmap_set(orhist->link_history_map, to_name, lhist); + } + return lhist; +} + +static void update_or_history(or_history_t *hist, time_t when) +{ + assert(hist); + if (hist->up_since) { + assert(!hist->down_since); + hist->uptime += (when - hist->up_since); + hist->up_since = when; + } else if (hist->down_since) { + hist->downtime += (when - hist->down_since); + hist->down_since = when; + } +} + +void rep_hist_init(void) +{ + history_map = strmap_new(); +} + +void rep_hist_note_connect_failed(const char* nickname, time_t when) +{ + or_history_t *hist; + hist = get_or_history(nickname); + ++hist->n_conn_fail; + if (hist->up_since) { + hist->uptime += (when - hist->up_since); + hist->up_since = 0; + } + if (!hist->down_since) + hist->down_since = when; +} + +void rep_hist_note_connect_succeeded(const char* nickname, time_t when) +{ + or_history_t *hist; + hist = get_or_history(nickname); + ++hist->n_conn_ok; + if (hist->down_since) { + hist->downtime += (when - hist->down_since); + hist->down_since = 0; + } + if (!hist->up_since) + hist->up_since = when; +} +void rep_hist_note_connection_died(const char* nickname, time_t when) +{ + or_history_t *hist; + hist = get_or_history(nickname); + if (hist->up_since) { + hist->uptime += (when - hist->up_since); + hist->up_since = 0; + } + if (!hist->down_since) + hist->down_since = when; +} + +void rep_hist_note_extend_succeeded(const char *from_name, + const char *to_name) +{ + link_history_t *hist; + hist = get_link_history(from_name, to_name); + ++hist->n_extend_ok; +} +void rep_hist_note_extend_failed(const char *from_name, const char *to_name) +{ + link_history_t *hist; + hist = get_link_history(from_name, to_name); + ++hist->n_extend_fail; +} + +void rep_hist_dump_status(time_t now) +{ + strmap_iter_t *lhist_it; + strmap_iter_t *orhist_it; + const char *name1, *name2; + or_history_t *or_history; + link_history_t *link_history; + double uptime; + char buffer[2048]; + char *cp; + int len; + + log(LOG_WARN, "--------------- Dumping history information:"); + + for (orhist_it = strmap_iter_init(history_map); !strmap_iter_done(orhist_it); + orhist_it = strmap_iter_next(history_map,orhist_it)) { + strmap_iter_get(orhist_it, &name1, (void**)&or_history); + + update_or_history(or_history, now); + + uptime = ((double)or_history->uptime) / or_history->downtime; + log(LOG_WARN, "OR %s: %ld/%ld good connection attempts; uptime %.2f%%", + name1, + or_history->n_conn_ok, or_history->n_conn_fail+or_history->n_conn_ok, + uptime*100.0); + + strcpy(buffer, " Good extend attempts: "); + len = strlen(buffer); + for (lhist_it = strmap_iter_init(or_history->link_history_map); + !strmap_iter_done(lhist_it); + lhist_it = strmap_iter_next(or_history->link_history_map, lhist_it)) { + strmap_iter_get(lhist_it, &name2, (void**)&link_history); + len += snprintf(buffer+len, 2048-len, "%s(%ld/%ld); ", name2, + link_history->n_extend_ok, + link_history->n_extend_ok+link_history->n_extend_fail); + if (len >= 2048) { + buffer[2047]='\0'; + break; + } + } + log(LOG_WARN, buffer); + } +} + + + +/* + Local Variables: + mode:c + indent-tabs-mode:nil + c-basic-offset:2 + End: +*/ |