Date: Tue, 1 Jun 2010 06:46:33 GMT From: Gabriel Silva <gsilva@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 179034 for review Message-ID: <201006010646.o516kXTl021192@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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, '<b', \ - lambda x: [pcs.Field(n, 8, default=x[0])] ), + lambda n, x: [pcs.Field(n, 8, default=x[0])] ), IEEE80211_RADIOTAP_DBM_ANTNOISE: \ ( "dbm_antnoise", 8, '<b', \ lambda n, x: [pcs.Field(n, 8, default=x[0])] ), @@ -198,11 +199,11 @@ """initialize an ethernet packet""" version = pcs.Field("version", 8) # currently 0. pad = pcs.Field("pad", 8) - len = pcs.Field("len", 16) # inclusive. + length = pcs.Field("length", 16) # inclusive. present = pcs.Field("present", 32) # Bit mask. tlvs = pcs.OptionListField("tlvs") - pcs.Packet.__init__(self, [version, pad, len, present, tlvs], \ + pcs.Packet.__init__(self, [version, pad, length, present, tlvs], \ bytes = bytes, **kv) self.description = inspect.getdoc(self) @@ -214,10 +215,10 @@ if bytes is not None: offset = self.sizeof() curr = offset - remaining = min(len(bytes), self.len) - offset + remaining = min(len(bytes), self.length) - offset # Force little-endian conversion. # TODO: Process the EXT bit. - he_prez = struct.unpack('<i', bytes[4:4]) + he_prez = struct.unpack_from('<i', bytes[4:])[0] for i in xrange(IEEE80211_RADIOTAP_TSFT, \ IEEE80211_RADIOTAP_XCHANNEL+1): if (he_prez & (1 << i)) != 0: @@ -228,12 +229,12 @@ vfmt = vt[2] vfunc = vt[3] if remaining >= 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))
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006010646.o516kXTl021192>