From 07306a2a00c908979fbb8cf3127278bae00803a4 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Tue, 9 Jul 2013 11:45:00 +0200 Subject: 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 --- gg_map/gg_map.c | 91 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 70 insertions(+), 21 deletions(-) (limited to 'gg_map/gg_map.c') 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; itrace_hops[i]; ip.s_addr = h->addr; n = _node_link_next(n, &ip); } - ip.s_addr = addr; n = _node_link_next(n, &ip); } -- cgit v1.2.3-59-g8ed1b