First implementation for detected wifi cards database
authorJavier Palacios <javiplx@gmail.com>
Mon, 23 Jul 2012 14:47:20 +0000 (16:47 +0200)
committerJavier Palacios <javiplx@gmail.com>
Mon, 23 Jul 2012 14:47:20 +0000 (16:47 +0200)
wifisniffer/wificards.py [new file with mode: 0644]
wifisniffer/wifilogger.py

diff --git a/wifisniffer/wificards.py b/wifisniffer/wificards.py
new file mode 100644 (file)
index 0000000..b64d776
--- /dev/null
@@ -0,0 +1,57 @@
+
+discovered = {}
+
+
+def add_card ( mac , radio_hdr ) :
+    if not discovered.has_key( mac ) :
+        discovered[ mac ] = card( mac , radio_hdr['CHANNEL'] )
+        print "INFO : adding node %3d , %s" % ( len(discovered) , mac )
+
+
+def add_full_card ( mac , tipo , subtype , radio_hdr ) :
+    if not discovered.has_key( mac ) :
+        discovered[ mac ] = card( mac , radio_hdr['CHANNEL'] , tipo )
+        print "INFO : adding node %3d , %s" % ( len(discovered) , mac )
+    elif not discovered[ mac ].tipo :
+        discovered[ mac ].tipo = tipo
+    elif discovered[ mac ].tipo != tipo :
+        print "WARNING : AP/STA mismatch on %s for %s" % ( subtype , mac )
+
+
+class card :
+
+    def __init__ ( self , mac , channel=None , tipo=None ) :
+        self.mac = mac
+        self.fresh = True
+        self.tipo = tipo
+        self.channel = []
+        self.rssi = [ 0 , 0 , 0 , 0 , 0 ]
+        self.sta = []
+        if channel :
+            self.channel.append( "%s" % channel )
+
+    def add_rssi ( self , radio_hdr ) :
+        signal = int(radio_hdr['DBM_ANTSIGNAL'])
+        noise  = int(radio_hdr['DBM_ANTNOISE'])
+        self.rssi[0] = self.rssi[0] + 1
+        self.rssi[1] = self.rssi[1] + signal
+        self.rssi[2] = self.rssi[2] + signal**2
+        self.rssi[3] = self.rssi[3] + noise
+        self.rssi[4] = self.rssi[4] + noise**2
+
+    def from_string ( self , str_list ) :
+        self.tipo = str_list.pop(0)
+        self.channel.extend( str_list.pop(0).split(",") )
+        self.rssi = map( int , str_list.pop(0).split(",") )
+        if str_list :
+            self.sta.extend( str_list.pop(0).split(",") )
+        self.fresh = False
+
+    def add_sta ( self , mac ) :
+        if mac not in self.sta :
+            self.sta.append( mac )
+
+    def __str__ ( self ) :
+        rssi_str = ",".join( map( str , self.rssi ) )
+        return "%s %s %s %s %s" % ( self.mac , self.tipo , ",".join( self.channel ) , rssi_str , ",".join( self.sta ) )
+
index 8b44527..4ee5f86 100755 (executable)
@@ -12,6 +12,7 @@ wlan = pyiw.WirelessInterface(iface)
 import time
 
 from ieee80211 import *
+from wificards import *
 
 max_time = 15 * 60
 tstamp = time.time()
@@ -24,6 +25,17 @@ read_timeout = 100 # in milliseconds
 pc = pcapy.open_live(iface, max_bytes, promiscuous, read_timeout)
 
 
+fd = open( "discovered.list" )
+for line in fd.readlines() :
+    items = line[:-1].split()
+    mac = items.pop(0)
+    discovered[ mac ] = card( mac )
+    discovered[mac].from_string( items )
+    if discovered[mac].tipo not in ( 'AP' , 'STA' , 'CELL' ) :
+        print "Unknwon type '%s' for %s" % ( discovered[mac].tipo , mac )
+fd.close()
+
+
 channel_hop = [ 30.0 , False ]
 
 def channel_change ( ) :
@@ -196,6 +208,34 @@ def dealWithPacket ( hdr , data ) :
         pcktlen -= 6
 
 
+    if frame_type == "MGT" : # addresses : dest orig BSSID
+        if len(maclist) != 3 :
+            print "ERROR : insuficientes macs (%d) en un MGT",len(maclist),pcktlen," %s"*len(maclist) % tuple(maclist)
+        else :
+            if frame_subtype == "BEACON" :
+                if maclist[0] == "FF:FF:FF:FF:FF:FF" :
+                    add_full_card ( maclist[1] , 'AP' , frame_subtype , radio_hdr )
+                    discovered[ maclist[1] ].add_rssi( radio_hdr )
+                    if maclist[1] != maclist[2] :
+                        add_full_card ( maclist[2] , 'CELL' , frame_subtype , radio_hdr )
+                        if maclist[1] not in discovered[ maclist[2] ].sta :
+                            discovered[ maclist[2] ].add_sta( maclist[1] )
+                else :
+                    print "ERROR : non broadcast BEACON : %s %s %s" % tuple(maclist)
+            elif frame_subtype == "PROBE_REQ" : # Pueden ser al broadcast o una "reasociacion ??
+                if maclist[0] == maclist[2] :
+                    add_full_card ( maclist[1] , 'STA' , frame_subtype , radio_hdr )
+                    discovered[ maclist[1] ].add_rssi( radio_hdr )
+                    if maclist[0] != "FF:FF:FF:FF:FF:FF" :
+                        add_full_card ( maclist[0] , 'AP' , frame_subtype , radio_hdr )
+                        if maclist[1] not in discovered[ maclist[0] ].sta :
+                            discovered[ maclist[0] ].add_sta( maclist[1] )
+                else :
+                    print "ERROR : broken PROBE_REQ : %s %s %s" % tuple(maclist)
+            else :
+                print "WARNING : unhandled MGT subtype %s" % frame_subtype
+
+
     logfile.write( "%4s %13s %6s %4d [ %2d %2d ] read %4d missing %4d" % (frame_type,frame_subtype,direction,radio_hdr['CHANNEL'],radio_hdr['FLAGS'],radio_hdr['CHANNEL_BITMAP'],pointer,pcktlen) )
     logfile.write( " = %s %s " % ( radio_hdr['DBM_ANTSIGNAL'] , radio_hdr['DBM_ANTNOISE'] ) )
     logfile.write( " ; %4d %4d " % sequence )
@@ -225,3 +265,8 @@ except Exception , ex :
 
 logfile.close()
 
+fd = open( "discovered.list" , "w" )
+for mac in discovered.keys() :
+    fd.write( "%s\n" % discovered[mac] )
+fd.close()
+