PERFORCE change 179034 for review

Gabriel Silva gsilva at FreeBSD.org
Tue Jun 1 06:46:34 UTC 2010


http://p4web.freebsd.org/@@179034?ac=10

Change 179034 by gsilva at 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))


More information about the p4-projects mailing list