xref: /wlan-dirver/utils/sigma-dut/sniffer-check-p2p-noa-duration.py (revision cd4e3c3e0365aac6e078aab03f11d01d8f1020d5)
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