X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fnetvis.cpp;h=7bb49bb458e507cb52d3f33cfcd17872f3537142;hb=049518d751b3e2bada5af0bd1af63273e782775f;hp=cece749e9be6a2ab6003e5d02447673a5ad2d983;hpb=c147c9caaf9bc2f6323baf188a438ced9f0f5894;p=netvis.git diff --git a/source/netvis.cpp b/source/netvis.cpp index cece749..7bb49bb 100644 --- a/source/netvis.cpp +++ b/source/netvis.cpp @@ -9,10 +9,10 @@ Distributed unter the GPL #include #include #include +#include #include #include #include -#include #include #include #include @@ -26,6 +26,7 @@ Distributed unter the GPL #include #include #include +#include "history.h" #include "host.h" #include "netvis.h" #include "packet.h" @@ -42,8 +43,6 @@ NetVis::NetVis(int argc, char **argv): font(0), max_hosts(1000), max_visible_hosts(30), - draw_labels(true), - blend(true), frames(0) { if(argc<2) @@ -67,7 +66,6 @@ NetVis::NetVis(int argc, char **argv): wnd = new Graphics::SimpleGLWindow(1024, 768); wnd->set_title("NetVis"); wnd->signal_close.connect(sigc::bind(sigc::mem_fun(this, &NetVis::exit), 0)); - wnd->signal_key_press.connect(sigc::mem_fun(this, &NetVis::key_press)); wnd->show(); GL::enable(GL::BLEND); @@ -76,6 +74,8 @@ NetVis::NetVis(int argc, char **argv): font = new GL::Font; DataFile::load(*font, "dejavu-10.font"); + history = new History(*this, 301, 100); + catch_signal(SIGINT); } @@ -91,6 +91,8 @@ NetVis::~NetVis() delete i->second; for(map::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end(); ++i) delete i->second; + for(map::iterator i=ports.begin(); i!=ports.end(); ++i) + delete i->second; for(list::iterator i=packets.begin(); i!=packets.end(); ++i) delete *i; } @@ -112,158 +114,146 @@ void NetVis::tick() wnd->get_display().tick(); + while(pcap_dispatch(pcap, -1, &capture_handler, reinterpret_cast(this))>0) ; + + resolver->tick(); + history->tick(tick_t); + + + float min_activity = numeric_limits::max(); + for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) { - Debug::ProfilingScope s(profiler, "capture"); - while(pcap_dispatch(pcap, -1, &capture_handler, reinterpret_cast(this))>0) ; + i->second->tick(dt); + min_activity = min(min_activity, i->second->get_activity()); } - + float del_limit = pow(10, 6-0.1*static_cast(max_hosts-hosts.size()-disabled_hosts.size())); + for(map::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end();) { - Debug::ProfilingScope s(profiler, "tick"); - - resolver->tick(); + i->second->tick(dt); - float min_activity = numeric_limits::max(); - for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) + if(i->second->get_activity()>min_activity) { - i->second->tick(dt); - min_activity = min(min_activity, i->second->get_activity()); + i->second->set_active(true); + hosts.insert(*i); + for(unsigned j=0; j<100; ++j) + i->second->tick(100*Time::msec); + disabled_hosts.erase(i++); } - float del_limit = pow(10, 6-0.1*(max_hosts-hosts.size()-disabled_hosts.size())); - for(map::iterator i=disabled_hosts.begin(); i!=disabled_hosts.end();) + else if(i->second->get_activity()second->tick(dt); - - if(i->second->get_activity()>min_activity) - { - i->second->set_active(true); - hosts.insert(*i); - disabled_hosts.erase(i++); - } - else if(i->second->get_activity()second; - disabled_hosts.erase(i++); - } - else - ++i; + resolver->cancel(i->second); + delete i->second; + disabled_hosts.erase(i++); } + else + ++i; + } - if(hosts.size()>max_visible_hosts) - { - list activity; - for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) - activity.push_back(i->second->get_activity()); - activity.sort(); - - list::iterator j = activity.begin(); - advance(j, activity.size()-max_visible_hosts); - float limit = *j; + if(hosts.size()>max_visible_hosts) + { + list activity; + for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) + activity.push_back(i->second->get_activity()); + activity.sort(); - for(map::iterator i=hosts.begin(); i!=hosts.end();) - { - if(i->second->get_activity()second->set_active(false); - disabled_hosts.insert(*i); - hosts.erase(i++); - } - else - ++i; - } - } + list::iterator j = activity.begin(); + advance(j, activity.size()-max_visible_hosts); + float limit = *j; - for(list::iterator i=packets.begin(); i!=packets.end();) + for(map::iterator i=hosts.begin(); i!=hosts.end();) { - (*i)->tick(dt); - if((*i)->get_stale()) + if(i->second->get_activity()second->set_active(false); + disabled_hosts.insert(*i); + hosts.erase(i++); } else ++i; } } + for(map::iterator i=ports.begin(); i!=ports.end();) { - Debug::ProfilingScope s(profiler, "render"); - GL::clear(GL::COLOR_BUFFER_BIT); + i->second->tick(dt); - GL::matrix_mode(GL::PROJECTION); - GL::load_identity(); - GL::ortho_centered(1024, 768); - GL::matrix_mode(GL::MODELVIEW); - GL::load_identity(); + if(!i->second->is_registered() && i->second->get_activity()<0.1) + { + delete i->second; + ports.erase(i++); + } + else + ++i; + } - for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) - i->second->render(); - if(draw_labels) + for(list::iterator i=packets.begin(); i!=packets.end();) + { + (*i)->tick(dt); + if((*i)->get_stale()) { - for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) - i->second->render_label(); - GL::Texture::unbind(); + delete *i; + i = packets.erase(i); } + else + ++i; + } + + render(); + wnd->swap_buffers(); + + ++frames; +} + +void NetVis::render() +{ + GL::clear(GL::COLOR_BUFFER_BIT); + + GL::matrix_mode(GL::PROJECTION); + GL::load_identity(); + GL::ortho_centered(1024, 768); + GL::matrix_mode(GL::MODELVIEW); + GL::load_identity(); + + for(map::iterator i=hosts.begin(); i!=hosts.end(); ++i) + i->second->render(); + { GL::Immediate imm((GL::COLOR4_UBYTE, GL::VERTEX2)); imm.begin(GL::QUADS); for(list::iterator i=packets.begin(); i!=packets.end(); ++i) (*i)->render(imm); imm.end(); + } - GL::push_matrix(); - GL::translate(-500, 360, 0); - unsigned n = 0; - for(map::iterator i=ports.begin(); (i!=ports.end() && n<50); ++i, ++n) + GL::push_matrix(); + GL::translate(-500, 360, 0); + unsigned n = 0; + for(map::iterator i=ports.begin(); (i!=ports.end() && n<50); ++i) + { + float act = i->second->get_activity(); + if((i->second->is_registered() && act>1) || act>200) { - const GL::Color &color = i->second.get_color(); - - imm.begin(GL::QUADS); - imm.color(color.r, color.g, color.b, color.a); - for(unsigned x=0; x<=4; x+=2) - { - imm.vertex(x+0, 0); - imm.vertex(x+10, 0); - imm.vertex(x+10, 10); - imm.vertex(x+0, 10); - } - imm.end(); - + i->second->render(); GL::translate(0, -12, 0); + ++n; } - GL::pop_matrix(); - - GL::push_matrix(); - if(draw_labels) - { - GL::push_matrix(); - GL::translate(-484, 361, 0); - GL::scale_uniform(10); - n = 0; - for(map::iterator i=ports.begin(); (i!=ports.end() && n<50); ++i, ++n) - { - GL::Immediate imm2((GL::COLOR4_UBYTE, GL::TEXCOORD2, GL::VERTEX2)); - imm.color(1.0f, 1.0f, 1.0f); - font->draw_string(i->second.get_name(), imm2); - - GL::translate(0, -1.2, 0); - } - GL::pop_matrix(); - GL::Texture::unbind(); - } - GL::pop_matrix(); - - GL::push_matrix(); - GL::translate(-500, -360, 0); - GL::scale_uniform(10); - font->draw_string(format("%d hosts", hosts.size()+disabled_hosts.size())); - GL::translate(0, -1.2, 0); - font->draw_string(format("%.2f fps", fps)); - GL::pop_matrix(); - GL::Texture::unbind(); - - wnd->swap_buffers(); } - - ++frames; + GL::pop_matrix(); + + GL::push_matrix(); + GL::translate(-500, -348, 0); + GL::scale_uniform(10); + font->draw_string(format("%d hosts", hosts.size()+disabled_hosts.size())); + GL::translate(0, -1.2, 0); + font->draw_string(format("%d ports", ports.size())); + GL::translate(0, -1.2, 0); + font->draw_string(format("%.2f fps", fps)); + GL::Texture::unbind(); + GL::pop_matrix(); + + GL::push_matrix(); + GL::translate(170, -370, 0); + history->render(); + GL::pop_matrix(); } Host &NetVis::get_host(unsigned a) @@ -281,69 +271,20 @@ Host &NetVis::get_host(unsigned a) host->set_local(true); resolver->push(host); host->set_position(Vector2(rand()*400.0/RAND_MAX-200.0, rand()*400.0/RAND_MAX-200.0)); + for(unsigned j=0; j<100; ++j) + host->tick(100*Time::msec); hosts[a] = host; return *host; } -GL::Color NetVis::generate_color(bool privileged) const +Port &NetVis::get_port(unsigned number) { - GL::Color color; - color.r = rand()*1.0/RAND_MAX; - color.g = rand()*1.0/RAND_MAX; - color.b = rand()*1.0/RAND_MAX; - float high = max(max(color.r, color.g), color.b); - color = color*(1.0/high); - if(privileged) - { - float low = min(min(color.r, color.g), color.b); - color = (color+-low)*(1/(1-low)); - } - else - color = color*0.6+0.4; - return color; -} - -const Port &NetVis::get_port(unsigned number) -{ - map::iterator i = ports.find(number); + map::iterator i = ports.find(number); if(i!=ports.end()) - return i->second; - - GL::Color best_color; - float best_score = 0; - for(unsigned j=0; (j<100 && best_score<1); ++j) - { - GL::Color color = generate_color(number<1024); - - float score = 2; - for(i=ports.begin(); i!=ports.end(); ++i) - { - const GL::Color &other = i->second.get_color(); - float dr = color.r-other.r; - float dg = color.g-other.g; - float db = color.b-other.b; - score = min(score, dr*dr+dg*dg+db*db); - } - if(score>best_score) - { - best_score = score; - best_color = color; - } - } - best_color.a = 0.4f; - i = ports.insert(map::value_type(number, Port(number, best_color))).first; - return i->second; -} - -void NetVis::key_press(unsigned key, unsigned, wchar_t) -{ - if(key==46) - draw_labels = !draw_labels; - else if(key==56) - { - blend = !blend; - GL::set(GL_BLEND, blend); - } + return *i->second; + Port *port = new Port(*this, number); + ports[number] = port; + return *port; } void NetVis::capture_handler(unsigned char *user, const pcap_pkthdr *, const unsigned char *data) @@ -356,17 +297,40 @@ void NetVis::capture_handler(unsigned char *user, const pcap_pkthdr *, const uns const iphdr *ip = reinterpret_cast(eth+1); unsigned size = ntohs(ip->tot_len); - unsigned port = 0; + + Port *sport = 0; + Port *dport = 0; if(ip->protocol==IPPROTO_TCP) { const tcphdr *tcp = reinterpret_cast(ip+1); - port = min(ntohs(tcp->source), ntohs(tcp->dest)); + sport = &self->get_port(ntohs(tcp->source)); + dport = &self->get_port(ntohs(tcp->dest)); } else if(ip->protocol==IPPROTO_UDP) { const udphdr *udp = reinterpret_cast(ip+1); - port = min(ntohs(udp->source), ntohs(udp->dest)); + sport = &self->get_port(ntohs(udp->source)); + dport = &self->get_port(ntohs(udp->dest)); } + + Port *port = 0; + if(sport && dport) + { + if(sport->is_registered()!=dport->is_registered()) + { + if(sport->is_registered()) + port = sport; + else + port = dport; + } + else if(sport->get_number()get_number()) + port = sport; + else + port = dport; + } + else + port = &self->get_port(0); + Host &shost = self->get_host(ntohl(ip->saddr)); Host *dhost = 0; if((ntohl(ip->daddr)&0xFF)!=0xFF) @@ -375,13 +339,23 @@ void NetVis::capture_handler(unsigned char *user, const pcap_pkthdr *, const uns float throttle = shost.send_packet(); if(throttle<1) { - self->packets.push_back(new Packet(shost, dhost, self->get_port(port).get_color(), size)); + self->packets.push_back(new Packet(shost, dhost, port->get_color(), size)); self->packets.back()->tick(-throttle*Msp::Time::sec); } shost.add_activity(size); if(dhost) dhost->add_activity(size); + + if(sport) + sport->add_activity(size); + if(dport) + dport->add_activity(size); + + if((ntohl(ip->saddr)&self->localnet_mask)==self->localnet) + self->history->activity(0, size); + else if((ntohl(ip->daddr)&self->localnet_mask)==self->localnet) + self->history->activity(size, 0); } }