test_p2p_messages.py 70 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723
  1. # P2P protocol tests for various messages
  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 binascii
  7. import struct
  8. import time
  9. import logging
  10. logger = logging.getLogger()
  11. import hostapd
  12. from test_p2p_persistent import form
  13. from test_p2p_persistent import invite
  14. MGMT_SUBTYPE_PROBE_REQ = 4
  15. MGMT_SUBTYPE_ACTION = 13
  16. ACTION_CATEG_PUBLIC = 4
  17. P2P_GO_NEG_REQ = 0
  18. P2P_GO_NEG_RESP = 1
  19. P2P_GO_NEG_CONF = 2
  20. P2P_INVITATION_REQ = 3
  21. P2P_INVITATION_RESP = 4
  22. P2P_DEV_DISC_REQ = 5
  23. P2P_DEV_DISC_RESP = 6
  24. P2P_PROV_DISC_REQ = 7
  25. P2P_PROV_DISC_RESP = 8
  26. P2P_ATTR_STATUS = 0
  27. P2P_ATTR_MINOR_REASON_CODE = 1
  28. P2P_ATTR_CAPABILITY = 2
  29. P2P_ATTR_DEVICE_ID = 3
  30. P2P_ATTR_GROUP_OWNER_INTENT = 4
  31. P2P_ATTR_CONFIGURATION_TIMEOUT = 5
  32. P2P_ATTR_LISTEN_CHANNEL = 6
  33. P2P_ATTR_GROUP_BSSID = 7
  34. P2P_ATTR_EXT_LISTEN_TIMING = 8
  35. P2P_ATTR_INTENDED_INTERFACE_ADDR = 9
  36. P2P_ATTR_MANAGEABILITY = 10
  37. P2P_ATTR_CHANNEL_LIST = 11
  38. P2P_ATTR_NOTICE_OF_ABSENCE = 12
  39. P2P_ATTR_DEVICE_INFO = 13
  40. P2P_ATTR_GROUP_INFO = 14
  41. P2P_ATTR_GROUP_ID = 15
  42. P2P_ATTR_INTERFACE = 16
  43. P2P_ATTR_OPERATING_CHANNEL = 17
  44. P2P_ATTR_INVITATION_FLAGS = 18
  45. P2P_ATTR_OOB_GO_NEG_CHANNEL = 19
  46. P2P_ATTR_VENDOR_SPECIFIC = 221
  47. P2P_SC_SUCCESS = 0
  48. P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE = 1
  49. P2P_SC_FAIL_INCOMPATIBLE_PARAMS = 2
  50. P2P_SC_FAIL_LIMIT_REACHED = 3
  51. P2P_SC_FAIL_INVALID_PARAMS = 4
  52. P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE = 5
  53. P2P_SC_FAIL_PREV_PROTOCOL_ERROR = 6
  54. P2P_SC_FAIL_NO_COMMON_CHANNELS = 7
  55. P2P_SC_FAIL_UNKNOWN_GROUP = 8
  56. P2P_SC_FAIL_BOTH_GO_INTENT_15 = 9
  57. P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10
  58. P2P_SC_FAIL_REJECTED_BY_USER = 11
  59. WSC_ATTR_CONFIG_METHODS = 0x1008
  60. WLAN_EID_SSID = 0
  61. WLAN_EID_SUPP_RATES = 1
  62. WLAN_EID_VENDOR_SPECIFIC = 221
  63. def ie_ssid(ssid):
  64. return struct.pack("<BB", WLAN_EID_SSID, len(ssid)) + ssid
  65. def ie_supp_rates():
  66. return struct.pack("<BBBBBBBBBB", WLAN_EID_SUPP_RATES, 8,
  67. 2*6, 2*9, 2*12, 2*18, 2*24, 2*36, 2*48, 2*54)
  68. def ie_p2p(attrs):
  69. return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
  70. 0x50, 0x6f, 0x9a, 9) + attrs
  71. def ie_wsc(attrs):
  72. return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
  73. 0x00, 0x50, 0xf2, 4) + attrs
  74. def wsc_attr_config_methods(methods=0):
  75. return struct.pack(">HHH", WSC_ATTR_CONFIG_METHODS, 2, methods)
  76. def p2p_attr_status(status=P2P_SC_SUCCESS):
  77. return struct.pack("<BHB", P2P_ATTR_STATUS, 1, status)
  78. def p2p_attr_minor_reason_code(code=0):
  79. return struct.pack("<BHB", P2P_ATTR_MINOR_REASON_CODE, 1, code)
  80. def p2p_attr_capability(dev_capab=0, group_capab=0):
  81. return struct.pack("<BHBB", P2P_ATTR_CAPABILITY, 2, dev_capab, group_capab)
  82. def p2p_attr_device_id(addr):
  83. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  84. t = (P2P_ATTR_DEVICE_ID, 6) + val
  85. return struct.pack('<BH6B', *t)
  86. def p2p_attr_go_intent(go_intent=0, tie_breaker=0):
  87. return struct.pack("<BHB", P2P_ATTR_GROUP_OWNER_INTENT, 1,
  88. (go_intent << 1) | (tie_breaker & 0x01))
  89. def p2p_attr_config_timeout(go_config_timeout=0, client_config_timeout=0):
  90. return struct.pack("<BHBB", P2P_ATTR_CONFIGURATION_TIMEOUT, 2,
  91. go_config_timeout, client_config_timeout)
  92. def p2p_attr_listen_channel(op_class=81, chan=1):
  93. return struct.pack("<BHBBBBB", P2P_ATTR_LISTEN_CHANNEL, 5,
  94. 0x58, 0x58, 0x04, op_class, chan)
  95. def p2p_attr_group_bssid(addr):
  96. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  97. t = (P2P_ATTR_GROUP_BSSID, 6) + val
  98. return struct.pack('<BH6B', *t)
  99. def p2p_attr_ext_listen_timing(period=0, interval=0):
  100. return struct.pack("<BHHH", P2P_ATTR_EXT_LISTEN_TIMING, 4, period, interval)
  101. def p2p_attr_intended_interface_addr(addr):
  102. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  103. t = (P2P_ATTR_INTENDED_INTERFACE_ADDR, 6) + val
  104. return struct.pack('<BH6B', *t)
  105. def p2p_attr_manageability(bitmap=0):
  106. return struct.pack("<BHB", P2P_ATTR_MANAGEABILITY, 1, bitmap)
  107. def p2p_attr_channel_list():
  108. return struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
  109. 0x58, 0x58, 0x04,
  110. 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
  111. def p2p_attr_device_info(addr, name="Test", config_methods=0, dev_type="00010050F2040001"):
  112. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  113. val2 = struct.unpack('8B', binascii.unhexlify(dev_type))
  114. t = (P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 4 + len(name)) + val + (config_methods,) + val2 + (0,)
  115. return struct.pack("<BH6BH8BB", *t) + struct.pack('>HH', 0x1011, len(name)) +name
  116. def p2p_attr_group_id(addr, ssid):
  117. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  118. t = (P2P_ATTR_GROUP_ID, 6 + len(ssid)) + val
  119. return struct.pack('<BH6B', *t) + ssid
  120. def p2p_attr_operating_channel(op_class=81, chan=1):
  121. return struct.pack("<BHBBBBB", P2P_ATTR_OPERATING_CHANNEL, 5,
  122. 0x58, 0x58, 0x04, op_class, chan)
  123. def p2p_attr_invitation_flags(bitmap=0):
  124. return struct.pack("<BHB", P2P_ATTR_INVITATION_FLAGS, 1, bitmap)
  125. def p2p_hdr_helper(dst, src, type=None, dialog_token=1, req=True):
  126. msg = {}
  127. msg['fc'] = MGMT_SUBTYPE_ACTION << 4
  128. msg['da'] = dst
  129. msg['sa'] = src
  130. if req:
  131. msg['bssid'] = dst
  132. else:
  133. msg['bssid'] = src
  134. msg['payload'] = struct.pack("<BBBBBB",
  135. ACTION_CATEG_PUBLIC, 9, 0x50, 0x6f, 0x9a, 9)
  136. if type is not None:
  137. msg['payload'] += struct.pack("<B", type)
  138. if dialog_token:
  139. msg['payload'] += struct.pack("<B", dialog_token)
  140. return msg
  141. def p2p_hdr(dst, src, type=None, dialog_token=1):
  142. return p2p_hdr_helper(dst, src, type, dialog_token, True)
  143. def p2p_hdr_resp(dst, src, type=None, dialog_token=1):
  144. return p2p_hdr_helper(dst, src, type, dialog_token, False)
  145. def start_p2p(dev, apdev):
  146. addr0 = dev[0].p2p_dev_addr()
  147. dev[0].p2p_listen()
  148. dev[1].p2p_find(social=True)
  149. ev = dev[1].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  150. if ev is None:
  151. raise Exception("Device discovery timed out")
  152. dev[1].p2p_stop_find()
  153. peer = dev[1].get_peer(addr0)
  154. bssid = apdev[0]['bssid']
  155. params = { 'ssid': "test", 'beacon_int': "2000" }
  156. if peer['listen_freq'] == "2412":
  157. params['channel'] = '1'
  158. elif peer['listen_freq'] == "2437":
  159. params['channel'] = '6'
  160. elif peer['listen_freq'] == "2462":
  161. params['channel'] = '11'
  162. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  163. hapd.set("ext_mgmt_frame_handling", "1")
  164. return addr0, bssid, hapd, int(params['channel'])
  165. def p2p_probe(hapd, src, chan=1):
  166. msg = {}
  167. msg['fc'] = MGMT_SUBTYPE_PROBE_REQ << 4
  168. msg['da'] = "ff:ff:ff:ff:ff:ff"
  169. msg['sa'] = src
  170. msg['bssid'] = "ff:ff:ff:ff:ff:ff"
  171. attrs = p2p_attr_listen_channel(chan=chan)
  172. msg['payload'] = ie_ssid("DIRECT-") + ie_supp_rates() + ie_p2p(attrs)
  173. hapd.mgmt_tx(msg)
  174. def parse_p2p_public_action(payload):
  175. pos = payload
  176. (category, action) = struct.unpack('BB', pos[0:2])
  177. if category != ACTION_CATEG_PUBLIC:
  178. return None
  179. if action != 9:
  180. return None
  181. pos = pos[2:]
  182. (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
  183. if oui1 != 0x50 or oui2 != 0x6f or oui3 != 0x9a or subtype != 9:
  184. return None
  185. pos = pos[4:]
  186. (subtype,dialog_token) = struct.unpack('BB', pos[0:2])
  187. p2p = {}
  188. p2p['subtype'] = subtype
  189. p2p['dialog_token'] = dialog_token
  190. pos = pos[2:]
  191. p2p['elements'] = pos
  192. while len(pos) > 2:
  193. (id,elen) = struct.unpack('BB', pos[0:2])
  194. pos = pos[2:]
  195. if elen > len(pos):
  196. raise Exception("Truncated IE in P2P Public Action frame (elen=%d left=%d)" % (elen, len(pos)))
  197. if id == WLAN_EID_VENDOR_SPECIFIC:
  198. if elen < 4:
  199. raise Exception("Too short vendor specific IE in P2P Public Action frame (elen=%d)" % elen)
  200. (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
  201. if oui1 == 0x50 and oui2 == 0x6f and oui3 == 0x9a and subtype == 9:
  202. if 'p2p' in p2p:
  203. p2p['p2p'] += pos[4:elen]
  204. else:
  205. p2p['p2p'] = pos[4:elen]
  206. if oui1 == 0x00 and oui2 == 0x50 and oui3 == 0xf2 and subtype == 4:
  207. p2p['wsc'] = pos[4:elen]
  208. pos = pos[elen:]
  209. if len(pos) > 0:
  210. raise Exception("Invalid element in P2P Public Action frame")
  211. if 'p2p' in p2p:
  212. p2p['p2p_attrs'] = {}
  213. pos = p2p['p2p']
  214. while len(pos) >= 3:
  215. (id,alen) = struct.unpack('<BH', pos[0:3])
  216. pos = pos[3:]
  217. if alen > len(pos):
  218. logger.info("P2P payload: " + binascii.hexlify(p2p['p2p']))
  219. raise Exception("Truncated P2P attribute in P2P Public Action frame (alen=%d left=%d p2p-payload=%d)" % (alen, len(pos), len(p2p['p2p'])))
  220. p2p['p2p_attrs'][id] = pos[0:alen]
  221. pos = pos[alen:]
  222. if P2P_ATTR_STATUS in p2p['p2p_attrs']:
  223. p2p['p2p_status'] = struct.unpack('B', p2p['p2p_attrs'][P2P_ATTR_STATUS])[0]
  224. if 'wsc' in p2p:
  225. p2p['wsc_attrs'] = {}
  226. pos = p2p['wsc']
  227. while len(pos) >= 4:
  228. (id,alen) = struct.unpack('>HH', pos[0:4])
  229. pos = pos[4:]
  230. if alen > len(pos):
  231. logger.info("WSC payload: " + binascii.hexlify(p2p['wsc']))
  232. raise Exception("Truncated WSC attribute in P2P Public Action frame (alen=%d left=%d wsc-payload=%d)" % (alen, len(pos), len(p2p['wsc'])))
  233. p2p['wsc_attrs'][id] = pos[0:alen]
  234. pos = pos[alen:]
  235. return p2p
  236. def test_p2p_msg_empty(dev, apdev):
  237. """P2P protocol test: empty P2P Public Action frame"""
  238. dst, src, hapd, channel = start_p2p(dev, apdev)
  239. msg = p2p_hdr(dst, src)
  240. hapd.mgmt_tx(msg)
  241. def test_p2p_msg_invitation_req(dev, apdev):
  242. """P2P protocol tests for invitation request processing"""
  243. dst, src, hapd, channel = start_p2p(dev, apdev)
  244. # Empty P2P Invitation Request (missing dialog token)
  245. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=None)
  246. hapd.mgmt_tx(msg)
  247. dialog_token = 0
  248. # Various p2p_parse() failure cases due to invalid attributes
  249. # Too short attribute header
  250. dialog_token += 1
  251. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  252. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  253. msg['payload'] += ie_p2p(attrs)
  254. hapd.mgmt_tx(msg)
  255. # Minimal attribute underflow
  256. dialog_token += 1
  257. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  258. attrs = struct.pack("<BH", P2P_ATTR_CAPABILITY, 1)
  259. msg['payload'] += ie_p2p(attrs)
  260. hapd.mgmt_tx(msg)
  261. # Large attribute underflow
  262. dialog_token += 1
  263. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  264. attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 0xffff, 1)
  265. msg['payload'] += ie_p2p(attrs)
  266. hapd.mgmt_tx(msg)
  267. # Too short Capability attribute
  268. dialog_token += 1
  269. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  270. attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 1, 0)
  271. msg['payload'] += ie_p2p(attrs)
  272. hapd.mgmt_tx(msg)
  273. # Too short Device ID attribute
  274. dialog_token += 1
  275. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  276. val = struct.unpack('5B', binascii.unhexlify("1122334455"))
  277. t = (P2P_ATTR_DEVICE_ID, 5) + val
  278. attrs = struct.pack('<BH5B', *t)
  279. msg['payload'] += ie_p2p(attrs)
  280. hapd.mgmt_tx(msg)
  281. # Too short GO Intent attribute
  282. dialog_token += 1
  283. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  284. attrs = struct.pack("<BH", P2P_ATTR_GROUP_OWNER_INTENT, 0)
  285. msg['payload'] += ie_p2p(attrs)
  286. hapd.mgmt_tx(msg)
  287. # Too short Status attribute
  288. dialog_token += 1
  289. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  290. attrs = struct.pack("<BH", P2P_ATTR_STATUS, 0)
  291. msg['payload'] += ie_p2p(attrs)
  292. hapd.mgmt_tx(msg)
  293. # null Listen channel and too short Listen Channel attribute
  294. dialog_token += 1
  295. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  296. attrs = struct.pack("<BH", P2P_ATTR_LISTEN_CHANNEL, 0)
  297. attrs += struct.pack("<BHB", P2P_ATTR_LISTEN_CHANNEL, 1, 0)
  298. msg['payload'] += ie_p2p(attrs)
  299. hapd.mgmt_tx(msg)
  300. # null Operating channel and too short Operating Channel attribute
  301. dialog_token += 1
  302. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  303. attrs = struct.pack("<BH", P2P_ATTR_OPERATING_CHANNEL, 0)
  304. attrs += struct.pack("<BHB", P2P_ATTR_OPERATING_CHANNEL, 1, 0)
  305. msg['payload'] += ie_p2p(attrs)
  306. hapd.mgmt_tx(msg)
  307. # Too short Channel List attribute
  308. dialog_token += 1
  309. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  310. attrs = struct.pack("<BHBB", P2P_ATTR_CHANNEL_LIST, 2, 1, 2)
  311. msg['payload'] += ie_p2p(attrs)
  312. hapd.mgmt_tx(msg)
  313. # Too short Device Info attribute
  314. dialog_token += 1
  315. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  316. attrs = struct.pack("<BHBB", P2P_ATTR_DEVICE_INFO, 2, 1, 2)
  317. msg['payload'] += ie_p2p(attrs)
  318. hapd.mgmt_tx(msg)
  319. # Truncated Secondary Device Types in Device Info attribute
  320. dialog_token += 1
  321. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  322. attrs = struct.pack("<BH6BH8BB", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1,
  323. 0, 0, 0, 0, 0, 0,
  324. 0,
  325. 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22,
  326. 255)
  327. msg['payload'] += ie_p2p(attrs)
  328. hapd.mgmt_tx(msg)
  329. # Missing Device Name in Device Info attribute
  330. dialog_token += 1
  331. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  332. attrs = struct.pack("<BH6BH8BB8B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8,
  333. 0, 0, 0, 0, 0, 0,
  334. 0,
  335. 0, 0, 0, 0, 0, 0, 0, 0,
  336. 1,
  337. 1, 2, 3, 4, 5, 6, 7, 8)
  338. msg['payload'] += ie_p2p(attrs)
  339. hapd.mgmt_tx(msg)
  340. # Invalid Device Name header in Device Info attribute
  341. dialog_token += 1
  342. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  343. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
  344. 0, 0, 0, 0, 0, 0,
  345. 0,
  346. 0, 0, 0, 0, 0, 0, 0, 0,
  347. 1,
  348. 1, 2, 3, 4, 5, 6, 7, 8,
  349. 0x11, 0x12, 0, 0)
  350. msg['payload'] += ie_p2p(attrs)
  351. hapd.mgmt_tx(msg)
  352. # Invalid Device Name header length in Device Info attribute
  353. dialog_token += 1
  354. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  355. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
  356. 0, 0, 0, 0, 0, 0,
  357. 0,
  358. 0, 0, 0, 0, 0, 0, 0, 0,
  359. 1,
  360. 1, 2, 3, 4, 5, 6, 7, 8,
  361. 0x10, 0x11, 0xff, 0xff)
  362. msg['payload'] += ie_p2p(attrs)
  363. hapd.mgmt_tx(msg)
  364. # Invalid Device Name header length in Device Info attribute
  365. dialog_token += 1
  366. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  367. devname = 'A'
  368. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
  369. 0, 0, 0, 0, 0, 0,
  370. 0,
  371. 0, 0, 0, 0, 0, 0, 0, 0,
  372. 1,
  373. 1, 2, 3, 4, 5, 6, 7, 8,
  374. 0x10, 0x11, 0, len(devname) + 1) + devname
  375. msg['payload'] += ie_p2p(attrs)
  376. hapd.mgmt_tx(msg)
  377. # Device Name filtering and too long Device Name in Device Info attribute
  378. dialog_token += 1
  379. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  380. attrs = struct.pack("<BH6BH8BB8B4B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + 4,
  381. 0, 0, 0, 0, 0, 0,
  382. 0,
  383. 0, 0, 0, 0, 0, 0, 0, 0,
  384. 1,
  385. 1, 2, 3, 4, 5, 6, 7, 8,
  386. 0x10, 0x11, 0, 4,
  387. 64, 9, 0, 64)
  388. devname = '123456789012345678901234567890123'
  389. attrs += struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
  390. 0, 0, 0, 0, 0, 0,
  391. 0,
  392. 0, 0, 0, 0, 0, 0, 0, 0,
  393. 1,
  394. 1, 2, 3, 4, 5, 6, 7, 8,
  395. 0x10, 0x11, 0, len(devname)) + devname
  396. msg['payload'] += ie_p2p(attrs)
  397. hapd.mgmt_tx(msg)
  398. # Too short Configuration Timeout attribute
  399. dialog_token += 1
  400. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  401. attrs = struct.pack("<BHB", P2P_ATTR_CONFIGURATION_TIMEOUT, 1, 1)
  402. msg['payload'] += ie_p2p(attrs)
  403. hapd.mgmt_tx(msg)
  404. # Too short Intended P2P Interface Address attribute
  405. dialog_token += 1
  406. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  407. attrs = struct.pack("<BHB", P2P_ATTR_INTENDED_INTERFACE_ADDR, 1, 1)
  408. msg['payload'] += ie_p2p(attrs)
  409. hapd.mgmt_tx(msg)
  410. # Too short P2P Group BSSID attribute
  411. dialog_token += 1
  412. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  413. attrs = struct.pack("<BHB", P2P_ATTR_GROUP_BSSID, 1, 1)
  414. msg['payload'] += ie_p2p(attrs)
  415. hapd.mgmt_tx(msg)
  416. # Too short P2P Group ID attribute
  417. dialog_token += 1
  418. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  419. attrs = struct.pack("<BHB", P2P_ATTR_GROUP_ID, 1, 1)
  420. msg['payload'] += ie_p2p(attrs)
  421. hapd.mgmt_tx(msg)
  422. # Too long P2P Group ID attribute
  423. dialog_token += 1
  424. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  425. attrs = struct.pack("<BH6B", P2P_ATTR_GROUP_ID, 6 + 33, 0, 0, 0, 0, 0, 0) + "123456789012345678901234567890123"
  426. msg['payload'] += ie_p2p(attrs)
  427. hapd.mgmt_tx(msg)
  428. # Too short Invitation Flags attribute
  429. dialog_token += 1
  430. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  431. attrs = struct.pack("<BH", P2P_ATTR_INVITATION_FLAGS, 0)
  432. msg['payload'] += ie_p2p(attrs)
  433. hapd.mgmt_tx(msg)
  434. # Valid and too short Manageability attribute
  435. dialog_token += 1
  436. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  437. attrs = p2p_attr_manageability()
  438. attrs += struct.pack("<BH", P2P_ATTR_MANAGEABILITY, 0)
  439. msg['payload'] += ie_p2p(attrs)
  440. hapd.mgmt_tx(msg)
  441. # Too short NoA attribute
  442. dialog_token += 1
  443. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  444. attrs = struct.pack("<BHB", P2P_ATTR_NOTICE_OF_ABSENCE, 1, 1)
  445. msg['payload'] += ie_p2p(attrs)
  446. hapd.mgmt_tx(msg)
  447. # Valid and too short Extended Listen Timing attributes
  448. dialog_token += 1
  449. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  450. attrs = p2p_attr_ext_listen_timing(period=100, interval=50)
  451. attrs += struct.pack("<BHBBB", P2P_ATTR_EXT_LISTEN_TIMING, 3, 0, 0, 0)
  452. msg['payload'] += ie_p2p(attrs)
  453. hapd.mgmt_tx(msg)
  454. # Valid and too short Minor Reason Code attributes
  455. dialog_token += 1
  456. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  457. attrs = p2p_attr_minor_reason_code(code=2)
  458. attrs += struct.pack("<BH", P2P_ATTR_MINOR_REASON_CODE, 0)
  459. msg['payload'] += ie_p2p(attrs)
  460. hapd.mgmt_tx(msg)
  461. # Unknown attribute and too short OOB GO Negotiation Channel attribute
  462. dialog_token += 1
  463. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  464. attrs = struct.pack("<BHB", 99, 1, 1)
  465. attrs += struct.pack("<BHB", P2P_ATTR_OOB_GO_NEG_CHANNEL, 1, 1)
  466. msg['payload'] += ie_p2p(attrs)
  467. hapd.mgmt_tx(msg)
  468. if hapd.mgmt_rx(timeout=0.5) is not None:
  469. raise Exception("Unexpected management frame received")
  470. dev[0].dump_monitor()
  471. dialog_token += 1
  472. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  473. attrs = p2p_attr_config_timeout()
  474. attrs += p2p_attr_invitation_flags()
  475. attrs += p2p_attr_operating_channel()
  476. attrs += p2p_attr_group_bssid(src)
  477. attrs += p2p_attr_channel_list()
  478. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  479. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  480. msg['payload'] += ie_p2p(attrs)
  481. hapd.mgmt_tx(msg)
  482. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  483. if ev is None:
  484. raise Exception("Timeout on device found event")
  485. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  486. if ev is None:
  487. raise Exception("Timeout on invitation event " + str(dialog_token))
  488. if hapd.mgmt_rx(timeout=1) is None:
  489. raise Exception("No invitation response " + str(dialog_token))
  490. time.sleep(0.1)
  491. dev[0].dump_monitor()
  492. dialog_token += 1
  493. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  494. attrs = p2p_attr_config_timeout()
  495. attrs += p2p_attr_invitation_flags()
  496. attrs += p2p_attr_operating_channel()
  497. attrs += p2p_attr_group_bssid(src)
  498. attrs += p2p_attr_channel_list()
  499. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  500. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  501. msg['payload'] += ie_p2p(attrs)
  502. hapd.mgmt_tx(msg)
  503. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  504. if ev is None:
  505. raise Exception("Timeout on invitation event " + str(dialog_token))
  506. if hapd.mgmt_rx(timeout=1) is None:
  507. raise Exception("No invitation response " + str(dialog_token))
  508. time.sleep(0.1)
  509. dev[0].dump_monitor()
  510. dialog_token += 1
  511. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  512. #attrs = p2p_attr_config_timeout()
  513. attrs = p2p_attr_invitation_flags()
  514. attrs += p2p_attr_operating_channel()
  515. attrs += p2p_attr_group_bssid(src)
  516. attrs += p2p_attr_channel_list()
  517. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  518. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  519. msg['payload'] += ie_p2p(attrs)
  520. hapd.mgmt_tx(msg)
  521. if hapd.mgmt_rx(timeout=1) is None:
  522. raise Exception("No invitation response " + str(dialog_token))
  523. time.sleep(0.1)
  524. dev[0].dump_monitor()
  525. dialog_token += 1
  526. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  527. attrs = p2p_attr_config_timeout()
  528. #attrs = p2p_attr_invitation_flags()
  529. attrs += p2p_attr_operating_channel()
  530. attrs += p2p_attr_group_bssid(src)
  531. attrs += p2p_attr_channel_list()
  532. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  533. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  534. msg['payload'] += ie_p2p(attrs)
  535. hapd.mgmt_tx(msg)
  536. if hapd.mgmt_rx(timeout=1) is None:
  537. raise Exception("No invitation response " + str(dialog_token))
  538. time.sleep(0.1)
  539. dev[0].dump_monitor()
  540. dialog_token += 1
  541. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  542. attrs = p2p_attr_config_timeout()
  543. attrs = p2p_attr_invitation_flags()
  544. #attrs += p2p_attr_operating_channel()
  545. attrs += p2p_attr_group_bssid(src)
  546. attrs += p2p_attr_channel_list()
  547. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  548. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  549. msg['payload'] += ie_p2p(attrs)
  550. hapd.mgmt_tx(msg)
  551. if hapd.mgmt_rx(timeout=1) is None:
  552. raise Exception("No invitation response " + str(dialog_token))
  553. time.sleep(0.1)
  554. dev[0].dump_monitor()
  555. dialog_token += 1
  556. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  557. attrs = p2p_attr_config_timeout()
  558. attrs = p2p_attr_invitation_flags()
  559. attrs += p2p_attr_operating_channel()
  560. #attrs += p2p_attr_group_bssid(src)
  561. attrs += p2p_attr_channel_list()
  562. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  563. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  564. msg['payload'] += ie_p2p(attrs)
  565. hapd.mgmt_tx(msg)
  566. if hapd.mgmt_rx(timeout=1) is None:
  567. raise Exception("No invitation response " + str(dialog_token))
  568. time.sleep(0.1)
  569. dev[0].dump_monitor()
  570. dialog_token += 1
  571. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  572. attrs = p2p_attr_config_timeout()
  573. attrs = p2p_attr_invitation_flags()
  574. attrs += p2p_attr_operating_channel()
  575. attrs += p2p_attr_group_bssid(src)
  576. #attrs += p2p_attr_channel_list()
  577. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  578. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  579. msg['payload'] += ie_p2p(attrs)
  580. hapd.mgmt_tx(msg)
  581. if hapd.mgmt_rx(timeout=1) is None:
  582. raise Exception("No invitation response " + str(dialog_token))
  583. time.sleep(0.1)
  584. dev[0].dump_monitor()
  585. dialog_token += 1
  586. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  587. attrs = p2p_attr_config_timeout()
  588. attrs = p2p_attr_invitation_flags()
  589. attrs += p2p_attr_operating_channel()
  590. attrs += p2p_attr_group_bssid(src)
  591. attrs += p2p_attr_channel_list()
  592. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  593. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  594. msg['payload'] += ie_p2p(attrs)
  595. hapd.mgmt_tx(msg)
  596. if hapd.mgmt_rx(timeout=1) is None:
  597. raise Exception("No invitation response " + str(dialog_token))
  598. time.sleep(0.1)
  599. dev[0].dump_monitor()
  600. dialog_token += 1
  601. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  602. attrs = p2p_attr_config_timeout()
  603. attrs = p2p_attr_invitation_flags()
  604. attrs += p2p_attr_operating_channel()
  605. attrs += p2p_attr_group_bssid(src)
  606. attrs += p2p_attr_channel_list()
  607. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  608. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  609. msg['payload'] += ie_p2p(attrs)
  610. hapd.mgmt_tx(msg)
  611. if hapd.mgmt_rx(timeout=1) is None:
  612. raise Exception("No invitation response " + str(dialog_token))
  613. time.sleep(0.1)
  614. dev[0].dump_monitor()
  615. dialog_token += 1
  616. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  617. hapd.mgmt_tx(msg)
  618. if hapd.mgmt_rx(timeout=1) is None:
  619. raise Exception("No invitation response " + str(dialog_token))
  620. # Unusable peer operating channel preference
  621. time.sleep(0.1)
  622. dev[0].dump_monitor()
  623. dialog_token += 1
  624. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  625. attrs = p2p_attr_config_timeout()
  626. attrs = p2p_attr_invitation_flags()
  627. attrs += p2p_attr_operating_channel(chan=15)
  628. attrs += p2p_attr_group_bssid(src)
  629. attrs += p2p_attr_channel_list()
  630. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  631. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  632. msg['payload'] += ie_p2p(attrs)
  633. hapd.mgmt_tx(msg)
  634. if hapd.mgmt_rx(timeout=1) is None:
  635. raise Exception("No invitation response " + str(dialog_token))
  636. def test_p2p_msg_invitation_req_to_go(dev, apdev):
  637. """P2P protocol tests for invitation request processing on GO device"""
  638. res = form(dev[0], dev[1])
  639. dev[0].dump_monitor()
  640. dev[1].dump_monitor()
  641. addr0 = dev[0].p2p_dev_addr()
  642. addr1 = dev[1].p2p_dev_addr()
  643. peer = dev[1].get_peer(addr0)
  644. listen_freq = peer['listen_freq']
  645. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  646. raise Exception("Failed to enable external management frame handling")
  647. networks = dev[0].list_networks()
  648. if len(networks) != 1:
  649. raise Exception("Unexpected number of networks")
  650. if "[P2P-PERSISTENT]" not in networks[0]['flags']:
  651. raise Exception("Not the persistent group data")
  652. if "OK" not in dev[0].global_request("P2P_GROUP_ADD persistent=" + networks[0]['id'] + " freq=" + listen_freq):
  653. raise Exception("Could not state GO")
  654. dialog_token = 0
  655. # Unusable peer operating channel preference
  656. dialog_token += 1
  657. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
  658. dialog_token=dialog_token)
  659. attrs = p2p_attr_config_timeout()
  660. attrs = p2p_attr_invitation_flags(bitmap=1)
  661. attrs += p2p_attr_operating_channel(chan=15)
  662. attrs += p2p_attr_channel_list()
  663. attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
  664. attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
  665. msg['payload'] += ie_p2p(attrs)
  666. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  667. rx_msg = dev[1].mgmt_rx()
  668. if rx_msg is None:
  669. raise Exception("MGMT-RX timeout")
  670. p2p = parse_p2p_public_action(rx_msg['payload'])
  671. if p2p is None:
  672. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  673. if p2p['subtype'] != P2P_INVITATION_RESP:
  674. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  675. if p2p['p2p_status'] != 0:
  676. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  677. # Forced channel re-selection due to channel list
  678. dialog_token += 1
  679. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
  680. dialog_token=dialog_token)
  681. attrs = p2p_attr_config_timeout()
  682. attrs = p2p_attr_invitation_flags(bitmap=1)
  683. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  684. 0x58, 0x58, 0x04,
  685. 81, 1, 3)
  686. attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
  687. attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
  688. msg['payload'] += ie_p2p(attrs)
  689. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  690. rx_msg = dev[1].mgmt_rx()
  691. if rx_msg is None:
  692. raise Exception("MGMT-RX timeout")
  693. p2p = parse_p2p_public_action(rx_msg['payload'])
  694. if p2p is None:
  695. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  696. if p2p['subtype'] != P2P_INVITATION_RESP:
  697. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  698. if p2p['p2p_status'] != 7:
  699. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  700. def test_p2p_msg_invitation_req_unknown(dev, apdev):
  701. """P2P protocol tests for invitation request from unknown peer"""
  702. dst, src, hapd, channel = start_p2p(dev, apdev)
  703. dialog_token = 0
  704. dialog_token += 1
  705. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  706. attrs = p2p_attr_config_timeout()
  707. attrs += p2p_attr_invitation_flags()
  708. attrs += p2p_attr_operating_channel()
  709. attrs += p2p_attr_group_bssid(src)
  710. attrs += p2p_attr_channel_list()
  711. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  712. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  713. msg['payload'] += ie_p2p(attrs)
  714. hapd.mgmt_tx(msg)
  715. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  716. if ev is None:
  717. raise Exception("Timeout on invitation event " + str(dialog_token))
  718. if hapd.mgmt_rx(timeout=1) is None:
  719. raise Exception("No invitation response " + str(dialog_token))
  720. def test_p2p_msg_invitation_no_common_channels(dev, apdev):
  721. """P2P protocol tests for invitation request without common channels"""
  722. dst, src, hapd, channel = start_p2p(dev, apdev)
  723. dialog_token = 0
  724. dialog_token += 1
  725. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  726. attrs = p2p_attr_config_timeout()
  727. attrs += p2p_attr_invitation_flags()
  728. attrs += p2p_attr_operating_channel()
  729. attrs += p2p_attr_group_bssid(src)
  730. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  731. 0x58, 0x58, 0x04,
  732. 81, 0)
  733. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  734. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  735. msg['payload'] += ie_p2p(attrs)
  736. hapd.mgmt_tx(msg)
  737. if hapd.mgmt_rx(timeout=1) is None:
  738. raise Exception("No invitation response " + str(dialog_token))
  739. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=0.1)
  740. if ev is not None:
  741. raise Exception("Unexpected invitation event")
  742. def test_p2p_msg_invitation_resp(dev, apdev):
  743. """P2P protocol tests for invitation response processing"""
  744. form(dev[0], dev[1])
  745. dev[0].dump_monitor()
  746. dev[1].dump_monitor()
  747. dst, src, hapd, channel = start_p2p(dev, apdev)
  748. addr0 = dev[0].p2p_dev_addr()
  749. addr1 = dev[1].p2p_dev_addr()
  750. peer = dev[1].get_peer(addr0)
  751. # P2P Invitation Response from unknown peer
  752. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=1)
  753. hapd.mgmt_tx(msg)
  754. # P2P Invitation Response from peer that is not in invitation
  755. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=2)
  756. attrs = p2p_attr_status()
  757. msg['payload'] += ie_p2p(attrs)
  758. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  759. time.sleep(0.1)
  760. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  761. raise Exception("Failed to enable external management frame handling")
  762. invite(dev[0], dev[1])
  763. rx_msg = dev[1].mgmt_rx()
  764. if rx_msg is None:
  765. raise Exception("MGMT-RX timeout")
  766. p2p = parse_p2p_public_action(rx_msg['payload'])
  767. if p2p is None:
  768. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  769. if p2p['subtype'] != P2P_INVITATION_REQ:
  770. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  771. # Invalid attribute to cause p2p_parse() failure
  772. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  773. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  774. msg['payload'] += ie_p2p(attrs)
  775. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  776. invite(dev[0], dev[1])
  777. rx_msg = dev[1].mgmt_rx()
  778. if rx_msg is None:
  779. raise Exception("MGMT-RX timeout")
  780. p2p = parse_p2p_public_action(rx_msg['payload'])
  781. if p2p is None:
  782. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  783. if p2p['subtype'] != P2P_INVITATION_REQ:
  784. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  785. # missing mandatory Status attribute
  786. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  787. attrs = p2p_attr_channel_list()
  788. msg['payload'] += ie_p2p(attrs)
  789. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  790. invite(dev[0], dev[1])
  791. rx_msg = dev[1].mgmt_rx()
  792. if rx_msg is None:
  793. raise Exception("MGMT-RX timeout")
  794. p2p = parse_p2p_public_action(rx_msg['payload'])
  795. if p2p is None:
  796. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  797. if p2p['subtype'] != P2P_INVITATION_REQ:
  798. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  799. # no channel match (no common channel found at all)
  800. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  801. attrs = p2p_attr_status()
  802. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  803. 0x58, 0x58, 0x04,
  804. 81, 1, 15)
  805. msg['payload'] += ie_p2p(attrs)
  806. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  807. invite(dev[0], dev[1])
  808. rx_msg = dev[1].mgmt_rx()
  809. if rx_msg is None:
  810. raise Exception("MGMT-RX timeout")
  811. p2p = parse_p2p_public_action(rx_msg['payload'])
  812. if p2p is None:
  813. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  814. if p2p['subtype'] != P2P_INVITATION_REQ:
  815. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  816. # no channel match (no acceptable P2P channel)
  817. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  818. attrs = p2p_attr_status()
  819. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  820. 0x58, 0x58, 0x04,
  821. 81, 1, 12)
  822. msg['payload'] += ie_p2p(attrs)
  823. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  824. invite(dev[0], dev[1])
  825. rx_msg = dev[1].mgmt_rx()
  826. if rx_msg is None:
  827. raise Exception("MGMT-RX timeout")
  828. p2p = parse_p2p_public_action(rx_msg['payload'])
  829. if p2p is None:
  830. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  831. if p2p['subtype'] != P2P_INVITATION_REQ:
  832. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  833. # missing mandatory Channel List attribute (ignored as a workaround)
  834. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  835. attrs = p2p_attr_status()
  836. msg['payload'] += ie_p2p(attrs)
  837. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  838. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
  839. if ev is None:
  840. raise Exception("Group was not started")
  841. def test_p2p_msg_pd_req(dev, apdev):
  842. """P2P protocol tests for provision discovery request processing"""
  843. dst, src, hapd, channel = start_p2p(dev, apdev)
  844. dialog_token = 0
  845. # Too short attribute header
  846. dialog_token += 1
  847. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  848. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  849. msg['payload'] += ie_p2p(attrs)
  850. hapd.mgmt_tx(msg)
  851. if hapd.mgmt_rx(timeout=0.5) is not None:
  852. raise Exception("Unexpected management frame received")
  853. # No attributes
  854. dialog_token += 1
  855. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  856. attrs = ""
  857. msg['payload'] += ie_p2p(attrs)
  858. hapd.mgmt_tx(msg)
  859. if hapd.mgmt_rx(timeout=1) is None:
  860. raise Exception("No PD response " + str(dialog_token))
  861. # Valid request
  862. time.sleep(0.1)
  863. dialog_token += 1
  864. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  865. attrs = wsc_attr_config_methods(methods=0x1008)
  866. msg['payload'] += ie_wsc(attrs)
  867. attrs = p2p_attr_capability()
  868. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  869. msg['payload'] += ie_p2p(attrs)
  870. hapd.mgmt_tx(msg)
  871. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  872. if ev is None:
  873. raise Exception("Timeout on device found event")
  874. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  875. if ev is None:
  876. raise Exception("Timeout on PD event")
  877. if hapd.mgmt_rx(timeout=1) is None:
  878. raise Exception("No PD response " + str(dialog_token))
  879. # Unknown group
  880. time.sleep(0.1)
  881. dialog_token += 1
  882. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  883. attrs = wsc_attr_config_methods(methods=0x1008)
  884. msg['payload'] += ie_wsc(attrs)
  885. attrs = p2p_attr_capability()
  886. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  887. attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
  888. msg['payload'] += ie_p2p(attrs)
  889. hapd.mgmt_tx(msg)
  890. if hapd.mgmt_rx(timeout=1) is None:
  891. raise Exception("No PD response " + str(dialog_token))
  892. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
  893. if ev is not None:
  894. raise Exception("Unexpected PD event")
  895. # Listen channel is not yet known
  896. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  897. raise Exception("Unexpected P2P_PROV_DISC success")
  898. # Unknown peer
  899. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
  900. raise Exception("Unexpected P2P_PROV_DISC success (2)")
  901. def test_p2p_msg_pd(dev, apdev):
  902. """P2P protocol tests for provision discovery request processing (known)"""
  903. dst, src, hapd, channel = start_p2p(dev, apdev)
  904. dialog_token = 0
  905. p2p_probe(hapd, src, chan=channel)
  906. time.sleep(0.1)
  907. # Valid request
  908. dialog_token += 1
  909. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  910. attrs = wsc_attr_config_methods(methods=0x1008)
  911. msg['payload'] += ie_wsc(attrs)
  912. attrs = p2p_attr_capability()
  913. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  914. msg['payload'] += ie_p2p(attrs)
  915. hapd.mgmt_tx(msg)
  916. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  917. if ev is None:
  918. raise Exception("Timeout on device found event")
  919. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  920. if ev is None:
  921. raise Exception("Timeout on PD event")
  922. if hapd.mgmt_rx(timeout=1) is None:
  923. raise Exception("No PD response " + str(dialog_token))
  924. if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  925. raise Exception("Unexpected P2P_PROV_DISC failure")
  926. frame = hapd.mgmt_rx(timeout=1)
  927. if frame is None:
  928. raise Exception("No PD request " + str(dialog_token))
  929. p2p = parse_p2p_public_action(frame['payload'])
  930. if p2p is None:
  931. raise Exception("Failed to parse PD request")
  932. # invalid dialog token
  933. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  934. dialog_token=p2p['dialog_token'] + 1)
  935. hapd.mgmt_tx(msg)
  936. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  937. if ev is not None:
  938. raise Exception("Unexpected PD result event")
  939. # valid dialog token
  940. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  941. dialog_token=p2p['dialog_token'])
  942. hapd.mgmt_tx(msg)
  943. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
  944. if ev is None:
  945. raise Exception("Timeout on PD result event")
  946. # valid dialog token
  947. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  948. dialog_token=p2p['dialog_token'])
  949. hapd.mgmt_tx(msg)
  950. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  951. if ev is not None:
  952. raise Exception("Unexpected PD result event")
  953. def check_p2p_response(hapd, dialog_token, status):
  954. resp = hapd.mgmt_rx(timeout=1)
  955. if resp is None:
  956. raise Exception("No GO Neg Response " + str(dialog_token))
  957. p2p = parse_p2p_public_action(resp['payload'])
  958. if p2p is None:
  959. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  960. if dialog_token != p2p['dialog_token']:
  961. raise Exception("Unexpected dialog token in response")
  962. if p2p['p2p_status'] != status:
  963. raise Exception("Unexpected status code %s in response (expected %d)" % (p2p['p2p_status'], status))
  964. def test_p2p_msg_go_neg_both_start(dev, apdev):
  965. """P2P protocol test for simultaneous GO Neg initiation"""
  966. addr0 = dev[0].p2p_dev_addr()
  967. addr1 = dev[1].p2p_dev_addr()
  968. dev[0].p2p_listen()
  969. dev[1].discover_peer(addr0)
  970. dev[1].p2p_listen()
  971. dev[0].discover_peer(addr1)
  972. dev[0].p2p_listen()
  973. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
  974. raise Exception("Failed to enable external management frame handling")
  975. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  976. raise Exception("Failed to enable external management frame handling")
  977. dev[0].request("P2P_CONNECT {} pbc".format(addr1))
  978. dev[1].request("P2P_CONNECT {} pbc".format(addr0))
  979. msg = dev[0].mgmt_rx()
  980. if msg is None:
  981. raise Exception("MGMT-RX timeout")
  982. msg = dev[1].mgmt_rx()
  983. if msg is None:
  984. raise Exception("MGMT-RX timeout(2)")
  985. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 0"):
  986. raise Exception("Failed to disable external management frame handling")
  987. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=2)
  988. if ev is not None:
  989. raise Exception("Unexpected GO Neg success")
  990. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
  991. raise Exception("Failed to disable external management frame handling")
  992. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  993. if ev is None:
  994. raise Exception("GO Neg did not succeed")
  995. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
  996. if ev is None:
  997. raise Exception("Group formation not succeed")
  998. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
  999. if ev is None:
  1000. raise Exception("Group formation not succeed")
  1001. def test_p2p_msg_go_neg_req(dev, apdev):
  1002. """P2P protocol tests for invitation request from unknown peer"""
  1003. dst, src, hapd, channel = start_p2p(dev, apdev)
  1004. dialog_token = 0
  1005. # invalid attribute
  1006. dialog_token += 1
  1007. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1008. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  1009. msg['payload'] += ie_p2p(attrs)
  1010. hapd.mgmt_tx(msg)
  1011. frame = hapd.mgmt_rx(timeout=0.1)
  1012. if frame is not None:
  1013. print frame
  1014. raise Exception("Unexpected GO Neg Response")
  1015. # missing atributes
  1016. dialog_token += 1
  1017. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1018. attrs = p2p_attr_capability()
  1019. attrs += p2p_attr_go_intent()
  1020. attrs += p2p_attr_config_timeout()
  1021. #attrs += p2p_attr_listen_channel()
  1022. attrs += p2p_attr_ext_listen_timing()
  1023. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1024. attrs += p2p_attr_channel_list()
  1025. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1026. attrs += p2p_attr_operating_channel()
  1027. msg['payload'] += ie_p2p(attrs)
  1028. hapd.mgmt_tx(msg)
  1029. if hapd.mgmt_rx(timeout=1) is None:
  1030. raise Exception("No GO Neg Response " + str(dialog_token))
  1031. time.sleep(0.1)
  1032. dialog_token += 1
  1033. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1034. attrs = p2p_attr_capability()
  1035. attrs += p2p_attr_go_intent()
  1036. attrs += p2p_attr_config_timeout()
  1037. attrs += p2p_attr_listen_channel()
  1038. attrs += p2p_attr_ext_listen_timing()
  1039. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1040. attrs += p2p_attr_channel_list()
  1041. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1042. #attrs += p2p_attr_operating_channel()
  1043. msg['payload'] += ie_p2p(attrs)
  1044. hapd.mgmt_tx(msg)
  1045. if hapd.mgmt_rx(timeout=1) is None:
  1046. raise Exception("No GO Neg Response " + str(dialog_token))
  1047. time.sleep(0.1)
  1048. dialog_token += 1
  1049. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1050. attrs = p2p_attr_capability()
  1051. attrs += p2p_attr_go_intent()
  1052. attrs += p2p_attr_config_timeout()
  1053. attrs += p2p_attr_listen_channel()
  1054. attrs += p2p_attr_ext_listen_timing()
  1055. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1056. #attrs += p2p_attr_channel_list()
  1057. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1058. attrs += p2p_attr_operating_channel()
  1059. msg['payload'] += ie_p2p(attrs)
  1060. hapd.mgmt_tx(msg)
  1061. if hapd.mgmt_rx(timeout=1) is None:
  1062. raise Exception("No GO Neg Response " + str(dialog_token))
  1063. time.sleep(0.1)
  1064. dialog_token += 1
  1065. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1066. attrs = p2p_attr_capability()
  1067. attrs += p2p_attr_go_intent()
  1068. attrs += p2p_attr_config_timeout()
  1069. attrs += p2p_attr_listen_channel()
  1070. attrs += p2p_attr_ext_listen_timing()
  1071. #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1072. attrs += p2p_attr_channel_list()
  1073. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1074. attrs += p2p_attr_operating_channel()
  1075. msg['payload'] += ie_p2p(attrs)
  1076. hapd.mgmt_tx(msg)
  1077. if hapd.mgmt_rx(timeout=1) is None:
  1078. raise Exception("No GO Neg Response " + str(dialog_token))
  1079. time.sleep(0.1)
  1080. dialog_token += 1
  1081. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1082. attrs = p2p_attr_capability()
  1083. attrs += p2p_attr_go_intent()
  1084. attrs += p2p_attr_config_timeout()
  1085. attrs += p2p_attr_listen_channel()
  1086. attrs += p2p_attr_ext_listen_timing()
  1087. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1088. attrs += p2p_attr_channel_list()
  1089. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1090. attrs += p2p_attr_operating_channel()
  1091. msg['payload'] += ie_p2p(attrs)
  1092. hapd.mgmt_tx(msg)
  1093. if hapd.mgmt_rx(timeout=1) is None:
  1094. raise Exception("No GO Neg Response " + str(dialog_token))
  1095. time.sleep(0.1)
  1096. # SA != P2P Device address
  1097. dialog_token += 1
  1098. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1099. attrs = p2p_attr_capability()
  1100. attrs += p2p_attr_go_intent()
  1101. attrs += p2p_attr_config_timeout()
  1102. attrs += p2p_attr_listen_channel()
  1103. attrs += p2p_attr_ext_listen_timing()
  1104. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1105. attrs += p2p_attr_channel_list()
  1106. attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
  1107. attrs += p2p_attr_operating_channel()
  1108. msg['payload'] += ie_p2p(attrs)
  1109. hapd.mgmt_tx(msg)
  1110. if hapd.mgmt_rx(timeout=1) is None:
  1111. raise Exception("No GO Neg Response " + str(dialog_token))
  1112. time.sleep(0.1)
  1113. # unexpected Status attribute
  1114. dialog_token += 1
  1115. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1116. attrs = p2p_attr_capability()
  1117. attrs += p2p_attr_go_intent()
  1118. attrs += p2p_attr_config_timeout()
  1119. attrs += p2p_attr_listen_channel()
  1120. attrs += p2p_attr_ext_listen_timing()
  1121. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1122. attrs += p2p_attr_channel_list()
  1123. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1124. attrs += p2p_attr_operating_channel()
  1125. attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  1126. msg['payload'] += ie_p2p(attrs)
  1127. hapd.mgmt_tx(msg)
  1128. if hapd.mgmt_rx(timeout=1) is None:
  1129. raise Exception("No GO Neg Response(1) " + str(dialog_token))
  1130. time.sleep(0.1)
  1131. # valid (with workarounds) GO Neg Req
  1132. dialog_token += 1
  1133. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1134. #attrs = p2p_attr_capability()
  1135. #attrs += p2p_attr_go_intent()
  1136. #attrs += p2p_attr_config_timeout()
  1137. attrs = p2p_attr_listen_channel()
  1138. attrs += p2p_attr_ext_listen_timing()
  1139. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1140. attrs += p2p_attr_channel_list()
  1141. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1142. attrs += p2p_attr_operating_channel()
  1143. msg['payload'] += ie_p2p(attrs)
  1144. hapd.mgmt_tx(msg)
  1145. check_p2p_response(hapd, dialog_token,
  1146. P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  1147. ev = dev[0].wait_event(["P2P-GO-NEG-REQUEST"], timeout=1)
  1148. if ev is None:
  1149. raise Exception("Timeout on GO Neg event " + str(dialog_token))
  1150. dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
  1151. # ready - missing attributes (with workarounds) GO Neg Req
  1152. time.sleep(0.1)
  1153. dialog_token += 1
  1154. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1155. #attrs = p2p_attr_capability()
  1156. #attrs += p2p_attr_go_intent()
  1157. #attrs += p2p_attr_config_timeout()
  1158. attrs = p2p_attr_listen_channel()
  1159. attrs += p2p_attr_ext_listen_timing()
  1160. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1161. attrs += p2p_attr_channel_list()
  1162. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1163. attrs += p2p_attr_operating_channel()
  1164. msg['payload'] += ie_p2p(attrs)
  1165. hapd.mgmt_tx(msg)
  1166. if hapd.mgmt_rx(timeout=1) is None:
  1167. raise Exception("No GO Neg Response " + str(dialog_token))
  1168. # ready - invalid GO Intent GO Neg Req
  1169. time.sleep(0.1)
  1170. dialog_token += 1
  1171. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1172. #attrs = p2p_attr_capability()
  1173. attrs = p2p_attr_go_intent(go_intent=16)
  1174. #attrs += p2p_attr_config_timeout()
  1175. attrs += p2p_attr_listen_channel()
  1176. attrs += p2p_attr_ext_listen_timing()
  1177. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1178. attrs += p2p_attr_channel_list()
  1179. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1180. attrs += p2p_attr_operating_channel()
  1181. msg['payload'] += ie_p2p(attrs)
  1182. hapd.mgmt_tx(msg)
  1183. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INVALID_PARAMS)
  1184. # ready - invalid Channel List
  1185. time.sleep(0.1)
  1186. dialog_token += 1
  1187. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1188. attrs = p2p_attr_capability()
  1189. attrs += p2p_attr_go_intent()
  1190. attrs += p2p_attr_config_timeout()
  1191. attrs += p2p_attr_listen_channel()
  1192. attrs += p2p_attr_ext_listen_timing()
  1193. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1194. attrs += struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
  1195. 0x58, 0x58, 0x04,
  1196. 81, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
  1197. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1198. attrs += p2p_attr_operating_channel()
  1199. msg['payload'] += ie_p2p(attrs)
  1200. hapd.mgmt_tx(msg)
  1201. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_NO_COMMON_CHANNELS)
  1202. # ready - invalid GO Neg Req (unsupported Device Password ID)
  1203. time.sleep(0.1)
  1204. dialog_token += 1
  1205. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1206. attrs = p2p_attr_capability()
  1207. attrs += p2p_attr_go_intent()
  1208. attrs += p2p_attr_config_timeout()
  1209. attrs += p2p_attr_listen_channel()
  1210. attrs += p2p_attr_ext_listen_timing()
  1211. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1212. # very long channel list
  1213. attrs += struct.pack("<BH3BBB11B30B", P2P_ATTR_CHANNEL_LIST, 46,
  1214. 0x58, 0x58, 0x04,
  1215. 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  1216. 1, 1, 1, 2, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5,
  1217. 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10)
  1218. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1219. attrs += p2p_attr_operating_channel()
  1220. msg['payload'] += ie_p2p(attrs)
  1221. hapd.mgmt_tx(msg)
  1222. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD)
  1223. def mgmt_tx(dev, msg):
  1224. for i in range(0, 20):
  1225. if "FAIL" in dev.request(msg):
  1226. raise Exception("Failed to send Action frame")
  1227. ev = dev.wait_event(["MGMT-TX-STATUS"], timeout=10)
  1228. if ev is None:
  1229. raise Exception("Timeout on MGMT-TX-STATUS")
  1230. if "result=SUCCESS" in ev:
  1231. break
  1232. time.sleep(0.01)
  1233. if "result=SUCCESS" not in ev:
  1234. raise Exception("Peer did not ack Action frame")
  1235. def rx_go_neg_req(dev):
  1236. msg = dev.mgmt_rx()
  1237. if msg is None:
  1238. raise Exception("MGMT-RX timeout")
  1239. p2p = parse_p2p_public_action(msg['payload'])
  1240. if p2p is None:
  1241. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1242. if p2p['subtype'] != P2P_GO_NEG_REQ:
  1243. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  1244. p2p['freq'] = msg['freq']
  1245. return p2p
  1246. def rx_go_neg_conf(dev, status=None, dialog_token=None):
  1247. msg = dev.mgmt_rx()
  1248. if msg is None:
  1249. raise Exception("MGMT-RX timeout")
  1250. p2p = parse_p2p_public_action(msg['payload'])
  1251. if p2p is None:
  1252. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1253. if p2p['subtype'] != P2P_GO_NEG_CONF:
  1254. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  1255. if dialog_token is not None and dialog_token != p2p['dialog_token']:
  1256. raise Exception("Unexpected dialog token")
  1257. if status is not None and p2p['p2p_status'] != status:
  1258. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  1259. def check_p2p_go_neg_fail_event(dev, status):
  1260. ev = dev.wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
  1261. if ev is None:
  1262. raise Exception("GO Negotiation failure not reported")
  1263. if "status=%d" % status not in ev:
  1264. raise Exception("Unexpected failure reason: " + ev)
  1265. def test_p2p_msg_go_neg_req_reject(dev, apdev):
  1266. """P2P protocol tests for user reject incorrectly in GO Neg Req"""
  1267. addr0 = dev[0].p2p_dev_addr()
  1268. addr1 = dev[1].p2p_dev_addr()
  1269. dev[0].p2p_listen()
  1270. dev[1].discover_peer(addr0)
  1271. dev[1].group_request("P2P_CONNECT " + addr0 + " pbc")
  1272. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1273. if ev is None:
  1274. raise Exception("Timeout on GO Neg Req")
  1275. peer = dev[0].get_peer(addr1)
  1276. dev[0].p2p_stop_find()
  1277. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_REQ, dialog_token=123)
  1278. attrs = p2p_attr_capability()
  1279. attrs += p2p_attr_status(status=P2P_SC_FAIL_REJECTED_BY_USER)
  1280. attrs += p2p_attr_go_intent()
  1281. attrs += p2p_attr_config_timeout()
  1282. attrs += p2p_attr_listen_channel()
  1283. attrs += p2p_attr_ext_listen_timing()
  1284. attrs += p2p_attr_intended_interface_addr(addr0)
  1285. attrs += p2p_attr_channel_list()
  1286. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1287. attrs += p2p_attr_operating_channel()
  1288. msg['payload'] += ie_p2p(attrs)
  1289. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1290. ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
  1291. if ev is None:
  1292. raise Exception("GO Negotiation failure not reported")
  1293. if "status=%d" % P2P_SC_FAIL_REJECTED_BY_USER not in ev:
  1294. raise Exception("Unexpected failure reason: " + ev)
  1295. def test_p2p_msg_unexpected_go_neg_resp(dev, apdev):
  1296. """P2P protocol tests for unexpected GO Neg Resp"""
  1297. addr0 = dev[0].p2p_dev_addr()
  1298. addr1 = dev[1].p2p_dev_addr()
  1299. dev[1].p2p_listen()
  1300. dev[0].discover_peer(addr1)
  1301. dev[0].p2p_stop_find()
  1302. peer = dev[0].get_peer(addr1)
  1303. logger.debug("GO Neg Resp without GO Neg session")
  1304. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=123)
  1305. attrs = p2p_attr_status()
  1306. attrs += p2p_attr_capability()
  1307. attrs += p2p_attr_go_intent()
  1308. attrs += p2p_attr_config_timeout()
  1309. attrs += p2p_attr_intended_interface_addr(addr0)
  1310. attrs += p2p_attr_channel_list()
  1311. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1312. attrs += p2p_attr_operating_channel()
  1313. msg['payload'] += ie_p2p(attrs)
  1314. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1315. dev[0].p2p_listen()
  1316. dev[1].discover_peer(addr0)
  1317. logger.debug("Unexpected GO Neg Resp while waiting for new GO Neg session")
  1318. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1319. raise Exception("P2P_CONNECT failed")
  1320. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1321. if ev is None:
  1322. raise Exception("Timeout on GO Neg Req")
  1323. dev[0].p2p_stop_find()
  1324. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1325. logger.debug("Invalid attribute in GO Neg Response")
  1326. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=197)
  1327. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  1328. msg['payload'] += ie_p2p(attrs)
  1329. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1330. frame = dev[0].mgmt_rx(timeout=0.1)
  1331. if frame is not None:
  1332. raise Exception("Unexpected GO Neg Confirm")
  1333. logger.debug("GO Neg Resp with unexpected dialog token")
  1334. dev[1].p2p_stop_find()
  1335. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
  1336. raise Exception("Failed to enable external management frame handling")
  1337. dev[0].p2p_listen()
  1338. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1339. raise Exception("P2P_CONNECT failed(2)")
  1340. p2p = rx_go_neg_req(dev[0])
  1341. dev[0].p2p_stop_find()
  1342. dialog_token = p2p['dialog_token']
  1343. if dialog_token < 255:
  1344. dialog_token += 1
  1345. else:
  1346. dialog_token = 1
  1347. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1348. attrs = p2p_attr_status()
  1349. attrs += p2p_attr_capability()
  1350. attrs += p2p_attr_go_intent()
  1351. attrs += p2p_attr_config_timeout()
  1352. attrs += p2p_attr_intended_interface_addr(addr0)
  1353. attrs += p2p_attr_channel_list()
  1354. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1355. attrs += p2p_attr_operating_channel()
  1356. msg['payload'] += ie_p2p(attrs)
  1357. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1358. logger.debug("GO Neg Resp without Status")
  1359. dev[1].p2p_stop_find()
  1360. dev[0].p2p_listen()
  1361. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1362. raise Exception("P2P_CONNECT failed(2)")
  1363. p2p = rx_go_neg_req(dev[0])
  1364. dev[0].p2p_stop_find()
  1365. dialog_token = p2p['dialog_token']
  1366. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1367. #attrs = p2p_attr_status()
  1368. attrs = p2p_attr_capability()
  1369. attrs += p2p_attr_go_intent()
  1370. attrs += p2p_attr_config_timeout()
  1371. attrs += p2p_attr_intended_interface_addr(addr0)
  1372. attrs += p2p_attr_channel_list()
  1373. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1374. attrs += p2p_attr_operating_channel()
  1375. msg['payload'] += ie_p2p(attrs)
  1376. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1377. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1378. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1379. logger.debug("GO Neg Resp without Intended Address")
  1380. dev[1].p2p_stop_find()
  1381. dev[0].p2p_listen()
  1382. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1383. raise Exception("P2P_CONNECT failed(2)")
  1384. p2p = rx_go_neg_req(dev[0])
  1385. dev[0].p2p_stop_find()
  1386. dialog_token = p2p['dialog_token']
  1387. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1388. attrs = p2p_attr_status()
  1389. #attrs += p2p_attr_capability()
  1390. attrs += p2p_attr_go_intent()
  1391. attrs += p2p_attr_config_timeout()
  1392. #attrs += p2p_attr_intended_interface_addr(addr0)
  1393. attrs += p2p_attr_channel_list()
  1394. #attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1395. attrs += p2p_attr_operating_channel()
  1396. msg['payload'] += ie_p2p(attrs)
  1397. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1398. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1399. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1400. logger.debug("GO Neg Resp without GO Intent")
  1401. dev[1].p2p_stop_find()
  1402. dev[0].p2p_listen()
  1403. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1404. raise Exception("P2P_CONNECT failed(2)")
  1405. p2p = rx_go_neg_req(dev[0])
  1406. dev[0].p2p_stop_find()
  1407. dialog_token = p2p['dialog_token']
  1408. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1409. attrs = p2p_attr_status()
  1410. attrs += p2p_attr_capability()
  1411. #attrs += p2p_attr_go_intent()
  1412. attrs += p2p_attr_config_timeout()
  1413. attrs += p2p_attr_intended_interface_addr(addr0)
  1414. attrs += p2p_attr_channel_list()
  1415. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1416. attrs += p2p_attr_operating_channel()
  1417. msg['payload'] += ie_p2p(attrs)
  1418. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1419. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1420. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1421. logger.debug("GO Neg Resp with invalid GO Intent")
  1422. dev[1].p2p_stop_find()
  1423. dev[0].p2p_listen()
  1424. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1425. raise Exception("P2P_CONNECT failed(2)")
  1426. p2p = rx_go_neg_req(dev[0])
  1427. dev[0].p2p_stop_find()
  1428. dialog_token = p2p['dialog_token']
  1429. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1430. attrs = p2p_attr_status()
  1431. attrs += p2p_attr_capability()
  1432. attrs += p2p_attr_go_intent(go_intent=16)
  1433. attrs += p2p_attr_config_timeout()
  1434. attrs += p2p_attr_intended_interface_addr(addr0)
  1435. attrs += p2p_attr_channel_list()
  1436. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1437. attrs += p2p_attr_operating_channel()
  1438. msg['payload'] += ie_p2p(attrs)
  1439. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1440. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1441. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1442. logger.debug("GO Neg Resp with incompatible GO Intent")
  1443. dev[1].p2p_stop_find()
  1444. dev[0].p2p_listen()
  1445. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15"):
  1446. raise Exception("P2P_CONNECT failed(2)")
  1447. p2p = rx_go_neg_req(dev[0])
  1448. dev[0].p2p_stop_find()
  1449. dialog_token = p2p['dialog_token']
  1450. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1451. attrs = p2p_attr_status()
  1452. attrs += p2p_attr_capability()
  1453. attrs += p2p_attr_go_intent(go_intent=15)
  1454. attrs += p2p_attr_config_timeout()
  1455. attrs += p2p_attr_intended_interface_addr(addr0)
  1456. attrs += p2p_attr_channel_list()
  1457. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1458. attrs += p2p_attr_operating_channel()
  1459. msg['payload'] += ie_p2p(attrs)
  1460. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1461. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INCOMPATIBLE_PARAMS)
  1462. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INCOMPATIBLE_PARAMS, dialog_token)
  1463. logger.debug("GO Neg Resp without P2P Group ID")
  1464. dev[1].p2p_stop_find()
  1465. dev[0].p2p_listen()
  1466. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1467. raise Exception("P2P_CONNECT failed(2)")
  1468. p2p = rx_go_neg_req(dev[0])
  1469. dev[0].p2p_stop_find()
  1470. dialog_token = p2p['dialog_token']
  1471. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1472. attrs = p2p_attr_status()
  1473. attrs += p2p_attr_capability()
  1474. attrs += p2p_attr_go_intent(go_intent=15)
  1475. attrs += p2p_attr_config_timeout()
  1476. attrs += p2p_attr_intended_interface_addr(addr0)
  1477. attrs += p2p_attr_channel_list()
  1478. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1479. attrs += p2p_attr_operating_channel()
  1480. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  1481. msg['payload'] += ie_p2p(attrs)
  1482. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1483. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1484. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1485. logger.debug("GO Neg Resp without Operating Channel")
  1486. dev[1].p2p_stop_find()
  1487. dev[0].p2p_listen()
  1488. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1489. raise Exception("P2P_CONNECT failed(2)")
  1490. p2p = rx_go_neg_req(dev[0])
  1491. dev[0].p2p_stop_find()
  1492. dialog_token = p2p['dialog_token']
  1493. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1494. attrs = p2p_attr_status()
  1495. attrs += p2p_attr_capability()
  1496. attrs += p2p_attr_go_intent(go_intent=15)
  1497. #attrs += p2p_attr_config_timeout()
  1498. attrs += p2p_attr_intended_interface_addr(addr0)
  1499. attrs += p2p_attr_channel_list()
  1500. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1501. #attrs += p2p_attr_operating_channel()
  1502. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1503. msg['payload'] += ie_p2p(attrs)
  1504. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1505. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1506. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1507. logger.debug("GO Neg Resp without Channel List")
  1508. dev[1].p2p_stop_find()
  1509. dev[0].p2p_listen()
  1510. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1511. raise Exception("P2P_CONNECT failed(2)")
  1512. p2p = rx_go_neg_req(dev[0])
  1513. dev[0].p2p_stop_find()
  1514. dialog_token = p2p['dialog_token']
  1515. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1516. attrs = p2p_attr_status()
  1517. attrs += p2p_attr_capability()
  1518. attrs += p2p_attr_go_intent(go_intent=15)
  1519. attrs += p2p_attr_config_timeout()
  1520. attrs += p2p_attr_intended_interface_addr(addr0)
  1521. #attrs += p2p_attr_channel_list()
  1522. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1523. attrs += p2p_attr_operating_channel()
  1524. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1525. msg['payload'] += ie_p2p(attrs)
  1526. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1527. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1528. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1529. logger.debug("GO Neg Resp without common channels")
  1530. dev[1].p2p_stop_find()
  1531. dev[0].p2p_listen()
  1532. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1533. raise Exception("P2P_CONNECT failed(2)")
  1534. p2p = rx_go_neg_req(dev[0])
  1535. dev[0].p2p_stop_find()
  1536. dialog_token = p2p['dialog_token']
  1537. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1538. attrs = p2p_attr_status()
  1539. attrs += p2p_attr_capability()
  1540. attrs += p2p_attr_go_intent(go_intent=15)
  1541. attrs += p2p_attr_config_timeout()
  1542. attrs += p2p_attr_intended_interface_addr(addr0)
  1543. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  1544. 0x58, 0x58, 0x04,
  1545. 81, 0)
  1546. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1547. attrs += p2p_attr_operating_channel()
  1548. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1549. msg['payload'] += ie_p2p(attrs)
  1550. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1551. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_NO_COMMON_CHANNELS)
  1552. rx_go_neg_conf(dev[0], P2P_SC_FAIL_NO_COMMON_CHANNELS, dialog_token)