test_p2p_messages.py 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  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 hostapd
  10. MGMT_SUBTYPE_PROBE_REQ = 4
  11. MGMT_SUBTYPE_ACTION = 13
  12. ACTION_CATEG_PUBLIC = 4
  13. P2P_GO_NEG_REQ = 0
  14. P2P_GO_NEG_RESP = 1
  15. P2P_GO_NEG_CONF = 2
  16. P2P_INVITATION_REQ = 3
  17. P2P_INVITATION_RESP = 4
  18. P2P_DEV_DISC_REQ = 5
  19. P2P_DEV_DISC_RESP = 6
  20. P2P_PROV_DISC_REQ = 7
  21. P2P_PROV_DISC_RESP = 8
  22. P2P_ATTR_STATUS = 0
  23. P2P_ATTR_MINOR_REASON_CODE = 1
  24. P2P_ATTR_CAPABILITY = 2
  25. P2P_ATTR_DEVICE_ID = 3
  26. P2P_ATTR_GROUP_OWNER_INTENT = 4
  27. P2P_ATTR_CONFIGURATION_TIMEOUT = 5
  28. P2P_ATTR_LISTEN_CHANNEL = 6
  29. P2P_ATTR_GROUP_BSSID = 7
  30. P2P_ATTR_EXT_LISTEN_TIMING = 8
  31. P2P_ATTR_INTENDED_INTERFACE_ADDR = 9
  32. P2P_ATTR_MANAGEABILITY = 10
  33. P2P_ATTR_CHANNEL_LIST = 11
  34. P2P_ATTR_NOTICE_OF_ABSENCE = 12
  35. P2P_ATTR_DEVICE_INFO = 13
  36. P2P_ATTR_GROUP_INFO = 14
  37. P2P_ATTR_GROUP_ID = 15
  38. P2P_ATTR_INTERFACE = 16
  39. P2P_ATTR_OPERATING_CHANNEL = 17
  40. P2P_ATTR_INVITATION_FLAGS = 18
  41. P2P_ATTR_OOB_GO_NEG_CHANNEL = 19
  42. P2P_ATTR_VENDOR_SPECIFIC = 221
  43. P2P_SC_SUCCESS = 0
  44. P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE = 1
  45. P2P_SC_FAIL_INCOMPATIBLE_PARAMS = 2
  46. P2P_SC_FAIL_LIMIT_REACHED = 3
  47. P2P_SC_FAIL_INVALID_PARAMS = 4
  48. P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE = 5
  49. P2P_SC_FAIL_PREV_PROTOCOL_ERROR = 6
  50. P2P_SC_FAIL_NO_COMMON_CHANNELS = 7
  51. P2P_SC_FAIL_UNKNOWN_GROUP = 8
  52. P2P_SC_FAIL_BOTH_GO_INTENT_15 = 9
  53. P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10
  54. P2P_SC_FAIL_REJECTED_BY_USER = 11
  55. WSC_ATTR_CONFIG_METHODS = 0x1008
  56. WLAN_EID_SSID = 0
  57. WLAN_EID_SUPP_RATES = 1
  58. WLAN_EID_VENDOR_SPECIFIC = 221
  59. def ie_ssid(ssid):
  60. return struct.pack("<BB", WLAN_EID_SSID, len(ssid)) + ssid
  61. def ie_supp_rates():
  62. return struct.pack("<BBBBBBBBBB", WLAN_EID_SUPP_RATES, 8,
  63. 2*6, 2*9, 2*12, 2*18, 2*24, 2*36, 2*48, 2*54)
  64. def ie_p2p(attrs):
  65. return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
  66. 0x50, 0x6f, 0x9a, 9) + attrs
  67. def ie_wsc(attrs):
  68. return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
  69. 0x00, 0x50, 0xf2, 4) + attrs
  70. def wsc_attr_config_methods(methods=0):
  71. return struct.pack(">HHH", WSC_ATTR_CONFIG_METHODS, 2, methods)
  72. def p2p_attr_status(status=P2P_SC_SUCCESS):
  73. return struct.pack("<BHB", P2P_ATTR_STATUS, 1, status)
  74. def p2p_attr_minor_reason_code(code=0):
  75. return struct.pack("<BHB", P2P_ATTR_MINOR_REASON_CODE, 1, code)
  76. def p2p_attr_capability(dev_capab=0, group_capab=0):
  77. return struct.pack("<BHBB", P2P_ATTR_CAPABILITY, 2, dev_capab, group_capab)
  78. def p2p_attr_device_id(addr):
  79. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  80. t = (P2P_ATTR_DEVICE_ID, 6) + val
  81. return struct.pack('<BH6B', *t)
  82. def p2p_attr_go_intent(go_intent=0, tie_breaker=0):
  83. return struct.pack("<BHB", P2P_ATTR_GROUP_OWNER_INTENT, 1,
  84. (go_intent << 1) | (tie_breaker & 0x01))
  85. def p2p_attr_config_timeout(go_config_timeout=0, client_config_timeout=0):
  86. return struct.pack("<BHBB", P2P_ATTR_CONFIGURATION_TIMEOUT, 2,
  87. go_config_timeout, client_config_timeout)
  88. def p2p_attr_listen_channel(op_class=81, chan=1):
  89. return struct.pack("<BHBBBBB", P2P_ATTR_LISTEN_CHANNEL, 5,
  90. 0x58, 0x58, 0x04, op_class, chan)
  91. def p2p_attr_group_bssid(addr):
  92. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  93. t = (P2P_ATTR_GROUP_BSSID, 6) + val
  94. return struct.pack('<BH6B', *t)
  95. def p2p_attr_ext_listen_timing(period=0, interval=0):
  96. return struct.pack("<BHHH", P2P_ATTR_EXT_LISTEN_TIMING, 4, period, interval)
  97. def p2p_attr_intended_interface_addr(addr):
  98. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  99. t = (P2P_ATTR_INTENDED_INTERFACE_ADDR, 6) + val
  100. return struct.pack('<BH6B', *t)
  101. def p2p_attr_manageability(bitmap=0):
  102. return struct.pack("<BHB", P2P_ATTR_MANAGEABILITY, 1, bitmap)
  103. def p2p_attr_channel_list():
  104. return struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
  105. 0x58, 0x58, 0x04,
  106. 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
  107. def p2p_attr_device_info(addr, name="Test", config_methods=0, dev_type="00010050F2040001"):
  108. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  109. val2 = struct.unpack('8B', binascii.unhexlify(dev_type))
  110. t = (P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 4 + len(name)) + val + (config_methods,) + val2 + (0,)
  111. return struct.pack("<BH6BH8BB", *t) + struct.pack('>HH', 0x1011, len(name)) +name
  112. def p2p_attr_group_id(addr, ssid):
  113. val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
  114. t = (P2P_ATTR_GROUP_ID, 6 + len(ssid)) + val
  115. return struct.pack('<BH6B', *t) + ssid
  116. def p2p_attr_operating_channel(op_class=81, chan=1):
  117. return struct.pack("<BHBBBBB", P2P_ATTR_OPERATING_CHANNEL, 5,
  118. 0x58, 0x58, 0x04, op_class, chan)
  119. def p2p_attr_invitation_flags(bitmap=0):
  120. return struct.pack("<BHB", P2P_ATTR_INVITATION_FLAGS, 1, bitmap)
  121. def p2p_hdr_helper(dst, src, type=None, dialog_token=1, req=True):
  122. msg = {}
  123. msg['fc'] = MGMT_SUBTYPE_ACTION << 4
  124. msg['da'] = dst
  125. msg['sa'] = src
  126. if req:
  127. msg['bssid'] = dst
  128. else:
  129. msg['bssid'] = src
  130. msg['payload'] = struct.pack("<BBBBBB",
  131. ACTION_CATEG_PUBLIC, 9, 0x50, 0x6f, 0x9a, 9)
  132. if type is not None:
  133. msg['payload'] += struct.pack("<B", type)
  134. if dialog_token:
  135. msg['payload'] += struct.pack("<B", dialog_token)
  136. return msg
  137. def p2p_hdr(dst, src, type=None, dialog_token=1):
  138. return p2p_hdr_helper(dst, src, type, dialog_token, True)
  139. def p2p_hdr_resp(dst, src, type=None, dialog_token=1):
  140. return p2p_hdr_helper(dst, src, type, dialog_token, False)
  141. def start_p2p(dev, apdev):
  142. addr0 = dev[0].p2p_dev_addr()
  143. dev[0].p2p_listen()
  144. dev[1].p2p_find(social=True)
  145. ev = dev[1].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  146. if ev is None:
  147. raise Exception("Device discovery timed out")
  148. dev[1].p2p_stop_find()
  149. peer = dev[1].get_peer(addr0)
  150. bssid = apdev[0]['bssid']
  151. params = { 'ssid': "test", 'beacon_int': "2000" }
  152. if peer['listen_freq'] == "2412":
  153. params['channel'] = '1'
  154. elif peer['listen_freq'] == "2437":
  155. params['channel'] = '6'
  156. elif peer['listen_freq'] == "2462":
  157. params['channel'] = '11'
  158. hapd = hostapd.add_ap(apdev[0]['ifname'], params)
  159. hapd.set("ext_mgmt_frame_handling", "1")
  160. return addr0, bssid, hapd, int(params['channel'])
  161. def p2p_probe(hapd, src, chan=1):
  162. msg = {}
  163. msg['fc'] = MGMT_SUBTYPE_PROBE_REQ << 4
  164. msg['da'] = "ff:ff:ff:ff:ff:ff"
  165. msg['sa'] = src
  166. msg['bssid'] = "ff:ff:ff:ff:ff:ff"
  167. attrs = p2p_attr_listen_channel(chan=chan)
  168. msg['payload'] = ie_ssid("DIRECT-") + ie_supp_rates() + ie_p2p(attrs)
  169. hapd.mgmt_tx(msg)
  170. def parse_p2p_public_action(payload):
  171. pos = payload
  172. (category, action) = struct.unpack('BB', pos[0:2])
  173. if category != ACTION_CATEG_PUBLIC:
  174. return None
  175. if action != 9:
  176. return None
  177. pos = pos[2:]
  178. (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
  179. if oui1 != 0x50 or oui2 != 0x6f or oui3 != 0x9a or subtype != 9:
  180. return None
  181. pos = pos[4:]
  182. (subtype,dialog_token) = struct.unpack('BB', pos[0:2])
  183. p2p = {}
  184. p2p['subtype'] = subtype
  185. p2p['dialog_token'] = dialog_token
  186. p2p['data'] = pos[2:]
  187. return p2p
  188. def test_p2p_msg_empty(dev, apdev):
  189. """P2P protocol test: empty P2P Public Action frame"""
  190. dst, src, hapd, channel = start_p2p(dev, apdev)
  191. msg = p2p_hdr(dst, src)
  192. hapd.mgmt_tx(msg)
  193. def test_p2p_msg_invitation_req(dev, apdev):
  194. """P2P protocol tests for invitation request processing"""
  195. dst, src, hapd, channel = start_p2p(dev, apdev)
  196. # Empty P2P Invitation Request (missing dialog token)
  197. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=None)
  198. hapd.mgmt_tx(msg)
  199. dialog_token = 0
  200. # Various p2p_parse() failure cases due to invalid attributes
  201. # Too short attribute header
  202. dialog_token += 1
  203. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  204. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  205. msg['payload'] += ie_p2p(attrs)
  206. hapd.mgmt_tx(msg)
  207. # Minimal attribute underflow
  208. dialog_token += 1
  209. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  210. attrs = struct.pack("<BH", P2P_ATTR_CAPABILITY, 1)
  211. msg['payload'] += ie_p2p(attrs)
  212. hapd.mgmt_tx(msg)
  213. # Large attribute underflow
  214. dialog_token += 1
  215. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  216. attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 0xffff, 1)
  217. msg['payload'] += ie_p2p(attrs)
  218. hapd.mgmt_tx(msg)
  219. # Too short Capability attribute
  220. dialog_token += 1
  221. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  222. attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 1, 0)
  223. msg['payload'] += ie_p2p(attrs)
  224. hapd.mgmt_tx(msg)
  225. # Too short Device ID attribute
  226. dialog_token += 1
  227. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  228. val = struct.unpack('5B', binascii.unhexlify("1122334455"))
  229. t = (P2P_ATTR_DEVICE_ID, 5) + val
  230. attrs = struct.pack('<BH5B', *t)
  231. msg['payload'] += ie_p2p(attrs)
  232. hapd.mgmt_tx(msg)
  233. # Too short GO Intent attribute
  234. dialog_token += 1
  235. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  236. attrs = struct.pack("<BH", P2P_ATTR_GROUP_OWNER_INTENT, 0)
  237. msg['payload'] += ie_p2p(attrs)
  238. hapd.mgmt_tx(msg)
  239. # Too short Status attribute
  240. dialog_token += 1
  241. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  242. attrs = struct.pack("<BH", P2P_ATTR_STATUS, 0)
  243. msg['payload'] += ie_p2p(attrs)
  244. hapd.mgmt_tx(msg)
  245. # null Listen channel and too short Listen Channel attribute
  246. dialog_token += 1
  247. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  248. attrs = struct.pack("<BH", P2P_ATTR_LISTEN_CHANNEL, 0)
  249. attrs += struct.pack("<BHB", P2P_ATTR_LISTEN_CHANNEL, 1, 0)
  250. msg['payload'] += ie_p2p(attrs)
  251. hapd.mgmt_tx(msg)
  252. # null Operating channel and too short Operating Channel attribute
  253. dialog_token += 1
  254. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  255. attrs = struct.pack("<BH", P2P_ATTR_OPERATING_CHANNEL, 0)
  256. attrs += struct.pack("<BHB", P2P_ATTR_OPERATING_CHANNEL, 1, 0)
  257. msg['payload'] += ie_p2p(attrs)
  258. hapd.mgmt_tx(msg)
  259. # Too short Channel List attribute
  260. dialog_token += 1
  261. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  262. attrs = struct.pack("<BHBB", P2P_ATTR_CHANNEL_LIST, 2, 1, 2)
  263. msg['payload'] += ie_p2p(attrs)
  264. hapd.mgmt_tx(msg)
  265. # Too short Device Info attribute
  266. dialog_token += 1
  267. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  268. attrs = struct.pack("<BHBB", P2P_ATTR_DEVICE_INFO, 2, 1, 2)
  269. msg['payload'] += ie_p2p(attrs)
  270. hapd.mgmt_tx(msg)
  271. # Truncated Secondary Device Types in Device Info attribute
  272. dialog_token += 1
  273. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  274. attrs = struct.pack("<BH6BH8BB", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1,
  275. 0, 0, 0, 0, 0, 0,
  276. 0,
  277. 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22,
  278. 255)
  279. msg['payload'] += ie_p2p(attrs)
  280. hapd.mgmt_tx(msg)
  281. # Missing Device Name in Device Info attribute
  282. dialog_token += 1
  283. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  284. attrs = struct.pack("<BH6BH8BB8B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8,
  285. 0, 0, 0, 0, 0, 0,
  286. 0,
  287. 0, 0, 0, 0, 0, 0, 0, 0,
  288. 1,
  289. 1, 2, 3, 4, 5, 6, 7, 8)
  290. msg['payload'] += ie_p2p(attrs)
  291. hapd.mgmt_tx(msg)
  292. # Invalid Device Name header in Device Info attribute
  293. dialog_token += 1
  294. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  295. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
  296. 0, 0, 0, 0, 0, 0,
  297. 0,
  298. 0, 0, 0, 0, 0, 0, 0, 0,
  299. 1,
  300. 1, 2, 3, 4, 5, 6, 7, 8,
  301. 0x11, 0x12, 0, 0)
  302. msg['payload'] += ie_p2p(attrs)
  303. hapd.mgmt_tx(msg)
  304. # Invalid Device Name header length in Device Info attribute
  305. dialog_token += 1
  306. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  307. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
  308. 0, 0, 0, 0, 0, 0,
  309. 0,
  310. 0, 0, 0, 0, 0, 0, 0, 0,
  311. 1,
  312. 1, 2, 3, 4, 5, 6, 7, 8,
  313. 0x10, 0x11, 0xff, 0xff)
  314. msg['payload'] += ie_p2p(attrs)
  315. hapd.mgmt_tx(msg)
  316. # Invalid Device Name header length in Device Info attribute
  317. dialog_token += 1
  318. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  319. devname = 'A'
  320. attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
  321. 0, 0, 0, 0, 0, 0,
  322. 0,
  323. 0, 0, 0, 0, 0, 0, 0, 0,
  324. 1,
  325. 1, 2, 3, 4, 5, 6, 7, 8,
  326. 0x10, 0x11, 0, len(devname) + 1) + devname
  327. msg['payload'] += ie_p2p(attrs)
  328. hapd.mgmt_tx(msg)
  329. # Device Name filtering and too long 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("<BH6BH8BB8B4B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + 4,
  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. 0x10, 0x11, 0, 4,
  339. 64, 9, 0, 64)
  340. devname = '123456789012345678901234567890123'
  341. attrs += struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
  342. 0, 0, 0, 0, 0, 0,
  343. 0,
  344. 0, 0, 0, 0, 0, 0, 0, 0,
  345. 1,
  346. 1, 2, 3, 4, 5, 6, 7, 8,
  347. 0x10, 0x11, 0, len(devname)) + devname
  348. msg['payload'] += ie_p2p(attrs)
  349. hapd.mgmt_tx(msg)
  350. # Too short Configuration Timeout attribute
  351. dialog_token += 1
  352. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  353. attrs = struct.pack("<BHB", P2P_ATTR_CONFIGURATION_TIMEOUT, 1, 1)
  354. msg['payload'] += ie_p2p(attrs)
  355. hapd.mgmt_tx(msg)
  356. # Too short Intended P2P Interface Address attribute
  357. dialog_token += 1
  358. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  359. attrs = struct.pack("<BHB", P2P_ATTR_INTENDED_INTERFACE_ADDR, 1, 1)
  360. msg['payload'] += ie_p2p(attrs)
  361. hapd.mgmt_tx(msg)
  362. # Too short P2P Group BSSID attribute
  363. dialog_token += 1
  364. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  365. attrs = struct.pack("<BHB", P2P_ATTR_GROUP_BSSID, 1, 1)
  366. msg['payload'] += ie_p2p(attrs)
  367. hapd.mgmt_tx(msg)
  368. # Too short P2P Group ID attribute
  369. dialog_token += 1
  370. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  371. attrs = struct.pack("<BHB", P2P_ATTR_GROUP_ID, 1, 1)
  372. msg['payload'] += ie_p2p(attrs)
  373. hapd.mgmt_tx(msg)
  374. # Too long P2P Group ID attribute
  375. dialog_token += 1
  376. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  377. attrs = struct.pack("<BH6B", P2P_ATTR_GROUP_ID, 6 + 33, 0, 0, 0, 0, 0, 0) + "123456789012345678901234567890123"
  378. msg['payload'] += ie_p2p(attrs)
  379. hapd.mgmt_tx(msg)
  380. # Too short Invitation Flags attribute
  381. dialog_token += 1
  382. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  383. attrs = struct.pack("<BH", P2P_ATTR_INVITATION_FLAGS, 0)
  384. msg['payload'] += ie_p2p(attrs)
  385. hapd.mgmt_tx(msg)
  386. # Valid and too short Manageability attribute
  387. dialog_token += 1
  388. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  389. attrs = p2p_attr_manageability()
  390. attrs += struct.pack("<BH", P2P_ATTR_MANAGEABILITY, 0)
  391. msg['payload'] += ie_p2p(attrs)
  392. hapd.mgmt_tx(msg)
  393. # Too short NoA attribute
  394. dialog_token += 1
  395. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  396. attrs = struct.pack("<BHB", P2P_ATTR_NOTICE_OF_ABSENCE, 1, 1)
  397. msg['payload'] += ie_p2p(attrs)
  398. hapd.mgmt_tx(msg)
  399. # Valid and too short Extended Listen Timing attributes
  400. dialog_token += 1
  401. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  402. attrs = p2p_attr_ext_listen_timing(period=100, interval=50)
  403. attrs += struct.pack("<BHBBB", P2P_ATTR_EXT_LISTEN_TIMING, 3, 0, 0, 0)
  404. msg['payload'] += ie_p2p(attrs)
  405. hapd.mgmt_tx(msg)
  406. # Valid and too short Minor Reason Code attributes
  407. dialog_token += 1
  408. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  409. attrs = p2p_attr_minor_reason_code(code=2)
  410. attrs += struct.pack("<BH", P2P_ATTR_MINOR_REASON_CODE, 0)
  411. msg['payload'] += ie_p2p(attrs)
  412. hapd.mgmt_tx(msg)
  413. # Unknown attribute and too short OOB GO Negotiation Channel attribute
  414. dialog_token += 1
  415. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  416. attrs = struct.pack("<BHB", 99, 1, 1)
  417. attrs += struct.pack("<BHB", P2P_ATTR_OOB_GO_NEG_CHANNEL, 1, 1)
  418. msg['payload'] += ie_p2p(attrs)
  419. hapd.mgmt_tx(msg)
  420. if hapd.mgmt_rx(timeout=0.5) is not None:
  421. raise Exception("Unexpected management frame received")
  422. dev[0].dump_monitor()
  423. dialog_token += 1
  424. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  425. attrs = p2p_attr_config_timeout()
  426. attrs += p2p_attr_invitation_flags()
  427. attrs += p2p_attr_operating_channel()
  428. attrs += p2p_attr_group_bssid(src)
  429. attrs += p2p_attr_channel_list()
  430. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  431. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  432. msg['payload'] += ie_p2p(attrs)
  433. hapd.mgmt_tx(msg)
  434. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  435. if ev is None:
  436. raise Exception("Timeout on device found event")
  437. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  438. if ev is None:
  439. raise Exception("Timeout on invitation event " + str(dialog_token))
  440. if hapd.mgmt_rx(timeout=1) is None:
  441. raise Exception("No invitation response " + str(dialog_token))
  442. time.sleep(0.1)
  443. dev[0].dump_monitor()
  444. dialog_token += 1
  445. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  446. attrs = p2p_attr_config_timeout()
  447. attrs += p2p_attr_invitation_flags()
  448. attrs += p2p_attr_operating_channel()
  449. attrs += p2p_attr_group_bssid(src)
  450. attrs += p2p_attr_channel_list()
  451. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  452. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  453. msg['payload'] += ie_p2p(attrs)
  454. hapd.mgmt_tx(msg)
  455. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  456. if ev is None:
  457. raise Exception("Timeout on invitation event " + str(dialog_token))
  458. if hapd.mgmt_rx(timeout=1) is None:
  459. raise Exception("No invitation response " + str(dialog_token))
  460. time.sleep(0.1)
  461. dev[0].dump_monitor()
  462. dialog_token += 1
  463. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  464. #attrs = p2p_attr_config_timeout()
  465. attrs = p2p_attr_invitation_flags()
  466. attrs += p2p_attr_operating_channel()
  467. attrs += p2p_attr_group_bssid(src)
  468. attrs += p2p_attr_channel_list()
  469. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  470. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  471. msg['payload'] += ie_p2p(attrs)
  472. hapd.mgmt_tx(msg)
  473. if hapd.mgmt_rx(timeout=1) is None:
  474. raise Exception("No invitation response " + str(dialog_token))
  475. time.sleep(0.1)
  476. dev[0].dump_monitor()
  477. dialog_token += 1
  478. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  479. attrs = p2p_attr_config_timeout()
  480. #attrs = p2p_attr_invitation_flags()
  481. attrs += p2p_attr_operating_channel()
  482. attrs += p2p_attr_group_bssid(src)
  483. attrs += p2p_attr_channel_list()
  484. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  485. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  486. msg['payload'] += ie_p2p(attrs)
  487. hapd.mgmt_tx(msg)
  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. if hapd.mgmt_rx(timeout=1) is None:
  504. raise Exception("No invitation response " + str(dialog_token))
  505. time.sleep(0.1)
  506. dev[0].dump_monitor()
  507. dialog_token += 1
  508. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  509. attrs = p2p_attr_config_timeout()
  510. attrs = p2p_attr_invitation_flags()
  511. attrs += p2p_attr_operating_channel()
  512. #attrs += p2p_attr_group_bssid(src)
  513. attrs += p2p_attr_channel_list()
  514. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  515. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  516. msg['payload'] += ie_p2p(attrs)
  517. hapd.mgmt_tx(msg)
  518. if hapd.mgmt_rx(timeout=1) is None:
  519. raise Exception("No invitation response " + str(dialog_token))
  520. time.sleep(0.1)
  521. dev[0].dump_monitor()
  522. dialog_token += 1
  523. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  524. attrs = p2p_attr_config_timeout()
  525. attrs = p2p_attr_invitation_flags()
  526. attrs += p2p_attr_operating_channel()
  527. attrs += p2p_attr_group_bssid(src)
  528. #attrs += p2p_attr_channel_list()
  529. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  530. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  531. msg['payload'] += ie_p2p(attrs)
  532. hapd.mgmt_tx(msg)
  533. if hapd.mgmt_rx(timeout=1) is None:
  534. raise Exception("No invitation response " + str(dialog_token))
  535. time.sleep(0.1)
  536. dev[0].dump_monitor()
  537. dialog_token += 1
  538. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  539. attrs = p2p_attr_config_timeout()
  540. attrs = p2p_attr_invitation_flags()
  541. attrs += p2p_attr_operating_channel()
  542. attrs += p2p_attr_group_bssid(src)
  543. attrs += p2p_attr_channel_list()
  544. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  545. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  546. msg['payload'] += ie_p2p(attrs)
  547. hapd.mgmt_tx(msg)
  548. if hapd.mgmt_rx(timeout=1) is None:
  549. raise Exception("No invitation response " + str(dialog_token))
  550. time.sleep(0.1)
  551. dev[0].dump_monitor()
  552. dialog_token += 1
  553. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  554. attrs = p2p_attr_config_timeout()
  555. attrs = p2p_attr_invitation_flags()
  556. attrs += p2p_attr_operating_channel()
  557. attrs += p2p_attr_group_bssid(src)
  558. attrs += p2p_attr_channel_list()
  559. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  560. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  561. msg['payload'] += ie_p2p(attrs)
  562. hapd.mgmt_tx(msg)
  563. if hapd.mgmt_rx(timeout=1) is None:
  564. raise Exception("No invitation response " + str(dialog_token))
  565. time.sleep(0.1)
  566. dev[0].dump_monitor()
  567. dialog_token += 1
  568. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  569. hapd.mgmt_tx(msg)
  570. if hapd.mgmt_rx(timeout=1) is None:
  571. raise Exception("No invitation response " + str(dialog_token))
  572. def test_p2p_msg_invitation_req_unknown(dev, apdev):
  573. """P2P protocol tests for invitation request from unknown peer"""
  574. dst, src, hapd, channel = start_p2p(dev, apdev)
  575. dialog_token = 0
  576. dialog_token += 1
  577. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  578. attrs = p2p_attr_config_timeout()
  579. attrs += p2p_attr_invitation_flags()
  580. attrs += p2p_attr_operating_channel()
  581. attrs += p2p_attr_group_bssid(src)
  582. attrs += p2p_attr_channel_list()
  583. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  584. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  585. msg['payload'] += ie_p2p(attrs)
  586. hapd.mgmt_tx(msg)
  587. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  588. if ev is None:
  589. raise Exception("Timeout on invitation event " + str(dialog_token))
  590. if hapd.mgmt_rx(timeout=1) is None:
  591. raise Exception("No invitation response " + str(dialog_token))
  592. def test_p2p_msg_invitation_no_common_channels(dev, apdev):
  593. """P2P protocol tests for invitation request without common channels"""
  594. dst, src, hapd, channel = start_p2p(dev, apdev)
  595. dialog_token = 0
  596. dialog_token += 1
  597. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  598. attrs = p2p_attr_config_timeout()
  599. attrs += p2p_attr_invitation_flags()
  600. attrs += p2p_attr_operating_channel()
  601. attrs += p2p_attr_group_bssid(src)
  602. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  603. 0x58, 0x58, 0x04,
  604. 81, 0)
  605. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  606. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  607. msg['payload'] += ie_p2p(attrs)
  608. hapd.mgmt_tx(msg)
  609. if hapd.mgmt_rx(timeout=1) is None:
  610. raise Exception("No invitation response " + str(dialog_token))
  611. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=0.1)
  612. if ev is not None:
  613. raise Exception("Unexpected invitation event")
  614. def test_p2p_msg_pd_req(dev, apdev):
  615. """P2P protocol tests for provision discovery request processing"""
  616. dst, src, hapd, channel = start_p2p(dev, apdev)
  617. dialog_token = 0
  618. # Too short attribute header
  619. dialog_token += 1
  620. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  621. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  622. msg['payload'] += ie_p2p(attrs)
  623. hapd.mgmt_tx(msg)
  624. if hapd.mgmt_rx(timeout=0.5) is not None:
  625. raise Exception("Unexpected management frame received")
  626. # No attributes
  627. dialog_token += 1
  628. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  629. attrs = ""
  630. msg['payload'] += ie_p2p(attrs)
  631. hapd.mgmt_tx(msg)
  632. if hapd.mgmt_rx(timeout=1) is None:
  633. raise Exception("No PD response " + str(dialog_token))
  634. # Valid request
  635. time.sleep(0.1)
  636. dialog_token += 1
  637. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  638. attrs = wsc_attr_config_methods(methods=0x1008)
  639. msg['payload'] += ie_wsc(attrs)
  640. attrs = p2p_attr_capability()
  641. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  642. msg['payload'] += ie_p2p(attrs)
  643. hapd.mgmt_tx(msg)
  644. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  645. if ev is None:
  646. raise Exception("Timeout on device found event")
  647. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  648. if ev is None:
  649. raise Exception("Timeout on PD event")
  650. if hapd.mgmt_rx(timeout=1) is None:
  651. raise Exception("No PD response " + str(dialog_token))
  652. # Unknown group
  653. time.sleep(0.1)
  654. dialog_token += 1
  655. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  656. attrs = wsc_attr_config_methods(methods=0x1008)
  657. msg['payload'] += ie_wsc(attrs)
  658. attrs = p2p_attr_capability()
  659. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  660. attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
  661. msg['payload'] += ie_p2p(attrs)
  662. hapd.mgmt_tx(msg)
  663. if hapd.mgmt_rx(timeout=1) is None:
  664. raise Exception("No PD response " + str(dialog_token))
  665. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
  666. if ev is not None:
  667. raise Exception("Unexpected PD event")
  668. # Listen channel is not yet known
  669. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  670. raise Exception("Unexpected P2P_PROV_DISC success")
  671. # Unknown peer
  672. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
  673. raise Exception("Unexpected P2P_PROV_DISC success (2)")
  674. def test_p2p_msg_pd(dev, apdev):
  675. """P2P protocol tests for provision discovery request processing (known)"""
  676. dst, src, hapd, channel = start_p2p(dev, apdev)
  677. dialog_token = 0
  678. p2p_probe(hapd, src, chan=channel)
  679. time.sleep(0.1)
  680. # Valid request
  681. dialog_token += 1
  682. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  683. attrs = wsc_attr_config_methods(methods=0x1008)
  684. msg['payload'] += ie_wsc(attrs)
  685. attrs = p2p_attr_capability()
  686. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  687. msg['payload'] += ie_p2p(attrs)
  688. hapd.mgmt_tx(msg)
  689. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  690. if ev is None:
  691. raise Exception("Timeout on device found event")
  692. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  693. if ev is None:
  694. raise Exception("Timeout on PD event")
  695. if hapd.mgmt_rx(timeout=1) is None:
  696. raise Exception("No PD response " + str(dialog_token))
  697. if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  698. raise Exception("Unexpected P2P_PROV_DISC failure")
  699. frame = hapd.mgmt_rx(timeout=1)
  700. if frame is None:
  701. raise Exception("No PD request " + str(dialog_token))
  702. p2p = parse_p2p_public_action(frame['payload'])
  703. if p2p is None:
  704. raise Exception("Failed to parse PD request")
  705. # invalid dialog token
  706. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  707. dialog_token=p2p['dialog_token'] + 1)
  708. hapd.mgmt_tx(msg)
  709. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  710. if ev is not None:
  711. raise Exception("Unexpected PD result event")
  712. # valid dialog token
  713. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  714. dialog_token=p2p['dialog_token'])
  715. hapd.mgmt_tx(msg)
  716. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
  717. if ev is None:
  718. raise Exception("Timeout on PD result event")
  719. # valid dialog token
  720. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  721. dialog_token=p2p['dialog_token'])
  722. hapd.mgmt_tx(msg)
  723. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  724. if ev is not None:
  725. raise Exception("Unexpected PD result event")
  726. def test_p2p_msg_go_neg_req(dev, apdev):
  727. """P2P protocol tests for invitation request from unknown peer"""
  728. dst, src, hapd, channel = start_p2p(dev, apdev)
  729. dialog_token = 0
  730. # invalid attribute
  731. dialog_token += 1
  732. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  733. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  734. msg['payload'] += ie_p2p(attrs)
  735. hapd.mgmt_tx(msg)
  736. frame = hapd.mgmt_rx(timeout=0.1)
  737. if frame is not None:
  738. print frame
  739. raise Exception("Unexpected GO Neg Response")
  740. # missing atributes
  741. dialog_token += 1
  742. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  743. attrs = p2p_attr_capability()
  744. attrs += p2p_attr_go_intent()
  745. attrs += p2p_attr_config_timeout()
  746. #attrs += p2p_attr_listen_channel()
  747. attrs += p2p_attr_ext_listen_timing()
  748. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  749. attrs += p2p_attr_channel_list()
  750. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  751. attrs += p2p_attr_operating_channel()
  752. msg['payload'] += ie_p2p(attrs)
  753. hapd.mgmt_tx(msg)
  754. if hapd.mgmt_rx(timeout=1) is None:
  755. raise Exception("No GO Neg Response " + str(dialog_token))
  756. time.sleep(0.1)
  757. dialog_token += 1
  758. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  759. attrs = p2p_attr_capability()
  760. attrs += p2p_attr_go_intent()
  761. attrs += p2p_attr_config_timeout()
  762. attrs += p2p_attr_listen_channel()
  763. attrs += p2p_attr_ext_listen_timing()
  764. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  765. attrs += p2p_attr_channel_list()
  766. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  767. #attrs += p2p_attr_operating_channel()
  768. msg['payload'] += ie_p2p(attrs)
  769. hapd.mgmt_tx(msg)
  770. if hapd.mgmt_rx(timeout=1) is None:
  771. raise Exception("No GO Neg Response " + str(dialog_token))
  772. time.sleep(0.1)
  773. dialog_token += 1
  774. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  775. attrs = p2p_attr_capability()
  776. attrs += p2p_attr_go_intent()
  777. attrs += p2p_attr_config_timeout()
  778. attrs += p2p_attr_listen_channel()
  779. attrs += p2p_attr_ext_listen_timing()
  780. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  781. #attrs += p2p_attr_channel_list()
  782. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  783. attrs += p2p_attr_operating_channel()
  784. msg['payload'] += ie_p2p(attrs)
  785. hapd.mgmt_tx(msg)
  786. if hapd.mgmt_rx(timeout=1) is None:
  787. raise Exception("No GO Neg Response " + str(dialog_token))
  788. time.sleep(0.1)
  789. dialog_token += 1
  790. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  791. attrs = p2p_attr_capability()
  792. attrs += p2p_attr_go_intent()
  793. attrs += p2p_attr_config_timeout()
  794. attrs += p2p_attr_listen_channel()
  795. attrs += p2p_attr_ext_listen_timing()
  796. #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  797. attrs += p2p_attr_channel_list()
  798. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  799. attrs += p2p_attr_operating_channel()
  800. msg['payload'] += ie_p2p(attrs)
  801. hapd.mgmt_tx(msg)
  802. if hapd.mgmt_rx(timeout=1) is None:
  803. raise Exception("No GO Neg Response " + str(dialog_token))
  804. time.sleep(0.1)
  805. dialog_token += 1
  806. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  807. attrs = p2p_attr_capability()
  808. attrs += p2p_attr_go_intent()
  809. attrs += p2p_attr_config_timeout()
  810. attrs += p2p_attr_listen_channel()
  811. attrs += p2p_attr_ext_listen_timing()
  812. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  813. attrs += p2p_attr_channel_list()
  814. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  815. attrs += p2p_attr_operating_channel()
  816. msg['payload'] += ie_p2p(attrs)
  817. hapd.mgmt_tx(msg)
  818. if hapd.mgmt_rx(timeout=1) is None:
  819. raise Exception("No GO Neg Response " + str(dialog_token))
  820. time.sleep(0.1)
  821. # SA != P2P Device address
  822. dialog_token += 1
  823. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  824. attrs = p2p_attr_capability()
  825. attrs += p2p_attr_go_intent()
  826. attrs += p2p_attr_config_timeout()
  827. attrs += p2p_attr_listen_channel()
  828. attrs += p2p_attr_ext_listen_timing()
  829. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  830. attrs += p2p_attr_channel_list()
  831. attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
  832. attrs += p2p_attr_operating_channel()
  833. msg['payload'] += ie_p2p(attrs)
  834. hapd.mgmt_tx(msg)
  835. if hapd.mgmt_rx(timeout=1) is None:
  836. raise Exception("No GO Neg Response " + str(dialog_token))
  837. time.sleep(0.1)
  838. # unexpected Status attribute
  839. dialog_token += 1
  840. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  841. attrs = p2p_attr_capability()
  842. attrs += p2p_attr_go_intent()
  843. attrs += p2p_attr_config_timeout()
  844. attrs += p2p_attr_listen_channel()
  845. attrs += p2p_attr_ext_listen_timing()
  846. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  847. attrs += p2p_attr_channel_list()
  848. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  849. attrs += p2p_attr_operating_channel()
  850. attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  851. msg['payload'] += ie_p2p(attrs)
  852. hapd.mgmt_tx(msg)
  853. if hapd.mgmt_rx(timeout=1) is None:
  854. raise Exception("No GO Neg Response(1) " + str(dialog_token))
  855. time.sleep(0.1)
  856. # valid (with workarounds) GO Neg Req
  857. dialog_token += 1
  858. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  859. #attrs = p2p_attr_capability()
  860. #attrs += p2p_attr_go_intent()
  861. #attrs += p2p_attr_config_timeout()
  862. attrs = p2p_attr_listen_channel()
  863. attrs += p2p_attr_ext_listen_timing()
  864. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  865. attrs += p2p_attr_channel_list()
  866. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  867. attrs += p2p_attr_operating_channel()
  868. msg['payload'] += ie_p2p(attrs)
  869. hapd.mgmt_tx(msg)
  870. if hapd.mgmt_rx(timeout=1) is None:
  871. raise Exception("No GO Neg Response " + str(dialog_token))
  872. ev = dev[0].wait_event(["P2P-GO-NEG-REQUEST"], timeout=1)
  873. if ev is None:
  874. raise Exception("Timeout on GO Neg event " + str(dialog_token))
  875. dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
  876. # ready - missing attributes (with workarounds) GO Neg Req
  877. time.sleep(0.1)
  878. dialog_token += 1
  879. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  880. #attrs = p2p_attr_capability()
  881. #attrs += p2p_attr_go_intent()
  882. #attrs += p2p_attr_config_timeout()
  883. attrs = p2p_attr_listen_channel()
  884. attrs += p2p_attr_ext_listen_timing()
  885. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  886. attrs += p2p_attr_channel_list()
  887. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  888. attrs += p2p_attr_operating_channel()
  889. msg['payload'] += ie_p2p(attrs)
  890. hapd.mgmt_tx(msg)
  891. if hapd.mgmt_rx(timeout=1) is None:
  892. raise Exception("No GO Neg Response " + str(dialog_token))
  893. # ready - invalid GO Intent GO Neg Req
  894. time.sleep(0.1)
  895. dialog_token += 1
  896. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  897. #attrs = p2p_attr_capability()
  898. attrs = p2p_attr_go_intent(go_intent=16)
  899. #attrs += p2p_attr_config_timeout()
  900. attrs += p2p_attr_listen_channel()
  901. attrs += p2p_attr_ext_listen_timing()
  902. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  903. attrs += p2p_attr_channel_list()
  904. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  905. attrs += p2p_attr_operating_channel()
  906. msg['payload'] += ie_p2p(attrs)
  907. hapd.mgmt_tx(msg)
  908. if hapd.mgmt_rx(timeout=1) is None:
  909. raise Exception("No GO Neg Response " + str(dialog_token))
  910. # ready - invalid GO Neg Req (unsupported Device Password ID)
  911. time.sleep(0.1)
  912. dialog_token += 1
  913. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  914. attrs = p2p_attr_capability()
  915. attrs += p2p_attr_go_intent()
  916. attrs += p2p_attr_config_timeout()
  917. attrs += p2p_attr_listen_channel()
  918. attrs += p2p_attr_ext_listen_timing()
  919. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  920. attrs += p2p_attr_channel_list()
  921. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  922. attrs += p2p_attr_operating_channel()
  923. msg['payload'] += ie_p2p(attrs)
  924. hapd.mgmt_tx(msg)
  925. if hapd.mgmt_rx(timeout=1) is None:
  926. raise Exception("No GO Neg Response " + str(dialog_token))