X-Git-Url: http://git.tdb.fi/?p=netvis.git;a=blobdiff_plain;f=source%2Fnetvis.cpp;h=22231b150a4b62356c312d403534fed34ff6f2ff;hp=52f586456f4a51b117b40e25ea482aa2980679f2;hb=597a794cd648dd7b4c9d442fdc39f5961a38aba0;hpb=cb4b88367edde2829e40015f0bc02d653db2a6a8 diff --git a/source/netvis.cpp b/source/netvis.cpp index 52f5864..22231b1 100644 --- a/source/netvis.cpp +++ b/source/netvis.cpp @@ -9,10 +9,6 @@ Distributed unter the GPL #include #include #include -#include -#include -#include -#include #include #include #include @@ -23,6 +19,7 @@ Distributed unter the GPL #include #include #include +#include #include #include #include @@ -278,79 +275,120 @@ Port &NetVis::get_port(unsigned number) return *port; } -void NetVis::capture_handler(unsigned char *user, const pcap_pkthdr *, const unsigned char *data) +void NetVis::capture_handler(unsigned char *user, const pcap_pkthdr *cap, const unsigned char *data) { NetVis *self = reinterpret_cast(user); + CaptureContext ctx; + ctx.cap_hdr = cap; const ethhdr *eth = reinterpret_cast(data); - if(ntohs(eth->h_proto)==ETH_P_IP) + self->handle_ethernet(ctx, eth, cap->caplen); +} + +void NetVis::handle_ethernet(CaptureContext &ctx, const ethhdr *eth, unsigned len) +{ + ctx.size = ctx.cap_hdr->len-sizeof(ethhdr); + + int proto = ntohs(eth->h_proto); + if(proto==ETH_P_IP) { const iphdr *ip = reinterpret_cast(eth+1); + handle_ipv4(ctx, ip, len-sizeof(ethhdr)); + } + else + IO::print("Unknown protocol in eth: %d\n", proto); +} - unsigned size = ntohs(ip->tot_len); +void NetVis::handle_ipv4(CaptureContext &ctx, const iphdr *ip, unsigned len) +{ + ctx.src_host = &get_host(ntohl(ip->saddr)); + if((ntohl(ip->daddr)&0xFF)!=0xFF) + ctx.dst_host = &get_host(ntohl(ip->daddr)); - Port *sport = 0; - Port *dport = 0; - if(ip->protocol==IPPROTO_TCP) - { - const tcphdr *tcp = reinterpret_cast(ip+1); - 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); - sport = &self->get_port(ntohs(udp->source)); - dport = &self->get_port(ntohs(udp->dest)); - } + if(ip->protocol==IPPROTO_TCP) + { + const tcphdr *tcp = reinterpret_cast(ip+1); + handle_tcp(ctx, tcp, len-sizeof(iphdr)); + } + else if(ip->protocol==IPPROTO_UDP) + { + const udphdr *udp = reinterpret_cast(ip+1); + handle_udp(ctx, udp, len-sizeof(iphdr)); + } + else + IO::print("Unknown protocol in ip: %d\n", ip->protocol); +} - 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) - dhost = &self->get_host(ntohl(ip->daddr)); +void NetVis::handle_tcp(CaptureContext &ctx, const tcphdr *tcp, unsigned) +{ + ctx.src_port = &get_port(ntohs(tcp->source)); + ctx.dst_port = &get_port(ntohs(tcp->dest)); + handle_packet(ctx); +} + +void NetVis::handle_udp(CaptureContext &ctx, const udphdr *udp, unsigned) +{ + ctx.src_port = &get_port(ntohs(udp->source)); + ctx.dst_port = &get_port(ntohs(udp->dest)); + handle_packet(ctx); +} - float throttle = shost.send_packet(); - if(throttle<1) +void NetVis::handle_packet(CaptureContext &ctx) +{ + Port *port = 0; + if(ctx.src_port && ctx.dst_port) + { + if(ctx.src_port->is_registered()!=ctx.dst_port->is_registered()) { - self->packets.push_back(new Packet(shost, dhost, port->get_color(), size)); - self->packets.back()->tick(-throttle*Msp::Time::sec); + if(ctx.src_port->is_registered()) + port = ctx.src_port; + else + port = ctx.dst_port; } + else if(ctx.src_port->get_number()get_number()) + port = ctx.src_port; + else + port = ctx.dst_port; + } + else + port = &get_port(0); - 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); + float throttle = ctx.src_host->send_packet(); + if(throttle<1) + { + packets.push_back(new Packet(*ctx.src_host, ctx.dst_host, port->get_color(), ctx.size)); + packets.back()->tick(-throttle*Msp::Time::sec); } + + ctx.src_host->add_activity(ctx.size); + if(ctx.dst_host) + ctx.dst_host->add_activity(ctx.size); + + if(ctx.src_port) + ctx.src_port->add_activity(ctx.size); + if(ctx.dst_port) + ctx.dst_port->add_activity(ctx.size); + + bool local_src = ctx.src_host->is_local(); + bool local_dst = (ctx.dst_host && ctx.dst_host->is_local()); + if(local_src && !local_dst) + history->activity(0, ctx.size); + else if(local_dst && !local_src) + history->activity(ctx.size, 0); } void NetVis::sighandler(int) { exit(0); } + + +NetVis::CaptureContext::CaptureContext(): + cap_hdr(0), + src_host(0), + src_port(0), + dst_host(0), + dst_port(0), + size(0) +{ }