From owner-p4-projects@FreeBSD.ORG Tue Jun 1 06:46:34 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4E1D21065678; Tue, 1 Jun 2010 06:46:34 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 129D91065672 for ; Tue, 1 Jun 2010 06:46:34 +0000 (UTC) (envelope-from gsilva@FreeBSD.org) Received: from repoman.freebsd.org (unknown [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id F2CBF8FC19 for ; Tue, 1 Jun 2010 06:46:33 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o516kXeV021194 for ; Tue, 1 Jun 2010 06:46:33 GMT (envelope-from gsilva@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o516kXTl021192 for perforce@freebsd.org; Tue, 1 Jun 2010 06:46:33 GMT (envelope-from gsilva@FreeBSD.org) Date: Tue, 1 Jun 2010 06:46:33 GMT Message-Id: <201006010646.o516kXTl021192@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gsilva@FreeBSD.org using -f From: Gabriel Silva To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 179034 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 01 Jun 2010 06:46:34 -0000 http://p4web.freebsd.org/@@179034?ac=10 Change 179034 by gsilva@gsilva on 2010/06/01 06:46:03 Added support to read frames from wireless cards. Added the snarf80211.py script to test 802.11 sniffing, and the radiotap.py script to test frame injection (not supported yet). Affected files ... .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/__init__.py#2 edit .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/packets/ieee80211.py#2 edit .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/packets/radiotap.py#2 edit .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/pcap/config.h#2 edit .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/pcap/pcap.pyx#2 edit .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/scripts/radiotap.py#1 add .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/scripts/snarf80211.py#1 add .. //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/setup.py#2 edit Differences ... ==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/__init__.py#2 (text+ko) ==== @@ -70,6 +70,8 @@ import exceptions import itertools +DLT_IEEE802_11_RADIO = 127 + # import fast def attribreprlist(obj, attrs): @@ -1837,7 +1839,7 @@ """ def __init__(self, name=None, snaplen=65535, promisc=True, \ - timeout_ms=500): + timeout_ms=500, wireless=False): """initialize a PcapConnector object name - the name of a file or network interface to open @@ -1848,6 +1850,9 @@ super(PcapConnector, self).__init__() try: self.file = pcap.pcap(name, snaplen, promisc, timeout_ms) + + if wireless: + self.file.set_datalink(DLT_IEEE802_11_RADIO) except: raise @@ -1971,6 +1976,8 @@ return packets.ethernet.ethernet(packet, timestamp) elif dlink == pcap.DLT_NULL: return packets.localhost.localhost(packet, timestamp) +# elif dlink == pcap.DLT_IEEE802_11_RADIO: +# return packets.radiotap.radiotap(packet, timestamp) else: raise UnpackError, "Could not interpret packet" ==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/packets/ieee80211.py#2 (text+ko) ==== @@ -273,7 +273,7 @@ def is_control(self): return has_ctl_bit(self.fc0) - has_addr4_bit = staticmethod(has_addr4_bit) + has_addr4_bit = staticmethod(has_addr4_bits) has_ctl_bit = staticmethod(has_ctl_bit) has_data_bit = staticmethod(has_data_bit) has_mgmt_bit = staticmethod(has_mgmt_bit) ==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/packets/radiotap.py#2 (text+ko) ==== @@ -37,6 +37,7 @@ import pcs import pcs.packets.payload #import pcs.packets.ieee80211 #notyet +from pcs.packets import payload import inspect import struct @@ -117,8 +118,8 @@ assert isinstance(n, str) assert isinstance(x, tuple) ret = [] - ret += pcs.Field("chan_mhz", 8, default=x[0]) - ret += pcs.Field("chan_flags", 8, default=x[1]) + ret += [pcs.Field("chan_mhz", 8, default=x[0])] + ret += [pcs.Field("chan_flags", 8, default=x[1])] return ret def _xchannel(n, x): @@ -127,10 +128,10 @@ assert isinstance(n, str) assert isinstance(x, tuple) ret = [] - ret += pcs.Field("xchan_flags", 32, default=x[0]) - ret += pcs.Field("xchan_mhz", 16, default=x[1]) - ret += pcs.Field("xchan_num", 8, default=x[2]) - ret += pcs.Field("xchan_hdbm", 8, default=x[3]) + ret += [pcs.Field("xchan_flags", 32, default=x[0])] + ret += [pcs.Field("xchan_mhz", 16, default=x[1])] + ret += [pcs.Field("xchan_num", 8, default=x[2])] + ret += [pcs.Field("xchan_hdbm", 8, default=x[3])] return ret # @@ -155,7 +156,7 @@ lambda n, x: [pcs.Field(n, 8, default=x[0])] ), IEEE80211_RADIOTAP_DBM_ANTSIGNAL: \ ( "dbm_antsignal", 8, '= vbytes: - value = struct.unpack(vfmt, bytes[curr:vlen]) + value = struct.unpack_from(vfmt, bytes[curr:]) fields = vfunc(vname, value) for f in fields: tlvs._options.append(f) - curr += vlen - remaining -= vlen + curr += vbytes + remaining -= vbytes else: break # XXX TODO: always decode next header as a full 802.11 header. @@ -244,12 +245,16 @@ def __str__(self): """Walk the entire packet and pretty print the values of the fields.""" - s = self._descr[self.type] + "\n" + #s = self._descr[self.type] + "\n" + retval = "\nRadiotap:\n" for fn in self._layout: f = self._fieldnames[fn.name] if fn.name == "present": - bs = bsprintf(f.value, self._bits) + bs = pcs.bsprintf(f.value, self._bits) retval += "%s %s\n" % (fn.name, bs) + if fn.name == "length": + retval += "%s %s\n" % (fn.name, struct.unpack('!h', struct.pack('h', f.value))[0]) else: retval += "%s %s\n" % (fn.name, f.value) + print type(f.value) return retval ==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/pcap/config.h#2 (text+ko) ==== @@ -1,3 +1,4 @@ #define HAVE_PCAP_SETNONBLOCK 1 #define HAVE_PCAP_FILE 1 +#define HAVE_PCAP_SET_DATALINK 1 #define HAVE_PCAP_COMPILE_NOPCAP 1 ==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/pcs/pcap/pcap.pyx#2 (text+ko) ==== @@ -70,6 +70,7 @@ unsigned char *arg) unsigned char *pcap_next(pcap_t *p, pcap_pkthdr *hdr) int pcap_datalink(pcap_t *p) + int pcap_set_datalink(pcap_t *p, int datalink) int pcap_snapshot(pcap_t *p) int pcap_stats(pcap_t *p, pcap_stat *ps) char *pcap_geterr(pcap_t *p) @@ -134,6 +135,7 @@ # XXX - OpenBSD DLT_PFLOG = 117 DLT_PFSYNC = 18 +DLT_IEEE802_11_RADIO = 127 if sys.platform.find('openbsd') != -1: DLT_LOOP = 12 DLT_RAW = 14 @@ -211,6 +213,8 @@ promisc, timeout_ms, self.__ebuf) + + if not self.__pcap: raise OSError, self.__ebuf @@ -317,7 +321,12 @@ def datalink(self): """Return datalink type (DLT_* values).""" return pcap_datalink(self.__pcap) - + + def set_datalink(self, datalink): + if pcap_set_datalink(self.__pcap, datalink) == -1: + raise OSError, "Error setting DLT_IEEE802_11_RADIO." + return 0 + def next(self): """Return the next (timestamp, packet) tuple, or None on error.""" cdef pcap_pkthdr hdr ==== //depot/projects/soc2010/gsilva_80211fuzz/src/tools/tools/net80211/80211fuzz/pcs-0.6/setup.py#2 (text+ko) ==== @@ -66,6 +66,8 @@ d['HAVE_PCAP_COMPILE_NOPCAP'] = 1 if buf.find('pcap_setnonblock(') != -1: d['HAVE_PCAP_SETNONBLOCK'] = 1 + if buf.find('pcap_set_datalink') != -1: + d['HAVE_PCAP_SET_DATALINK'] = 1 f = open('pcs/pcap/config.h', 'w') for k, v in d.iteritems(): f.write('#define %s %s\n' % (k, v))