aboutsummaryrefslogtreecommitdiffstats
path: root/libglouglou/libggnet.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglouglou/libggnet.c')
-rw-r--r--libglouglou/libggnet.c68
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);
+}