typo fix
[senf.git] / Sniffer / Sniffer.cc
index e2a4997..40aec9c 100644 (file)
@@ -1,6 +1,6 @@
 // $Id$
 //
-// Copyright (C) 2006 
+// Copyright (C) 2006
 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
@@ -30,6 +30,9 @@
 #include <iostream>
 #include <iomanip>
 #include "Socket/PacketSocketHandle.hh"
+#include "Scheduler/Scheduler.hh"
+#include "Utils/membind.hh"
+
 #include "Packets/EthernetPacket.hh"
 #include "Packets/IpV4Packet.hh"
 #include "Packets/UDPPacket.hh"
@@ -54,8 +57,8 @@ namespace {
                     std::cout << "  " << ascii << "\n";
                     ascii = "";
                 }
-                std::cout << "  " 
-                          << std::hex << std::setw(4) << std::setfill('0') 
+                std::cout << "  "
+                          << std::hex << std::setw(4) << std::setfill('0')
                           << offset << ' ';
                 break;
             case BLOCK_SIZE/2:
@@ -63,7 +66,7 @@ namespace {
                 ascii += ' ';
                 break;
             }
-            std::cout << ' ' << std::hex << std::setw(2) << std::setfill('0') 
+            std::cout << ' ' << std::hex << std::setw(2) << std::setfill('0')
                       << unsigned(*i);
             ascii += (*i >= ' ' && *i < 126) ? *i : '.';
         }
@@ -81,22 +84,22 @@ namespace {
     void use_em()
     {
         // Pull in symbols from the wanted packets ...
-        satcom::pkf::Packet::create<satcom::pkf::IpV4Packet>(0,0);
-        satcom::pkf::Packet::create<satcom::pkf::UDPPacket>(0,0);
+        senf::Packet::create<senf::IpV4Packet>(0,0);
+        senf::Packet::create<senf::UDPPacket>(0,0);
     }
 }
 
-int main (int argc, char const * argv[])
+int loop_main (int argc, char const * argv[])
 {
     try {
-        satcom::lib::PacketSocketHandle sock;
-        sock.bind(satcom::lib::LLSocketAddress("eth0"));
-        // sock.protocol().promisc("eth0",satcom::lib::PacketProtocol::Promiscuous);
-        
+        senf::PacketSocketHandle sock;
+        sock.bind(senf::LLSocketAddress("eth0"));
+        // sock.protocol().promisc("eth0",senf::PacketProtocol::Promiscuous);
+
         while (true) { // forever
             std::string data (sock.read());
-            satcom::pkf::EthernetPacket::ptr packet (
-                satcom::pkf::Packet::create<satcom::pkf::EthernetPacket>(
+            senf::EthernetPacket::ptr packet (
+                senf::Packet::create<senf::EthernetPacket>(
                     data.begin(), data.end()));
             packet->dump(std::cout);
             hexdump(packet->last()->begin(),
@@ -105,8 +108,61 @@ int main (int argc, char const * argv[])
         }
     }
     catch (std::exception const & ex) {
-        std::cerr << satcom::lib::prettyName(typeid(ex)) << ": " << ex.what() << "\n";
+        std::cerr << senf::prettyName(typeid(ex)) << ": " << ex.what() << "\n";
     }
+    return 0;
+}
+
+class Sniffer
+{
+    senf::PacketSocketHandle sock;
+
+public:
+    Sniffer(std::string const & interface)
+        { sock.bind(senf::LLSocketAddress(interface)); }
+
+    void run()
+        {
+            senf::Scheduler::instance().add(sock, senf::membind(&Sniffer::dumpPacket, this));
+            senf::Scheduler::instance().process();
+        }
+         
+private:
+    void dumpPacket(senf::FileHandle /* ignored */, senf::Scheduler::EventId event)
+        {
+            std::string data (sock.read());
+            senf::EthernetPacket::ptr packet (
+                senf::Packet::create<senf::EthernetPacket>(
+                    data.begin(), data.end()));
+            packet->dump(std::cout);
+            hexdump(packet->last()->begin(),
+                    packet->last()->end());
+            std::cout << "\n\n";
+        }
+};
+
+int scheduler_main(int argc, char const * argv[])
+{
+    try {
+        Sniffer sniffer ("eth0");
+        sniffer.run();
+    }
+    catch (std::exception const & ex) {
+        std::cerr << senf::prettyName(typeid(ex)) << ": " << ex.what() << "\n";
+    }
+    return 0;
+}
+
+int main(int argc, char const * argv[])
+{
+    if (argc >= 2)
+        if (std::string(argv[1]) == "loop")
+            return loop_main(argc,argv);
+        else if (std::string(argv[1]) == "scheduler")
+            return scheduler_main(argc,argv);
+
+    std::cerr << "Usage: sniffer { loop | scheduler }" << std::endl;
+    return 1;
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
@@ -116,5 +172,8 @@ int main (int argc, char const * argv[])
 \f
 // Local Variables:
 // mode: c++
-// c-file-style: "satcom"
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
 // End: