How to use wait_for_nav method in Playwright Python

Best Python code snippet using playwright-python

uwicore_80211mac.py

Source:uwicore_80211mac.py Github

copy

Full Screen

1#!/usr/bin/env python2# Copyright 2005, 2006 Free Software Foundation, Inc.3 4# This file is part of GNU Radio5 6# GNU Radio is free software; you can redistribute it and/or modify7# it under the terms of the GNU General Public License as published by8# the Free Software Foundation; either version 3, or (at your option)9# any later version.10 11# GNU Radio is distributed in the hope that it will be useful,12# but WITHOUT ANY WARRANTY; without even the implied warranty of13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14# GNU General Public License for more details.15 16# You should have received a copy of the GNU General Public License17# along with GNU Radio; see the file COPYING. If not, write to18# the Free Software Foundation, Inc., 51 Franklin Street,19# Boston, MA 02110-1301, USA.202122# Projectname: uwicore@umh_80211_MAC2324# Filename: uwicore_80211mac.py2526# This script contains the MAC Finite State Machine (FSM) implementation developed by the Uwicore 27# Laboratory at the University Miguel Hernandez of Elche. More detailed information about the 28# FSM diagram transitions can be found at www.uwicore.umh.es/mhop-testbeds.html or at the publication:2930# J.R. Gutierrez-Agullo, B. Coll-Perales and J. Gozalvez, "An IEEE 802.11 MAC Software Defined Radio Implementation for Experimental Wireless Communications and Networking Research", Proceedings of the 2010 IFIP/IEEE Wireless Days (WD'10), pp. 1-5, 20-22 October 2010, Venice (Italy).3132# Ubiquitous Wireless Communications Research Laboratory 33# Uwicore, http://www.uwicore.umh.es34# Communications Engineering Department35# University Miguel Hernandez of Elche36# Avda de la Universidad, s/n37# 03202 Elche, Spain38# Release: April 201139# List of Authors:40# Juan R. Gutierrez-Agullo (jgutierrez@umh.es)41# Baldomero Coll-Perales (bcoll@umh.es)42# Dr. Javier Gozalvez (j.gozalvez@umh.es)434445from optparse import OptionParser46from gnuradio.eng_option import eng_option47import uwicore_mac_utils as MAC4849import time, sys, random5051# Finite State Machine MAC main52def main():53 parser = OptionParser(option_class=eng_option, conflict_handler="resolve")54 parser.add_option("", "--PHYport", type="intx", default=8013,55 help="PHY communication socket port, [default=%default]")56 parser.add_option("", "--MACport", type="intx", default=8001,57 help="MAC communication socket port, [default=%default]")58 parser.add_option("-i", "--interp", type="intx", default=10,59 help="USRP2 interpolation factor value, [default=%default]\60 5 -> 802.11a/g, OFDM T_Symbol=4us, \61 10 -> 802.11p, OFDM T_Symbol=8us")62 parser.add_option("", "--regime", type="string", default="1",63 help="OFDM regimecode [default=%default]\64 1 -> 6 (3) Mbit/s (BPSK r=0.5), \65 2 -> 9 (4.5) Mbit/s (BPSK r=0.75), \66 3 -> 12 (6) Mbit/s (QPSK r=0.5), \67 4 -> 18 (9) Mbit/s (QPSK r=0.75), \68 5 -> 24 (12) Mbit/s (QAM16 r=0.5), \69 6 -> 36 (18) Mbit/s (QAM16 r=0.75), \70 7 -> 48 (24) Mbit/s (QAM64 r=0.66), \71 8 -> 54 (27) Mbit/s (QAM64 r=0.75)")72 parser.add_option("-n", "--node", type="intx", default=1,73 help="Number of USRP2 node, [default=%default]")74 parser.add_option("", "--beta", type="float", default=10000,75 help="Scaling Time Parameter, [default=%default]")76 parser.add_option("-t", "--time_slot", type="float", default=9e-6,77 help="Time slot value, [default=%default]")78 parser.add_option("-B", "--BI", type="float", default=1,79 help="Beacon Interval (BI) value in seconds, [default=%default]")80 parser.add_option("-S", "--SIFS", type="float", default=16e-6,81 help="Short Inter-frame space (SIFS) value, [default=%default]")82 parser.add_option('', "--retx", action="store_true", default=False,83 help="Retransmissions enabled, [default=%default]")84 parser.add_option('', "--RTS", action="store_true", default=False,85 help="RTS-threshold enabled, [default=%default]")86 parser.add_option('-v', "--V", action="store_true", default=False,87 help="Print debug information, [default=%default]")88 (options, args) = parser.parse_args ()89 90 my_mac = MAC.usrp2_node(options.node) # MAC address for this node91 dest_mac = MAC.usrp2_node(2) # Dummy value (updated when an incoming packet arrives)92 93 """94 IEEE 802.11-a MAC parameters95 """96 beta = options.beta # scaling time parameter97 tslot = options.time_slot * beta98 SIFS = options.SIFS * beta99 DIFS = SIFS + 2 * tslot100 Preamble = DIFS #16e-6101 PLCP_header = 4e-6 * beta102 ACK_time = Preamble + PLCP_header103 CW_min = 15104 CW_max = 1023105 RTS_THRESHOLD = 150106 dot11FragmentationTh = 1036107108 # TX time estimation for a CTS and an ACK packet109 empty_values = {"duration":0, "mac_ra":my_mac, "timestamp":time.time()} 110 CTS_empty = MAC.generate_pkt("CTS", options.interp, options.regime, empty_values)111 T_cts = CTS_empty["INFO"]["txtime"]112 ACK_empty = MAC.generate_pkt("ACK", options.interp, options.regime, empty_values)113 T_ack = ACK_empty["INFO"]["txtime"]114 115 # Set socket ports116 PHY_port = options.PHYport117 #PHYRX_port = options.PHYRXport118 MAC_port = options.MACport119 120 # Variables involving MAC tests121 testing = False # Testing mode active, used to conduct trials122 N_TESTS = 1000 # Number of tests123 N_TESTS_INI = N_TESTS 124 LONG_TESTS = 20 # Payload length for tests125 payload_test = "0000" + LONG_TESTS*'1' # Payload for tests126 test_with_sensing = True # Carrier Sensing (CS) allowed during the test127 total_processing_time = 0 # Total processing time128 t_sense_mean = 0 # CS average time129 t_csense = 0 # CS time130 t_MAC = 0 # MAC time131 t_MAC_mean = 0 # MAC average time132 packet_i=0 # Packets sent counter133 n_sensing = 0 # Number of CS performed134 135 # 'State' controls the state of the MAC136 State = "IDLE" 137 138 # Initial Conditions of the Finite State Machine139 NAV = 0 # Network Allocation Vector 140 N_RETRIES = 0 # Retries to send a packet counter141 busy_in_wfd = False # Busy in Wait_for_DIFS state142 BO_frozen = "NO" # Backoff frozen 143 TX_attempts = 0 # Tries to send a packet counter144 CTS_failed = False # CTS reception failed145 chan = "FREE" # Channel state = IDDLE146 N_SEQ = 0 # Sequence number counter147 N_FRAG = 0 # Fragment number counter148 first_tx = True # Is the first attempt to send a packet?149 frag_count = 0 # Counter used during fragmentation150 data_temp_reass = "" # Initial variable to perform de re-assembly process151 verbose = True # Shows when the MAC is in 'IDDLE' state152 beaconing = False # Is ON the Beaconing process?153 fragmenting = 0 # Is the packet received a fragment?154 155 if options.V:156 print "============================================="157 print " \t MAC layer: DCF + RTS/CTS"158 print "============================================="159 print "MAC address:",MAC.which_dir(my_mac)160 print "Rate = ",options.regime161 print "tslot(s): %f \t SIFS(s): %f"%(tslot,SIFS)162 print "DIFS(s): %f \t T_ACK(s): %f"%(DIFS, ACK_time)163 print "pseudo-random exp. BACKOFF [%i,%i]"%(CW_min, CW_max)164 if options.RTS: 165 print "RTS/CTS: enabled"166 print "\t with RTS Threshold(Bytes): %i \t" %RTS_THRESHOLD167 else: print "RTS/CTS: disabled"168 print "Fragmentation Threshold (Bytes):",dot11FragmentationTh169 if options.retx: print "Retransmissions: enabled"170 else: print "Retransmissions: disabled"171 print "Scaling time parameter = ",beta172 print "============================================="173 174 """175 Starts the MAC operation176 """177 while 1:178 #IDLE STATE179 if State == "IDLE":180 # Is a RTS?181 reply_phy1, packet_phy1 = MAC.read_phy_response(PHY_port, "RTS")182 #print State183 if reply_phy1 == "YES":184 verbose = True # Show when the MAC is IDLE185 copied = packet_phy1 # Copy the received packet from the PHY186 x = copied["INFO"] # Copy the 802.11 frame included in the received packet from PHY187 if my_mac == x["RX_add"]:188 print "[R]-[%s]-[DA: %s]-[SA: %s]-[duration: %f]-[IFM:1]" %(copied["HEADER"],MAC.which_dir(x["RX_add"]),MAC.which_dir(x["TX_add"]),x["txtime"])189 dest_mac = (x["TX_add"]) # Receiver Address of the CTS frame190 RTS_duration = x["txtime"] # Value of RTS' TX time 191 if options.V: print "| IDLE | RTS received | TRANSMITTING_CTS |" 192 """193 #============================================================194 # /TEST/ UNCOMMENT TO CHECK RTS/CTS FUNCTIONALITY195 #============================================================196 # STEP 1/4: Node 1 --> RTS197 values = {"duration":x["txtime"], "mac_ra":x["RX_add"], "mac_ta":x["TX_add"], "timestamp":time.time()} 198 RTS_forced = MAC.generate_pkt("RTS", options.interp, options.regime, values)199 packet_RTS_forced = MAC.create_packet("PKT", RTS_forced)200 MAC.transmit(packet_RTS_forced, PHY_port)201 time.sleep(tslot)202 #============================================================203 """204 State = "TRANSMITTING_CTS"205 else:206 print "[R]-[%s]-[DA:%s]-[SA:%s]-[duration:%f]-[IFM:0]" %(copied["HEADER"],MAC.which_dir(x["RX_add"]),MAC.which_dir(x["TX_add"]),x["txtime"]) 207 tiempo = x["txtime"] / (1.0e3) # Divided by 1e3 because txtime is on milliseconds208 if options.V: print "| IDLE | RTS captured (update NAV) | IDLE |"209 NAV = MAC.update_NAV(time.time(), tiempo, tslot)210 State = "IDLE"211 212 # Check upper layer buffer for data to send213 else:214 reply_up, PAYLOAD = MAC.read_ul_buffer(MAC_port)215 if reply_up == "YES":216 verbose = True217 if options.V: print "| IDLE | MAC has DATA to Tx | WAIT_FOR_NAV |"218 State = "WAIT_FOR_NAV"219 elif reply_up == "BEACON":220 beaconing = True221 if options.V: print "| IDLE | Transmit BEACON FRAME | WAIT_FOR_NAV |"222 State = "TRANSMITTING_RTS"223 elif reply_up == "NO": 224 # is a CTS? 225 reply_phy2, packet_phy2 = MAC.read_phy_response(PHY_port, "CTS")226 if reply_phy2 == "YES":227 verbose = True228 copied = packet_phy2229 x = copied["INFO"]230 print "[R]-[%s]-[DA:%s]-[duration:%f]-[IFM:0]" %(copied["HEADER"],MAC.which_dir(x["RX_add"]),x["txtime"])231 tiempo = x["txtime"]/1.0e3 232 if options.V: print "| IDLE | CTS captured (update NAV) | IDLE |"233 NAV = MAC.update_NAV(time.time(), tiempo, tslot)234 State = "IDLE"235 else:236 if verbose == True: 237 print "\n| IDLE |\n"238 verbose = False239 State = "IDLE"240 if testing == True: # if True, it allows to switch manually to any state 241 t_testA = time.time() 242 packet_i +=1243 State = "WAIT_FOR_NAV" # Edit the state to switch to 244 245 if State == "IDLE": time.sleep(tslot) # Time-slotted MAC246 247 248 #WAIT_FOR_NAV STATE249 elif State == "WAIT_FOR_NAV":250 #print State251 NAV = MAC.update_NAV(time.time(), NAV, tslot)252 if NAV > 0:253 if options.V: print "| WAIT_FOR_NAV | NAV > 0 | WAIT_FOR_NAV |"254 State = "WAIT_FOR_NAV"255 else:256 if options.V: print "| WAIT_FOR_NAV | NAV = 0 | WAIT_FOR_DIFS |"257 State = "WAIT_FOR_DIFS"258 chan = "FREE"259 260 #WAIT_FOR_DIFS STATE261 elif State == "WAIT_FOR_DIFS":262 # This state performs the channel sensing process and decides whether the channel is BUSY or IDLE263 #print State264 t_inicial=time.time()265 t_final=t_inicial + DIFS266 n_sensing=0267 while n_sensing < 2:268 t_testB = time.time()269 channel_in_wfd, t = MAC.sense_channel(PHY_port)270 t_testC = time.time()271 assert (tslot - (t_testC-t_testB) >=0),"Timing Error. Please increase the beta parameter."272 time.sleep(tslot-(t_testC-t_testB))273 if channel_in_wfd == "OCCUPIED":274 chan = "OCCUPIED"275 t_csense = t_csense + (t_testC - t_testB)276 n_sensing +=1 277 assert (t_final - time.time() >=0),"Timing Error. Please increase the beta parameter."278 time.sleep(t_final - time.time())279 t_csense = t_csense/3280 # print "Wait_for_DIFS operation time = ", (time.time()-t_inicial) # DEBUG281 282 if chan == "FREE":283 if BO_frozen == "NO" and busy_in_wfd == False and CTS_failed == False:284 BACKOFF = 0 # Channel IDLE for the first time, BOtimer = 0285 State = "BACKING_OFF"286 if options.V: print "| WAIT_FOR_DIFS | Channel idle | BACKING_OFF |" 287 else:288 if BO_frozen == "NO" and CTS_failed == False: # If it is the 1st time, set the CW289 BACKOFF = MAC.retry(TX_attempts, CW_min)290 TX_attempts = TX_attempts + 1291 #BO_frozen=="YES"292 BO_first_time = 1293 State = "IDLE"294 chan = "FREE"295 if options.V: print "| WAIT_FOR_DIFS | Channel busy | IDLE |"296 297 298 #BACKING_OFF STATE299 elif State == "BACKING_OFF":300 #print State301 busy_in_wfd = False302 if BACKOFF == 0:303 BO_first_time = 1304 State = "TRANSMITTING_RTS"305 else:306 tx = time.time() 307 canal_en_bo, t = MAC.sense_channel(PHY_port)308 309 if canal_en_bo == "FREE": # Channel idle310 BACKOFF = BACKOFF - 1311 BO_first_time = 0 # Backoff process started, freeze CW value!312 if BACKOFF > 0: 313 if options.V: print "| BACKING_OFF | Channel idle (CW = %i) | BACKING_OFF |"%BACKOFF314 State = "BACKING_OFF"315 else:316 if options.V: print "| BACKING_OFF | Channel idle (CW = %i) | TRANSMITTING_RTS |"%BACKOFF 317 State = "TRANSMITTING_RTS"318 busy_in_wfd = False319 320 else: # Channel busy321 BACKOFF = BACKOFF - 1322 BO_first_time = 0 # Channel busy, CW frozen323 BO_frozen = "YES"324 State = "IDLE"325 if options.V:326 if options.V: print "| BACKING_OFF | Channel busy (CW = %i) | IDLE |"%BACKOFF 327 ty = time.time()328 assert (tslot - (ty - tx) >=0),"Timing Error. Please increase the beta parameter."329 time.sleep(tslot - (ty - tx))330 331 #TRANSMITTING_RTS STATE332 elif State == "TRANSMITTING_RTS":333 #print State334 #TX_attempts = 0 # DEBUG335 BO_first_time = 1 # Update backoff status for the next time336 337 # Work out TX time of the packet to send338 if testing == True:339 N_TESTS -= 1340 N_SEQ +=1 341 values = {"payload":payload_test, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":0,"timestamp":time.time()}342 test = MAC.generate_pkt("DATA", options.interp, options.regime, values)343 packet_TEST = MAC.create_packet("PKT", test)344 t_testD = time.time()345 346 # Send the packet to PHY347 MAC.transmit(packet_TEST, PHY_port)348 349 t_MAC = t_MAC + (t_testD-t_testA)350 t_MAC_mean = t_MAC/packet_i351 t_sense_mean = t_sense_mean + t_csense352 print "=============== Packet %i ==================="%(packet_i)353 print "MAC processing time = ",(t_testD-t_testA)354 print "MAC processing time (average) = ", t_MAC_mean355 print "Carrier sensing time = ",(t_testC - t_testB)356 print "Carrier sensing time (average) = ",t_sense_mean/packet_i357 print "============================================="358 359 if N_TESTS == 0: 360 sys.stderr.write("End of Test. Press ENTER to exit")361 z=raw_input()362 sys.exit(0)363 364 # Not a Beacon to TX365 elif beaconing == False: 366 values = {"payload":PAYLOAD, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}367 packet = MAC.generate_pkt("DATA", options.interp, options.regime, values)368 T_data = packet["INFO"]["txtime"]369 '''370 Value of RTS fields:371 Duration = T_cts + T_ack + 3*SIFS + T_data372 mac_ra = dest_mac373 mac_ta = my_mac374 '''375 if options.RTS == True:376 if PAYLOAD > RTS_THRESHOLD:377 if first_tx == True: 378 retx_retries = 7379 fail_tx = False380 first_tx = False381 duration = (3 * SIFS) + (T_cts + T_ack + T_data) / 1000 #Txtime in milliseconds382 mac_ra = dest_mac383 mac_ta = my_mac384 values = {"duration":duration, "mac_ra":mac_ra, "mac_ta":mac_ta,"timestamp":time.time()} 385 RTS = MAC.generate_pkt("RTS", options.interp, options.regime, values)386 packet_RTS = MAC.create_packet("PKT", RTS)387 MAC.transmit(packet_RTS, PHY_port)388 print "[T]-[RTS]-[SA:%s]-[DA=%s]-[duration:%i]" %(MAC.which_dir(my_mac),MAC.which_dir(mac_ta),duration)389 WFC_first_time = 1 # First time in WAITING_FOR_CTS state390 State = "WAITING_FOR_CTS"391 if options.V: print "| TRANSMITTING_RTS | (PAYLOAD > RTS_Th) Send RTS | WAITING_FOR_CTS |"392 else:393 if first_tx == True: 394 retx_retries = 4395 fail_tx = False396 first_tx = False397 State = "TRANSMITTING_UNICAST"398 if options.V: print "| TRANSMITTING_RTS | (PAYLOAD < RTS_Th) Send DATA | TRANSMITTING_UNICAST |"399 else:400 if first_tx == True: 401 retx_retries = 4402 fail_tx = False403 first_tx = False404 if options.V: print "| TRANSMITTING_RTS | (RTS OFF) Send DATA | TRANSMITTING_UNICAST |"405 State = "TRANSMITTING_UNICAST"406 else:407 values = {"address2":my_mac, "N_SEQ":N_SEQ,"N_FRAG":0 ,"BI":options.BI, "timestamp":time.time()}408 print "[T]-[BEACON]-[SA:%s]-[BI=%f]-[#seq:%i]" %(MAC.which_dir(my_mac),options.BI,N_SEQ)409 if options.V: print "| TRANSMITTING_RTS | Send BEACON | IDLE |"410 BEACON = MAC.generate_pkt("BEACON", options.interp, options.regime, values)411 packet_BEACON = MAC.create_packet("PKT", BEACON)412 MAC.transmit(packet_BEACON, PHY_port)413 MAC.remove_ul_buff_packet(MAC_port)414 N_SEQ += 1415 beaconing = False416 verbose = True417 State = "IDLE"418 419 #TRANSMITTING_UNICAST STATE420 elif State == "TRANSMITTING_UNICAST":421 '''422 Send packet to PHY for its transmission using the USRP2423 packet = [MPDU][LENGHT][INFO] 424 pkt = [Header: PKT][Data: packet]425 '''426 #print State427 #if options.V: print "[%s]\t: TX DATA packet to PHY" % State428 if len(PAYLOAD) > dot11FragmentationTh:429 if options.V: print "| TRANSMITTING_UNICAST | Send Fragmented Data | TRANSMITTING_FRAGMENTED_PACKET |"430 State = "TRANSMITTING_FRAGMENTED_PACKET"431 first_time_fg = True432 WF_ACK_FG_first_time = True433 else:434 values = {"payload":PAYLOAD, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}435 print "[T]-[DATA]-[DA:%s]-[SA:%s]-[MF:0]-[#seq:%i]-[Payload = %s]" %(MAC.which_dir(dest_mac),MAC.which_dir(my_mac),N_SEQ,PAYLOAD)436 if options.V: print "| TRANSMITTING_UNICAST | Send DATA | WAITING_FOR_ACK |"437 N_SEQ += 1438 N_FRAG = 0439 if fail_tx == False:440 packet = MAC.generate_pkt("DATA", options.interp, options.regime, values)441 else:442 packet = MAC.generate_pkt("DATA_RETX", options.interp, options.regime, values)443 pkt = MAC.create_packet("PKT", packet)444 MAC.transmit(pkt, PHY_port)445 WF_ACK_first_time = 1 # First time in WAITING_FOR_ACK state 446 State = "WAITING_FOR_ACK"447 448 # WAITING_FOR_CTS STATE449 elif State == "WAITING_FOR_CTS":450 #print State451 if WFC_first_time == 1:452 CTS_time = SIFS453 CTS_fin = 0 454 t0 = time.time()455 no_packet, packet_phy = MAC.read_phy_response(PHY_port, "CTS")456 457 '''458 #============================================================459 # /TEST/ UNCOMMENT TO CHECK RTS/CTS FUNCTIONALITY460 #============================================================461 # STEP 2/4: Node 2 --> CTS462 mac_ra = my_mac463 values = {"duration":0, "mac_ra":mac_ra,"timestamp":time.time()} 464 CTS_forced = MAC.generate_pkt("CTS", options.interp, options.regime, values)465 packet_CTS_forced = MAC.create_packet("PKT", CTS_forced)466 MAC.transmit(packet_CTS_forced, PHY_port)467 time.sleep(tslot)468 #============================================================469 '''470 if no_packet == "YES":471 # Is the CTS frame for this station? 472 copied = packet_phy["INFO"]473 if copied["RX_add"] == my_mac:474 WFC_first_time = 1475 State = "TRANSMITTING_UNICAST"476 CTS_fin = 1477 TX_attempts = 0478 CTS_failed = False479 if options.V:480 print "[R]-[CTS]-[RA: %s]-[duration: %f]-[IFM:1]" %(MAC.which_dir(copied["RX_add"]),copied["txtime"])481 if options.V: print "| WAITING_FOR_CTS | CTS received | TRANSMITTING_UNICAST |" 482 else:483 CTS_fin = 1 # CTS captured! Transmission aborted to avoid a collision484 print "[R]-[CTS]-[RA:%s]-[duration:%f]-[IFM:0]" %(MAC.which_dir(copied["RX_add"]),copied["txtime"])485 State = "IDLE"486 nuevo_NAV = copied["txtime"]/1e3487 NAV = MAC.update_NAV(time.time(),nuevo_NAV , tslot)488 if options.V: print "| WAITING_FOR_CTS | CTS captured (Update NAV = %f) | IDLE |"%NAV489490 else:491 State = "WAITING_FOR_CTS" 492 WFC_first_time = 0 493 #CTS_fin = 0494 t1 = time.time()495 CTS_time = CTS_time - (t1 - t0)496 497 if CTS_fin == 0:498 if CTS_time > 0:499 State = "WAITING_FOR_CTS" 500 else:501 TX_attempts = TX_attempts + 1502 BACKOFF = MAC.retry(TX_attempts, CW_min)503 State = "IDLE" # Timer expired and CTS hasn't been received504 if options.V:505 if options.V: print "| WAITING_FOR_CTS | CTS not received | IDLE |"506 CTS_failed = True507 508509 #TRANSMITTING_FRAGMENTED_PACKET STATE510 elif State == "TRANSMITTING_FRAGMENTED_PACKET":511 #print State512 if first_time_fg == True:513 fragments = MAC.fragment(PAYLOAD, dot11FragmentationTh) #fragment the PAYLOAD based on a fragmentation threshold514 first_time_fg = False515 else:516 if len(fragments) > 1:517 payload_tmp = fragments[0]518 #Create packet with MORE FRAGMENT = 1 and payload = payload_tmp519 values = {"payload":payload_tmp, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}520 packet = MAC.generate_pkt("DATA_FRAG", options.interp, options.regime, values)521 N_SEQ += 1522 N_FRAG += 1523 pkt = MAC.create_packet("PKT", packet) 524 print "[T]-[FRAGMENTED DATA]-[DA:%s]-[SA:%s]-[MF:1]-[#seq:%i]-[#frag:%i]-[Payload = %s]" %(MAC.which_dir(dest_mac),MAC.which_dir(my_mac),N_SEQ,N_FRAG,payload_tmp)525 if options.V: print "| TRANSMITTING_FRAGMENTED_PACKET | Send DATA FRAG | WAIT_ACK_FRAGMENTED |"526 MAC.transmit(pkt, PHY_port)527 fragments.pop(0) #FIXME Retransmission for Fragmented packets is required528 fin_wait_ack_fragmented = False529 State = "WAIT_ACK_FRAGMENTED"530 elif len(fragments) == 1:531 payload_tmp = fragments[0]532 #Create packet with MORE FRAGMENT = 0 and payload = payload_tmp533 values = {"payload":payload_tmp, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}534 N_SEQ += 1535 N_FRAG += 1536 N_FRAG = 0537 print "[T]-[DATA]-[DA:%s]-[SA:%s]-[MF:0]-[#seq:%i]-[Payload = %s]" %(MAC.which_dir(dest_mac),MAC.which_dir(my_mac),N_SEQ, payload_tmp)538 if options.V: print "| TRANSMITTING_FRAGMENTED_PACKET | Send DATA FRAG (last fragment) | WAIT_ACK_FRAGMENTED |"539 packet = MAC.generate_pkt("DATA", options.interp, options.regime, values) 540 pkt = MAC.create_packet("PKT", packet) 541 MAC.transmit(pkt, PHY_port)542 fin_wait_ack_fragmented = True543 State = "WAIT_ACK_FRAGMENTED" 544545 #WAIT_ACK_FRAGMENTED STATE 546 elif State == "WAIT_ACK_FRAGMENTED":547 #print State548 if WF_ACK_FG_first_time == 1:549 T_ACK = SIFS550 ta1 = time.time()551 no_packet, packet_phy = MAC.read_phy_response(PHY_port, "ACK")552 if no_packet == "YES": # ACK addressed to this station553 x = packet_phy["INFO"]554 print "[R]-[%s]-[DA: %s]-[duration:%f]-[IFM:1]" %(packet_phy["HEADER"],MAC.which_dir(x["RX_add"]),x["txtime"])555 if fin_wait_ack_fragmented == True: # Last fragment sent556 if options.V: print "| WAIT_ACK_FRAGMENTED | All fragments acknowledged | IDLE |"557 State = "IDLE"558 MAC.remove_ul_buff_packet(MAC_port) # Remove the packet from upper layers559 first_tx = True560 else:561 print "[R]-[%s]-[DA:%s]-[duration:%f]-[IFM:1]" %(packet_phy["HEADER"],MAC.which_dir(x["RX_add"]),x["txtime"])562 if options.V: print "| WAIT_ACK_FRAGMENTED | ACK received | TRANSMITTING_FRAGMENTED_PACKET |"563 State = "TRANSMITTING_FRAGMENTED_PACKET"564 BACKOFF = 0565 WF_ACK_FG_first_time = 1566 ACK_FG_fin = 1 567 else:568 State = "WAIT_ACK_FRAGMENTED" # Not an ACK569 WF_ACK_FG_first_time = 0570 ACK_FG_fin = 0571 ta2=time.time()572 573 assert (tslot - (ta2 - ta1) >=0),"Timing Error. Please increase the beta parameter."574 time.sleep(tslot - (ta2 - ta1))575 tb = time.time()576 T_ACK = T_ACK - (tb - ta1)577 if ACK_FG_fin == 0:578 if T_ACK > 0:579 if options.V: print "| WAIT_ACK_FRAGMENTED | ACK not received yet | WAIT_ACK_FRAGMENTED |"580 State = "WAIT_ACK_FRAGMENTED"581 else: 582 if options.V: print "| WAIT_ACK_FRAGMENTED | ACK not received | IDLE |"583 State = "IDLE"584 MAC.remove_ul_buff_packet(MAC_port) # ACK not received within the Waiting_for_ack interval585 first_tx = True586 587588 #WAITING_FOR_ACK STATE 589 elif State == "WAITING_FOR_ACK":590 #print State591 if WF_ACK_first_time == 1:592 T_ACK = SIFS593 ta = time.time()594 no_packet, packet_phy = MAC.read_phy_response(PHY_port, "ACK")595 if no_packet == "YES":596 x = packet_phy["INFO"] 597 print "[R]-[%s]-[DA:%s]-[duration:%f]-[IFM:1]" %(packet_phy["HEADER"],MAC.which_dir(x["RX_add"]),x["txtime"])598 '''599 #============================================================600 # /TEST/ UNCOMMENT TO CHECK RTS/CTS FUNCTIONALITY601 #============================================================602 # STEP 4/4: Node 2 --> ACK603 mac_ra = my_mac604 values = {"duration":x["txtime"], "mac_ra":mac_ra,"timestamp":time.time()} 605 ACK_forced = MAC.generate_pkt("ACK", options.interp, options.regime, values)606 packet_ACK_forced = MAC.create_packet("PKT", ACK_forced)607 MAC.transmit(packet_ACK_forced, PHY_port)608 time.sleep(tslot)609 #============================================================610 '''611 if options.V: print "| WAITING_FOR_ACK | ACK received | IDLE |"612 State = "IDLE"613 BACKOFF = 0614 WF_ACK_first_time = 1615 ACK_fin = 1 616 MAC.remove_ul_buff_packet(MAC_port) # Packet acknoweledged, remove from upper layers617 first_tx = True618 619 else:620 State = "WAITING_FOR_ACK" # Not an ACK621 WF_ACK_first_time = 0622 ACK_fin = 0623 624 ta_fin = time.time()625 assert (tslot - (ta_fin - ta) >=0),"Timing Error. Please increase the beta parameter."626 time.sleep(tslot - (ta_fin - ta))627 tb = time.time()628 T_ACK = T_ACK - (tb - ta)629 if ACK_fin == 0:630 if T_ACK > 0:631 if options.V: print "| WAITING_FOR_ACK | ACK not received yet | WAITING_FOR_ACK |"632 State = "WAITING_FOR_ACK"633 else:634 # Not ACK yet, Reset CW to CWmin and go to IDLE635 if options.retx == True:636 retx_retries = retx_retries - 1637 if retx_retries < 0:638 CW = CW_min 639 State = "IDLE"640 MAC.remove_ul_buff_packet(MAC_port)641 first_tx = True642 if options.V: print "| WAITING_FOR_ACK | Remove packet from upper layers | IDLE |"643 N_FRAG = 0 644 fail_tx = False645 else:646 if options.V: print "| WAITING_FOR_ACK | ACK not received (retries left = %i) | IDLE |"%retx_retries647 State = "IDLE"648 fail_tx = True649 else: 650 State = "IDLE"651 if options.V: print "| WAITING_FOR_ACK | Remove packet from upper layers | IDLE |"652 MAC.remove_ul_buff_packet(MAC_port) # No Re-TX!653 first_tx = True654 655 #TRANSMITTING_CTS STATE 656 elif State == "TRANSMITTING_CTS":657 '''658 RTS received. NAV allows channel access.659 Send CTS to PHY for its transmission.660 - packet = [CTS][LENGHT][INFO]661 - pkt = [Header: PKT][Data: packet]662 '''663 #print State664 NAV = MAC.update_NAV(time.time(), NAV, tslot)665 if NAV > 0:666 if options.V: print "| TRANSMITTING_CTS | NAV > 0 | TRANSMITTING_CTS |"667 State = "TRANSMITTING_CTS"668 else:669 duration = RTS_duration - (2 * T_cts) / 10 - SIFS 670 mac_ra = dest_mac671 values = {"duration":duration, "mac_ra":mac_ra, "timestamp":time.time()} 672 CTS = MAC.generate_pkt("CTS", options.interp, options.regime, values)673 packet_CTS = MAC.create_packet("PKT", CTS)674 print "[T]-[CTS]-[DA:%s]-[duration=%f]" %(MAC.which_dir(mac_ra),duration)675 if options.V: print "| TRANSMITTING_CTS | CTS sent | WAITING_FOR_DATA |"676 MAC.transmit(packet_CTS, PHY_port)677 WF_DATA_first_time = 1678 State = "WAITING_FOR_DATA"679 680 #WAITING_FOR_DATA STATE 681 elif State == "WAITING_FOR_DATA":682 '''683 Once the CTS is transmitted, wait for Data arrival684 -> If a data packet arrives, go to TRANSMITTING_ACK685 -> If no, go to IDLE686 '''687 #print State688 if WF_DATA_first_time == 1:689 T_DATA = SIFS690 t_1 = time.time()691 no_packet, packet_phy = MAC.read_phy_response(PHY_port, "DATA")692 if no_packet == "YES":693 x = packet_phy["INFO"] # DATA packet addressed to this station694 '''695 #============================================================696 # /TEST/ UNCOMMENT TO CHECK RTS/CTS FUNCTIONALITY697 #============================================================698 # STEP 3/4: Node 1 --> DATA699 values = {"payload":"Paquete_que_llega12", "address1":x["mac_add1"], "address2":x["mac_add2"], "N_SEQ":N_SEQ, "N_FRAG":0, "timestamp":time.time()} 700 DATA_forced = MAC.generate_pkt("DATA", options.interp, options.regime, values)701 packet_DATA_forced = MAC.create_packet("PKT", DATA_forced)702 MAC.transmit(packet_DATA_forced, PHY_port)703 time.sleep(2*tslot)704 #============================================================705 '''706 dest_mac = x["mac_add2"]707 if x["MF"]==0: #More Fragments = 0708 if fragmenting == 0: # Not a fragmented packet709 print "[R]-[DATA]-[DA:%s]-[SA:%s]-[MF:0]-[IFM:1]-[PAYLOAD = %s]" %(MAC.which_dir(x["mac_add1"]),MAC.which_dir(x["mac_add2"]),x["PAYLOAD"])710 if options.V: print "| WAITING_FOR_DATA | DATA received | TRANSMITTING_ACK |"711 State = "TRANSMITTING_ACK"712 WF_DATA_first_time = 1 713 DATA_ok = 1714 frag_count = 0715 MAC.send_ul_buff_packet(MAC_port, x["PAYLOAD"])716 else: # Last fragmented packet717 fragmenting = 0718 frag_count +=1719 print "[R]-[FRAGMENTED DATA]-[DA:%s]-[SA:%s]-[MF:0]-[#seq:%i]-[#frag:%i]-[IFM:1]-[PAYLOAD = %s]" %(MAC.which_dir(x["mac_add2"]),MAC.which_dir(my_mac),x["N_SEQ"],x["N_FRAG"],x["PAYLOAD"])720 test_seq = x["N_FRAG"]+1 - frag_count721 if test_seq == 0:722 dato_leido = data_temp_reass + x["PAYLOAD"]723 State = "TRANSMITTING_ACK"724 WF_DATA_first_time = 1725 frag_count = 0 726 DATA_ok = 1727 fragmenting = 0728 if options.V: print "| WAITING_FOR_DATA | DATA_FRAG received (MF = 0)| TRANSMITTING_ACK |"729 MAC.send_ul_buff_packet(MAC_port, dato_leido)730 else: 731 State = "IDLE"732 WF_DATA_first_time = 1 733 DATA_ok = 0734 frag_count = 0735 fragmenting = 0736 if options.V: print "| WAITING_FOR_DATA | Error: one or more fragments not received | TRANSMITTING_ACK |"737 else: # More Fragments = 1. It's a fragment738 print "[R]-[FRAGMENTED DATA]-[DA:%s]-[SA:%s]-[MF:1]-[#seq:%i]-[#frag:%i]-[IFM:1]-[PAYLOAD = %s]" %(MAC.which_dir(x["mac_add2"]),MAC.which_dir(my_mac),x["N_SEQ"],x["N_FRAG"],x["PAYLOAD"])739 if options.V: print "| WAITING_FOR_DATA | DATA_FRAG received (MF = 1)| TRANSMITTING_ACK |"740 fragmenting = 1741 frag_count +=1742 DATA_ok = 1743 data_temp_reass = data_temp_reass + x["PAYLOAD"]744 State = "TX_ACK_FG" 745 else:746 DATA_ok = 0747 State = "WAITING_FOR_DATA" # Not a DATA packet748 WF_DATA_first_time = 0749 tdiff = (time.time() - t_1)750 assert (tslot - tdiff >=0),"Timing Error. Please increase the beta parameter."751 time.sleep(tslot - tdiff)752 T_DATA = T_DATA - (time.time() - t_1)753 if DATA_ok == 0:754 if T_DATA > 0:755 if options.V: print "| WAITING_FOR_DATA | DATA not received yet | WAITING_FOR_DATA |"756 State = "WAITING_FOR_DATA"757 else:758 # DATA didn't arrive, go to IDLE759 State = "IDLE"760 if options.V: print "| WAITING_FOR_DATA | DATA not received | IDLE |"761 DATA_ok = 1 762 763 #TX_ACK_FG STATE 764 elif State == "TX_ACK_FG":765 #print State766 values = {"duration":0, "mac_ra":dest_mac, "timestamp":time.time()} #dest_mac value copied from the previous Data packet767 print "[T]-[ACK]-[duration=%f]-[DA:%s]" %(values["duration"],MAC.which_dir(dest_mac))768 if options.V: print "| TX_ACK_FG | ACK sent | WAITING_FOR_DATA |"769 ACK = MAC.generate_pkt("ACK", options.interp, options.regime, values)770 packet_ACK = MAC.create_packet("PKT", ACK)771 MAC.transmit(packet_ACK, PHY_port)772 State = "WAITING_FOR_DATA"773 774 #TRANSMITTING_ACK STATE 775 elif State == "TRANSMITTING_ACK":776 #print State777 values = {"duration":0, "mac_ra":dest_mac, "timestamp":time.time()} #dest_mac value copied from the previous Data packet778 ACK = MAC.generate_pkt("ACK", options.interp, options.regime, values)779 packet_ACK = MAC.create_packet("PKT", ACK)780 print "[T]-[ACK]-[duration=%f]-[DA:%s]" %(values["duration"], MAC.which_dir(dest_mac))781 MAC.transmit(packet_ACK, PHY_port)782 State = "IDLE"783 if options.V: print "| TRANSMITTING_ACK | ACK sent | IDLE |"784785 786if __name__ == '__main__':787 try:788 main()789 except KeyboardInterrupt: ...

Full Screen

Full Screen

test_navigation.py

Source:test_navigation.py Github

copy

Full Screen

...432 pass433 await asyncio.gather(frame.evaluate("() => window.stop()"), navigation_promise)434async def test_wait_for_nav_should_work_with_url_match(page, server):435 responses = [None, None, None]436 async def wait_for_nav(url: Any, index: int) -> None:437 async with page.expect_navigation(url=url) as response_info:438 pass439 responses[index] = await response_info.value440 response0_promise = asyncio.create_task(441 wait_for_nav(re.compile(r"one-style\.html"), 0)442 )443 response1_promise = asyncio.create_task(444 wait_for_nav(re.compile(r"\/frame.html"), 1)445 )446 response2_promise = asyncio.create_task(447 wait_for_nav(lambda url: "foo=bar" in url, 2)448 )449 assert responses == [None, None, None]450 await page.goto(server.EMPTY_PAGE)451 assert responses == [None, None, None]452 await page.goto(server.PREFIX + "/frame.html")453 assert responses[0] is None454 await response1_promise455 assert responses[1] is not None456 assert responses[2] is None457 await page.goto(server.PREFIX + "/one-style.html")458 await response0_promise459 assert responses[0] is not None460 assert responses[1] is not None461 assert responses[2] is None...

Full Screen

Full Screen

basic_80211mac.py

Source:basic_80211mac.py Github

copy

Full Screen

1#!/usr/bin/env python2# Copyright 2005, 2006 Free Software Foundation, Inc.3 4# This file is part of GNU Radio5 6# GNU Radio is free software; you can redistribute it and/or modify7# it under the terms of the GNU General Public License as published by8# the Free Software Foundation; either version 3, or (at your option)9# any later version.10 11# GNU Radio is distributed in the hope that it will be useful,12# but WITHOUT ANY WARRANTY; without even the implied warranty of13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the14# GNU General Public License for more details.15 16# You should have received a copy of the GNU General Public License17# along with GNU Radio; see the file COPYING. If not, write to18# the Free Software Foundation, Inc., 51 Franklin Street,19# Boston, MA 02110-1301, USA.20# Projectname: uwicore@umh_80211_MAC21# Filename: uwicore_80211mac.py22# This script contains the MAC Finite State Machine (FSM) implementation developed by the Uwicore 23# Laboratory at the University Miguel Hernandez of Elche. More detailed information about the 24# FSM diagram transitions can be found at www.uwicore.umh.es/mhop-testbeds.html or at the publication:25# J.R. Gutierrez-Agullo, B. Coll-Perales and J. Gozalvez, "An IEEE 802.11 MAC Software Defined Radio Implementation for Experimental Wireless Communications and Networking Research", Proceedings of the 2010 IFIP/IEEE Wireless Days (WD'10), pp. 1-5, 20-22 October 2010, Venice (Italy).26# Ubiquitous Wireless Communications Research Laboratory 27# Uwicore, http://www.uwicore.umh.es28# Communications Engineering Department29# University Miguel Hernandez of Elche30# Avda de la Universidad, s/n31# 03202 Elche, Spain32# Release: April 201133# List of Authors:34# Juan R. Gutierrez-Agullo (jgutierrez@umh.es)35# Baldomero Coll-Perales (bcoll@umh.es)36# Dr. Javier Gozalvez (j.gozalvez@umh.es)37from optparse import OptionParser38from gnuradio.eng_option import eng_option39import uwicore_mac_utils as MAC40import time, sys, random41# Finite State Machine MAC main42def main():43 parser = OptionParser(option_class=eng_option, conflict_handler="resolve")44 parser.add_option("", "--PHYport", type="intx", default=8013,45 help="PHY communication socket port, [default=%default]")46 parser.add_option("", "--MACport", type="intx", default=8001,47 help="MAC communication socket port, [default=%default]")48 parser.add_option("-i", "--interp", type="intx", default=10,49 help="USRP2 interpolation factor value, [default=%default]\50 5 -> 802.11a/g, OFDM T_Symbol=4us, \51 10 -> 802.11p, OFDM T_Symbol=8us")52 parser.add_option("", "--regime", type="string", default="1",53 help="OFDM regimecode [default=%default]\54 1 -> 6 (3) Mbit/s (BPSK r=0.5), \55 2 -> 9 (4.5) Mbit/s (BPSK r=0.75), \56 3 -> 12 (6) Mbit/s (QPSK r=0.5), \57 4 -> 18 (9) Mbit/s (QPSK r=0.75), \58 5 -> 24 (12) Mbit/s (QAM16 r=0.5), \59 6 -> 36 (18) Mbit/s (QAM16 r=0.75), \60 7 -> 48 (24) Mbit/s (QAM64 r=0.66), \61 8 -> 54 (27) Mbit/s (QAM64 r=0.75)")62 parser.add_option("-n", "--node", type="intx", default=1,63 help="Number of USRP2 node, [default=%default]")64 parser.add_option("", "--beta", type="float", default=50000,65 help="Scaling Time Parameter, [default=%default]")66 parser.add_option("-t", "--time_slot", type="float", default=9e-6,67 help="Time slot value, [default=%default]")68 parser.add_option("-B", "--BI", type="float", default=1,69 help="Beacon Interval (BI) value in seconds, [default=%default]")70 parser.add_option("-S", "--SIFS", type="float", default=16e-6,71 help="Short Inter-frame space (SIFS) value, [default=%default]")72 parser.add_option('', "--retx", action="store_true", default=False,73 help="Retransmissions enabled, [default=%default]")74 parser.add_option('', "--RTS", action="store_true", default=True,75 help="RTS-threshold enabled, [default=%default]")76 parser.add_option('-v', "--V", action="store_true", default=False,77 help="Print debug information, [default=%default]")78 (options, args) = parser.parse_args ()79 80 my_mac = MAC.usrp2_node(options.node) # MAC address for this node81 dest_mac = MAC.usrp2_node(2) # Dummy value (updated when an incoming packet arrives)82 83 """84 IEEE 802.11-a MAC parameters85 """86 beta = options.beta # scaling time parameter87 tslot = options.time_slot * beta88 SIFS = options.SIFS * beta89 DIFS = SIFS + 2 * tslot90 Preamble = DIFS #16e-691 PLCP_header = 4e-6 * beta92 ACK_time = Preamble + PLCP_header93 CW_min = 1594 CW_max = 102395 RTS_THRESHOLD = 15096 dot11FragmentationTh = 103697 # TX time estimation for a CTS and an ACK packet98 empty_values = {"duration":0, "mac_ra":my_mac, "timestamp":time.time()} 99 CTS_empty = MAC.generate_pkt("CTS", options.interp, options.regime, empty_values)100 T_cts = CTS_empty["INFO"]["txtime"]101 ACK_empty = MAC.generate_pkt("ACK", options.interp, options.regime, empty_values)102 T_ack = ACK_empty["INFO"]["txtime"]103 104 # Set socket ports105 PHY_port = options.PHYport106 #PHYRX_port = options.PHYRXport107 MAC_port = options.MACport108 109 # Variables involving MAC tests110 testing = False # Testing mode active, used to conduct trials111 N_TESTS = 1000 # Number of tests112 N_TESTS_INI = N_TESTS 113 LONG_TESTS = 20 # Payload length for tests114 payload_test = "0000" + LONG_TESTS*'1' # Payload for tests115 test_with_sensing = True # Carrier Sensing (CS) allowed during the test116 total_processing_time = 0 # Total processing time117 t_sense_mean = 0 # CS average time118 t_csense = 0 # CS time119 t_MAC = 0 # MAC time120 t_MAC_mean = 0 # MAC average time121 packet_i=0 # Packets sent counter122 n_sensing = 0 # Number of CS performed123 124 # 'State' controls the state of the MAC125 State = "IDLE" 126 127 # Initial Conditions of the Finite State Machine128 NAV = 0 # Network Allocation Vector 129 N_RETRIES = 0 # Retries to send a packet counter130 busy_in_wfd = False # Busy in Wait_for_DIFS state131 BO_frozen = "NO" # Backoff frozen 132 TX_attempts = 0 # Tries to send a packet counter133 CTS_failed = False # CTS reception failed134 chan = "FREE" # Channel state = IDDLE135 N_SEQ = 0 # Sequence number counter136 N_FRAG = 0 # Fragment number counter137 first_tx = True # Is the first attempt to send a packet?138 frag_count = 0 # Counter used during fragmentation139 data_temp_reass = "" # Initial variable to perform de re-assembly process140 verbose = True # Shows when the MAC is in 'IDDLE' state141 beaconing = False # Is ON the Beaconing process?142 fragmenting = 0 # Is the packet received a fragment?143 144 if options.V:145 print "============================================="146 print " \t MAC layer: DCF + RTS/CTS"147 print "============================================="148 print "MAC address:",MAC.which_dir(my_mac)149 print "Rate = ",options.regime150 print "tslot(s): %f \t SIFS(s): %f"%(tslot,SIFS)151 print "DIFS(s): %f \t T_ACK(s): %f"%(DIFS, ACK_time)152 print "pseudo-random exp. BACKOFF [%i,%i]"%(CW_min, CW_max)153 if options.RTS: 154 print "RTS/CTS: enabled"155 print "\t with RTS Threshold(Bytes): %i \t" %RTS_THRESHOLD156 else: print "RTS/CTS: disabled"157 print "Fragmentation Threshold (Bytes):",dot11FragmentationTh158 if options.retx: print "Retransmissions: enabled"159 else: print "Retransmissions: disabled"160 print "Scaling time parameter = ",beta161 print "============================================="162 163 """164 Starts the MAC operation165 """166 while 1:167 #IDLE STATE168 if State == "IDLE":169 # Is there a DATA?170 reply_phy1, packet_phy1 = MAC.read_phy_response(PHY_port, "DATA")171 print State172 if reply_phy1 == "YES":173 verbose = True # Show when the MAC is IDLE174 x = packet_phy1["INFO"] # DATA packet addressed to this station175 '''176 #============================================================177 # /TEST/ UNCOMMENT TO CHECK RTS/CTS FUNCTIONALITY178 #============================================================179 # STEP 3/4: Node 1 --> DATA180 values = {"payload":"Paquete_que_llega12", "address1":x["mac_add1"], "address2":x["mac_add2"], "N_SEQ":N_SEQ, "N_FRAG":0, "timestamp":time.time()} 181 DATA_forced = MAC.generate_pkt("DATA", options.interp, options.regime, values)182 packet_DATA_forced = MAC.create_packet("PKT", DATA_forced)183 MAC.transmit(packet_DATA_forced, PHY_port)184 time.sleep(2*tslot)185 #============================================================186 '''187 dest_mac = x["mac_add2"]188 if x["MF"]==0: #More Fragments = 0189 if fragmenting == 0: # Not a fragmented packet190 print "[R]-[DATA]-[DA:%s]-[SA:%s]-[MF:0]-[IFM:1]-[PAYLOAD = %s]" %(MAC.which_dir(x["mac_add1"]),MAC.which_dir(x["mac_add2"]),x["PAYLOAD"])191 if options.V: print "| WAITING_FOR_DATA | DATA received | TRANSMITTING_ACK |"192 State = "TRANSMITTING_ACK"193 WF_DATA_first_time = 1 194 frag_count = 0195 MAC.send_ul_buff_packet(MAC_port, x["PAYLOAD"])196 else: # Last fragmented packet197 fragmenting = 0198 frag_count +=1199 print "[R]-[FRAGMENTED DATA]-[DA:%s]-[SA:%s]-[MF:0]-[#seq:%i]-[#frag:%i]-[IFM:1]-[PAYLOAD = %s]" %(MAC.which_dir(x["mac_add2"]),MAC.which_dir(my_mac),x["N_SEQ"],x["N_FRAG"],x["PAYLOAD"])200 test_seq = x["N_FRAG"]+1 - frag_count201 if test_seq == 0:202 dato_leido = data_temp_reass + x["PAYLOAD"]203 State = "TRANSMITTING_ACK"204 WF_DATA_first_time = 1205 frag_count = 0 206 fragmenting = 0207 if options.V: print "| WAITING_FOR_DATA | DATA_FRAG received (MF = 0)| TRANSMITTING_ACK |"208 MAC.send_ul_buff_packet(MAC_port, dato_leido)209 else: 210 WF_DATA_first_time = 1 211 frag_count = 0212 fragmenting = 0213 if options.V: print "| WAITING_FOR_DATA | Error: one or more fragments not received | IDLE |"214 else: # More Fragments = 1. It's a fragment215 print "[R]-[FRAGMENTED DATA]-[DA:%s]-[SA:%s]-[MF:1]-[#seq:%i]-[#frag:%i]-[IFM:1]-[PAYLOAD = %s]" %(MAC.which_dir(x["mac_add2"]),MAC.which_dir(my_mac),x["N_SEQ"],x["N_FRAG"],x["PAYLOAD"])216 if options.V: print "| WAITING_FOR_DATA | DATA_FRAG received (MF = 1)| TRANSMITTING_ACK |"217 fragmenting = 1218 frag_count +=1219 data_temp_reass = data_temp_reass + x["PAYLOAD"]220 State = "TX_ACK_FG" 221 222 223 # Check upper layer buffer for data to send224 else:225 reply_up, PAYLOAD = MAC.read_ul_buffer(MAC_port)226 if reply_up == "YES":227 verbose = True228 if options.V: print "| IDLE | MAC has DATA to Tx | WAIT_FOR_NAV |"229 State = "WAIT_FOR_NAV"230 elif reply_up == "BEACON":231 beaconing = True232 values = {"address2":my_mac, "N_SEQ":N_SEQ,"N_FRAG":0 ,"BI":options.BI, "timestamp":time.time()}233 print "[T]-[BEACON]-[SA:%s]-[BI=%f]-[#seq:%i]" %(MAC.which_dir(my_mac),options.BI,N_SEQ)234 if options.V: print "| IDLE | Send BEACON | IDLE |"235 BEACON = MAC.generate_pkt("BEACON", options.interp, options.regime, values)236 packet_BEACON = MAC.create_packet("PKT", BEACON)237 MAC.transmit(packet_BEACON, PHY_port)238 MAC.remove_ul_buff_packet(MAC_port)239 N_SEQ += 1240 beaconing = False241 if testing == True: # if True, it allows to switch manually to any state 242 t_testA = time.time() 243 packet_i +=1244 State = "WAIT_FOR_NAV" # Edit the state to switch to 245 246 if State == "IDLE": 247 time.sleep(tslot) # Time-slotted MAC248 249 250 #WAIT_FOR_NAV STATE251 elif State == "WAIT_FOR_NAV":252 print State253 NAV = MAC.update_NAV(time.time(), NAV, tslot)254 if NAV > 0:255 if options.V: print "| WAIT_FOR_NAV | NAV > 0 | WAIT_FOR_NAV |"256 State = "WAIT_FOR_NAV"257 else:258 if options.V: print "| WAIT_FOR_NAV | NAV = 0 | WAIT_FOR_DIFS |"259 State = "WAIT_FOR_DIFS"260 chan = "FREE"261 262 #WAIT_FOR_DIFS STATE263 elif State == "WAIT_FOR_DIFS":264 # This state performs the channel sensing process and decides whether the channel is BUSY or IDLE265 print State266 t_inicial=time.time()267 t_final=t_inicial + DIFS268 n_sensing=0269 while n_sensing < 2:270 #t_testB = time.time()271 channel_in_wfd, t = MAC.sense_channel(PHY_port)272 #t_testC = time.time()273 #assert (tslot - (t_testC-t_testB) >=0),"Timing Error. Please increase the beta parameter."274 #time.sleep(tslot-(t_testC-t_testB))275 assert (tslot - t >=0),"Timing Error. Please increase the beta parameter."276 time.sleep(tslot-t)277 if channel_in_wfd == "OCCUPIED":278 chan = "OCCUPIED"279 #t_csense = t_csense + (t_testC - t_testB)280 t_csense = t_csense + t281 n_sensing +=1 282 assert (t_final - time.time() >=0),"Timing Error. Please increase the beta parameter."283 time.sleep(t_final - time.time())284 t_csense = t_csense/3285 # print "Wait_for_DIFS operation time = ", (time.time()-t_inicial) # DEBUG286 287 if chan == "FREE":288 if BO_frozen == "NO" and busy_in_wfd == False and CTS_failed == False:289 BACKOFF = 0 # Channel IDLE for the first time, BOtimer = 0290 State = "BACKING_OFF"291 if options.V: print "| WAIT_FOR_DIFS | Channel idle | BACKING_OFF |" 292 else:293 if BO_frozen == "NO" and CTS_failed == False: # If it is the 1st time, set the CW294 BACKOFF = MAC.retry(TX_attempts, CW_min)295 TX_attempts = TX_attempts + 1296 #BO_frozen=="YES"297 BO_first_time = 1298 State = "IDLE"299 chan = "FREE"300 if options.V: print "| WAIT_FOR_DIFS | Channel busy | IDLE |"301 302 303 #BACKING_OFF STATE304 elif State == "BACKING_OFF":305 print State306 busy_in_wfd = False307 if BACKOFF == 0:308 BO_first_time = 1309 State = "TRANSMITTING_UNICAST"310 else:311 tx = time.time() 312 ch_status, t = MAC.sense_channel(PHY_port)313 314 if ch_status == "FREE": # Channel idle315 BACKOFF = BACKOFF - 1316 BO_first_time = 0 # Backoff process started, freeze CW value!317 if BACKOFF > 0: 318 if options.V: print "| BACKING_OFF | Channel idle (CW = %i) | BACKING_OFF |"%BACKOFF319 State = "BACKING_OFF"320 else:321 if options.V: print "| BACKING_OFF | Channel idle (CW = %i) | TRANSMITTING_UNICAST |"%BACKOFF 322 State = "TRANSMITTING_UNICAST"323 busy_in_wfd = False324 325 else: # Channel busy326 BACKOFF = BACKOFF - 1327 BO_first_time = 0 # Channel busy, CW frozen328 BO_frozen = "YES"329 State = "IDLE"330 if options.V:331 if options.V: print "| BACKING_OFF | Channel busy (CW = %i) | IDLE |"%BACKOFF 332 ty = time.time()333 assert (tslot - (ty - tx) >=0),"Timing Error. Please increase the beta parameter."334 time.sleep(tslot - (ty - tx))335 336 337 #TRANSMITTING_UNICAST STATE338 elif State == "TRANSMITTING_UNICAST":339 '''340 Send packet to PHY for its transmission using the USRP2341 packet = [MPDU][LENGHT][INFO] 342 pkt = [Header: PKT][Data: packet]343 '''344 print State345 fail_tx = False346 #if options.V: print "[%s]\t: TX DATA packet to PHY" % State347 if len(PAYLOAD) > dot11FragmentationTh:348 if options.V: print "| TRANSMITTING_UNICAST | Send Fragmented Data | TRANSMITTING_FRAGMENTED_PACKET |"349 State = "TRANSMITTING_FRAGMENTED_PACKET"350 first_time_fg = True351 WF_ACK_FG_first_time = True352 else:353 values = {"payload":PAYLOAD, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}354 print "[T]-[DATA]-[DA:%s]-[SA:%s]-[MF:0]-[#seq:%i]-[Payload = %s]" %(MAC.which_dir(dest_mac),MAC.which_dir(my_mac),N_SEQ,PAYLOAD)355 if options.V: print "| TRANSMITTING_UNICAST | Send DATA | WAITING_FOR_ACK |"356 N_SEQ += 1357 N_FRAG = 0358 if fail_tx == False:359 packet = MAC.generate_pkt("DATA", options.interp, options.regime, values)360 else:361 packet = MAC.generate_pkt("DATA_RETX", options.interp, options.regime, values)362 pkt = MAC.create_packet("PKT", packet)363 MAC.transmit(pkt, PHY_port)364 WF_ACK_first_time = 1 # First time in WAITING_FOR_ACK state 365 State = "WAITING_FOR_ACK"366 367 #WAITING_FOR_ACK STATE 368 elif State == "WAITING_FOR_ACK":369 print State370 if WF_ACK_first_time == 1:371 T_ACK = SIFS372 ta = time.time()373 any_packet, packet_phy = MAC.read_phy_response(PHY_port, "ACK")374 if any_packet == "YES":375 x = packet_phy["INFO"] 376 #print "[R]-[%s]-[DA:%s]-[duration:%f]-[IFM:1]" %(packet_phy["HEADER"],MAC.which_dir(x["RX_add"]),x["txtime"])377 print "[R]-[ACK]-[DA:%s]-[IFM:1]" %(MAC.which_dir(x["RX_add"]))378 '''379 #============================================================380 # /TEST/ UNCOMMENT TO CHECK RTS/CTS FUNCTIONALITY381 #============================================================382 # STEP 4/4: Node 2 --> ACK383 mac_ra = my_mac384 values = {"duration":x["txtime"], "mac_ra":mac_ra,"timestamp":time.time()} 385 ACK_forced = MAC.generate_pkt("ACK", options.interp, options.regime, values)386 packet_ACK_forced = MAC.create_packet("PKT", ACK_forced)387 MAC.transmit(packet_ACK_forced, PHY_port)388 time.sleep(tslot)389 #============================================================390 '''391 if options.V: print "| WAITING_FOR_ACK | ACK received | IDLE |"392 State = "IDLE"393 BACKOFF = 0394 WF_ACK_first_time = 1395 ACK_fin = 1 396 MAC.remove_ul_buff_packet(MAC_port) # Packet acknoweledged, remove from upper layers397 first_tx = True398 399 else:400 State = "WAITING_FOR_ACK" # Not an ACK401 WF_ACK_first_time = 0402 ACK_fin = 0403 404 ta_fin = time.time()405 assert (tslot - (ta_fin - ta) >=0),"Timing Error. Please increase the beta parameter."406 time.sleep(tslot - (ta_fin - ta))407 tb = time.time()408 T_ACK = T_ACK - (tb - ta)409 if ACK_fin == 0:410 if T_ACK > 0:411 if options.V: print "| WAITING_FOR_ACK | ACK not received yet | WAITING_FOR_ACK |"412 State = "WAITING_FOR_ACK"413 else:414 # Not ACK yet, Reset CW to CWmin and go to IDLE415 if options.retx == True:416 retx_retries = retx_retries - 1417 if retx_retries < 0:418 CW = CW_min 419 State = "IDLE"420 MAC.remove_ul_buff_packet(MAC_port) # drop the packet after maximum number of retries421 first_tx = True422 if options.V: print "| WAITING_FOR_ACK | Remove packet from upper layers | IDLE |"423 N_FRAG = 0 424 fail_tx = False425 else:426 if options.V: print "| WAITING_FOR_ACK | ACK not received (retries left = %i) | IDLE |"%retx_retries427 State = "IDLE"428 fail_tx = True429 else: 430 State = "IDLE"431 if options.V: print "| WAITING_FOR_ACK | Remove packet from upper layers | IDLE |"432 MAC.remove_ul_buff_packet(MAC_port) # No Re-TX!433 first_tx = True434 #TRANSMITTING_FRAGMENTED_PACKET STATE435 elif State == "TRANSMITTING_FRAGMENTED_PACKET":436 print State437 if first_time_fg == True:438 fragments = MAC.fragment(PAYLOAD, dot11FragmentationTh) #fragment the PAYLOAD based on a fragmentation threshold439 first_time_fg = False440 else:441 if len(fragments) > 1:442 payload_tmp = fragments[0]443 #Create packet with MORE FRAGMENT = 1 and payload = payload_tmp444 values = {"payload":payload_tmp, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}445 packet = MAC.generate_pkt("DATA_FRAG", options.interp, options.regime, values)446 N_SEQ += 1447 N_FRAG += 1448 pkt = MAC.create_packet("PKT", packet) 449 print "[T]-[FRAGMENTED DATA]-[DA:%s]-[SA:%s]-[MF:1]-[#seq:%i]-[#frag:%i]-[Payload = %s]" %(MAC.which_dir(dest_mac),MAC.which_dir(my_mac),N_SEQ,N_FRAG,payload_tmp)450 if options.V: print "| TRANSMITTING_FRAGMENTED_PACKET | Send DATA FRAG | WAIT_ACK_FRAGMENTED |"451 MAC.transmit(pkt, PHY_port)452 fragments.pop(0) #FIXME Retransmission for Fragmented packets is required453 fin_wait_ack_fragmented = False454 State = "WAIT_ACK_FRAGMENTED"455 elif len(fragments) == 1:456 payload_tmp = fragments[0]457 #Create packet with MORE FRAGMENT = 0 and payload = payload_tmp458 values = {"payload":payload_tmp, "address1":dest_mac, "address2":my_mac, "N_SEQ":N_SEQ, "N_FRAG":N_FRAG, "timestamp":time.time()}459 N_SEQ += 1460 N_FRAG += 1461 N_FRAG = 0462 print "[T]-[DATA]-[DA:%s]-[SA:%s]-[MF:0]-[#seq:%i]-[Payload = %s]" %(MAC.which_dir(dest_mac),MAC.which_dir(my_mac),N_SEQ, payload_tmp)463 if options.V: print "| TRANSMITTING_FRAGMENTED_PACKET | Send DATA FRAG (last fragment) | WAIT_ACK_FRAGMENTED |"464 packet = MAC.generate_pkt("DATA", options.interp, options.regime, values) 465 pkt = MAC.create_packet("PKT", packet) 466 MAC.transmit(pkt, PHY_port)467 fin_wait_ack_fragmented = True468 State = "WAIT_ACK_FRAGMENTED" 469 #WAIT_ACK_FRAGMENTED STATE 470 elif State == "WAIT_ACK_FRAGMENTED":471 print State472 if WF_ACK_FG_first_time == 1:473 T_ACK = SIFS474 ta1 = time.time()475 no_packet, packet_phy = MAC.read_phy_response(PHY_port, "ACK")476 if no_packet == "YES": # ACK addressed to this station477 x = packet_phy["INFO"]478 print "[R]-[ACK-FRAG]-[DA: %s]-[IFM:1]" %(MAC.which_dir(x["RX_add"]))479 if fin_wait_ack_fragmented == True: # Last fragment sent480 if options.V: print "| WAIT_ACK_FRAGMENTED | All fragments acknowledged | IDLE |"481 State = "IDLE"482 MAC.remove_ul_buff_packet(MAC_port) # Remove the packet from upper layers483 first_tx = True484 else:485 print "[R]-[ACK-FRAG]-[DA:%s]-[IFM:1]" %(MAC.which_dir(x["RX_add"]))486 if options.V: print "| WAIT_ACK_FRAGMENTED | ACK received | TRANSMITTING_FRAGMENTED_PACKET |"487 State = "TRANSMITTING_FRAGMENTED_PACKET"488 BACKOFF = 0489 WF_ACK_FG_first_time = 1490 ACK_FG_fin = 1 491 else:492 State = "WAIT_ACK_FRAGMENTED" # Not an ACK493 WF_ACK_FG_first_time = 0494 ACK_FG_fin = 0495 ta2=time.time()496 497 assert (tslot - (ta2 - ta1) >=0),"Timing Error. Please increase the beta parameter."498 time.sleep(tslot - (ta2 - ta1))499 tb = time.time()500 T_ACK = T_ACK - (tb - ta1)501 if ACK_FG_fin == 0:502 if T_ACK > 0:503 if options.V: print "| WAIT_ACK_FRAGMENTED | ACK not received yet | WAIT_ACK_FRAGMENTED |"504 State = "WAIT_ACK_FRAGMENTED"505 else: 506 if options.V: print "| WAIT_ACK_FRAGMENTED | ACK not received | IDLE |"507 State = "IDLE"508 MAC.remove_ul_buff_packet(MAC_port) # ACK not received within the Waiting_for_ack interval509 first_tx = True510 511 #TX_ACK_FG STATE 512 elif State == "TX_ACK_FG":513 print State514 values = {"duration":0, "mac_ra":dest_mac, "timestamp":time.time()} #dest_mac value copied from the previous Data packet515 print "[T]-[ACK]-[duration=%f]-[DA:%s]" %(values["duration"],MAC.which_dir(dest_mac))516 if options.V: print "| TX_ACK_FG | ACK sent | WAITING_FOR_DATA |"517 ACK = MAC.generate_pkt("ACK", options.interp, options.regime, values)518 packet_ACK = MAC.create_packet("PKT", ACK)519 MAC.transmit(packet_ACK, PHY_port)520 State = "WAITING_FOR_DATA"521 522 #TRANSMITTING_ACK STATE 523 elif State == "TRANSMITTING_ACK":524 print State525 #time.sleep(SIFS)526 values = {"duration":0, "mac_ra":dest_mac, "timestamp":time.time()} #dest_mac value copied from the previous Data packet527 ACK = MAC.generate_pkt("ACK", options.interp, options.regime, values)528 packet_ACK = MAC.create_packet("PKT", ACK)529 print "[T]-[ACK]-[duration=%f]-[DA:%s]" %(values["duration"], MAC.which_dir(dest_mac))530 MAC.transmit(packet_ACK, PHY_port)531 State = "IDLE"532 if options.V: print "| TRANSMITTING_ACK | ACK sent | IDLE |"533 534if __name__ == '__main__':535 try:536 main()537 except KeyboardInterrupt:...

Full Screen

Full Screen

Playwright tutorial

LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.

Chapters:

  1. What is Playwright : Playwright is comparatively new but has gained good popularity. Get to know some history of the Playwright with some interesting facts connected with it.
  2. How To Install Playwright : Learn in detail about what basic configuration and dependencies are required for installing Playwright and run a test. Get a step-by-step direction for installing the Playwright automation framework.
  3. Playwright Futuristic Features: Launched in 2020, Playwright gained huge popularity quickly because of some obliging features such as Playwright Test Generator and Inspector, Playwright Reporter, Playwright auto-waiting mechanism and etc. Read up on those features to master Playwright testing.
  4. What is Component Testing: Component testing in Playwright is a unique feature that allows a tester to test a single component of a web application without integrating them with other elements. Learn how to perform Component testing on the Playwright automation framework.
  5. Inputs And Buttons In Playwright: Every website has Input boxes and buttons; learn about testing inputs and buttons with different scenarios and examples.
  6. Functions and Selectors in Playwright: Learn how to launch the Chromium browser with Playwright. Also, gain a better understanding of some important functions like “BrowserContext,” which allows you to run multiple browser sessions, and “newPage” which interacts with a page.
  7. Handling Alerts and Dropdowns in Playwright : Playwright interact with different types of alerts and pop-ups, such as simple, confirmation, and prompt, and different types of dropdowns, such as single selector and multi-selector get your hands-on with handling alerts and dropdown in Playright testing.
  8. Playwright vs Puppeteer: Get to know about the difference between two testing frameworks and how they are different than one another, which browsers they support, and what features they provide.
  9. Run Playwright Tests on LambdaTest: Playwright testing with LambdaTest leverages test performance to the utmost. You can run multiple Playwright tests in Parallel with the LammbdaTest test cloud. Get a step-by-step guide to run your Playwright test on the LambdaTest platform.
  10. Playwright Python Tutorial: Playwright automation framework support all major languages such as Python, JavaScript, TypeScript, .NET and etc. However, there are various advantages to Python end-to-end testing with Playwright because of its versatile utility. Get the hang of Playwright python testing with this chapter.
  11. Playwright End To End Testing Tutorial: Get your hands on with Playwright end-to-end testing and learn to use some exciting features such as TraceViewer, Debugging, Networking, Component testing, Visual testing, and many more.
  12. Playwright Video Tutorial: Watch the video tutorials on Playwright testing from experts and get a consecutive in-depth explanation of Playwright automation testing.

Run Playwright Python automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful