[Guessnet-devel] [svn] r129 - trunk/src
Enrico Zini
enrico at costa.debian.org
Sun Oct 23 10:13:15 UTC 2005
Author: enrico
Date: Sun Oct 23 10:13:15 2005
New Revision: 129
Modified:
trunk/src/IfaceParser.cc
trunk/src/NetWatcher.cc
trunk/src/NetWatcher.h
trunk/src/PacketMaker.cc
trunk/src/PacketMaker.h
trunk/src/PeerScanner.cc
trunk/src/PeerScanner.h
trunk/src/guessnet.cc
Log:
Implemented MAC-only scan (requires a source IP address in most cases to get a reply)
Modified: trunk/src/IfaceParser.cc
==============================================================================
--- trunk/src/IfaceParser.cc (original)
+++ trunk/src/IfaceParser.cc Sun Oct 23 10:13:15 2005
@@ -192,6 +192,9 @@
if (src != args.end())
s->setSource(IPAddress(src->second));
+
+ if (ip == args.end() && mac != args.end() && src == args.end())
+ warning("Mac-only peer test is likely to fail unless you provide a source IP address");
sc.handleScan(s);
found++;
Modified: trunk/src/NetWatcher.cc
==============================================================================
--- trunk/src/NetWatcher.cc (original)
+++ trunk/src/NetWatcher.cc Sun Oct 23 10:13:15 2005
@@ -41,7 +41,7 @@
class NetWatcherImpl : public Thread
{
protected:
- static const int captureSize = LIBNET_ETH_H + (LIBNET_ARP_H >? LIBNET_IPV4_H) + LIBNET_UDP_H + 300;
+ static const int captureSize = LIBNET_ETH_H + (LIBNET_ARP_H >? LIBNET_IPV4_H) + (LIBNET_UDP_H >? ICMP_ECHO) + 300;
int _ref;
string iface;
@@ -53,6 +53,7 @@
list<PacketListener*> listeners_arp;
list<PacketListener*> listeners_ethernet;
list<PacketListener*> listeners_dhcp;
+ list<PacketListener*> listeners_icmp;
struct libnet_link_int* link_interface;
@@ -102,6 +103,12 @@
MutexLock lock(listenersMutex);
listeners_dhcp.push_back(pl);
}
+
+ void addICMPListener(PacketListener* pl) throw ()
+ {
+ MutexLock lock(listenersMutex);
+ listeners_icmp.push_back(pl);
+ }
};
/*
@@ -162,7 +169,7 @@
}
else if (ntohs (packet_header->ether_type) == ETHERTYPE_IP)
{
- if (!listeners_dhcp.empty())
+ if (!(listeners_dhcp.empty() || listeners_icmp.empty()))
{
// IPv4 packet
NetBuffer ipv4 = pkt.after(LIBNET_ETH_H);
@@ -196,6 +203,12 @@
i != listeners_dhcp.end(); i++)
(*i)->handleDHCP(dhcp);
}
+ } else if (ipv4_header->ip_p == IPPROTO_ICMP) {
+ // ICMP packet
+ NetBuffer icmp = ipv4.after(ipv4_header->ip_hl*4);
+ for (list<PacketListener*>::iterator i = listeners_icmp.begin();
+ i != listeners_icmp.end(); i++)
+ (*i)->handleICMP(icmp);
}
}
}
Modified: trunk/src/NetWatcher.h
==============================================================================
--- trunk/src/NetWatcher.h (original)
+++ trunk/src/NetWatcher.h Sun Oct 23 10:13:15 2005
@@ -57,6 +57,7 @@
public:
virtual void handleARP(const NetBuffer& pkt) throw () {}
virtual void handleDHCP(const NetBuffer& pkt) throw () {}
+ virtual void handleICMP(const NetBuffer& pkt) throw () {}
virtual void handleEthernet(const NetBuffer& pkt) throw () {}
};
@@ -82,6 +83,7 @@
void addARPListener(PacketListener* pl) throw ();
void addDHCPListener(PacketListener* pl) throw ();
+ void addICMPListener(PacketListener* pl) throw ();
void addEthernetListener(PacketListener* pl) throw ();
void shutdown() throw ();
Modified: trunk/src/PacketMaker.cc
==============================================================================
--- trunk/src/PacketMaker.cc (original)
+++ trunk/src/PacketMaker.cc Sun Oct 23 10:13:15 2005
@@ -58,15 +58,18 @@
return buffer_from_libnet(ln_context);
}
-Buffer PacketMaker::makeARPRequest(const ether_addr& mac, const IPAddress& src) throw ()
+Buffer PacketMaker::makePingRequest(const ether_addr& mac, const IPAddress& src) throw ()
{
unsigned char ether_broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//unsigned char ether_no_addr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
struct libnet_ether_addr* localmac = sender.getMACAddress();
libnet_t* ln_context = sender.getLibnetContext();
+ int id = rand();
IPAddress noaddr("0.0.0.0");
// Build the pieces of the packet
+
+ /*
libnet_build_arp (
ARPHRD_ETHER,
ETHERTYPE_IP,
@@ -80,12 +83,43 @@
NULL,
0,
ln_context, 0);
- libnet_build_ethernet (
- ether_broadcast_addr,
+ */
+
+ if (libnet_build_icmpv4_echo(
+ ICMP_ECHO, // type
+ 0, // code
+ 0, // checksum
+ id, // id
+ 0, // seq
+ NULL, // payload
+ 0, // payload len
+ ln_context,
+ 0) == -1)
+ throw libnetException(ln_context, "Building ICMPv4 echo packet");
+
+ if (libnet_build_ipv4(
+ LIBNET_IPV4_H + LIBNET_ICMPV4_ECHO_H + 0,
+ 0, // ToS
+ id, // id
+ 0, // frag
+ 64, // ttl
+ IPPROTO_ICMP,
+ 0, // checksum
+ src.s_addr(), // Source IP
+ 0xffffffff, // Destination IP
+ NULL, // payload
+ 0,
+ ln_context,
+ 0) == -1)
+ throw libnetException(ln_context, "Building IPv4 packet");
+
+ if (libnet_build_ethernet(
+ (u_char*)&mac,
localmac->ether_addr_octet,
- ETHERTYPE_ARP,
+ ETHERTYPE_IP,
NULL, 0,
- ln_context, 0);
+ ln_context, 0) == -1)
+ throw libnetException(ln_context, "Building Ethernet packet");
// Construct the packet
return buffer_from_libnet(ln_context);
Modified: trunk/src/PacketMaker.h
==============================================================================
--- trunk/src/PacketMaker.h (original)
+++ trunk/src/PacketMaker.h Sun Oct 23 10:13:15 2005
@@ -15,6 +15,7 @@
Buffer makeARPRequest(const IPAddress& ip, const IPAddress& src) throw ();
Buffer makeARPRequest(const ether_addr& mac, const IPAddress& src) throw ();
+ Buffer makePingRequest(const ether_addr& mac, const IPAddress& src) throw ();
Buffer makeDHCPRequest() throw ();
};
Modified: trunk/src/PeerScanner.cc
==============================================================================
--- trunk/src/PeerScanner.cc (original)
+++ trunk/src/PeerScanner.cc Sun Oct 23 10:13:15 2005
@@ -34,6 +34,56 @@
using namespace std;
+void PeerScanner::registerWith(NetWatcher& watcher) throw ()
+{
+ bool wantARP = false;
+ bool wantEth = false;
+
+ for (list<const PeerScan*>::const_iterator i = candidates.begin();
+ i != candidates.end(); i++)
+ {
+ const PeerScan* scan = *i;
+ if (scan->hasIP())
+ wantARP = true;
+ else
+ wantEth = true;
+ }
+
+ if (wantARP)
+ {
+ debug("Listen ARP\n");
+ watcher.addARPListener(this);
+ }
+ if (wantEth)
+ {
+ debug("Listen Ethernet\n");
+ watcher.addEthernetListener(this);
+ }
+}
+
+
+void PeerScanner::handleEthernet(const NetBuffer& pkt) throw ()
+{
+ MutexLock lock(candMutex);
+
+ // Parse and check the ethernet header
+ const libnet_ethernet_hdr* packet_header = pkt.cast<struct libnet_ethernet_hdr>();
+
+ //debug("Got eth packet\n");
+
+ // Just check that it comes from the MAC we're looking for
+ for (list<const PeerScan*>::const_iterator i = candidates.begin();
+ i != candidates.end(); i++)
+ {
+ // Just check that it comes from the MAC we're looking for
+ const PeerScan* scan = *i;
+ if (!scan->hasIP() && MAC_MATCHES(&scan->mac(), packet_header->ether_shost))
+ {
+ debug("Got reply from %.*s\n", PFSTR(fmt(scan->mac())));
+ succeeded(*i);
+ }
+ }
+}
void PeerScanner::handleARP(const NetBuffer& arp) throw ()
{
@@ -95,8 +145,8 @@
}
else
{
- pkt = pm.makeARPRequest(scan->mac(), scan->source());
- verbose("Sending 10 RARP probes, 1 every second...\n");
+ pkt = pm.makePingRequest(scan->mac(), scan->source());
+ verbose("Sending 10 Ping probes, 1 every second...\n");
}
Modified: trunk/src/PeerScanner.h
==============================================================================
--- trunk/src/PeerScanner.h (original)
+++ trunk/src/PeerScanner.h Sun Oct 23 10:13:15 2005
@@ -31,6 +31,8 @@
#include <list>
+class NetWatcher;
+
class PeerScanner : public Scanner, public PacketListener
{
protected:
@@ -45,9 +47,12 @@
: Scanner(listener), sender(sender) {}
virtual ~PeerScanner() throw () {}
+ virtual void handleEthernet(const NetBuffer& arp) throw ();
virtual void handleARP(const NetBuffer& arp) throw ();
void addCandidate(const PeerScan* scan) throw ();
+
+ void registerWith(NetWatcher& watcher) throw ();
};
// vim:set ts=4 sw=4:
Modified: trunk/src/guessnet.cc
==============================================================================
--- trunk/src/guessnet.cc (original)
+++ trunk/src/guessnet.cc Sun Oct 23 10:13:15 2005
@@ -267,7 +267,6 @@
verbose("Starting peer test subsystem\n");
startNetScanning();
peerScanner = new PeerScanner(*sender, this);
- watcher->addARPListener(peerScanner);
}
void startScriptScanner() throw (SystemException)
@@ -286,10 +285,8 @@
verbose("Starting dhcp test subsystem\n");
startNetScanning();
dhcpScanner = new DHCPScanner(*sender, this);
- watcher->addDHCPListener(dhcpScanner);
}
-
public:
MainScanner(IFace& iface) throw (Exception) : ScanRunner(),
sender(0), watcher(0), runner(0), peerScanner(0), dhcpScanner(0), scriptScanner(0),
@@ -366,6 +363,12 @@
//printf("Unknown test %p\n", scan);
printf("Unknown test %.*s: %.*s\n", PFSTR(scan->name()), PFSTR(scan->signature()));
}
+
+ if (peerScanner)
+ peerScanner->registerWith(*watcher);
+ //watcher->addARPListener(peerScanner);
+ if (dhcpScanner)
+ watcher->addDHCPListener(dhcpScanner);
}
};
More information about the Guessnet-devel
mailing list