test_p2p_channel.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  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. from test_p2p_grpform import go_neg_pin_authorized
  12. from test_p2p_grpform import check_grpform_results
  13. from test_p2p_grpform import remove_group
  14. def set_country(country):
  15. subprocess.call(['sudo', 'iw', 'reg', 'set', country])
  16. time.sleep(0.1)
  17. def test_p2p_channel_5ghz(dev):
  18. """P2P group formation with 5 GHz preference"""
  19. try:
  20. set_country("US")
  21. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  22. r_dev=dev[1], r_intent=0,
  23. test_data=False)
  24. check_grpform_results(i_res, r_res)
  25. freq = int(i_res['freq'])
  26. if freq < 5000:
  27. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  28. remove_group(dev[0], dev[1])
  29. finally:
  30. set_country("00")
  31. def test_p2p_channel_5ghz_no_vht(dev):
  32. """P2P group formation with 5 GHz preference when VHT channels are disallowed"""
  33. try:
  34. set_country("US")
  35. dev[0].request("P2P_SET disallow_freq 5180-5240")
  36. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  37. r_dev=dev[1], r_intent=0,
  38. test_data=False)
  39. check_grpform_results(i_res, r_res)
  40. freq = int(i_res['freq'])
  41. if freq < 5000:
  42. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  43. remove_group(dev[0], dev[1])
  44. finally:
  45. set_country("00")
  46. dev[0].request("P2P_SET disallow_freq ")
  47. def test_p2p_channel_random_social(dev):
  48. """P2P group formation with 5 GHz preference but all 5 GHz channels disabled"""
  49. try:
  50. set_country("US")
  51. dev[0].request("SET p2p_oper_channel 11")
  52. dev[0].request("P2P_SET disallow_freq 5000-6000,2462")
  53. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  54. r_dev=dev[1], r_intent=0,
  55. test_data=False)
  56. check_grpform_results(i_res, r_res)
  57. freq = int(i_res['freq'])
  58. if freq not in [ 2412, 2437, 2462 ]:
  59. raise Exception("Unexpected channel %d MHz - did not pick random social channel" % freq)
  60. remove_group(dev[0], dev[1])
  61. finally:
  62. set_country("00")
  63. dev[0].request("P2P_SET disallow_freq ")
  64. def test_p2p_channel_random(dev):
  65. """P2P group formation with 5 GHz preference but all 5 GHz channels and all social channels disabled"""
  66. try:
  67. set_country("US")
  68. dev[0].request("SET p2p_oper_channel 11")
  69. dev[0].request("P2P_SET disallow_freq 5000-6000,2412,2437,2462")
  70. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  71. r_dev=dev[1], r_intent=0,
  72. test_data=False)
  73. check_grpform_results(i_res, r_res)
  74. freq = int(i_res['freq'])
  75. if freq > 2500 or freq in [ 2412, 2437, 2462 ]:
  76. raise Exception("Unexpected channel %d MHz" % freq)
  77. remove_group(dev[0], dev[1])
  78. finally:
  79. set_country("00")
  80. dev[0].request("P2P_SET disallow_freq ")
  81. def test_p2p_channel_random_social_with_op_class_change(dev, apdev, params):
  82. """P2P group formation using random social channel with oper class change needed"""
  83. try:
  84. set_country("US")
  85. logger.info("Start group on 5 GHz")
  86. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  87. r_dev=dev[1], r_intent=0,
  88. test_data=False)
  89. check_grpform_results(i_res, r_res)
  90. freq = int(i_res['freq'])
  91. if freq < 5000:
  92. raise Exception("Unexpected channel %d MHz - did not pick 5 GHz preference" % freq)
  93. remove_group(dev[0], dev[1])
  94. logger.info("Disable 5 GHz and try to re-start group based on 5 GHz preference")
  95. dev[0].request("SET p2p_oper_reg_class 115")
  96. dev[0].request("SET p2p_oper_channel 36")
  97. dev[0].request("P2P_SET disallow_freq 5000-6000")
  98. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  99. r_dev=dev[1], r_intent=0,
  100. test_data=False)
  101. check_grpform_results(i_res, r_res)
  102. freq = int(i_res['freq'])
  103. if freq not in [ 2412, 2437, 2462 ]:
  104. raise Exception("Unexpected channel %d MHz - did not pick random social channel" % freq)
  105. remove_group(dev[0], dev[1])
  106. try:
  107. arg = [ "tshark",
  108. "-r", os.path.join(params['logdir'], "hwsim0.pcapng"),
  109. "-R", "wifi_p2p.public_action.subtype == 0",
  110. "-V" ]
  111. cmd = subprocess.Popen(arg, stdout=subprocess.PIPE,
  112. stderr=open('/dev/null', 'w'))
  113. except Exception, e:
  114. logger.info("Could run run tshark check: " + str(e))
  115. cmd = None
  116. pass
  117. if cmd:
  118. last = None
  119. for l in cmd.stdout.read().splitlines():
  120. if "Operating Channel:" not in l:
  121. continue
  122. last = l
  123. if last is None:
  124. raise Exception("Could not find GO Negotiation Request")
  125. if "Operating Class 81" not in last:
  126. raise Exception("Unexpected operating class: " + last.strip())
  127. finally:
  128. set_country("00")
  129. dev[0].request("P2P_SET disallow_freq ")
  130. dev[0].request("SET p2p_oper_reg_class 81")
  131. dev[0].request("SET p2p_oper_channel 11")