def test_pcap_write(self): """Test the underlying __compare__ functionality of the packet. Two packets constructed from the same bytes should be equal and two that are not should not be equal.""" from pcs.pcap import DLT_NULL # Create a vanilla ping packet ip = ipv4() ip.version = 4 ip.hlen = 5 ip.tos = 0 ip.length = 64 ip.id = 1 ip.flags = 0 ip.offset = 0 ip.ttl = 64 ip.protocol = IPPROTO_ICMP ip.src = inet_atol("127.0.0.1") ip.dst = inet_atol("127.0.0.1") icmp = icmpv4() icmp.type = 8 icmp.code = 0 echo = icmpv4echo() echo.id = 32767 echo.seq = 1 lo = localhost() lo.type = 2 packet = Chain([lo, ip, icmp, echo]) outfile = PcapDumpConnector("pcaptest.dump", DLT_NULL) outfile.write(packet.bytes) outfile.close() infile = PcapConnector("pcaptest.dump") packet = infile.read() ipnew = ipv4(packet[infile.dloff:len(packet)]) assert (ip != None) assert (ipnew != None) self.assertEqual(ip, ipnew, "packets should be equal but are not")
def main(): from pcs import PcapConnector, TimeoutError, LimitReachedError from pcs.packets.ethernet import ethernet from pcs.packets.ipv4 import ipv4 from pcs.packets.icmpv4 import icmpv4 from pcs.packets.icmpv4 import icmpv4echo from pcs.packets.icmpv4 import ICMP_ECHO #from pcs.packets.icmpv4 import ICMP_ECHOREPLY fxp0 = PcapConnector("fxp0") filter = ethernet() / ipv4() / icmpv4(type=ICMP_ECHO) / icmpv4echo() #from pcs.bpf import program #bp = fxp0.make_bpf_program(filter) #for lp in bp.disassemble(): # print lp #fxp0.setfilter('icmp') #fxp0.set_bpf_program(bp) print "Expecting at least 1 ICMP echo request within 10 seconds." try: fxp0.expect([filter], 10) except LimitReachedError: print "Limit reached." sys.exit(1) except TimeoutError: print "Timed out." sys.exit(1) nmatches = 0 if fxp0.matches is not None: nmatches = len(fxp0.matches) print "Matched", nmatches, "chain(s)." sys.exit(0)
def test_pcap_live(self): """Test live injection and reception. This test requires threads and must be run as root to succeed.""" import threading e = ethernet() assert (e != None) e.src = "\x00\xbd\x03\x07\xfa\x00" e.dst = "\x00\xbd\x03\x07\xfa\x00" e.type = 0x0800 # Create a vanilla ping packet ip = ipv4() ip.version = 4 ip.hlen = 5 ip.tos = 0 ip.length = 64 ip.id = 1 ip.flags = 0 ip.offset = 0 ip.ttl = 64 ip.protocol = IPPROTO_ICMP ip.src = inet_atol("192.0.2.1") ip.dst = inet_atol("192.0.2.1") icmp = icmpv4() icmp.type = 8 icmp.code = 0 echo = icmpv4echo() echo.id = 54321 echo.seq = 12345 ip.length = len(ip.bytes) + len(icmp.bytes) + len(echo.bytes) packet = Chain([e, ip, icmp, echo]) packet.calc_checksums() packet.encode() import os uname = os.uname()[0] if uname == "FreeBSD": devname = "edsc0" elif uname == "Linux": devname = "lo" elif uname == "Darwin": devname = "en0" else: print "unknown host os %s" % uname return wfile = PcapConnector(devname) rfile = PcapConnector(devname) rfile.setfilter("icmp") count = wfile.write(packet.bytes, 42) assert (count == 42) got = ethernet(rfile.read()) ip = got.data ping = ip.data self.assertEqual(ping, icmp)