test_p2p_channel.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  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 utils import HwsimSkip
  14. from tshark import run_tshark
  15. from wpasupplicant import WpaSupplicant
  16. from hwsim import HWSimRadio
  17. from test_p2p_grpform import go_neg_pin_authorized
  18. from test_p2p_grpform import check_grpform_results
  19. from test_p2p_grpform import remove_group
  20. from test_p2p_grpform import go_neg_pbc
  21. from test_p2p_autogo import autogo
  22. def set_country(country, dev=None):
  23. subprocess.call(['iw', 'reg', 'set', country])
  24. time.sleep(0.1)
  25. if dev:
  26. for i in range(10):
  27. ev = dev.wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=15)
  28. if ev is None:
  29. raise Exception("No regdom change event seen")
  30. if "type=COUNTRY alpha2=" + country in ev:
  31. return
  32. raise Exception("No matching regdom event seen for set_country(%s)" % country)
  33. def test_p2p_channel_5ghz(dev):
  34. """P2P group formation with 5 GHz preference"""
  35. try:
  36. set_country("US", dev[0])
  37. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  38. r_dev=dev[1], r_intent=0,
  39. test_data=False)
  40. check_grpform_results(i_res, r_res)
  41. freq = int(i_res['freq'])
  42. if freq < 5000:
  43. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  44. remove_group(dev[0], dev[1])
  45. finally:
  46. set_country("00")
  47. dev[1].flush_scan_cache()
  48. def test_p2p_channel_5ghz_no_vht(dev):
  49. """P2P group formation with 5 GHz preference when VHT channels are disallowed"""
  50. try:
  51. set_country("US", dev[0])
  52. dev[0].request("P2P_SET disallow_freq 5180-5240")
  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 < 5000:
  59. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  60. remove_group(dev[0], dev[1])
  61. finally:
  62. set_country("00")
  63. dev[0].request("P2P_SET disallow_freq ")
  64. dev[1].flush_scan_cache()
  65. def test_p2p_channel_random_social(dev):
  66. """P2P group formation with 5 GHz preference but all 5 GHz channels disabled"""
  67. try:
  68. set_country("US", dev[0])
  69. dev[0].request("SET p2p_oper_channel 11")
  70. dev[0].request("P2P_SET disallow_freq 5000-6000,2462")
  71. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  72. r_dev=dev[1], r_intent=0,
  73. test_data=False)
  74. check_grpform_results(i_res, r_res)
  75. freq = int(i_res['freq'])
  76. if freq not in [ 2412, 2437, 2462 ]:
  77. raise Exception("Unexpected channel %d MHz - did not pick random social channel" % freq)
  78. remove_group(dev[0], dev[1])
  79. finally:
  80. set_country("00")
  81. dev[0].request("P2P_SET disallow_freq ")
  82. dev[1].flush_scan_cache()
  83. def test_p2p_channel_random(dev):
  84. """P2P group formation with 5 GHz preference but all 5 GHz channels and all social channels disabled"""
  85. try:
  86. set_country("US", dev[0])
  87. dev[0].request("SET p2p_oper_channel 11")
  88. dev[0].request("P2P_SET disallow_freq 5000-6000,2412,2437,2462")
  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 > 2500 or freq in [ 2412, 2437, 2462 ]:
  95. raise Exception("Unexpected channel %d MHz" % freq)
  96. remove_group(dev[0], dev[1])
  97. finally:
  98. set_country("00")
  99. dev[0].request("P2P_SET disallow_freq ")
  100. dev[1].flush_scan_cache()
  101. def test_p2p_channel_random_social_with_op_class_change(dev, apdev, params):
  102. """P2P group formation using random social channel with oper class change needed"""
  103. try:
  104. set_country("US", dev[0])
  105. logger.info("Start group on 5 GHz")
  106. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  107. r_dev=dev[1], r_intent=0,
  108. test_data=False)
  109. check_grpform_results(i_res, r_res)
  110. freq = int(i_res['freq'])
  111. if freq < 5000:
  112. raise Exception("Unexpected channel %d MHz - did not pick 5 GHz preference" % freq)
  113. remove_group(dev[0], dev[1])
  114. logger.info("Disable 5 GHz and try to re-start group based on 5 GHz preference")
  115. dev[0].request("SET p2p_oper_reg_class 115")
  116. dev[0].request("SET p2p_oper_channel 36")
  117. dev[0].request("P2P_SET disallow_freq 5000-6000")
  118. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  119. r_dev=dev[1], r_intent=0,
  120. test_data=False)
  121. check_grpform_results(i_res, r_res)
  122. freq = int(i_res['freq'])
  123. if freq not in [ 2412, 2437, 2462 ]:
  124. raise Exception("Unexpected channel %d MHz - did not pick random social channel" % freq)
  125. remove_group(dev[0], dev[1])
  126. out = run_tshark(os.path.join(params['logdir'], "hwsim0.pcapng"),
  127. "wifi_p2p.public_action.subtype == 0")
  128. if out is not None:
  129. last = None
  130. for l in out.splitlines():
  131. if "Operating Channel:" not in l:
  132. continue
  133. last = l
  134. if last is None:
  135. raise Exception("Could not find GO Negotiation Request")
  136. if "Operating Class 81" not in last:
  137. raise Exception("Unexpected operating class: " + last.strip())
  138. finally:
  139. set_country("00")
  140. dev[0].request("P2P_SET disallow_freq ")
  141. dev[0].request("SET p2p_oper_reg_class 0")
  142. dev[0].request("SET p2p_oper_channel 0")
  143. dev[1].flush_scan_cache()
  144. def test_p2p_channel_avoid(dev):
  145. """P2P and avoid frequencies driver event"""
  146. try:
  147. set_country("US", dev[0])
  148. if "OK" not in dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES 5000-6000,2412,2437,2462"):
  149. raise Exception("Could not simulate driver event")
  150. ev = dev[0].wait_event(["CTRL-EVENT-AVOID-FREQ"], timeout=10)
  151. if ev is None:
  152. raise Exception("No CTRL-EVENT-AVOID-FREQ event")
  153. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  154. r_dev=dev[1], r_intent=0,
  155. test_data=False)
  156. check_grpform_results(i_res, r_res)
  157. freq = int(i_res['freq'])
  158. if freq > 2500 or freq in [ 2412, 2437, 2462 ]:
  159. raise Exception("Unexpected channel %d MHz" % freq)
  160. if "OK" not in dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES"):
  161. raise Exception("Could not simulate driver event(2)")
  162. ev = dev[0].wait_event(["CTRL-EVENT-AVOID-FREQ"], timeout=10)
  163. if ev is None:
  164. raise Exception("No CTRL-EVENT-AVOID-FREQ event")
  165. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=1)
  166. if ev is not None:
  167. raise Exception("Unexpected P2P-REMOVE-AND-REFORM-GROUP event")
  168. if "OK" not in dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES " + str(freq)):
  169. raise Exception("Could not simulate driver event(3)")
  170. ev = dev[0].wait_event(["CTRL-EVENT-AVOID-FREQ"], timeout=10)
  171. if ev is None:
  172. raise Exception("No CTRL-EVENT-AVOID-FREQ event")
  173. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"],
  174. timeout=10)
  175. if ev is None:
  176. raise Exception("No P2P-REMOVE-AND-REFORM-GROUP event")
  177. finally:
  178. set_country("00")
  179. dev[0].request("DRIVER_EVENT AVOID_FREQUENCIES")
  180. dev[1].flush_scan_cache()
  181. def test_autogo_following_bss(dev, apdev):
  182. """P2P autonomous GO operate on the same channel as station interface"""
  183. if dev[0].get_mcc() > 1:
  184. logger.info("test mode: MCC")
  185. dev[0].request("SET p2p_no_group_iface 0")
  186. channels = { 3 : "2422", 5 : "2432", 9 : "2452" }
  187. for key in channels:
  188. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test',
  189. "channel" : str(key) })
  190. dev[0].connect("ap-test", key_mgmt="NONE",
  191. scan_freq=str(channels[key]))
  192. res_go = autogo(dev[0])
  193. if res_go['freq'] != channels[key]:
  194. raise Exception("Group operation channel is not the same as on connected station interface")
  195. hwsim_utils.test_connectivity(dev[0], hapd)
  196. dev[0].remove_group(res_go['ifname'])
  197. def test_go_neg_with_bss_connected(dev, apdev):
  198. """P2P channel selection: GO negotiation when station interface is connected"""
  199. dev[0].flush_scan_cache()
  200. dev[1].flush_scan_cache()
  201. dev[0].request("SET p2p_no_group_iface 0")
  202. hapd = hostapd.add_ap(apdev[0]['ifname'],
  203. { "ssid": 'bss-2.4ghz', "channel": '5' })
  204. dev[0].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2432")
  205. #dev[0] as GO
  206. [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=10, r_dev=dev[1],
  207. r_intent=1)
  208. check_grpform_results(i_res, r_res)
  209. if i_res['role'] != "GO":
  210. raise Exception("GO not selected according to go_intent")
  211. if i_res['freq'] != "2432":
  212. raise Exception("Group formed on a different frequency than BSS")
  213. hwsim_utils.test_connectivity(dev[0], hapd)
  214. dev[0].remove_group(i_res['ifname'])
  215. dev[1].wait_go_ending_session()
  216. if dev[0].get_mcc() > 1:
  217. logger.info("Skip as-client case due to MCC being enabled")
  218. return;
  219. #dev[0] as client
  220. [i_res2, r_res2] = go_neg_pbc(i_dev=dev[0], i_intent=1, r_dev=dev[1],
  221. r_intent=10)
  222. check_grpform_results(i_res2, r_res2)
  223. if i_res2['role'] != "client":
  224. raise Exception("GO not selected according to go_intent")
  225. if i_res2['freq'] != "2432":
  226. raise Exception("Group formed on a different frequency than BSS")
  227. hwsim_utils.test_connectivity(dev[0], hapd)
  228. dev[1].remove_group(r_res2['ifname'])
  229. dev[0].wait_go_ending_session()
  230. dev[0].request("DISCONNECT")
  231. hapd.disable()
  232. dev[0].flush_scan_cache()
  233. dev[1].flush_scan_cache()
  234. def test_autogo_with_bss_on_disallowed_chan(dev, apdev):
  235. """P2P channel selection: Autonomous GO with BSS on a disallowed channel"""
  236. with HWSimRadio(n_channels=2) as (radio, iface):
  237. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  238. wpas.interface_add(iface)
  239. wpas.request("SET p2p_no_group_iface 0")
  240. if wpas.get_mcc() < 2:
  241. raise Exception("New radio does not support MCC")
  242. try:
  243. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'bss-2.4ghz',
  244. "channel": '1' })
  245. wpas.request("P2P_SET disallow_freq 2412")
  246. wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412")
  247. res = autogo(wpas)
  248. if res['freq'] == "2412":
  249. raise Exception("GO set on a disallowed channel")
  250. hwsim_utils.test_connectivity(wpas, hapd)
  251. finally:
  252. wpas.request("P2P_SET disallow_freq ")
  253. def test_go_neg_with_bss_on_disallowed_chan(dev, apdev):
  254. """P2P channel selection: GO negotiation with station interface on a disallowed channel"""
  255. with HWSimRadio(n_channels=2) as (radio, iface):
  256. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  257. wpas.interface_add(iface)
  258. wpas.request("SET p2p_no_group_iface 0")
  259. if wpas.get_mcc() < 2:
  260. raise Exception("New radio does not support MCC")
  261. try:
  262. hapd = hostapd.add_ap(apdev[0]['ifname'],
  263. { "ssid": 'bss-2.4ghz', "channel": '1' })
  264. # make sure PBC overlap from old test cases is not maintained
  265. dev[1].flush_scan_cache()
  266. wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412")
  267. wpas.request("P2P_SET disallow_freq 2412")
  268. #wpas as GO
  269. [i_res, r_res] = go_neg_pbc(i_dev=wpas, i_intent=10, r_dev=dev[1],
  270. r_intent=1)
  271. check_grpform_results(i_res, r_res)
  272. if i_res['role'] != "GO":
  273. raise Exception("GO not selected according to go_intent")
  274. if i_res['freq'] == "2412":
  275. raise Exception("Group formed on a disallowed channel")
  276. hwsim_utils.test_connectivity(wpas, hapd)
  277. wpas.remove_group(i_res['ifname'])
  278. dev[1].wait_go_ending_session()
  279. dev[1].flush_scan_cache()
  280. wpas.dump_monitor()
  281. dev[1].dump_monitor()
  282. #wpas as client
  283. [i_res2, r_res2] = go_neg_pbc(i_dev=wpas, i_intent=1, r_dev=dev[1],
  284. r_intent=10)
  285. check_grpform_results(i_res2, r_res2)
  286. if i_res2['role'] != "client":
  287. raise Exception("GO not selected according to go_intent")
  288. if i_res2['freq'] == "2412":
  289. raise Exception("Group formed on a disallowed channel")
  290. hwsim_utils.test_connectivity(wpas, hapd)
  291. dev[1].remove_group(r_res2['ifname'])
  292. wpas.wait_go_ending_session()
  293. ev = dev[1].wait_global_event(["P2P-GROUP-REMOVED"], timeout=5)
  294. if ev is None:
  295. raise Exception("Group removal not indicated")
  296. wpas.request("DISCONNECT")
  297. hapd.disable()
  298. finally:
  299. wpas.request("P2P_SET disallow_freq ")
  300. def test_autogo_force_diff_channel(dev, apdev):
  301. """P2P autonomous GO and station interface operate on different channels"""
  302. with HWSimRadio(n_channels=2) as (radio, iface):
  303. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  304. wpas.interface_add(iface)
  305. if wpas.get_mcc() < 2:
  306. raise Exception("New radio does not support MCC")
  307. wpas.request("SET p2p_no_group_iface 0")
  308. hapd = hostapd.add_ap(apdev[0]['ifname'],
  309. {"ssid" : 'ap-test', "channel" : '1'})
  310. wpas.connect("ap-test", key_mgmt = "NONE", scan_freq = "2412")
  311. channels = { 2 : 2417, 5 : 2432, 9 : 2452 }
  312. for key in channels:
  313. res_go = autogo(wpas, channels[key])
  314. hwsim_utils.test_connectivity(wpas, hapd)
  315. if int(res_go['freq']) == 2412:
  316. raise Exception("Group operation channel is: 2412 excepted: " + res_go['freq'])
  317. wpas.remove_group(res_go['ifname'])
  318. def test_go_neg_forced_freq_diff_than_bss_freq(dev, apdev):
  319. """P2P channel selection: GO negotiation with forced freq different than station interface"""
  320. with HWSimRadio(n_channels=2) as (radio, iface):
  321. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  322. wpas.interface_add(iface)
  323. if wpas.get_mcc() < 2:
  324. raise Exception("New radio does not support MCC")
  325. # Clear possible PBC session overlap from previous test case
  326. dev[1].flush_scan_cache()
  327. wpas.request("SET p2p_no_group_iface 0")
  328. hapd = hostapd.add_ap(apdev[0]['ifname'],
  329. { "country_code": 'US',
  330. "ssid": 'bss-5ghz', "hw_mode": 'a',
  331. "channel": '40' })
  332. wpas.connect("bss-5ghz", key_mgmt="NONE", scan_freq="5200")
  333. # GO and peer force the same freq, different than BSS freq,
  334. # wpas to become GO
  335. [i_res, r_res] = go_neg_pbc(i_dev=dev[1], i_intent=1, i_freq=5180,
  336. r_dev=wpas, r_intent=14, r_freq=5180)
  337. check_grpform_results(i_res, r_res)
  338. if i_res['freq'] != "5180":
  339. raise Exception("P2P group formed on unexpected frequency: " + i_res['freq'])
  340. if r_res['role'] != "GO":
  341. raise Exception("GO not selected according to go_intent")
  342. hwsim_utils.test_connectivity(wpas, hapd)
  343. wpas.remove_group(r_res['ifname'])
  344. dev[1].wait_go_ending_session()
  345. dev[1].flush_scan_cache()
  346. # GO and peer force the same freq, different than BSS freq, wpas to
  347. # become client
  348. [i_res2, r_res2] = go_neg_pbc(i_dev=dev[1], i_intent=14, i_freq=2422,
  349. r_dev=wpas, r_intent=1, r_freq=2422)
  350. check_grpform_results(i_res2, r_res2)
  351. if i_res2['freq'] != "2422":
  352. raise Exception("P2P group formed on unexpected frequency: " + i_res2['freq'])
  353. if r_res2['role'] != "client":
  354. raise Exception("GO not selected according to go_intent")
  355. hwsim_utils.test_connectivity(wpas, hapd)
  356. wpas.request("DISCONNECT")
  357. hapd.request("DISABLE")
  358. subprocess.call(['iw', 'reg', 'set', '00'])
  359. wpas.flush_scan_cache()
  360. def test_go_pref_chan_bss_on_diff_chan(dev, apdev):
  361. """P2P channel selection: Station on different channel than GO configured pref channel"""
  362. dev[0].request("SET p2p_no_group_iface 0")
  363. try:
  364. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'bss-2.4ghz',
  365. "channel": '1' })
  366. dev[0].request("SET p2p_pref_chan 81:2")
  367. dev[0].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412")
  368. res = autogo(dev[0])
  369. if res['freq'] != "2412":
  370. raise Exception("GO channel did not follow BSS")
  371. hwsim_utils.test_connectivity(dev[0], hapd)
  372. finally:
  373. dev[0].request("SET p2p_pref_chan ")
  374. def test_go_pref_chan_bss_on_disallowed_chan(dev, apdev):
  375. """P2P channel selection: Station interface on different channel than GO configured pref channel, and station channel is disallowed"""
  376. with HWSimRadio(n_channels=2) as (radio, iface):
  377. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  378. wpas.interface_add(iface)
  379. if wpas.get_mcc() < 2:
  380. raise Exception("New radio does not support MCC")
  381. wpas.request("SET p2p_no_group_iface 0")
  382. try:
  383. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'bss-2.4ghz',
  384. "channel": '1' })
  385. wpas.request("P2P_SET disallow_freq 2412")
  386. wpas.request("SET p2p_pref_chan 81:2")
  387. wpas.connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2412")
  388. res2 = autogo(wpas)
  389. if res2['freq'] != "2417":
  390. raise Exception("GO channel did not follow pref_chan configuration")
  391. hwsim_utils.test_connectivity(wpas, hapd)
  392. finally:
  393. wpas.request("P2P_SET disallow_freq ")
  394. wpas.request("SET p2p_pref_chan ")
  395. def test_no_go_freq(dev, apdev):
  396. """P2P channel selection: no GO freq"""
  397. try:
  398. dev[0].request("SET p2p_no_go_freq 2412")
  399. # dev[0] as client, channel 1 is ok
  400. [i_res, r_res] = go_neg_pbc(i_dev=dev[0], i_intent=1,
  401. r_dev=dev[1], r_intent=14, r_freq=2412)
  402. check_grpform_results(i_res, r_res)
  403. if i_res['freq'] != "2412":
  404. raise Exception("P2P group not formed on forced freq")
  405. dev[1].remove_group(r_res['ifname'])
  406. dev[0].wait_go_ending_session()
  407. dev[0].flush_scan_cache()
  408. fail = False
  409. # dev[0] as GO, channel 1 is not allowed
  410. try:
  411. dev[0].request("SET p2p_no_go_freq 2412")
  412. [i_res2, r_res2] = go_neg_pbc(i_dev=dev[0], i_intent=14,
  413. r_dev=dev[1], r_intent=1, r_freq=2412)
  414. check_grpform_results(i_res2, r_res2)
  415. fail = True
  416. except:
  417. pass
  418. if fail:
  419. raise Exception("GO set on a disallowed freq")
  420. finally:
  421. dev[0].request("SET p2p_no_go_freq ")
  422. def test_go_neg_peers_force_diff_freq(dev, apdev):
  423. """P2P channel selection when peers for different frequency"""
  424. try:
  425. [i_res2, r_res2] = go_neg_pbc(i_dev=dev[0], i_intent=14, i_freq=5180,
  426. r_dev=dev[1], r_intent=0, r_freq=5200)
  427. except Exception, e:
  428. return
  429. raise Exception("Unexpected group formation success")
  430. def test_autogo_random_channel(dev, apdev):
  431. """P2P channel selection: GO instantiated on random channel 1, 6, 11"""
  432. freqs = []
  433. go_freqs = ["2412", "2437", "2462"]
  434. for i in range(0, 20):
  435. result = autogo(dev[0])
  436. if result['freq'] not in go_freqs:
  437. raise Exception("Unexpected frequency selected: " + result['freq'])
  438. if result['freq'] not in freqs:
  439. freqs.append(result['freq'])
  440. if len(freqs) == 3:
  441. break
  442. dev[0].remove_group(result['ifname'])
  443. if i == 20:
  444. raise Exception("GO created 20 times and not all social channels were selected. freqs not selected: " + str(list(set(go_freqs) - set(freqs))))
  445. def test_p2p_autogo_pref_chan_disallowed(dev, apdev):
  446. """P2P channel selection: GO preferred channels are disallowed"""
  447. try:
  448. dev[0].request("SET p2p_pref_chan 81:1,81:3,81:6,81:9,81:11")
  449. dev[0].request("P2P_SET disallow_freq 2412,2422,2437,2452,2462")
  450. for i in range(0, 5):
  451. res = autogo(dev[0])
  452. if res['freq'] in [ "2412", "2422", "2437", "2452", "2462" ]:
  453. raise Exception("GO channel is disallowed")
  454. dev[0].remove_group(res['ifname'])
  455. finally:
  456. dev[0].request("P2P_SET disallow_freq ")
  457. dev[0].request("SET p2p_pref_chan ")
  458. def test_p2p_autogo_pref_chan_not_in_regulatory(dev, apdev):
  459. """P2P channel selection: GO preferred channel not allowed in the regulatory rules"""
  460. try:
  461. set_country("US", dev[0])
  462. dev[0].request("SET p2p_pref_chan 124:149")
  463. res = autogo(dev[0], persistent=True)
  464. if res['freq'] != "5745":
  465. raise Exception("Unexpected channel selected: " + res['freq'])
  466. dev[0].remove_group(res['ifname'])
  467. netw = dev[0].list_networks(p2p=True)
  468. if len(netw) != 1:
  469. raise Exception("Unexpected number of network blocks: " + str(netw))
  470. id = netw[0]['id']
  471. set_country("DE", dev[0])
  472. res = autogo(dev[0], persistent=id)
  473. if res['freq'] == "5745":
  474. raise Exception("Unexpected channel selected(2): " + res['freq'])
  475. dev[0].remove_group(res['ifname'])
  476. finally:
  477. dev[0].request("SET p2p_pref_chan ")
  478. set_country("00")
  479. def run_autogo(dev, param):
  480. if "OK" not in dev.global_request("P2P_GROUP_ADD " + param):
  481. raise Exception("P2P_GROUP_ADD failed: " + param)
  482. ev = dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  483. if ev is None:
  484. raise Exception("GO start up timed out")
  485. res = dev.group_form_result(ev)
  486. dev.remove_group()
  487. return res
  488. def _test_autogo_ht_vht(dev):
  489. res = run_autogo(dev[0], "ht40")
  490. res = run_autogo(dev[0], "vht")
  491. res = run_autogo(dev[0], "freq=2")
  492. freq = int(res['freq'])
  493. if freq < 2412 or freq > 2462:
  494. raise Exception("Unexpected freq=2 channel: " + str(freq))
  495. res = run_autogo(dev[0], "freq=5")
  496. freq = int(res['freq'])
  497. if freq < 5000 or freq >= 6000:
  498. raise Exception("Unexpected freq=5 channel: " + str(freq))
  499. res = run_autogo(dev[0], "freq=5 ht40 vht")
  500. logger.info(str(res))
  501. freq = int(res['freq'])
  502. if freq < 5000 or freq >= 6000:
  503. raise Exception("Unexpected freq=5 ht40 vht channel: " + str(freq))
  504. def test_autogo_ht_vht(dev):
  505. """P2P autonomous GO with HT/VHT parameters"""
  506. try:
  507. set_country("US", dev[0])
  508. _test_autogo_ht_vht(dev)
  509. finally:
  510. set_country("00")
  511. def test_p2p_listen_chan_optimize(dev, apdev):
  512. """P2P listen channel optimization"""
  513. wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
  514. wpas.interface_add("wlan5")
  515. addr5 = wpas.p2p_dev_addr()
  516. try:
  517. if "OK" not in wpas.request("SET p2p_optimize_listen_chan 1"):
  518. raise Exception("Failed to set p2p_optimize_listen_chan")
  519. wpas.p2p_listen()
  520. if not dev[0].discover_peer(addr5):
  521. raise Exception("Could not discover peer")
  522. peer = dev[0].get_peer(addr5)
  523. lfreq = peer['listen_freq']
  524. wpas.p2p_stop_find()
  525. dev[0].p2p_stop_find()
  526. channel = "1" if lfreq != '2412' else "6"
  527. freq = "2412" if lfreq != '2412' else "2437"
  528. params = { "ssid": "test-open", "channel": channel }
  529. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  530. id = wpas.connect("test-open", key_mgmt="NONE", scan_freq=freq)
  531. wpas.p2p_listen()
  532. if "OK" not in dev[0].request("P2P_FLUSH"):
  533. raise Exception("P2P_FLUSH failed")
  534. if not dev[0].discover_peer(addr5):
  535. raise Exception("Could not discover peer")
  536. peer = dev[0].get_peer(addr5)
  537. lfreq2 = peer['listen_freq']
  538. if lfreq == lfreq2:
  539. raise Exception("Listen channel did not change")
  540. if lfreq2 != freq:
  541. raise Exception("Listen channel not on AP's operating channel")
  542. wpas.p2p_stop_find()
  543. dev[0].p2p_stop_find()
  544. wpas.request("DISCONNECT")
  545. wpas.wait_disconnected()
  546. # for larger coverage, cover case of current channel matching
  547. wpas.select_network(id)
  548. wpas.wait_connected()
  549. wpas.request("DISCONNECT")
  550. wpas.wait_disconnected()
  551. lchannel = "1" if channel != "1" else "6"
  552. lfreq3 = "2412" if channel != "1" else "2437"
  553. if "OK" not in wpas.request("P2P_SET listen_channel " + lchannel):
  554. raise Exception("Failed to set listen channel")
  555. wpas.select_network(id)
  556. wpas.wait_connected()
  557. wpas.p2p_listen()
  558. if "OK" not in dev[0].request("P2P_FLUSH"):
  559. raise Exception("P2P_FLUSH failed")
  560. if not dev[0].discover_peer(addr5):
  561. raise Exception("Could not discover peer")
  562. peer = dev[0].get_peer(addr5)
  563. lfreq4 = peer['listen_freq']
  564. if lfreq4 != lfreq3:
  565. raise Exception("Unexpected Listen channel after configuration")
  566. wpas.p2p_stop_find()
  567. dev[0].p2p_stop_find()
  568. finally:
  569. wpas.request("SET p2p_optimize_listen_chan 0")
  570. def test_p2p_channel_5ghz_only(dev):
  571. """P2P GO start with only 5 GHz band allowed"""
  572. try:
  573. set_country("US", dev[0])
  574. dev[0].request("P2P_SET disallow_freq 2400-2500")
  575. res = autogo(dev[0])
  576. freq = int(res['freq'])
  577. if freq < 5000:
  578. raise Exception("Unexpected channel %d MHz" % freq)
  579. dev[0].remove_group()
  580. finally:
  581. set_country("00")
  582. dev[0].request("P2P_SET disallow_freq ")
  583. def test_p2p_channel_5ghz_165_169_us(dev):
  584. """P2P GO and 5 GHz channels 165 (allowed) and 169 (disallowed) in US"""
  585. try:
  586. set_country("US", dev[0])
  587. res = dev[0].p2p_start_go(freq=5825)
  588. if res['freq'] != "5825":
  589. raise Exception("Unexpected frequency: " + res['freq'])
  590. dev[0].remove_group()
  591. res = dev[0].global_request("P2P_GROUP_ADD freq=5845")
  592. if "FAIL" not in res:
  593. raise Exception("GO on channel 169 allowed unexpectedly")
  594. finally:
  595. set_country("00")
  596. def test_p2p_go_move_reg_change(dev, apdev, params):
  597. """P2P GO move due to regulatory change [long]"""
  598. if not params['long']:
  599. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  600. try:
  601. set_country("US")
  602. dev[0].global_request("P2P_SET disallow_freq 2400-5000")
  603. res = autogo(dev[0])
  604. freq1 = int(res['freq'])
  605. if freq1 < 5000:
  606. raise Exception("Unexpected channel %d MHz" % freq1)
  607. dev[0].global_request("P2P_SET disallow_freq ")
  608. # GO move is not allowed while waiting for initial client connection
  609. time.sleep(20)
  610. set_country("00")
  611. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"],
  612. timeout=10)
  613. if ev is None:
  614. raise Exception("P2P-REMOVE-AND-REFORM-GROUP not seen")
  615. freq2 = dev[0].get_group_status_field('freq')
  616. if freq1 == freq2:
  617. raise Exception("Unexpected freq after group reform=" + freq2)
  618. dev[0].remove_group()
  619. finally:
  620. dev[0].global_request("P2P_SET disallow_freq ")
  621. set_country("00")
  622. def test_p2p_go_move_active(dev, apdev, params):
  623. """P2P GO stays in freq although SCM is possible [long]"""
  624. if dev[0].get_mcc() <= 1:
  625. raise HwsimSkip("Skip due to MCC not being enabled")
  626. if not params['long']:
  627. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  628. dev[0].request("SET p2p_no_group_iface 0")
  629. try:
  630. dev[0].global_request("P2P_SET disallow_freq 2430-6000")
  631. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test',
  632. "channel" : '11' })
  633. dev[0].connect("ap-test", key_mgmt="NONE",
  634. scan_freq="2462")
  635. res = autogo(dev[0])
  636. freq = int(res['freq'])
  637. if freq > 2430:
  638. raise Exception("Unexpected channel %d MHz" % freq)
  639. # GO move is not allowed while waiting for initial client connection
  640. time.sleep(20)
  641. dev[0].global_request("P2P_SET disallow_freq ")
  642. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"],
  643. timeout=10)
  644. if ev is not None:
  645. raise Exception("Unexpected P2P-REMOVE-AND-REFORM-GROUP seen")
  646. dev[0].remove_group()
  647. finally:
  648. dev[0].global_request("P2P_SET disallow_freq ")
  649. def test_p2p_go_move_scm(dev, apdev, params):
  650. """P2P GO move due to SCM operation preference [long]"""
  651. if dev[0].get_mcc() <= 1:
  652. raise HwsimSkip("Skip due to MCC not being enabled")
  653. if not params['long']:
  654. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  655. dev[0].request("SET p2p_no_group_iface 0")
  656. try:
  657. dev[0].global_request("P2P_SET disallow_freq 2430-6000")
  658. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test',
  659. "channel" : '11' })
  660. dev[0].connect("ap-test", key_mgmt="NONE",
  661. scan_freq="2462")
  662. dev[0].global_request("SET p2p_go_freq_change_policy 0")
  663. res = autogo(dev[0])
  664. freq = int(res['freq'])
  665. if freq > 2430:
  666. raise Exception("Unexpected channel %d MHz" % freq)
  667. # GO move is not allowed while waiting for initial client connection
  668. time.sleep(20)
  669. dev[0].global_request("P2P_SET disallow_freq ")
  670. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=3)
  671. if ev is None:
  672. raise Exception("P2P-REMOVE-AND-REFORM-GROUP not seen")
  673. freq = dev[0].get_group_status_field('freq')
  674. if freq != '2462':
  675. raise Exception("Unexpected freq after group reform=" + freq)
  676. dev[0].remove_group()
  677. finally:
  678. dev[0].global_request("P2P_SET disallow_freq ")
  679. dev[0].global_request("SET p2p_go_freq_change_policy 2")
  680. def test_p2p_go_move_scm_peer_supports(dev, apdev, params):
  681. """P2P GO move due to SCM operation preference (peer supports) [long]"""
  682. if dev[0].get_mcc() <= 1:
  683. raise HwsimSkip("Skip due to MCC not being enabled")
  684. if not params['long']:
  685. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  686. try:
  687. dev[0].global_request("SET p2p_go_freq_change_policy 1")
  688. set_country("US", dev[0])
  689. dev[0].request("SET p2p_no_group_iface 0")
  690. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  691. r_dev=dev[1], r_intent=0,
  692. test_data=False)
  693. check_grpform_results(i_res, r_res)
  694. freq = int(i_res['freq'])
  695. if freq < 5000:
  696. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  697. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test',
  698. "channel" : '11' })
  699. logger.info('Connecting client to to an AP on channel 11');
  700. dev[0].connect("ap-test", key_mgmt="NONE",
  701. scan_freq="2462")
  702. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=3)
  703. if ev is None:
  704. raise Exception("P2P-REMOVE-AND-REFORM-GROUP not seen")
  705. freq = dev[0].get_group_status_field('freq')
  706. if freq != '2462':
  707. raise Exception("Unexpected freq after group reform=" + freq)
  708. dev[0].remove_group()
  709. finally:
  710. dev[0].global_request("SET p2p_go_freq_change_policy 2")
  711. set_country("00")
  712. def test_p2p_go_move_scm_peer_does_not_support(dev, apdev, params):
  713. """No P2P GO move due to SCM operation (peer does not supports) [long]"""
  714. if dev[0].get_mcc() <= 1:
  715. raise HwsimSkip("Skip due to MCC not being enabled")
  716. if not params['long']:
  717. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  718. try:
  719. dev[0].global_request("SET p2p_go_freq_change_policy 1")
  720. set_country("US", dev[0])
  721. dev[0].request("SET p2p_no_group_iface 0")
  722. if "OK" not in dev[1].request("DRIVER_EVENT AVOID_FREQUENCIES 2400-2500"):
  723. raise Exception("Could not simulate driver event")
  724. [i_res, r_res] = go_neg_pin_authorized(i_dev=dev[0], i_intent=15,
  725. r_dev=dev[1], r_intent=0,
  726. test_data=False)
  727. check_grpform_results(i_res, r_res)
  728. freq = int(i_res['freq'])
  729. if freq < 5000:
  730. raise Exception("Unexpected channel %d MHz - did not follow 5 GHz preference" % freq)
  731. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test',
  732. "channel" : '11' })
  733. logger.info('Connecting client to to an AP on channel 11');
  734. dev[0].connect("ap-test", key_mgmt="NONE",
  735. scan_freq="2462")
  736. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"],
  737. timeout=10)
  738. if ev is not None:
  739. raise Exception("Unexpected P2P-REMOVE-AND-REFORM-GROUP seen")
  740. dev[0].remove_group()
  741. finally:
  742. dev[0].global_request("SET p2p_go_freq_change_policy 2")
  743. set_country("00")
  744. def test_p2p_go_move_scm_multi(dev, apdev, params):
  745. """P2P GO move due to SCM operation preference multiple times [long]"""
  746. if dev[0].get_mcc() <= 1:
  747. raise HwsimSkip("Skip due to MCC not being enabled")
  748. if not params['long']:
  749. raise HwsimSkip("Skip test case with long duration due to --long not specified")
  750. dev[0].request("SET p2p_no_group_iface 0")
  751. try:
  752. dev[0].global_request("P2P_SET disallow_freq 2430-6000")
  753. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test-1',
  754. "channel" : '11' })
  755. dev[0].connect("ap-test-1", key_mgmt="NONE",
  756. scan_freq="2462")
  757. dev[0].global_request("SET p2p_go_freq_change_policy 0")
  758. res = autogo(dev[0])
  759. freq = int(res['freq'])
  760. if freq > 2430:
  761. raise Exception("Unexpected channel %d MHz" % freq)
  762. # GO move is not allowed while waiting for initial client connection
  763. time.sleep(20)
  764. dev[0].global_request("P2P_SET disallow_freq ")
  765. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=3)
  766. if ev is None:
  767. raise Exception("P2P-REMOVE-AND-REFORM-GROUP not seen")
  768. freq = dev[0].get_group_status_field('freq')
  769. if freq != '2462':
  770. raise Exception("Unexpected freq after group reform=" + freq)
  771. hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid" : 'ap-test-2',
  772. "channel" : '6' })
  773. dev[0].connect("ap-test-2", key_mgmt="NONE",
  774. scan_freq="2437")
  775. ev = dev[0].wait_group_event(["P2P-REMOVE-AND-REFORM-GROUP"], timeout=5)
  776. if ev is None:
  777. raise Exception("(2) P2P-REMOVE-AND-REFORM-GROUP not seen")
  778. freq = dev[0].get_group_status_field('freq')
  779. if freq != '2437':
  780. raise Exception("(2) Unexpected freq after group reform=" + freq)
  781. dev[0].remove_group()
  782. finally:
  783. dev[0].global_request("P2P_SET disallow_freq ")
  784. dev[0].global_request("SET p2p_go_freq_change_policy 2")