1*cd4e3c3eSJouni Malinen#!/usr/bin/python 2*cd4e3c3eSJouni Malinen# 3*cd4e3c3eSJouni Malinen# Sigma Control API DUT (sniffer - P2P NoA check) 4*cd4e3c3eSJouni Malinen# Copyright (c) 2014, Qualcomm Atheros, Inc. 5*cd4e3c3eSJouni Malinen# All Rights Reserved. 6*cd4e3c3eSJouni Malinen# Licensed under the Clear BSD license. See README for more details. 7*cd4e3c3eSJouni Malinen 8*cd4e3c3eSJouni Malinenimport sys 9*cd4e3c3eSJouni Malinenimport subprocess 10*cd4e3c3eSJouni Malinen 11*cd4e3c3eSJouni Malineninfile = sys.argv[1] 12*cd4e3c3eSJouni Malinenbssid = sys.argv[2] 13*cd4e3c3eSJouni Malinensrcmac = sys.argv[3] 14*cd4e3c3eSJouni Malinendestmac = sys.argv[4] 15*cd4e3c3eSJouni Malinen 16*cd4e3c3eSJouni Malinentshark = subprocess.Popen(['tshark', '-r', infile, 17*cd4e3c3eSJouni Malinen '-c', '1', 18*cd4e3c3eSJouni Malinen '-R', 'wlan.sa==' + bssid + " and wlan.fc.type_subtype==8", 19*cd4e3c3eSJouni Malinen '-Tfields', 20*cd4e3c3eSJouni Malinen '-e', 'radiotap.mactime', 21*cd4e3c3eSJouni Malinen '-e', 'wlan_mgt.fixed.timestamp', 22*cd4e3c3eSJouni Malinen '-e', 'wifi_p2p.noa.duration', 23*cd4e3c3eSJouni Malinen '-e', 'wifi_p2p.noa.interval', 24*cd4e3c3eSJouni Malinen '-e', 'wifi_p2p.noa.start_time', 25*cd4e3c3eSJouni Malinen '-e', 'frame.time_relative'], 26*cd4e3c3eSJouni Malinen stdout=subprocess.PIPE) 27*cd4e3c3eSJouni Malinennoa_data = tshark.stdout.read() 28*cd4e3c3eSJouni Malinenvals = noa_data.rstrip().split('\t') 29*cd4e3c3eSJouni Malinenmactime = int(vals[0]) 30*cd4e3c3eSJouni Malinentimestamp = int(vals[1], 16) 31*cd4e3c3eSJouni Malinennoa_duration = int(vals[2]) 32*cd4e3c3eSJouni Malinennoa_interval = int(vals[3]) 33*cd4e3c3eSJouni Malinennoa_start = int(vals[4]) 34*cd4e3c3eSJouni Malinenframe_time = float(vals[5]) 35*cd4e3c3eSJouni Malinen 36*cd4e3c3eSJouni Malinenif noa_start > timestamp: 37*cd4e3c3eSJouni Malinen print "FilterStatus,FAIL,reasonCode,Unexpected NoA Start Time after Beacon timestamp" 38*cd4e3c3eSJouni Malinen sys.exit() 39*cd4e3c3eSJouni Malinen 40*cd4e3c3eSJouni Malinennoa_start_mactime = mactime - (timestamp - noa_start) 41*cd4e3c3eSJouni Malinennoa_start_frame_time = frame_time - (timestamp - noa_start) / 1000000.0 42*cd4e3c3eSJouni Malinen 43*cd4e3c3eSJouni Malinendebug = open(infile + ".txt", "w") 44*cd4e3c3eSJouni Malinendebug.write("mactime={}\ntimestamp={}\nnoa_duration={}\nnoa_interval={}\nnoa_start={}\nnoa_start_mactime={}\nnoa_start_frame_time={}\n".format(mactime, timestamp, noa_duration, noa_interval, noa_start, noa_start_mactime, noa_start_frame_time)) 45*cd4e3c3eSJouni Malinen 46*cd4e3c3eSJouni Malinentshark = subprocess.Popen(['tshark', '-r', infile, 47*cd4e3c3eSJouni Malinen '-R', 'wlan.da==' + destmac + " and wlan.sa==" + srcmac, 48*cd4e3c3eSJouni Malinen '-Tfields', 49*cd4e3c3eSJouni Malinen '-e', 'frame.number', 50*cd4e3c3eSJouni Malinen '-e', 'radiotap.mactime', 51*cd4e3c3eSJouni Malinen '-e', 'frame.time_relative'], 52*cd4e3c3eSJouni Malinen stdout=subprocess.PIPE) 53*cd4e3c3eSJouni Malinenframes = tshark.stdout.read() 54*cd4e3c3eSJouni Malinenerror_frame = None 55*cd4e3c3eSJouni Malinendebug.write("\nframenum mactime offset(mactime) offset(frametime)\n") 56*cd4e3c3eSJouni Malinenfor f in frames.splitlines(): 57*cd4e3c3eSJouni Malinen vals = f.rstrip().split('\t') 58*cd4e3c3eSJouni Malinen framenum = int(vals[0]) 59*cd4e3c3eSJouni Malinen mactime = int(vals[1]) 60*cd4e3c3eSJouni Malinen frametime = float(vals[2]) 61*cd4e3c3eSJouni Malinen if mactime < noa_start_mactime: 62*cd4e3c3eSJouni Malinen print "FilterStatus,FAIL,reasonCode,Unexpected mactime before NoA Start Time" 63*cd4e3c3eSJouni Malinen sys.exit() 64*cd4e3c3eSJouni Malinen offset = (mactime - noa_start_mactime) % noa_interval 65*cd4e3c3eSJouni Malinen offset_t = ((frametime - noa_start_frame_time) * 1000000) % noa_interval 66*cd4e3c3eSJouni Malinen debug.write("{} {} {} {}\n".format(framenum, mactime, offset, offset_t)) 67*cd4e3c3eSJouni Malinen # allow 200 us as extra buffer to compensate for sniffer inaccuracy 68*cd4e3c3eSJouni Malinen allow_buffer = 200 69*cd4e3c3eSJouni Malinen if offset > allow_buffer and offset + allow_buffer < noa_duration: 70*cd4e3c3eSJouni Malinen debug.write("Frame {} during GO absence (mactime) (mactime={}, offset={} usec, NoA-duration={} usec)\n".format(framenum, mactime, offset, noa_duration)) 71*cd4e3c3eSJouni Malinen error_frame = framenum 72*cd4e3c3eSJouni Malinen if offset_t > allow_buffer and offset_t + allow_buffer < noa_duration: 73*cd4e3c3eSJouni Malinen debug.write("Frame {} during GO absence (frametime) (frametime={}, offset={} usec, NoA-duration={} usec)\n".format(framenum, frametime, offset_t, noa_duration)) 74*cd4e3c3eSJouni Malinen #error_frame = framenum 75*cd4e3c3eSJouni Malinen 76*cd4e3c3eSJouni Malinenif error_frame: 77*cd4e3c3eSJouni Malinen print "FilterStatus,FAILURE,frameNumber," + str(error_frame) 78*cd4e3c3eSJouni Malinenelse: 79*cd4e3c3eSJouni Malinen print "FilterStatus,SUCCESS" 80