00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <string>
00030 #include <iostream>
00031 #include <iomanip>
00032 #include <senf/Socket/Protocols/Raw.hh>
00033 #include <senf/Utils/membind.hh>
00034 #include <senf/Utils/hexdump.hh>
00035 #include <senf/Packets/DefaultBundle/EthernetPacket.hh>
00036 #include <senf/Scheduler/Scheduler.hh>
00037
00038
00039 #define prefix_
00040
00041
00042 int loop_main (int argc, char const * argv[])
00043 {
00044 try {
00045 senf::PacketSocketHandle sock;
00046 sock.bind(senf::LLSocketAddress(argv[2]));
00047
00048
00049 while (true) {
00050 senf::EthernetPacket packet (senf::EthernetPacket::create(
00051 senf::noinit));
00052 sock.read(packet.data(),0);
00053 packet.dump(std::cout);
00054 senf::hexdump(
00055 packet.last().data().begin(),
00056 packet.last().data().end(),
00057 std::cout);
00058 std::cout << "\n\n";
00059 }
00060 }
00061 catch (std::exception const & ex) {
00062 std::cerr << senf::prettyName(typeid(ex)) << ": " << ex.what() << "\n";
00063 }
00064 return 0;
00065 }
00066
00067 class Sniffer
00068 {
00069 senf::PacketSocketHandle sock;
00070 senf::scheduler::FdEvent event;
00071
00072 public:
00073 Sniffer(std::string const & interface)
00074 : event ("Sniffer", senf::membind(&Sniffer::dumpPacket, this),
00075 sock, senf::scheduler::FdEvent::EV_READ)
00076 {
00077 sock.bind(senf::LLSocketAddress(interface));
00078 }
00079
00080 void run()
00081 {
00082 senf::scheduler::process();
00083 }
00084
00085 private:
00086 void dumpPacket(int event)
00087 {
00088 senf::EthernetPacket packet (
00089 senf::EthernetPacket::create(senf::noinit));
00090 sock.read(packet.data(),0);
00091 packet.dump(std::cout);
00092 senf::hexdump(
00093 packet.last().data().begin(),
00094 packet.last().data().end(),
00095 std::cout);
00096 std::cout << "\n\n";
00097 }
00098 };
00099
00100 int scheduler_main(int argc, char const * argv[])
00101 {
00102 try {
00103 Sniffer sniffer (argv[2]);
00104 sniffer.run();
00105 }
00106 catch (std::exception const & ex) {
00107 std::cerr << senf::prettyName(typeid(ex)) << ": " << ex.what() << "\n";
00108 }
00109 return 0;
00110 }
00111
00112 int main(int argc, char const * argv[])
00113 {
00114 std::cout << "Registered packets:\n\n";
00115 senf::dumpPacketRegistries(std::cout);
00116
00117 if (argc >= 3) {
00118 if (std::string(argv[1]) == "loop")
00119 return loop_main(argc,argv);
00120 else if (std::string(argv[1]) == "scheduler")
00121 return scheduler_main(argc,argv);
00122 }
00123
00124 std::cerr << "Usage: sniffer { loop | scheduler } [interface]" << std::endl;
00125 return 1;
00126 }
00127
00128
00129 #undef prefix_
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141