aboutsummaryrefslogtreecommitdiffstats
path: root/gg_map
diff options
context:
space:
mode:
authorLaurent Ghigonis <laurent@p1sec.com>2013-07-09 11:45:00 +0200
committerLaurent Ghigonis <laurent@p1sec.com>2013-07-09 11:45:00 +0200
commit07306a2a00c908979fbb8cf3127278bae00803a4 (patch)
tree91c84a1d7f1402f1c2b7833a90b5ff1d245eae5b /gg_map
parentfix segfault because of bad libdnet intf_get_dst() usage (diff)
downloadglouglou-07306a2a00c908979fbb8cf3127278bae00803a4.tar.xz
glouglou-07306a2a00c908979fbb8cf3127278bae00803a4.zip
WIP, improve traceroute
* del trace on timeout (still WIP) * keep track of nodes traceroute usage * fix IP address storage / transfer * add some debug printf around
Diffstat (limited to 'gg_map')
-rw-r--r--gg_map/gg_map.c91
1 files changed, 70 insertions, 21 deletions
diff --git a/gg_map/gg_map.c b/gg_map/gg_map.c
index 3fbc329..73a5068 100644
--- a/gg_map/gg_map.c
+++ b/gg_map/gg_map.c
@@ -57,7 +57,7 @@ _cb_ggnet_addgroup(struct ggnet *net, struct ggnet_nodegroup *group,
{
Egraph_Vertice *vgroup;
- vgroup = egraph_group_add(_egraph, ip_to_str(group->addr.s_addr), group);
+ vgroup = egraph_group_add(_egraph, inet_ntoa(group->addr), group);
ggnet_nodegroup_usrdata_set(group, vgroup);
if (parent)
egraph_group_vertice_attach(_egraph, vgroup,
@@ -112,7 +112,8 @@ _node_to_vertice(struct ggnet_node *n)
v = ggnet_node_usrdata_get(n);
if (!v) {
- v = egraph_vertice_add(_egraph, ip_to_str(n->addr.s_addr), n);
+
+ v = egraph_vertice_add(_egraph, inet_ntoa(n->addr), n);
ggnet_node_usrdata_set(n, v);
group = ggnet_node_group_get(n);
if (group)
@@ -177,7 +178,7 @@ _conn_add(u_int id, u_int src, u_int dst, u_int proto, u_int8_t pktsize)
e = egraph_edge_find(_egraph, va, vb);
if (_loglevel >= 2)
printf("_conn_add: a %d b %d e %p id %d\n", va->id, vb->id, e, id);
- if (!e) {
+ if (!e && !egraph_edge_find(_egraph, va, vb)) {
if (a->group && a->group->conn_count == 1)
_node_detach_parentgroup(a);
if (b->group && b->group->conn_count == 1)
@@ -186,7 +187,33 @@ _conn_add(u_int id, u_int src, u_int dst, u_int proto, u_int8_t pktsize)
if (_loglevel >= 2)
printf("_conn_add: egraph edge added %p\n", e);
}
- ggnet_conn_usrdata_set(conn, e);
+ if (e)
+ ggnet_conn_usrdata_set(conn, e);
+}
+
+static void
+_del_trace(struct ggnet_node *a, struct ggnet_node *b)
+{
+ struct ggnet_node *n, *np;
+ Egraph_Vertice *va, *vb;
+ Egraph_Edge *e;
+
+ n = b;
+ while ((np = n->path_parent)) {
+ if (np->used_traceroute > 0 && np->used_conn == 0) {
+ np->used_traceroute--;
+ if (np->used_traceroute == 0) {
+ va = ggnet_node_usrdata_get(np);
+ vb = ggnet_node_usrdata_get(n);
+ e = egraph_edge_find(_egraph, va, vb);
+ if (e) // XXX IN PROGRESS REMOVE but SEGV
+ egraph_edge_del(_egraph, e);
+ egraph_vertice_del(_egraph, va);
+ ggnet_node_usrdata_set(np, NULL);
+ }
+ }
+ n = np;
+ }
}
static void
@@ -210,7 +237,12 @@ _conn_del(int id) {
// a vertice without edge ...
if (_loglevel >= 2)
printf("_conn_del: edge del %p\n", e); // XXX
- egraph_edge_del(_egraph, e);
+ if (b->path_parent)
+ _del_trace(a, b);
+ else {
+ egraph_edge_del(_egraph, e);
+ ggnet_conn_usrdata_set(conn, NULL);
+ }
if (a->group && a->group->conn_count == 0)
_node_attach_parentgroup(a);
if (b->group && b->group->conn_count == 0)
@@ -268,15 +300,18 @@ _node_link_next(struct ggnet_node *np, struct in_addr *ip)
Egraph_Vertice *v;
n = ggnet_node_find(_ggnet, ip);
- if (!n) {
- n = ggnet_node_add(_ggnet, ip, 0);
- v = _node_to_vertice(n);
- if (v)
- egraph_vertice_type_set(_egraph, v,
- "vertice_alt1");
- else
- printf("gg_map: ERROR: could not create trace vertice !\n");
- }
+ if (np == n)
+ return n;
+ if (!n)
+ n = ggnet_node_add(_ggnet, ip, 1);
+ else if (n->used_traceroute > 0)
+ n->used_traceroute++;
+ v = _node_to_vertice(n);
+ if (v)
+ egraph_vertice_type_set(_egraph, v,
+ "vertice_alt1");
+ else
+ printf("gg_map: ERROR: could not create trace vertice !\n");
ggnet_node_path_link(np, n);
return n;
}
@@ -284,23 +319,37 @@ _node_link_next(struct ggnet_node *np, struct in_addr *ip)
static void
_conn_trace(u_int32_t addr, u_int32_t src, u_int8_t hopcount, struct gg_packet *pkt) {
struct gg_packet_tracehop *h;
- struct ggnet_node *n;
+ struct ggnet_node *a, *b, *n;
+ struct ggnet_conn *conn;
struct in_addr ip;
+ Egraph_Edge *e;
int i;
+ /* look for direct link between a and b */
ip.s_addr = src;
- printf("XXX ==== SRC %x\n", src);
- n = ggnet_node_find(_ggnet, &ip);
- printf("XXX ==== SRC node %p\n", n);
- if (!n)
- return;
+ a = ggnet_node_find(_ggnet, &ip);
+ if (!a) return;
+ ip.s_addr = addr;
+ b = ggnet_node_find(_ggnet, &ip);
+ if (b) {
+ conn = ggnet_conn_find_by_node(_ggnet, a, b);
+ e = egraph_edge_find(_egraph, ggnet_node_usrdata_get(a),
+ ggnet_node_usrdata_get(b));
+ if (e) {
+ printf("XXX remove direct edge !\n");
+ /* remove direct link now that we have traceroute */
+ egraph_edge_del(_egraph, e);
+ ggnet_conn_usrdata_set(conn, NULL);
+ }
+ }
+ /* build traceroute path between a and b */
+ n = a;
for (i=0; i<hopcount; i++) {
h = &pkt->trace_hops[i];
ip.s_addr = h->addr;
n = _node_link_next(n, &ip);
}
-
ip.s_addr = addr;
n = _node_link_next(n, &ip);
}