[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