#include <list>
#include <map>
#include <pcap.h>
+#include <netinet/ether.h>
+#include <netinet/icmp6.h>
+#include <netinet/ip.h>
+#include <netinet/ip_icmp.h>
+#include <netinet/ip6.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
#include <msp/core/application.h>
#include <msp/debug/profiler.h>
-#include <msp/gbase/display.h>
-#include <msp/gbase/glcontext.h>
-#include <msp/gbase/simplewindow.h>
+#include <msp/graphics/display.h>
+#include <msp/graphics/glcontext.h>
+#include <msp/graphics/simplewindow.h>
#include <msp/gl/color.h>
#include <msp/gl/font.h>
#include <msp/time/timestamp.h>
+#include "address.h"
+class History;
class Host;
class Packet;
class Port;
class Resolver;
-class NetVis: public Msp::Application
+class NetVis: public Msp::RegisteredApplication<NetVis>
{
private:
+ struct CaptureContext
+ {
+ const pcap_pkthdr *cap_hdr;
+ Host *src_host;
+ Port *src_port;
+ Host *dst_host;
+ Port *dst_port;
+ unsigned size;
+
+ CaptureContext();
+ };
+
std::string iface;
pcap_t *pcap;
Resolver *resolver;
- unsigned localnet;
- unsigned localnet_mask;
+ std::list<Address> localnets;
Msp::Graphics::SimpleGLWindow *wnd;
Msp::GL::Font *font;
unsigned max_hosts;
unsigned max_visible_hosts;
- std::map<unsigned, Host *> hosts;
- std::map<unsigned, Host *> disabled_hosts;
+ std::map<Address, Host *> hosts;
+ std::map<Address, Host *> disabled_hosts;
std::list<Packet *> packets;
std::map<unsigned, Port *> ports;
- bool draw_labels;
- bool blend;
+ History *history;
Msp::Time::TimeStamp tick_t;
Msp::Time::TimeStamp fps_t;
~NetVis();
const Msp::GL::Font &get_font() const { return *font; }
- const std::map<unsigned, Host *> &get_hosts() const { return hosts; }
+ const std::map<Address, Host *> &get_hosts() const { return hosts; }
const std::map<unsigned, Port *> &get_ports() const { return ports; }
private:
virtual void tick();
void render();
- Host &get_host(unsigned);
+ Host &get_host(const Address &);
Msp::GL::Color generate_color(bool) const;
- const Port &get_port(unsigned);
- void key_press(unsigned, unsigned, wchar_t);
+ Port &get_port(unsigned);
+ void create_history_texture();
static void capture_handler(unsigned char *, const pcap_pkthdr *, const unsigned char *);
+ void handle_ethernet(CaptureContext &, const ethhdr *, unsigned);
+ void handle_ipv4(CaptureContext &, const iphdr *, unsigned);
+ void handle_ipv6(CaptureContext &, const ip6_hdr *, unsigned);
+ void handle_tcp(CaptureContext &, const tcphdr *, unsigned);
+ void handle_udp(CaptureContext &, const udphdr *, unsigned);
+ void handle_icmp(CaptureContext &, const icmphdr *, unsigned);
+ void handle_icmp6(CaptureContext &, const icmp6_hdr *, unsigned);
+ void handle_packet(CaptureContext &);
void sighandler(int);
-
- static Application::RegApp<NetVis> reg;
};
#endif