1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
#include "Environment.h"
#include "IFace.h"
#include "NetSender.h"
#include "NetWatcher.h"
#include "PacketMaker.h"
#include <stdio.h>
#include <iostream>
extern "C" {
#include <libnet.h>
}
using namespace std;
using namespace wibble::sys;
class PacketPrinter : public PacketListener
{
public:
virtual void handleARP(struct libnet_arp_hdr* arp_header) throw ()
{
cout << "Seen ARP";
// Parse and check the arp header
if (ntohs (arp_header->ar_op) == ARPOP_REPLY)
{
string rep;
//in_addr* ipv4_him = arp_get_tip(arp_header);
in_addr* ipv4_him = arp_get_sip(arp_header);
ether_addr* mac_him = arp_get_sha(arp_header);
rep += fmt(IPAddress(*ipv4_him)) + " " + fmt(*mac_him);
cout << " reply from " << rep;
//IPv4_FROM_LIBNET(ipv4_me, arp_header->ar_tpa);
//IPv4_FROM_ARP(ipv4_him, arp_header->ar_spa);
}
cout << endl;
}
virtual void handleEthernet(struct libnet_ethernet_hdr* arp_header) throw ()
{
cout << "Seen Ethernet" << endl;
}
// others to come as needed, like:
// // // virtual handleDHCP(struct libnet_hdcp_something* hdcp_header) throw () {}
};
static void printConfig(const char* tag, IFace& iface)
{
if_params ifp = iface.getConfiguration();
printf("%-10.10s %s: ", tag, iface.name().c_str());
ifp.print();
}
int main(int argc, char* argv[])
{
if (argc < 2)
fatal_error("Usage: %s <iface>\n", argv[0]);
try {
wibble::exception::InstallUnexpected installUnexpected;
{
fprintf(stderr, "\t\tTrying libnet setup...\n");
libnet_t* ln_context;
char ln_errbuf[LIBNET_ERRBUF_SIZE];
if (!(ln_context = libnet_init(LIBNET_LINK_ADV, argv[1], ln_errbuf)))
throw wibble::exception::Libnet(ln_errbuf, "opening link interface");
fprintf(stderr, "\t\tLibnet deleting %p...\n", ln_context);
libnet_destroy(ln_context);
fprintf(stderr, "\t\tLibnet tried...\n");
}
IFace iface(argv[1]);
if_params ifp = iface.getConfiguration();
printConfig("Initial", iface);
{
fprintf(stderr, "\t\tInitializing net sender...\n");
NetSender sender(argv[1]);
printConfig("Post-NS", iface);
}
/*
fprintf(stderr, "\t\tDeconfiguring interface...\n");
system("ifconfig eth0 down");
printConfig("Down", iface);
{
fprintf(stderr, "\t\tInitializing net sender...\n");
NetSender sender(argv[1]);
printConfig("Post-NS", iface);
}
fprintf(stderr, "\t\tConfiguring for broadcast...\n");
iface.initBroadcast(4);
printConfig("Broadcast", iface);
{
fprintf(stderr, "\t\tInitializing net sender...\n");
NetSender sender(argv[1]);
printConfig("Post-NS", iface);
}
*/
NetSender sender(argv[1]);
NetWatcher watcher(argv[1]);
PacketPrinter pp;
watcher.addARPListener(&pp);
// Build and send arp probes
PacketMaker pm(sender);
Buffer pkt = pm.makeARPRequest(IPAddress("192.168.1.1"), IPAddress("0.0.0.0"));
// Enqueue the packet for sending
sender.post(pkt, 1000, 10000);
sleep(20);
fprintf(stderr, "\t\tRestoring interface...\n");
iface.setConfiguration(ifp);
printConfig("Restored", iface);
fprintf(stderr, "\t\tDone.\n");
}
catch (std::exception& e)
{
error("%s\n", e.what());
return 1;
}
return 0;
}
// vim:set ts=4 sw=4:
|