diff options
Diffstat (limited to 'libglouglou/libggnet.c')
-rw-r--r-- | libglouglou/libggnet.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/libglouglou/libggnet.c b/libglouglou/libggnet.c index 832de54..5f9810b 100644 --- a/libglouglou/libggnet.c +++ b/libglouglou/libggnet.c @@ -4,6 +4,7 @@ #include "libggnet.h" #include "libggnet_dns.h" +#include "libggnet_traceroute.h" static struct ggnet_nodegroup * nodegroup_add(struct ggnet *, @@ -17,6 +18,7 @@ static struct ggnet_nodegroup * static void nodegroup_set(struct ggnet *, struct ggnet_node *); static void nodegroup_unset(struct ggnet *, struct ggnet_node *); static void _cb_dns_reverse(struct in_addr *, char *, void *); +static void _cb_traceroute_trace(struct ggnet_traceroute_req *req, void *data); struct ggnet * ggnet_new(int manage_connid) @@ -53,12 +55,25 @@ ggnet_set_grouping(struct ggnet *net, int set, } void +ggnet_setcb_traceroute(struct ggnet *net, + void (*cb_link)(struct ggnet *, + struct ggnet_node *, struct ggnet_node *), + void (*cb_unlink)(struct ggnet *, + struct ggnet_node *, struct ggnet_node *)) +{ + net->cb_traceroute_link = cb_link; + net->cb_traceroute_unlink = cb_unlink; +} + +void ggnet_set_dns(struct ggnet *net, int set, struct event_base *ev_base, void (*cb_nodename)(struct ggnet *, struct ggnet_node *)) { + printf("XXX ggnet_set_dns %d\n", set); net->use_dns = set; if (set) { + printf("XXX calling ggnet_dns_new\n"); net->ggdns = ggnet_dns_new(ev_base); net->cb_nodename = cb_nodename; } @@ -67,6 +82,20 @@ ggnet_set_dns(struct ggnet *net, int set, } void +ggnet_set_traceroute(struct ggnet *net, int set, char *iface, + struct event_base *ev_base, + void (*cb_traceroute)(struct ggnet *, struct ggnet_traceroute_req *)) +{ + net->use_traceroute = set; + if (set) { + net->ggtraceroute = ggnet_traceroute_new(ev_base, iface, net->debug); + net->cb_traceroute = cb_traceroute; + } + else if (net->use_traceroute) + ggnet_traceroute_free(net->ggtraceroute); +} + +void ggnet_debug_set(struct ggnet *net, int set) { net->debug = set; @@ -110,6 +139,12 @@ ggnet_node_add(struct ggnet *net, struct in_addr *addr) nodegroup_set(net, n); if (net->use_dns) n->dns_req = ggnet_dns_reverse(net->ggdns, &n->addr, _cb_dns_reverse, n); + if (net->use_traceroute) { + struct addr ip; + addr_aton(inet_ntoa(*addr), &ip); + printf("XXX calling trace on %s\n", inet_ntoa(*addr)); + n->traceroute_req = ggnet_traceroute_trace_tcp(net->ggtraceroute, &ip, 80, _cb_traceroute_trace, NULL, n); + } return n; } @@ -163,6 +198,26 @@ ggnet_node_group_get(struct ggnet_node *n) return n->group; } +int +ggnet_node_path_link(struct ggnet_node *a, struct ggnet_node *b) +{ + if (b->path_parent) { + if (b->path_parent == a) + return 0; /* already path connected */ + /* remove old path link */ + LIST_REMOVE(b, entry_path); + b->path_parent = NULL; + if (a->net->cb_traceroute_unlink) + a->net->cb_traceroute_unlink(a->net, a, b); + } + LIST_INSERT_HEAD(&a->path_to, b, entry_path); + b->path_parent = a; + if (a->net->cb_traceroute_link) + a->net->cb_traceroute_link(a->net, a, b); + + return 1; +} + struct ggnet_conn * ggnet_conn_add(struct ggnet *net, struct in_addr *src, int src_port, struct in_addr *dst, int dst_port, int proto, int size, @@ -487,6 +542,7 @@ _cb_dns_reverse(struct in_addr *ip, char *name, void *data) struct ggnet *net; struct ggnet_node *n; + printf("XXX _cb_dns_reverse %s\n", name); n = data; net = n->net; n->dns_req = NULL; @@ -496,3 +552,15 @@ _cb_dns_reverse(struct in_addr *ip, char *name, void *data) } } +static void +_cb_traceroute_trace(struct ggnet_traceroute_req *req, void *data) +{ + struct ggnet *net; + struct ggnet_node *n; + + printf("XXX _cb_traceroute_trace %p\n", req); + n = data; + net = n->net; + n->traceroute_req = NULL; + net->cb_traceroute(net, req); +} |