test_p2p_messages.py 70 KB

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