--- /dev/null
+
+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 ) )
+
import time
from ieee80211 import *
+from wificards import *
max_time = 15 * 60
tstamp = time.time()
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 ( ) :
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 )
logfile.close()
+fd = open( "discovered.list" , "w" )
+for mac in discovered.keys() :
+ fd.write( "%s\n" % discovered[mac] )
+fd.close()
+