test_p2p_channel.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. # P2P channel selection test cases
  2. # Copyright (c) 2014, Jouni Malinen <j@w1.fi>
  3. #
  4. # This software may be distributed under the terms of the BSD license.
  5. # See README for more details.
  6. import logging
  7. logger = logging.getLogger()
  8. import os
  9. import subprocess
  10. import time
  11. import hostapd
  12. import hwsim_utils
  13. from test_p2p_grpform import go_neg_pin_authorized
  14. from test_p2p_grpform import check_grpform_results
  15. from test_p2p_grpform import remove_group
  16. from test_p2p_autogo import autogo
  17. def set_country(country):
  18. subprocess.call(['sudo', 'iw', 'reg', 'set', country])
  19. time.sleep(0.1)
  20. def test_p2p_channel_5ghz(dev):
  21. """P2P group formation with 5 GHz preference"""
  22. try:
  23. set_country("US")
  24. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  25. r_dev=dev[1], r_intent=0,
  26. test_data=False)
  27. check_grpform_results(i_res, r_res)
  28. freq = int(i_res['freq'])
  29. if freq < 5000:
  30. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  31. remove_group(dev[0], dev[1])
  32. finally:
  33. set_country("00")
  34. def test_p2p_channel_5ghz_no_vht(dev):
  35. """P2P group formation with 5 GHz preference when VHT channels are disallowed"""
  36. try:
  37. set_country("US")
  38. dev[0].request("P2P_SET disallow_freq 5180-5240")
  39. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  40. r_dev=dev[1], r_intent=0,
  41. test_data=False)
  42. check_grpform_results(i_res, r_res)
  43. freq = int(i_res['freq'])
  44. if freq < 5000:
  45. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  46. remove_group(dev[0], dev[1])
  47. finally:
  48. set_country("00")
  49. dev[0].request("P2P_SET disallow_freq ")
  50. def test_p2p_channel_random_social(dev):
  51. """P2P group formation with 5 GHz preference but all 5 GHz channels disabled"""
  52. try:
  53. set_country("US")
  54. dev[0].request("SET p2p_oper_channel 11")
  55. dev[0].request("P2P_SET disallow_freq 5000-6000,2462")
  56. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  57. r_dev=dev[1], r_intent=0,
  58. test_data=False)
  59. check_grpform_results(i_res, r_res)
  60. freq = int(i_res['freq'])
  61. if freq not in [ 2412, 2437, 2462 ]:
  62. raise Exception("Unexpected channel %d MHz - did not pick random social channel" % freq)
  63. remove_group(dev[0], dev[1])
  64. finally:
  65. set_country("00")
  66. dev[0].request("P2P_SET disallow_freq ")
  67. def test_p2p_channel_random(dev):
  68. """P2P group formation with 5 GHz preference but all 5 GHz channels and all social channels disabled"""
  69. try:
  70. set_country("US")
  71. dev[0].request("SET p2p_oper_channel 11")
  72. dev[0].request("P2P_SET disallow_freq 5000-6000,2412,2437,2462")
  73. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  74. r_dev=dev[1], r_intent=0,
  75. test_data=False)
  76. check_grpform_results(i_res, r_res)
  77. freq = int(i_res['freq'])
  78. if freq > 2500 or freq in [ 2412, 2437, 2462 ]:
  79. raise Exception("Unexpected channel %d MHz" % freq)
  80. remove_group(dev[0], dev[1])
  81. finally:
  82. set_country("00")
  83. dev[0].request("P2P_SET disallow_freq ")
  84. def test_p2p_channel_random_social_with_op_class_change(dev, apdev, params):
  85. """P2P group formation using random social channel with oper class change needed"""
  86. try:
  87. set_country("US")
  88. logger.info("Start group on 5 GHz")
  89. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  90. r_dev=dev[1], r_intent=0,
  91. test_data=False)
  92. check_grpform_results(i_res, r_res)
  93. freq = int(i_res['freq'])
  94. if freq < 5000:
  95. raise Exception("Unexpected channel %d MHz - did not pick 5 GHz preference" % freq)
  96. remove_group(dev[0], dev[1])
  97. logger.info("Disable 5 GHz and try to re-start group based on 5 GHz preference")
  98. dev[0].request("SET p2p_oper_reg_class 115")
  99. dev[0].request("SET p2p_oper_channel 36")
  100. dev[0].request("P2P_SET disallow_freq 5000-6000")
  101. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  102. r_dev=dev[1], r_intent=0,
  103. test_data=False)
  104. check_grpform_results(i_res, r_res)
  105. freq = int(i_res['freq'])
  106. if freq not in [ 2412, 2437, 2462 ]:
  107. raise Exception("Unexpected channel %d MHz - did not pick random social channel" % freq)
  108. remove_group(dev[0], dev[1])
  109. try:
  110. arg = [ "tshark",
  111. "-r", os.path.join(params['logdir'], "hwsim0.pcapng"),
  112. "-R", "wifi_p2p.public_action.subtype == 0",
  113. "-V" ]
  114. cmd = subprocess.Popen(arg, stdout=subprocess.PIPE,
  115. stderr=open('/dev/null', 'w'))
  116. except Exception, e:
  117. logger.info("Could run run tshark check: " + str(e))
  118. cmd = None
  119. pass
  120. if cmd:
  121. last = None
  122. for l in cmd.stdout.read().splitlines():
  123. if "Operating Channel:" not in l:
  124. continue
  125. last = l
  126. if last is None:
  127. raise Exception("Could not find GO Negotiation Request")
  128. if "Operating Class 81" not in last:
  129. raise Exception("Unexpected operating class: " + last.strip())
  130. finally:
  131. set_country("00")
  132. dev[0].request("P2P_SET disallow_freq ")
  133. dev[0].request("SET p2p_oper_reg_class 81")
  134. dev[0].request("SET p2p_oper_channel 11")
  135. def test_p2p_channel_avoid(dev):
  136. """P2P and avoid frequencies driver event"""
  137. try:
  138. set_country("US")
  139. if "OK" not in dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES 5000-6000,2412,2437,2462"):
  140. raise Exception("Could not simulate driver event")
  141. ev = dev[0].wait_event(["CTRL-EVENT-AVOID-FREQ"], timeout=10)
  142. if ev is None:
  143. raise Exception("No CTRL-EVENT-AVOID-FREQ event")
  144. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  145. r_dev=dev[1], r_intent=0,
  146. test_data=False)
  147. check_grpform_results(i_res, r_res)
  148. freq = int(i_res['freq'])
  149. if freq > 2500 or freq in [ 2412, 2437, 2462 ]:
  150. raise Exception("Unexpected channel %d MHz" % freq)
  151. if "OK" not in dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES"):
  152. raise Exception("Could not simulate driver event(2)")
  153. ev = dev[0].wait_event(["CTRL-EVENT-AVOID-FREQ"], timeout=10)
  154. if ev is None:
  155. raise Exception("No CTRL-EVENT-AVOID-FREQ event")
  156. ev = dev[0].wait_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=1)
  157. if ev is not None:
  158. raise Exception("Unexpected P2P-REMOVE-AND-REFORM-GROUP event")
  159. if "OK" not in dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES " + str(freq)):
  160. raise Exception("Could not simulate driver event(3)")
  161. ev = dev[0].wait_event(["CTRL-EVENT-AVOID-FREQ"], timeout=10)
  162. if ev is None:
  163. raise Exception("No CTRL-EVENT-AVOID-FREQ event")
  164. ev = dev[0].wait_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=10)
  165. if ev is None:
  166. raise Exception("No P2P-REMOVE-AND-REFORM-GROUP event")
  167. finally:
  168. set_country("00")
  169. dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES")
  170. def test_autogo_following_bss(dev, apdev):
  171. """P2P autonomous GO operate on the same channel as station interface"""
  172. if dev[0].get_mcc() > 1:
  173. logger.info("test mode: MCC")
  174. dev[0].request("SET p2p_no_group_iface 0")
  175. channels = { 3 : "2422", 5 : "2432", 9 : "2452" }
  176. for key in channels:
  177. hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test',
  178. "channel" : str(key) })
  179. dev[0].connect("ap-test", key_mgmt="NONE",
  180. scan_freq=str(channels[key]))
  181. res_go = autogo(dev[0])
  182. if res_go['freq'] != channels[key]:
  183. raise Exception("Group operation channel is not the same as on connected station interface")
  184. hwsim_utils.test_connectivity(dev[0].ifname, apdev[0]['ifname'])
  185. dev[0].remove_group(res_go['ifname'])