summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2004-03-20 01:48:05 +0000
committerNick Mathewson <nickm@torproject.org>2004-03-20 01:48:05 +0000
commitda9d5ccfdada2b7f306b3da047b1871e117ac5fe (patch)
treefb7c828a6096626b8aaeab75a73e579e1225a97e
parentb0ef4e1143619e0beb2388f523c7dce39d5bc6ed (diff)
downloadtor-da9d5ccfdada2b7f306b3da047b1871e117ac5fe.tar.gz
tor-da9d5ccfdada2b7f306b3da047b1871e117ac5fe.zip
Add initial history-tracking backend code for reputation module. Not called or tested yet.
svn:r1310
-rw-r--r--src/common/util.h9
-rw-r--r--src/or/Makefile.am2
-rw-r--r--src/or/or.h12
-rw-r--r--src/or/rephist.c175
4 files changed, 194 insertions, 4 deletions
diff --git a/src/common/util.h b/src/common/util.h
index 5bdcaed96b..46792b84b3 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 f79381a828..c056fa20f2 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 8efbba62f3..154df4a58b 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 0000000000..7fa5c5a540
--- /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:
+*/