]> git.tdb.fi Git - netvis.git/commitdiff
Handle ICMP packets master
authorMikko Rasa <tdb@tdb.fi>
Mon, 16 Jun 2014 17:35:21 +0000 (20:35 +0300)
committerMikko Rasa <tdb@tdb.fi>
Mon, 16 Jun 2014 17:35:21 +0000 (20:35 +0300)
source/netvis.cpp
source/netvis.h
source/port.cpp
source/port.h

index 0e2378fd689ac6ee9efb96a6d77a0ff9af10efc9..771af7f5db93272ee673faffc481810f81ee1164 100644 (file)
@@ -296,6 +296,13 @@ Port &NetVis::get_port(unsigned number)
        if(i!=ports.end())
                return *i->second;
        Port *port = new Port(*this, number);
+       if(number>=0x10000)
+       {
+               if((number&0xFF)==IPPROTO_ICMP)
+                       port->set_name("icmp");
+               else if((number&0xFF)==IPPROTO_ICMPV6)
+                       port->set_name("icmp6");
+       }
        ports[number] = port;
        return *port;
 }
@@ -345,6 +352,11 @@ void NetVis::handle_ipv4(CaptureContext &ctx, const iphdr *ip, unsigned len)
                const udphdr *udp = reinterpret_cast<const udphdr *>(ip+1);
                handle_udp(ctx, udp, len-sizeof(iphdr));
        }
+       else if(ip->protocol==IPPROTO_ICMP)
+       {
+               const icmphdr *icmp = reinterpret_cast<const icmphdr *>(ip+1);
+               handle_icmp(ctx, icmp, len-sizeof(iphdr));
+       }
        else
                IO::print("Unknown protocol in ip: %d\n", ip->protocol);
 }
@@ -365,6 +377,11 @@ void NetVis::handle_ipv6(CaptureContext &ctx, const ip6_hdr *ip6, unsigned len)
                const udphdr *udp = reinterpret_cast<const udphdr *>(ip6+1);
                handle_udp(ctx, udp, len-sizeof(ip6_hdr));
        }
+       else if(ip6->ip6_nxt==IPPROTO_ICMPV6)
+       {
+               const icmp6_hdr *icmp6 = reinterpret_cast<const icmp6_hdr *>(ip6+1);
+               handle_icmp6(ctx, icmp6, len-sizeof(ip6_hdr));
+       }
        else
                IO::print("Unknown next header in ip6: %d\n", ip6->ip6_nxt);
 }
@@ -383,6 +400,20 @@ void NetVis::handle_udp(CaptureContext &ctx, const udphdr *udp, unsigned)
        handle_packet(ctx);
 }
 
+void NetVis::handle_icmp(CaptureContext &ctx, const icmphdr *, unsigned)
+{
+       ctx.src_port = &get_port(0x10000|IPPROTO_ICMP);
+       ctx.dst_port = ctx.src_port;
+       handle_packet(ctx);
+}
+
+void NetVis::handle_icmp6(CaptureContext &ctx, const icmp6_hdr *, unsigned)
+{
+       ctx.src_port = &get_port(0x10000|IPPROTO_ICMPV6);
+       ctx.dst_port = ctx.src_port;
+       handle_packet(ctx);
+}
+
 void NetVis::handle_packet(CaptureContext &ctx)
 {
        Port *port = 0;
index cd451339880c4fc5d40ceaf0666df937f34461f2..1c8c2874f29d3236f85d073c74f8934e94d7e86b 100644 (file)
@@ -12,7 +12,9 @@ Distributed unter the GPL
 #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>
@@ -89,6 +91,8 @@ private:
        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);
index a96e151fcd63c9d82f933d91bfc9b879d469c96e..678be06e991bdfb4dce3bbd31f88c36732795cbd 100644 (file)
@@ -92,6 +92,11 @@ Port::Port(NetVis &v, unsigned n):
        bld.end();
 }
 
+void Port::set_name(const string &n)
+{
+       name = n;
+}
+
 void Port::add_activity(unsigned bytes)
 {
        activity.add_bytes(bytes);
index 8877ed9067df827cf8a332503d0bf1b72b42b835..7fdd87e9a3b49cc70ec95101bea9197d835ce8e1 100644 (file)
@@ -31,6 +31,7 @@ public:
 
        unsigned get_number() const { return number; }
        bool is_registered() const { return registered; }
+       void set_name(const std::string &);
        const std::string &get_name() const { return name; }
        const Msp::GL::Color &get_color() const { return color; }