test_p2p_messages.py 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882
  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_long_ssid(dev, apdev):
  242. """P2P protocol test: Too long SSID in P2P Public Action frame"""
  243. dst, src, hapd, channel = start_p2p(dev, apdev)
  244. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=1)
  245. attrs = p2p_attr_config_timeout()
  246. attrs += p2p_attr_invitation_flags()
  247. attrs += p2p_attr_operating_channel()
  248. attrs += p2p_attr_group_bssid(src)
  249. attrs += p2p_attr_channel_list()
  250. attrs += p2p_attr_group_id(src, 'DIRECT-foo')
  251. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  252. msg['payload'] += ie_p2p(attrs)
  253. msg['payload'] += ie_ssid(255 * 'A')
  254. hapd.mgmt_tx(msg)
  255. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  256. if ev is None:
  257. raise Exception("Timeout on device found event")
  258. def test_p2p_msg_long_dev_name(dev, apdev):
  259. """P2P protocol test: Too long Device Name in P2P Public Action frame"""
  260. dst, src, hapd, channel = start_p2p(dev, apdev)
  261. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=1)
  262. attrs = p2p_attr_config_timeout()
  263. attrs += p2p_attr_invitation_flags()
  264. attrs += p2p_attr_operating_channel()
  265. attrs += p2p_attr_group_bssid(src)
  266. attrs += p2p_attr_channel_list()
  267. attrs += p2p_attr_group_id(src, 'DIRECT-foo')
  268. attrs += p2p_attr_device_info(src, config_methods=0x0108,
  269. name="123456789012345678901234567890123")
  270. msg['payload'] += ie_p2p(attrs)
  271. hapd.mgmt_tx(msg)
  272. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=0.1)
  273. if ev is not None:
  274. raise Exception("Unexpected device found event")
  275. def test_p2p_msg_invitation_req(dev, apdev):
  276. """P2P protocol tests for invitation request processing"""
  277. dst, src, hapd, channel = start_p2p(dev, apdev)
  278. # Empty P2P Invitation Request (missing dialog token)
  279. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=None)
  280. hapd.mgmt_tx(msg)
  281. dialog_token = 0
  282. # Various p2p_parse() failure cases due to invalid attributes
  283. # Too short attribute header
  284. dialog_token += 1
  285. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  286. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  287. msg['payload'] += ie_p2p(attrs)
  288. hapd.mgmt_tx(msg)
  289. # Minimal attribute underflow
  290. dialog_token += 1
  291. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  292. attrs = struct.pack("<BH", P2P_ATTR_CAPABILITY, 1)
  293. msg['payload'] += ie_p2p(attrs)
  294. hapd.mgmt_tx(msg)
  295. # Large attribute underflow
  296. dialog_token += 1
  297. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  298. attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 0xffff, 1)
  299. msg['payload'] += ie_p2p(attrs)
  300. hapd.mgmt_tx(msg)
  301. # Too short Capability attribute
  302. dialog_token += 1
  303. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  304. attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 1, 0)
  305. msg['payload'] += ie_p2p(attrs)
  306. hapd.mgmt_tx(msg)
  307. # Too short Device ID attribute
  308. dialog_token += 1
  309. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  310. val = struct.unpack('5B', binascii.unhexlify("1122334455"))
  311. t = (P2P_ATTR_DEVICE_ID, 5) + val
  312. attrs = struct.pack('<BH5B', *t)
  313. msg['payload'] += ie_p2p(attrs)
  314. hapd.mgmt_tx(msg)
  315. # Too short GO Intent attribute
  316. dialog_token += 1
  317. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  318. attrs = struct.pack("<BH", P2P_ATTR_GROUP_OWNER_INTENT, 0)
  319. msg['payload'] += ie_p2p(attrs)
  320. hapd.mgmt_tx(msg)
  321. # Too short Status attribute
  322. dialog_token += 1
  323. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  324. attrs = struct.pack("<BH", P2P_ATTR_STATUS, 0)
  325. msg['payload'] += ie_p2p(attrs)
  326. hapd.mgmt_tx(msg)
  327. # null Listen channel and too short Listen Channel attribute
  328. dialog_token += 1
  329. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  330. attrs = struct.pack("<BH", P2P_ATTR_LISTEN_CHANNEL, 0)
  331. attrs += struct.pack("<BHB", P2P_ATTR_LISTEN_CHANNEL, 1, 0)
  332. msg['payload'] += ie_p2p(attrs)
  333. hapd.mgmt_tx(msg)
  334. # null Operating channel and too short Operating Channel attribute
  335. dialog_token += 1
  336. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  337. attrs = struct.pack("<BH", P2P_ATTR_OPERATING_CHANNEL, 0)
  338. attrs += struct.pack("<BHB", P2P_ATTR_OPERATING_CHANNEL, 1, 0)
  339. msg['payload'] += ie_p2p(attrs)
  340. hapd.mgmt_tx(msg)
  341. # Too short Channel List attribute
  342. dialog_token += 1
  343. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  344. attrs = struct.pack("<BHBB", P2P_ATTR_CHANNEL_LIST, 2, 1, 2)
  345. msg['payload'] += ie_p2p(attrs)
  346. hapd.mgmt_tx(msg)
  347. # Too short Device Info attribute
  348. dialog_token += 1
  349. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  350. attrs = struct.pack("<BHBB", P2P_ATTR_DEVICE_INFO, 2, 1, 2)
  351. msg['payload'] += ie_p2p(attrs)
  352. hapd.mgmt_tx(msg)
  353. # Truncated Secondary Device Types in Device Info attribute
  354. dialog_token += 1
  355. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  356. attrs = struct.pack("<BH6BH8BB", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1,
  357. 0, 0, 0, 0, 0, 0,
  358. 0,
  359. 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22,
  360. 255)
  361. msg['payload'] += ie_p2p(attrs)
  362. hapd.mgmt_tx(msg)
  363. # Missing Device Name in Device Info attribute
  364. dialog_token += 1
  365. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  366. attrs = struct.pack("<BH6BH8BB8B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8,
  367. 0, 0, 0, 0, 0, 0,
  368. 0,
  369. 0, 0, 0, 0, 0, 0, 0, 0,
  370. 1,
  371. 1, 2, 3, 4, 5, 6, 7, 8)
  372. msg['payload'] += ie_p2p(attrs)
  373. hapd.mgmt_tx(msg)
  374. # Invalid Device Name header in Device Info attribute
  375. dialog_token += 1
  376. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  377. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
  378. 0, 0, 0, 0, 0, 0,
  379. 0,
  380. 0, 0, 0, 0, 0, 0, 0, 0,
  381. 1,
  382. 1, 2, 3, 4, 5, 6, 7, 8,
  383. 0x11, 0x12, 0, 0)
  384. msg['payload'] += ie_p2p(attrs)
  385. hapd.mgmt_tx(msg)
  386. # Invalid Device Name header length in Device Info attribute
  387. dialog_token += 1
  388. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  389. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
  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, 0xff, 0xff)
  396. msg['payload'] += ie_p2p(attrs)
  397. hapd.mgmt_tx(msg)
  398. # Invalid Device Name header length in Device Info attribute
  399. dialog_token += 1
  400. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  401. devname = 'A'
  402. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
  403. 0, 0, 0, 0, 0, 0,
  404. 0,
  405. 0, 0, 0, 0, 0, 0, 0, 0,
  406. 1,
  407. 1, 2, 3, 4, 5, 6, 7, 8,
  408. 0x10, 0x11, 0, len(devname) + 1) + devname
  409. msg['payload'] += ie_p2p(attrs)
  410. hapd.mgmt_tx(msg)
  411. # Device Name filtering and too long Device Name in Device Info attribute
  412. dialog_token += 1
  413. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  414. attrs = struct.pack("<BH6BH8BB8B4B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + 4,
  415. 0, 0, 0, 0, 0, 0,
  416. 0,
  417. 0, 0, 0, 0, 0, 0, 0, 0,
  418. 1,
  419. 1, 2, 3, 4, 5, 6, 7, 8,
  420. 0x10, 0x11, 0, 4,
  421. 64, 9, 0, 64)
  422. devname = '123456789012345678901234567890123'
  423. attrs += struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
  424. 0, 0, 0, 0, 0, 0,
  425. 0,
  426. 0, 0, 0, 0, 0, 0, 0, 0,
  427. 1,
  428. 1, 2, 3, 4, 5, 6, 7, 8,
  429. 0x10, 0x11, 0, len(devname)) + devname
  430. msg['payload'] += ie_p2p(attrs)
  431. hapd.mgmt_tx(msg)
  432. # Too short Configuration Timeout attribute
  433. dialog_token += 1
  434. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  435. attrs = struct.pack("<BHB", P2P_ATTR_CONFIGURATION_TIMEOUT, 1, 1)
  436. msg['payload'] += ie_p2p(attrs)
  437. hapd.mgmt_tx(msg)
  438. # Too short Intended P2P Interface Address attribute
  439. dialog_token += 1
  440. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  441. attrs = struct.pack("<BHB", P2P_ATTR_INTENDED_INTERFACE_ADDR, 1, 1)
  442. msg['payload'] += ie_p2p(attrs)
  443. hapd.mgmt_tx(msg)
  444. # Too short P2P Group BSSID attribute
  445. dialog_token += 1
  446. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  447. attrs = struct.pack("<BHB", P2P_ATTR_GROUP_BSSID, 1, 1)
  448. msg['payload'] += ie_p2p(attrs)
  449. hapd.mgmt_tx(msg)
  450. # Too short P2P Group ID attribute
  451. dialog_token += 1
  452. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  453. attrs = struct.pack("<BHB", P2P_ATTR_GROUP_ID, 1, 1)
  454. msg['payload'] += ie_p2p(attrs)
  455. hapd.mgmt_tx(msg)
  456. # Too long P2P Group ID attribute
  457. dialog_token += 1
  458. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  459. attrs = struct.pack("<BH6B", P2P_ATTR_GROUP_ID, 6 + 33, 0, 0, 0, 0, 0, 0) + "123456789012345678901234567890123"
  460. msg['payload'] += ie_p2p(attrs)
  461. hapd.mgmt_tx(msg)
  462. # Too short Invitation Flags attribute
  463. dialog_token += 1
  464. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  465. attrs = struct.pack("<BH", P2P_ATTR_INVITATION_FLAGS, 0)
  466. msg['payload'] += ie_p2p(attrs)
  467. hapd.mgmt_tx(msg)
  468. # Valid and too short Manageability attribute
  469. dialog_token += 1
  470. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  471. attrs = p2p_attr_manageability()
  472. attrs += struct.pack("<BH", P2P_ATTR_MANAGEABILITY, 0)
  473. msg['payload'] += ie_p2p(attrs)
  474. hapd.mgmt_tx(msg)
  475. # Too short NoA attribute
  476. dialog_token += 1
  477. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  478. attrs = struct.pack("<BHB", P2P_ATTR_NOTICE_OF_ABSENCE, 1, 1)
  479. msg['payload'] += ie_p2p(attrs)
  480. hapd.mgmt_tx(msg)
  481. # Valid and too short Extended Listen Timing attributes
  482. dialog_token += 1
  483. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  484. attrs = p2p_attr_ext_listen_timing(period=100, interval=50)
  485. attrs += struct.pack("<BHBBB", P2P_ATTR_EXT_LISTEN_TIMING, 3, 0, 0, 0)
  486. msg['payload'] += ie_p2p(attrs)
  487. hapd.mgmt_tx(msg)
  488. # Valid and too short Minor Reason Code attributes
  489. dialog_token += 1
  490. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  491. attrs = p2p_attr_minor_reason_code(code=2)
  492. attrs += struct.pack("<BH", P2P_ATTR_MINOR_REASON_CODE, 0)
  493. msg['payload'] += ie_p2p(attrs)
  494. hapd.mgmt_tx(msg)
  495. # Unknown attribute and too short OOB GO Negotiation Channel attribute
  496. dialog_token += 1
  497. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  498. attrs = struct.pack("<BHB", 99, 1, 1)
  499. attrs += struct.pack("<BHB", P2P_ATTR_OOB_GO_NEG_CHANNEL, 1, 1)
  500. msg['payload'] += ie_p2p(attrs)
  501. hapd.mgmt_tx(msg)
  502. if hapd.mgmt_rx(timeout=0.5) is not None:
  503. raise Exception("Unexpected management frame received")
  504. dev[0].dump_monitor()
  505. dialog_token += 1
  506. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  507. attrs = p2p_attr_config_timeout()
  508. attrs += p2p_attr_invitation_flags()
  509. attrs += p2p_attr_operating_channel()
  510. attrs += p2p_attr_group_bssid(src)
  511. attrs += p2p_attr_channel_list()
  512. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  513. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  514. msg['payload'] += ie_p2p(attrs)
  515. hapd.mgmt_tx(msg)
  516. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  517. if ev is None:
  518. raise Exception("Timeout on device found event")
  519. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  520. if ev is None:
  521. raise Exception("Timeout on invitation event " + str(dialog_token))
  522. if hapd.mgmt_rx(timeout=1) is None:
  523. raise Exception("No invitation response " + str(dialog_token))
  524. time.sleep(0.1)
  525. dev[0].dump_monitor()
  526. dialog_token += 1
  527. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  528. attrs = p2p_attr_config_timeout()
  529. attrs += p2p_attr_invitation_flags()
  530. attrs += p2p_attr_operating_channel()
  531. attrs += p2p_attr_group_bssid(src)
  532. attrs += p2p_attr_channel_list()
  533. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  534. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  535. msg['payload'] += ie_p2p(attrs)
  536. hapd.mgmt_tx(msg)
  537. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  538. if ev is None:
  539. raise Exception("Timeout on invitation event " + str(dialog_token))
  540. if hapd.mgmt_rx(timeout=1) is None:
  541. raise Exception("No invitation response " + str(dialog_token))
  542. time.sleep(0.1)
  543. dev[0].dump_monitor()
  544. dialog_token += 1
  545. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  546. #attrs = p2p_attr_config_timeout()
  547. attrs = p2p_attr_invitation_flags()
  548. attrs += p2p_attr_operating_channel()
  549. attrs += p2p_attr_group_bssid(src)
  550. attrs += p2p_attr_channel_list()
  551. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  552. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  553. msg['payload'] += ie_p2p(attrs)
  554. hapd.mgmt_tx(msg)
  555. if hapd.mgmt_rx(timeout=1) is None:
  556. raise Exception("No invitation response " + str(dialog_token))
  557. time.sleep(0.1)
  558. dev[0].dump_monitor()
  559. dialog_token += 1
  560. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  561. attrs = p2p_attr_config_timeout()
  562. #attrs = p2p_attr_invitation_flags()
  563. attrs += p2p_attr_operating_channel()
  564. attrs += p2p_attr_group_bssid(src)
  565. attrs += p2p_attr_channel_list()
  566. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  567. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  568. msg['payload'] += ie_p2p(attrs)
  569. hapd.mgmt_tx(msg)
  570. if hapd.mgmt_rx(timeout=1) is None:
  571. raise Exception("No invitation response " + str(dialog_token))
  572. time.sleep(0.1)
  573. dev[0].dump_monitor()
  574. dialog_token += 1
  575. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  576. attrs = p2p_attr_config_timeout()
  577. attrs = p2p_attr_invitation_flags()
  578. #attrs += p2p_attr_operating_channel()
  579. attrs += p2p_attr_group_bssid(src)
  580. attrs += p2p_attr_channel_list()
  581. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  582. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  583. msg['payload'] += ie_p2p(attrs)
  584. hapd.mgmt_tx(msg)
  585. if hapd.mgmt_rx(timeout=1) is None:
  586. raise Exception("No invitation response " + str(dialog_token))
  587. time.sleep(0.1)
  588. dev[0].dump_monitor()
  589. dialog_token += 1
  590. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  591. attrs = p2p_attr_config_timeout()
  592. attrs = p2p_attr_invitation_flags()
  593. attrs += p2p_attr_operating_channel()
  594. #attrs += p2p_attr_group_bssid(src)
  595. attrs += p2p_attr_channel_list()
  596. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  597. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  598. msg['payload'] += ie_p2p(attrs)
  599. hapd.mgmt_tx(msg)
  600. if hapd.mgmt_rx(timeout=1) is None:
  601. raise Exception("No invitation response " + str(dialog_token))
  602. time.sleep(0.1)
  603. dev[0].dump_monitor()
  604. dialog_token += 1
  605. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  606. attrs = p2p_attr_config_timeout()
  607. attrs = p2p_attr_invitation_flags()
  608. attrs += p2p_attr_operating_channel()
  609. attrs += p2p_attr_group_bssid(src)
  610. #attrs += p2p_attr_channel_list()
  611. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  612. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  613. msg['payload'] += ie_p2p(attrs)
  614. hapd.mgmt_tx(msg)
  615. if hapd.mgmt_rx(timeout=1) is None:
  616. raise Exception("No invitation response " + str(dialog_token))
  617. time.sleep(0.1)
  618. dev[0].dump_monitor()
  619. dialog_token += 1
  620. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  621. attrs = p2p_attr_config_timeout()
  622. attrs = p2p_attr_invitation_flags()
  623. attrs += p2p_attr_operating_channel()
  624. attrs += p2p_attr_group_bssid(src)
  625. attrs += p2p_attr_channel_list()
  626. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  627. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  628. msg['payload'] += ie_p2p(attrs)
  629. hapd.mgmt_tx(msg)
  630. if hapd.mgmt_rx(timeout=1) is None:
  631. raise Exception("No invitation response " + str(dialog_token))
  632. time.sleep(0.1)
  633. dev[0].dump_monitor()
  634. dialog_token += 1
  635. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  636. attrs = p2p_attr_config_timeout()
  637. attrs = p2p_attr_invitation_flags()
  638. attrs += p2p_attr_operating_channel()
  639. attrs += p2p_attr_group_bssid(src)
  640. attrs += p2p_attr_channel_list()
  641. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  642. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  643. msg['payload'] += ie_p2p(attrs)
  644. hapd.mgmt_tx(msg)
  645. if hapd.mgmt_rx(timeout=1) is None:
  646. raise Exception("No invitation response " + str(dialog_token))
  647. time.sleep(0.1)
  648. dev[0].dump_monitor()
  649. dialog_token += 1
  650. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  651. hapd.mgmt_tx(msg)
  652. if hapd.mgmt_rx(timeout=1) is None:
  653. raise Exception("No invitation response " + str(dialog_token))
  654. # Unusable peer operating channel preference
  655. time.sleep(0.1)
  656. dev[0].dump_monitor()
  657. dialog_token += 1
  658. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  659. attrs = p2p_attr_config_timeout()
  660. attrs = p2p_attr_invitation_flags()
  661. attrs += p2p_attr_operating_channel(chan=15)
  662. attrs += p2p_attr_group_bssid(src)
  663. attrs += p2p_attr_channel_list()
  664. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  665. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  666. msg['payload'] += ie_p2p(attrs)
  667. hapd.mgmt_tx(msg)
  668. if hapd.mgmt_rx(timeout=1) is None:
  669. raise Exception("No invitation response " + str(dialog_token))
  670. def test_p2p_msg_invitation_req_to_go(dev, apdev):
  671. """P2P protocol tests for invitation request processing on GO device"""
  672. res = form(dev[0], dev[1])
  673. dev[0].dump_monitor()
  674. dev[1].dump_monitor()
  675. addr0 = dev[0].p2p_dev_addr()
  676. addr1 = dev[1].p2p_dev_addr()
  677. peer = dev[1].get_peer(addr0)
  678. listen_freq = peer['listen_freq']
  679. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  680. raise Exception("Failed to enable external management frame handling")
  681. networks = dev[0].list_networks()
  682. if len(networks) != 1:
  683. raise Exception("Unexpected number of networks")
  684. if "[P2P-PERSISTENT]" not in networks[0]['flags']:
  685. raise Exception("Not the persistent group data")
  686. dev[0].p2p_start_go(persistent=networks[0]['id'], freq=listen_freq)
  687. dialog_token = 0
  688. # Unusable peer operating channel preference
  689. dialog_token += 1
  690. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
  691. dialog_token=dialog_token)
  692. attrs = p2p_attr_config_timeout()
  693. attrs = p2p_attr_invitation_flags(bitmap=1)
  694. attrs += p2p_attr_operating_channel(chan=15)
  695. attrs += p2p_attr_channel_list()
  696. attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
  697. attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
  698. msg['payload'] += ie_p2p(attrs)
  699. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  700. rx_msg = dev[1].mgmt_rx()
  701. if rx_msg is None:
  702. raise Exception("MGMT-RX timeout")
  703. p2p = parse_p2p_public_action(rx_msg['payload'])
  704. if p2p is None:
  705. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  706. if p2p['subtype'] != P2P_INVITATION_RESP:
  707. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  708. if p2p['p2p_status'] != 0:
  709. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  710. # Forced channel re-selection due to channel list
  711. dialog_token += 1
  712. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
  713. dialog_token=dialog_token)
  714. attrs = p2p_attr_config_timeout()
  715. attrs = p2p_attr_invitation_flags(bitmap=1)
  716. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  717. 0x58, 0x58, 0x04,
  718. 81, 1, 3)
  719. attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
  720. attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
  721. msg['payload'] += ie_p2p(attrs)
  722. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  723. rx_msg = dev[1].mgmt_rx()
  724. if rx_msg is None:
  725. raise Exception("MGMT-RX timeout")
  726. p2p = parse_p2p_public_action(rx_msg['payload'])
  727. if p2p is None:
  728. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  729. if p2p['subtype'] != P2P_INVITATION_RESP:
  730. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  731. if p2p['p2p_status'] != 7:
  732. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  733. def test_p2p_msg_invitation_req_unknown(dev, apdev):
  734. """P2P protocol tests for invitation request from unknown peer"""
  735. dst, src, hapd, channel = start_p2p(dev, apdev)
  736. dialog_token = 0
  737. dialog_token += 1
  738. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  739. attrs = p2p_attr_config_timeout()
  740. attrs += p2p_attr_invitation_flags()
  741. attrs += p2p_attr_operating_channel()
  742. attrs += p2p_attr_group_bssid(src)
  743. attrs += p2p_attr_channel_list()
  744. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  745. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  746. msg['payload'] += ie_p2p(attrs)
  747. hapd.mgmt_tx(msg)
  748. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  749. if ev is None:
  750. raise Exception("Timeout on invitation event " + str(dialog_token))
  751. if hapd.mgmt_rx(timeout=1) is None:
  752. raise Exception("No invitation response " + str(dialog_token))
  753. def test_p2p_msg_invitation_no_common_channels(dev, apdev):
  754. """P2P protocol tests for invitation request without common channels"""
  755. dst, src, hapd, channel = start_p2p(dev, apdev)
  756. dialog_token = 0
  757. dialog_token += 1
  758. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  759. attrs = p2p_attr_config_timeout()
  760. attrs += p2p_attr_invitation_flags()
  761. attrs += p2p_attr_operating_channel()
  762. attrs += p2p_attr_group_bssid(src)
  763. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  764. 0x58, 0x58, 0x04,
  765. 81, 0)
  766. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  767. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  768. msg['payload'] += ie_p2p(attrs)
  769. hapd.mgmt_tx(msg)
  770. if hapd.mgmt_rx(timeout=1) is None:
  771. raise Exception("No invitation response " + str(dialog_token))
  772. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=0.1)
  773. if ev is not None:
  774. raise Exception("Unexpected invitation event")
  775. def test_p2p_msg_invitation_resp(dev, apdev):
  776. """P2P protocol tests for invitation response processing"""
  777. form(dev[0], dev[1])
  778. dev[0].dump_monitor()
  779. dev[1].dump_monitor()
  780. dst, src, hapd, channel = start_p2p(dev, apdev)
  781. addr0 = dev[0].p2p_dev_addr()
  782. addr1 = dev[1].p2p_dev_addr()
  783. peer = dev[1].get_peer(addr0)
  784. # P2P Invitation Response from unknown peer
  785. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=1)
  786. hapd.mgmt_tx(msg)
  787. # P2P Invitation Response from peer that is not in invitation
  788. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=2)
  789. attrs = p2p_attr_status()
  790. msg['payload'] += ie_p2p(attrs)
  791. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  792. time.sleep(0.25)
  793. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  794. raise Exception("Failed to enable external management frame handling")
  795. invite(dev[0], dev[1])
  796. rx_msg = dev[1].mgmt_rx()
  797. if rx_msg is None:
  798. raise Exception("MGMT-RX timeout")
  799. p2p = parse_p2p_public_action(rx_msg['payload'])
  800. if p2p is None:
  801. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  802. if p2p['subtype'] != P2P_INVITATION_REQ:
  803. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  804. # Invalid attribute to cause p2p_parse() failure
  805. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  806. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  807. msg['payload'] += ie_p2p(attrs)
  808. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  809. invite(dev[0], dev[1])
  810. rx_msg = dev[1].mgmt_rx()
  811. if rx_msg is None:
  812. raise Exception("MGMT-RX timeout")
  813. p2p = parse_p2p_public_action(rx_msg['payload'])
  814. if p2p is None:
  815. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  816. if p2p['subtype'] != P2P_INVITATION_REQ:
  817. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  818. # missing mandatory Status attribute
  819. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  820. attrs = p2p_attr_channel_list()
  821. msg['payload'] += ie_p2p(attrs)
  822. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  823. invite(dev[0], dev[1])
  824. rx_msg = dev[1].mgmt_rx()
  825. if rx_msg is None:
  826. raise Exception("MGMT-RX timeout")
  827. p2p = parse_p2p_public_action(rx_msg['payload'])
  828. if p2p is None:
  829. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  830. if p2p['subtype'] != P2P_INVITATION_REQ:
  831. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  832. # no channel match (no common channel found at all)
  833. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  834. attrs = p2p_attr_status()
  835. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  836. 0x58, 0x58, 0x04,
  837. 81, 1, 15)
  838. msg['payload'] += ie_p2p(attrs)
  839. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  840. invite(dev[0], dev[1])
  841. rx_msg = dev[1].mgmt_rx()
  842. if rx_msg is None:
  843. raise Exception("MGMT-RX timeout")
  844. p2p = parse_p2p_public_action(rx_msg['payload'])
  845. if p2p is None:
  846. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  847. if p2p['subtype'] != P2P_INVITATION_REQ:
  848. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  849. # no channel match (no acceptable P2P channel)
  850. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  851. attrs = p2p_attr_status()
  852. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  853. 0x58, 0x58, 0x04,
  854. 81, 1, 12)
  855. msg['payload'] += ie_p2p(attrs)
  856. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  857. invite(dev[0], dev[1])
  858. rx_msg = dev[1].mgmt_rx()
  859. if rx_msg is None:
  860. raise Exception("MGMT-RX timeout")
  861. p2p = parse_p2p_public_action(rx_msg['payload'])
  862. if p2p is None:
  863. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  864. if p2p['subtype'] != P2P_INVITATION_REQ:
  865. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  866. # missing mandatory Channel List attribute (ignored as a workaround)
  867. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  868. attrs = p2p_attr_status()
  869. msg['payload'] += ie_p2p(attrs)
  870. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  871. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
  872. if ev is None:
  873. raise Exception("Group was not started")
  874. def test_p2p_msg_invitation_resend(dev, apdev):
  875. """P2P protocol tests for invitation resending on no-common-channels"""
  876. form(dev[0], dev[1])
  877. dev[0].dump_monitor()
  878. dev[1].dump_monitor()
  879. addr0 = dev[0].p2p_dev_addr()
  880. addr1 = dev[1].p2p_dev_addr()
  881. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  882. raise Exception("Failed to enable external management frame handling")
  883. logger.info("Forced channel in invitation")
  884. invite(dev[0], dev[1], extra="freq=2422")
  885. rx_msg = dev[1].mgmt_rx()
  886. if rx_msg is None:
  887. raise Exception("MGMT-RX timeout")
  888. p2p = parse_p2p_public_action(rx_msg['payload'])
  889. if p2p is None:
  890. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  891. if p2p['subtype'] != P2P_INVITATION_REQ:
  892. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  893. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
  894. dialog_token=p2p['dialog_token'])
  895. attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
  896. msg['payload'] += ie_p2p(attrs)
  897. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  898. ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
  899. if ev is None:
  900. raise Exception("Timeout on invitation result");
  901. if "status=7" not in ev:
  902. raise Exception("Unexpected invitation result: " + ev)
  903. logger.info("Any channel allowed, only preference provided in invitation");
  904. invite(dev[0], dev[1], extra="pref=2422")
  905. rx_msg = dev[1].mgmt_rx()
  906. if rx_msg is None:
  907. raise Exception("MGMT-RX timeout")
  908. p2p = parse_p2p_public_action(rx_msg['payload'])
  909. if p2p is None:
  910. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  911. if p2p['subtype'] != P2P_INVITATION_REQ:
  912. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  913. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
  914. dialog_token=p2p['dialog_token'])
  915. attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
  916. msg['payload'] += ie_p2p(attrs)
  917. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
  918. raise Exception("Failed to disable external management frame handling")
  919. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  920. ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
  921. if ev is None:
  922. raise Exception("Timeout on invitation result");
  923. if "status=0" not in ev:
  924. raise Exception("Unexpected invitation result: " + ev)
  925. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
  926. if ev is None:
  927. raise Exception("Group was not started on dev0")
  928. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
  929. if ev is None:
  930. raise Exception("Group was not started on dev1")
  931. def test_p2p_msg_invitation_resend_duplicate(dev, apdev):
  932. """P2P protocol tests for invitation resending on no-common-channels and duplicated response"""
  933. form(dev[0], dev[1])
  934. dev[0].dump_monitor()
  935. dev[1].dump_monitor()
  936. addr0 = dev[0].p2p_dev_addr()
  937. addr1 = dev[1].p2p_dev_addr()
  938. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  939. raise Exception("Failed to enable external management frame handling")
  940. logger.info("Any channel allowed, only preference provided in invitation");
  941. invite(dev[0], dev[1], extra="pref=2422")
  942. rx_msg = dev[1].mgmt_rx()
  943. if rx_msg is None:
  944. raise Exception("MGMT-RX timeout")
  945. p2p = parse_p2p_public_action(rx_msg['payload'])
  946. if p2p is None:
  947. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  948. if p2p['subtype'] != P2P_INVITATION_REQ:
  949. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  950. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
  951. dialog_token=p2p['dialog_token'])
  952. attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
  953. msg['payload'] += ie_p2p(attrs)
  954. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  955. rx_msg = dev[1].mgmt_rx()
  956. if rx_msg is None:
  957. raise Exception("MGMT-RX timeout")
  958. p2p = parse_p2p_public_action(rx_msg['payload'])
  959. if p2p is None:
  960. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  961. if p2p['subtype'] != P2P_INVITATION_REQ:
  962. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  963. logger.info("Retransmit duplicate of previous response")
  964. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  965. logger.info("Transmit real response")
  966. msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
  967. dialog_token=p2p['dialog_token'])
  968. attrs = p2p_attr_status(status=P2P_SC_SUCCESS)
  969. attrs += p2p_attr_channel_list()
  970. msg['payload'] += ie_p2p(attrs)
  971. if "FAIL" in dev[1].request("MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload']))):
  972. raise Exception("Failed to transmit real response")
  973. dev[1].request("SET ext_mgmt_frame_handling 0")
  974. ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=10)
  975. if ev is None:
  976. raise Exception("Timeout on invitation result");
  977. if "status=0" not in ev:
  978. raise Exception("Unexpected invitation result: " + ev)
  979. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  980. if ev is None:
  981. raise Exception("Group formation timed out")
  982. dev[0].group_form_result(ev)
  983. dev[0].remove_group()
  984. def test_p2p_msg_pd_req(dev, apdev):
  985. """P2P protocol tests for provision discovery request processing"""
  986. dst, src, hapd, channel = start_p2p(dev, apdev)
  987. dialog_token = 0
  988. # Too short attribute header
  989. dialog_token += 1
  990. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  991. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  992. msg['payload'] += ie_p2p(attrs)
  993. hapd.mgmt_tx(msg)
  994. if hapd.mgmt_rx(timeout=0.5) is not None:
  995. raise Exception("Unexpected management frame received")
  996. # No attributes
  997. dialog_token += 1
  998. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  999. attrs = ""
  1000. msg['payload'] += ie_p2p(attrs)
  1001. hapd.mgmt_tx(msg)
  1002. if hapd.mgmt_rx(timeout=1) is None:
  1003. raise Exception("No PD response " + str(dialog_token))
  1004. # Valid request
  1005. time.sleep(0.1)
  1006. dialog_token += 1
  1007. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  1008. attrs = wsc_attr_config_methods(methods=0x1008)
  1009. msg['payload'] += ie_wsc(attrs)
  1010. attrs = p2p_attr_capability()
  1011. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1012. msg['payload'] += ie_p2p(attrs)
  1013. hapd.mgmt_tx(msg)
  1014. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  1015. if ev is None:
  1016. raise Exception("Timeout on device found event")
  1017. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  1018. if ev is None:
  1019. raise Exception("Timeout on PD event")
  1020. if hapd.mgmt_rx(timeout=1) is None:
  1021. raise Exception("No PD response " + str(dialog_token))
  1022. # Unknown group
  1023. time.sleep(0.1)
  1024. dialog_token += 1
  1025. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  1026. attrs = wsc_attr_config_methods(methods=0x1008)
  1027. msg['payload'] += ie_wsc(attrs)
  1028. attrs = p2p_attr_capability()
  1029. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1030. attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
  1031. msg['payload'] += ie_p2p(attrs)
  1032. hapd.mgmt_tx(msg)
  1033. if hapd.mgmt_rx(timeout=1) is None:
  1034. raise Exception("No PD response " + str(dialog_token))
  1035. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
  1036. if ev is not None:
  1037. raise Exception("Unexpected PD event")
  1038. # Listen channel is not yet known
  1039. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  1040. raise Exception("Unexpected P2P_PROV_DISC success")
  1041. # Unknown peer
  1042. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
  1043. raise Exception("Unexpected P2P_PROV_DISC success (2)")
  1044. def test_p2p_msg_pd(dev, apdev):
  1045. """P2P protocol tests for provision discovery request processing (known)"""
  1046. dst, src, hapd, channel = start_p2p(dev, apdev)
  1047. dialog_token = 0
  1048. p2p_probe(hapd, src, chan=channel)
  1049. time.sleep(0.1)
  1050. # Valid request
  1051. dialog_token += 1
  1052. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  1053. attrs = wsc_attr_config_methods(methods=0x1008)
  1054. msg['payload'] += ie_wsc(attrs)
  1055. attrs = p2p_attr_capability()
  1056. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1057. msg['payload'] += ie_p2p(attrs)
  1058. hapd.mgmt_tx(msg)
  1059. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  1060. if ev is None:
  1061. raise Exception("Timeout on device found event")
  1062. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  1063. if ev is None:
  1064. raise Exception("Timeout on PD event")
  1065. if hapd.mgmt_rx(timeout=1) is None:
  1066. raise Exception("No PD response " + str(dialog_token))
  1067. if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  1068. raise Exception("Unexpected P2P_PROV_DISC failure")
  1069. frame = hapd.mgmt_rx(timeout=1)
  1070. if frame is None:
  1071. raise Exception("No PD request " + str(dialog_token))
  1072. p2p = parse_p2p_public_action(frame['payload'])
  1073. if p2p is None:
  1074. raise Exception("Failed to parse PD request")
  1075. # invalid dialog token
  1076. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  1077. dialog_token=p2p['dialog_token'] + 1)
  1078. hapd.mgmt_tx(msg)
  1079. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  1080. if ev is not None:
  1081. raise Exception("Unexpected PD result event")
  1082. # valid dialog token
  1083. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  1084. dialog_token=p2p['dialog_token'])
  1085. hapd.mgmt_tx(msg)
  1086. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
  1087. if ev is None:
  1088. raise Exception("Timeout on PD result event")
  1089. # valid dialog token
  1090. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  1091. dialog_token=p2p['dialog_token'])
  1092. hapd.mgmt_tx(msg)
  1093. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  1094. if ev is not None:
  1095. raise Exception("Unexpected PD result event")
  1096. def check_p2p_response(hapd, dialog_token, status):
  1097. resp = hapd.mgmt_rx(timeout=1)
  1098. if resp is None:
  1099. raise Exception("No GO Neg Response " + str(dialog_token))
  1100. p2p = parse_p2p_public_action(resp['payload'])
  1101. if p2p is None:
  1102. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1103. if dialog_token != p2p['dialog_token']:
  1104. raise Exception("Unexpected dialog token in response")
  1105. if p2p['p2p_status'] != status:
  1106. raise Exception("Unexpected status code %s in response (expected %d)" % (p2p['p2p_status'], status))
  1107. def test_p2p_msg_go_neg_both_start(dev, apdev):
  1108. """P2P protocol test for simultaneous GO Neg initiation"""
  1109. addr0 = dev[0].p2p_dev_addr()
  1110. addr1 = dev[1].p2p_dev_addr()
  1111. dev[0].p2p_listen()
  1112. dev[1].discover_peer(addr0)
  1113. dev[1].p2p_listen()
  1114. dev[0].discover_peer(addr1)
  1115. dev[0].p2p_listen()
  1116. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
  1117. raise Exception("Failed to enable external management frame handling")
  1118. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  1119. raise Exception("Failed to enable external management frame handling")
  1120. dev[0].request("P2P_CONNECT {} pbc".format(addr1))
  1121. dev[1].request("P2P_CONNECT {} pbc".format(addr0))
  1122. msg = dev[0].mgmt_rx()
  1123. if msg is None:
  1124. raise Exception("MGMT-RX timeout")
  1125. msg = dev[1].mgmt_rx()
  1126. if msg is None:
  1127. raise Exception("MGMT-RX timeout(2)")
  1128. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 0"):
  1129. raise Exception("Failed to disable external management frame handling")
  1130. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=2)
  1131. if ev is not None:
  1132. raise Exception("Unexpected GO Neg success")
  1133. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
  1134. raise Exception("Failed to disable external management frame handling")
  1135. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  1136. if ev is None:
  1137. raise Exception("GO Neg did not succeed")
  1138. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
  1139. if ev is None:
  1140. raise Exception("Group formation not succeed")
  1141. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
  1142. if ev is None:
  1143. raise Exception("Group formation not succeed")
  1144. def test_p2p_msg_go_neg_req(dev, apdev):
  1145. """P2P protocol tests for invitation request from unknown peer"""
  1146. dst, src, hapd, channel = start_p2p(dev, apdev)
  1147. dialog_token = 0
  1148. # invalid attribute
  1149. dialog_token += 1
  1150. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1151. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  1152. msg['payload'] += ie_p2p(attrs)
  1153. hapd.mgmt_tx(msg)
  1154. frame = hapd.mgmt_rx(timeout=0.1)
  1155. if frame is not None:
  1156. print frame
  1157. raise Exception("Unexpected GO Neg Response")
  1158. # missing atributes
  1159. dialog_token += 1
  1160. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1161. attrs = p2p_attr_capability()
  1162. attrs += p2p_attr_go_intent()
  1163. attrs += p2p_attr_config_timeout()
  1164. #attrs += p2p_attr_listen_channel()
  1165. attrs += p2p_attr_ext_listen_timing()
  1166. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1167. attrs += p2p_attr_channel_list()
  1168. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1169. attrs += p2p_attr_operating_channel()
  1170. msg['payload'] += ie_p2p(attrs)
  1171. hapd.mgmt_tx(msg)
  1172. if hapd.mgmt_rx(timeout=1) is None:
  1173. raise Exception("No GO Neg Response " + str(dialog_token))
  1174. time.sleep(0.1)
  1175. dialog_token += 1
  1176. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1177. attrs = p2p_attr_capability()
  1178. attrs += p2p_attr_go_intent()
  1179. attrs += p2p_attr_config_timeout()
  1180. attrs += p2p_attr_listen_channel()
  1181. attrs += p2p_attr_ext_listen_timing()
  1182. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1183. attrs += p2p_attr_channel_list()
  1184. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1185. #attrs += p2p_attr_operating_channel()
  1186. msg['payload'] += ie_p2p(attrs)
  1187. hapd.mgmt_tx(msg)
  1188. if hapd.mgmt_rx(timeout=1) is None:
  1189. raise Exception("No GO Neg Response " + str(dialog_token))
  1190. time.sleep(0.1)
  1191. dialog_token += 1
  1192. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1193. attrs = p2p_attr_capability()
  1194. attrs += p2p_attr_go_intent()
  1195. attrs += p2p_attr_config_timeout()
  1196. attrs += p2p_attr_listen_channel()
  1197. attrs += p2p_attr_ext_listen_timing()
  1198. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1199. #attrs += p2p_attr_channel_list()
  1200. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1201. attrs += p2p_attr_operating_channel()
  1202. msg['payload'] += ie_p2p(attrs)
  1203. hapd.mgmt_tx(msg)
  1204. if hapd.mgmt_rx(timeout=1) is None:
  1205. raise Exception("No GO Neg Response " + str(dialog_token))
  1206. time.sleep(0.1)
  1207. dialog_token += 1
  1208. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1209. attrs = p2p_attr_capability()
  1210. attrs += p2p_attr_go_intent()
  1211. attrs += p2p_attr_config_timeout()
  1212. attrs += p2p_attr_listen_channel()
  1213. attrs += p2p_attr_ext_listen_timing()
  1214. #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1215. attrs += p2p_attr_channel_list()
  1216. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1217. attrs += p2p_attr_operating_channel()
  1218. msg['payload'] += ie_p2p(attrs)
  1219. hapd.mgmt_tx(msg)
  1220. if hapd.mgmt_rx(timeout=1) is None:
  1221. raise Exception("No GO Neg Response " + str(dialog_token))
  1222. time.sleep(0.1)
  1223. dialog_token += 1
  1224. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1225. attrs = p2p_attr_capability()
  1226. attrs += p2p_attr_go_intent()
  1227. attrs += p2p_attr_config_timeout()
  1228. attrs += p2p_attr_listen_channel()
  1229. attrs += p2p_attr_ext_listen_timing()
  1230. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1231. attrs += p2p_attr_channel_list()
  1232. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1233. attrs += p2p_attr_operating_channel()
  1234. msg['payload'] += ie_p2p(attrs)
  1235. hapd.mgmt_tx(msg)
  1236. if hapd.mgmt_rx(timeout=1) is None:
  1237. raise Exception("No GO Neg Response " + str(dialog_token))
  1238. time.sleep(0.1)
  1239. # SA != P2P Device address
  1240. dialog_token += 1
  1241. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1242. attrs = p2p_attr_capability()
  1243. attrs += p2p_attr_go_intent()
  1244. attrs += p2p_attr_config_timeout()
  1245. attrs += p2p_attr_listen_channel()
  1246. attrs += p2p_attr_ext_listen_timing()
  1247. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1248. attrs += p2p_attr_channel_list()
  1249. attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
  1250. attrs += p2p_attr_operating_channel()
  1251. msg['payload'] += ie_p2p(attrs)
  1252. hapd.mgmt_tx(msg)
  1253. if hapd.mgmt_rx(timeout=1) is None:
  1254. raise Exception("No GO Neg Response " + str(dialog_token))
  1255. time.sleep(0.1)
  1256. # unexpected Status attribute
  1257. dialog_token += 1
  1258. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1259. attrs = p2p_attr_capability()
  1260. attrs += p2p_attr_go_intent()
  1261. attrs += p2p_attr_config_timeout()
  1262. attrs += p2p_attr_listen_channel()
  1263. attrs += p2p_attr_ext_listen_timing()
  1264. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1265. attrs += p2p_attr_channel_list()
  1266. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1267. attrs += p2p_attr_operating_channel()
  1268. attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  1269. msg['payload'] += ie_p2p(attrs)
  1270. hapd.mgmt_tx(msg)
  1271. if hapd.mgmt_rx(timeout=1) is None:
  1272. raise Exception("No GO Neg Response(1) " + str(dialog_token))
  1273. time.sleep(0.1)
  1274. # valid (with workarounds) GO Neg Req
  1275. dialog_token += 1
  1276. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1277. #attrs = p2p_attr_capability()
  1278. #attrs += p2p_attr_go_intent()
  1279. #attrs += p2p_attr_config_timeout()
  1280. attrs = p2p_attr_listen_channel()
  1281. attrs += p2p_attr_ext_listen_timing()
  1282. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1283. attrs += p2p_attr_channel_list()
  1284. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1285. attrs += p2p_attr_operating_channel()
  1286. msg['payload'] += ie_p2p(attrs)
  1287. hapd.mgmt_tx(msg)
  1288. check_p2p_response(hapd, dialog_token,
  1289. P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  1290. ev = dev[0].wait_event(["P2P-GO-NEG-REQUEST"], timeout=1)
  1291. if ev is None:
  1292. raise Exception("Timeout on GO Neg event " + str(dialog_token))
  1293. dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
  1294. # ready - missing attributes (with workarounds) GO Neg Req
  1295. time.sleep(0.1)
  1296. dialog_token += 1
  1297. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1298. #attrs = p2p_attr_capability()
  1299. #attrs += p2p_attr_go_intent()
  1300. #attrs += p2p_attr_config_timeout()
  1301. attrs = p2p_attr_listen_channel()
  1302. attrs += p2p_attr_ext_listen_timing()
  1303. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1304. attrs += p2p_attr_channel_list()
  1305. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1306. attrs += p2p_attr_operating_channel()
  1307. msg['payload'] += ie_p2p(attrs)
  1308. hapd.mgmt_tx(msg)
  1309. if hapd.mgmt_rx(timeout=1) is None:
  1310. raise Exception("No GO Neg Response " + str(dialog_token))
  1311. # ready - invalid GO Intent GO Neg Req
  1312. time.sleep(0.1)
  1313. dialog_token += 1
  1314. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1315. #attrs = p2p_attr_capability()
  1316. attrs = p2p_attr_go_intent(go_intent=16)
  1317. #attrs += p2p_attr_config_timeout()
  1318. attrs += p2p_attr_listen_channel()
  1319. attrs += p2p_attr_ext_listen_timing()
  1320. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1321. attrs += p2p_attr_channel_list()
  1322. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1323. attrs += p2p_attr_operating_channel()
  1324. msg['payload'] += ie_p2p(attrs)
  1325. hapd.mgmt_tx(msg)
  1326. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INVALID_PARAMS)
  1327. # ready - invalid Channel List
  1328. time.sleep(0.1)
  1329. dialog_token += 1
  1330. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1331. attrs = p2p_attr_capability()
  1332. attrs += p2p_attr_go_intent()
  1333. attrs += p2p_attr_config_timeout()
  1334. attrs += p2p_attr_listen_channel()
  1335. attrs += p2p_attr_ext_listen_timing()
  1336. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1337. attrs += struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
  1338. 0x58, 0x58, 0x04,
  1339. 81, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
  1340. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1341. attrs += p2p_attr_operating_channel()
  1342. msg['payload'] += ie_p2p(attrs)
  1343. hapd.mgmt_tx(msg)
  1344. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_NO_COMMON_CHANNELS)
  1345. # ready - invalid GO Neg Req (unsupported Device Password ID)
  1346. time.sleep(0.1)
  1347. dialog_token += 1
  1348. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1349. attrs = p2p_attr_capability()
  1350. attrs += p2p_attr_go_intent()
  1351. attrs += p2p_attr_config_timeout()
  1352. attrs += p2p_attr_listen_channel()
  1353. attrs += p2p_attr_ext_listen_timing()
  1354. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1355. # very long channel list
  1356. attrs += struct.pack("<BH3BBB11B30B", P2P_ATTR_CHANNEL_LIST, 46,
  1357. 0x58, 0x58, 0x04,
  1358. 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  1359. 1, 1, 1, 2, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5,
  1360. 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10)
  1361. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1362. attrs += p2p_attr_operating_channel()
  1363. msg['payload'] += ie_p2p(attrs)
  1364. hapd.mgmt_tx(msg)
  1365. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD)
  1366. def mgmt_tx(dev, msg):
  1367. for i in range(0, 20):
  1368. if "FAIL" in dev.request(msg):
  1369. raise Exception("Failed to send Action frame")
  1370. ev = dev.wait_event(["MGMT-TX-STATUS"], timeout=10)
  1371. if ev is None:
  1372. raise Exception("Timeout on MGMT-TX-STATUS")
  1373. if "result=SUCCESS" in ev:
  1374. break
  1375. time.sleep(0.01)
  1376. if "result=SUCCESS" not in ev:
  1377. raise Exception("Peer did not ack Action frame")
  1378. def rx_go_neg_req(dev):
  1379. msg = dev.mgmt_rx()
  1380. if msg is None:
  1381. raise Exception("MGMT-RX timeout")
  1382. p2p = parse_p2p_public_action(msg['payload'])
  1383. if p2p is None:
  1384. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1385. if p2p['subtype'] != P2P_GO_NEG_REQ:
  1386. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  1387. p2p['freq'] = msg['freq']
  1388. return p2p
  1389. def rx_go_neg_conf(dev, status=None, dialog_token=None):
  1390. msg = dev.mgmt_rx()
  1391. if msg is None:
  1392. raise Exception("MGMT-RX timeout")
  1393. p2p = parse_p2p_public_action(msg['payload'])
  1394. if p2p is None:
  1395. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1396. if p2p['subtype'] != P2P_GO_NEG_CONF:
  1397. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  1398. if dialog_token is not None and dialog_token != p2p['dialog_token']:
  1399. raise Exception("Unexpected dialog token")
  1400. if status is not None and p2p['p2p_status'] != status:
  1401. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  1402. def check_p2p_go_neg_fail_event(dev, status):
  1403. ev = dev.wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
  1404. if ev is None:
  1405. raise Exception("GO Negotiation failure not reported")
  1406. if "status=%d" % status not in ev:
  1407. raise Exception("Unexpected failure reason: " + ev)
  1408. def test_p2p_msg_go_neg_req_reject(dev, apdev):
  1409. """P2P protocol tests for user reject incorrectly in GO Neg Req"""
  1410. addr0 = dev[0].p2p_dev_addr()
  1411. addr1 = dev[1].p2p_dev_addr()
  1412. dev[0].p2p_listen()
  1413. dev[1].discover_peer(addr0)
  1414. dev[1].group_request("P2P_CONNECT " + addr0 + " pbc")
  1415. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1416. if ev is None:
  1417. raise Exception("Timeout on GO Neg Req")
  1418. peer = dev[0].get_peer(addr1)
  1419. dev[0].p2p_stop_find()
  1420. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_REQ, dialog_token=123)
  1421. attrs = p2p_attr_capability()
  1422. attrs += p2p_attr_status(status=P2P_SC_FAIL_REJECTED_BY_USER)
  1423. attrs += p2p_attr_go_intent()
  1424. attrs += p2p_attr_config_timeout()
  1425. attrs += p2p_attr_listen_channel()
  1426. attrs += p2p_attr_ext_listen_timing()
  1427. attrs += p2p_attr_intended_interface_addr(addr0)
  1428. attrs += p2p_attr_channel_list()
  1429. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1430. attrs += p2p_attr_operating_channel()
  1431. msg['payload'] += ie_p2p(attrs)
  1432. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1433. ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
  1434. if ev is None:
  1435. raise Exception("GO Negotiation failure not reported")
  1436. if "status=%d" % P2P_SC_FAIL_REJECTED_BY_USER not in ev:
  1437. raise Exception("Unexpected failure reason: " + ev)
  1438. def test_p2p_msg_unexpected_go_neg_resp(dev, apdev):
  1439. """P2P protocol tests for unexpected GO Neg Resp"""
  1440. addr0 = dev[0].p2p_dev_addr()
  1441. addr1 = dev[1].p2p_dev_addr()
  1442. dev[1].p2p_listen()
  1443. dev[0].discover_peer(addr1)
  1444. dev[0].p2p_stop_find()
  1445. peer = dev[0].get_peer(addr1)
  1446. logger.debug("GO Neg Resp without GO Neg session")
  1447. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=123)
  1448. attrs = p2p_attr_status()
  1449. attrs += p2p_attr_capability()
  1450. attrs += p2p_attr_go_intent()
  1451. attrs += p2p_attr_config_timeout()
  1452. attrs += p2p_attr_intended_interface_addr(addr0)
  1453. attrs += p2p_attr_channel_list()
  1454. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1455. attrs += p2p_attr_operating_channel()
  1456. msg['payload'] += ie_p2p(attrs)
  1457. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1458. dev[0].p2p_listen()
  1459. dev[1].discover_peer(addr0)
  1460. logger.debug("Unexpected GO Neg Resp while waiting for new GO Neg session")
  1461. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1462. raise Exception("P2P_CONNECT failed")
  1463. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1464. if ev is None:
  1465. raise Exception("Timeout on GO Neg Req")
  1466. dev[0].p2p_stop_find()
  1467. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1468. logger.debug("Invalid attribute in GO Neg Response")
  1469. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=197)
  1470. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  1471. msg['payload'] += ie_p2p(attrs)
  1472. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1473. frame = dev[0].mgmt_rx(timeout=0.1)
  1474. if frame is not None:
  1475. raise Exception("Unexpected GO Neg Confirm")
  1476. logger.debug("GO Neg Resp with unexpected dialog token")
  1477. dev[1].p2p_stop_find()
  1478. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
  1479. raise Exception("Failed to enable external management frame handling")
  1480. dev[0].p2p_listen()
  1481. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1482. raise Exception("P2P_CONNECT failed(2)")
  1483. p2p = rx_go_neg_req(dev[0])
  1484. dev[0].p2p_stop_find()
  1485. dialog_token = p2p['dialog_token']
  1486. if dialog_token < 255:
  1487. dialog_token += 1
  1488. else:
  1489. dialog_token = 1
  1490. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1491. attrs = p2p_attr_status()
  1492. attrs += p2p_attr_capability()
  1493. attrs += p2p_attr_go_intent()
  1494. attrs += p2p_attr_config_timeout()
  1495. attrs += p2p_attr_intended_interface_addr(addr0)
  1496. attrs += p2p_attr_channel_list()
  1497. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1498. attrs += p2p_attr_operating_channel()
  1499. msg['payload'] += ie_p2p(attrs)
  1500. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1501. logger.debug("GO Neg Resp without Status")
  1502. dev[1].p2p_stop_find()
  1503. dev[0].p2p_listen()
  1504. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1505. raise Exception("P2P_CONNECT failed(2)")
  1506. p2p = rx_go_neg_req(dev[0])
  1507. dev[0].p2p_stop_find()
  1508. dialog_token = p2p['dialog_token']
  1509. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1510. #attrs = p2p_attr_status()
  1511. attrs = p2p_attr_capability()
  1512. attrs += p2p_attr_go_intent()
  1513. attrs += p2p_attr_config_timeout()
  1514. attrs += p2p_attr_intended_interface_addr(addr0)
  1515. attrs += p2p_attr_channel_list()
  1516. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1517. attrs += p2p_attr_operating_channel()
  1518. msg['payload'] += ie_p2p(attrs)
  1519. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1520. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1521. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1522. logger.debug("GO Neg Resp without Intended Address")
  1523. dev[1].p2p_stop_find()
  1524. dev[0].p2p_listen()
  1525. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1526. raise Exception("P2P_CONNECT failed(2)")
  1527. p2p = rx_go_neg_req(dev[0])
  1528. dev[0].p2p_stop_find()
  1529. dialog_token = p2p['dialog_token']
  1530. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1531. attrs = p2p_attr_status()
  1532. #attrs += p2p_attr_capability()
  1533. attrs += p2p_attr_go_intent()
  1534. attrs += p2p_attr_config_timeout()
  1535. #attrs += p2p_attr_intended_interface_addr(addr0)
  1536. attrs += p2p_attr_channel_list()
  1537. #attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1538. attrs += p2p_attr_operating_channel()
  1539. msg['payload'] += ie_p2p(attrs)
  1540. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1541. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1542. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1543. logger.debug("GO Neg Resp without GO Intent")
  1544. dev[1].p2p_stop_find()
  1545. dev[0].p2p_listen()
  1546. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1547. raise Exception("P2P_CONNECT failed(2)")
  1548. p2p = rx_go_neg_req(dev[0])
  1549. dev[0].p2p_stop_find()
  1550. dialog_token = p2p['dialog_token']
  1551. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1552. attrs = p2p_attr_status()
  1553. attrs += p2p_attr_capability()
  1554. #attrs += p2p_attr_go_intent()
  1555. attrs += p2p_attr_config_timeout()
  1556. attrs += p2p_attr_intended_interface_addr(addr0)
  1557. attrs += p2p_attr_channel_list()
  1558. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1559. attrs += p2p_attr_operating_channel()
  1560. msg['payload'] += ie_p2p(attrs)
  1561. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1562. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1563. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1564. logger.debug("GO Neg Resp with invalid GO Intent")
  1565. dev[1].p2p_stop_find()
  1566. dev[0].p2p_listen()
  1567. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1568. raise Exception("P2P_CONNECT failed(2)")
  1569. p2p = rx_go_neg_req(dev[0])
  1570. dev[0].p2p_stop_find()
  1571. dialog_token = p2p['dialog_token']
  1572. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1573. attrs = p2p_attr_status()
  1574. attrs += p2p_attr_capability()
  1575. attrs += p2p_attr_go_intent(go_intent=16)
  1576. attrs += p2p_attr_config_timeout()
  1577. attrs += p2p_attr_intended_interface_addr(addr0)
  1578. attrs += p2p_attr_channel_list()
  1579. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1580. attrs += p2p_attr_operating_channel()
  1581. msg['payload'] += ie_p2p(attrs)
  1582. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1583. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1584. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1585. logger.debug("GO Neg Resp with incompatible GO Intent")
  1586. dev[1].p2p_stop_find()
  1587. dev[0].p2p_listen()
  1588. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15"):
  1589. raise Exception("P2P_CONNECT failed(2)")
  1590. p2p = rx_go_neg_req(dev[0])
  1591. dev[0].p2p_stop_find()
  1592. dialog_token = p2p['dialog_token']
  1593. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1594. attrs = p2p_attr_status()
  1595. attrs += p2p_attr_capability()
  1596. attrs += p2p_attr_go_intent(go_intent=15)
  1597. attrs += p2p_attr_config_timeout()
  1598. attrs += p2p_attr_intended_interface_addr(addr0)
  1599. attrs += p2p_attr_channel_list()
  1600. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1601. attrs += p2p_attr_operating_channel()
  1602. msg['payload'] += ie_p2p(attrs)
  1603. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1604. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INCOMPATIBLE_PARAMS)
  1605. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INCOMPATIBLE_PARAMS, dialog_token)
  1606. logger.debug("GO Neg Resp without P2P Group ID")
  1607. dev[1].p2p_stop_find()
  1608. dev[0].p2p_listen()
  1609. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1610. raise Exception("P2P_CONNECT failed(2)")
  1611. p2p = rx_go_neg_req(dev[0])
  1612. dev[0].p2p_stop_find()
  1613. dialog_token = p2p['dialog_token']
  1614. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1615. attrs = p2p_attr_status()
  1616. attrs += p2p_attr_capability()
  1617. attrs += p2p_attr_go_intent(go_intent=15)
  1618. attrs += p2p_attr_config_timeout()
  1619. attrs += p2p_attr_intended_interface_addr(addr0)
  1620. attrs += p2p_attr_channel_list()
  1621. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1622. attrs += p2p_attr_operating_channel()
  1623. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  1624. msg['payload'] += ie_p2p(attrs)
  1625. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1626. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1627. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1628. logger.debug("GO Neg Resp without Operating Channel")
  1629. dev[1].p2p_stop_find()
  1630. dev[0].p2p_listen()
  1631. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1632. raise Exception("P2P_CONNECT failed(2)")
  1633. p2p = rx_go_neg_req(dev[0])
  1634. dev[0].p2p_stop_find()
  1635. dialog_token = p2p['dialog_token']
  1636. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1637. attrs = p2p_attr_status()
  1638. attrs += p2p_attr_capability()
  1639. attrs += p2p_attr_go_intent(go_intent=15)
  1640. #attrs += p2p_attr_config_timeout()
  1641. attrs += p2p_attr_intended_interface_addr(addr0)
  1642. attrs += p2p_attr_channel_list()
  1643. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1644. #attrs += p2p_attr_operating_channel()
  1645. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1646. msg['payload'] += ie_p2p(attrs)
  1647. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1648. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1649. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1650. logger.debug("GO Neg Resp without Channel List")
  1651. dev[1].p2p_stop_find()
  1652. dev[0].p2p_listen()
  1653. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1654. raise Exception("P2P_CONNECT failed(2)")
  1655. p2p = rx_go_neg_req(dev[0])
  1656. dev[0].p2p_stop_find()
  1657. dialog_token = p2p['dialog_token']
  1658. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1659. attrs = p2p_attr_status()
  1660. attrs += p2p_attr_capability()
  1661. attrs += p2p_attr_go_intent(go_intent=15)
  1662. attrs += p2p_attr_config_timeout()
  1663. attrs += p2p_attr_intended_interface_addr(addr0)
  1664. #attrs += p2p_attr_channel_list()
  1665. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1666. attrs += p2p_attr_operating_channel()
  1667. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1668. msg['payload'] += ie_p2p(attrs)
  1669. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1670. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1671. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1672. logger.debug("GO Neg Resp without common channels")
  1673. dev[1].p2p_stop_find()
  1674. dev[0].p2p_listen()
  1675. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1676. raise Exception("P2P_CONNECT failed(2)")
  1677. p2p = rx_go_neg_req(dev[0])
  1678. dev[0].p2p_stop_find()
  1679. dialog_token = p2p['dialog_token']
  1680. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1681. attrs = p2p_attr_status()
  1682. attrs += p2p_attr_capability()
  1683. attrs += p2p_attr_go_intent(go_intent=15)
  1684. attrs += p2p_attr_config_timeout()
  1685. attrs += p2p_attr_intended_interface_addr(addr0)
  1686. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  1687. 0x58, 0x58, 0x04,
  1688. 81, 0)
  1689. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1690. attrs += p2p_attr_operating_channel()
  1691. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1692. msg['payload'] += ie_p2p(attrs)
  1693. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1694. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_NO_COMMON_CHANNELS)
  1695. rx_go_neg_conf(dev[0], P2P_SC_FAIL_NO_COMMON_CHANNELS, dialog_token)