test_p2p_messages.py 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632
  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. def test_p2p_msg_invitation_req_unknown(dev, apdev):
  621. """P2P protocol tests for invitation request from unknown peer"""
  622. dst, src, hapd, channel = start_p2p(dev, apdev)
  623. dialog_token = 0
  624. dialog_token += 1
  625. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  626. attrs = p2p_attr_config_timeout()
  627. attrs += p2p_attr_invitation_flags()
  628. attrs += p2p_attr_operating_channel()
  629. attrs += p2p_attr_group_bssid(src)
  630. attrs += p2p_attr_channel_list()
  631. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  632. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  633. msg['payload'] += ie_p2p(attrs)
  634. hapd.mgmt_tx(msg)
  635. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
  636. if ev is None:
  637. raise Exception("Timeout on invitation event " + str(dialog_token))
  638. if hapd.mgmt_rx(timeout=1) is None:
  639. raise Exception("No invitation response " + str(dialog_token))
  640. def test_p2p_msg_invitation_no_common_channels(dev, apdev):
  641. """P2P protocol tests for invitation request without common channels"""
  642. dst, src, hapd, channel = start_p2p(dev, apdev)
  643. dialog_token = 0
  644. dialog_token += 1
  645. msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
  646. attrs = p2p_attr_config_timeout()
  647. attrs += p2p_attr_invitation_flags()
  648. attrs += p2p_attr_operating_channel()
  649. attrs += p2p_attr_group_bssid(src)
  650. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  651. 0x58, 0x58, 0x04,
  652. 81, 0)
  653. attrs += p2p_attr_group_id(src, "DIRECT-foo")
  654. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  655. msg['payload'] += ie_p2p(attrs)
  656. hapd.mgmt_tx(msg)
  657. if hapd.mgmt_rx(timeout=1) is None:
  658. raise Exception("No invitation response " + str(dialog_token))
  659. ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=0.1)
  660. if ev is not None:
  661. raise Exception("Unexpected invitation event")
  662. def test_p2p_msg_invitation_resp(dev, apdev):
  663. """P2P protocol tests for invitation response processing"""
  664. form(dev[0], dev[1])
  665. dev[0].dump_monitor()
  666. dev[1].dump_monitor()
  667. dst, src, hapd, channel = start_p2p(dev, apdev)
  668. addr0 = dev[0].p2p_dev_addr()
  669. addr1 = dev[1].p2p_dev_addr()
  670. peer = dev[1].get_peer(addr0)
  671. # P2P Invitation Response from unknown peer
  672. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=1)
  673. hapd.mgmt_tx(msg)
  674. # P2P Invitation Response from peer that is not in invitation
  675. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=2)
  676. attrs = p2p_attr_status()
  677. msg['payload'] += ie_p2p(attrs)
  678. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  679. time.sleep(0.1)
  680. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  681. raise Exception("Failed to enable external management frame handling")
  682. invite(dev[0], dev[1])
  683. rx_msg = dev[1].mgmt_rx()
  684. if rx_msg is None:
  685. raise Exception("MGMT-RX timeout")
  686. p2p = parse_p2p_public_action(rx_msg['payload'])
  687. if p2p is None:
  688. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  689. if p2p['subtype'] != P2P_INVITATION_REQ:
  690. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  691. # Invalid attribute to cause p2p_parse() failure
  692. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  693. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  694. msg['payload'] += ie_p2p(attrs)
  695. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  696. invite(dev[0], dev[1])
  697. rx_msg = dev[1].mgmt_rx()
  698. if rx_msg is None:
  699. raise Exception("MGMT-RX timeout")
  700. p2p = parse_p2p_public_action(rx_msg['payload'])
  701. if p2p is None:
  702. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  703. if p2p['subtype'] != P2P_INVITATION_REQ:
  704. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  705. # missing mandatory Status attribute
  706. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  707. attrs = p2p_attr_channel_list()
  708. msg['payload'] += ie_p2p(attrs)
  709. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  710. invite(dev[0], dev[1])
  711. rx_msg = dev[1].mgmt_rx()
  712. if rx_msg is None:
  713. raise Exception("MGMT-RX timeout")
  714. p2p = parse_p2p_public_action(rx_msg['payload'])
  715. if p2p is None:
  716. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  717. if p2p['subtype'] != P2P_INVITATION_REQ:
  718. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  719. # no channel match (no common channel found at all)
  720. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  721. attrs = p2p_attr_status()
  722. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  723. 0x58, 0x58, 0x04,
  724. 81, 1, 15)
  725. msg['payload'] += ie_p2p(attrs)
  726. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  727. invite(dev[0], dev[1])
  728. rx_msg = dev[1].mgmt_rx()
  729. if rx_msg is None:
  730. raise Exception("MGMT-RX timeout")
  731. p2p = parse_p2p_public_action(rx_msg['payload'])
  732. if p2p is None:
  733. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  734. if p2p['subtype'] != P2P_INVITATION_REQ:
  735. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  736. # no channel match (no acceptable P2P channel)
  737. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  738. attrs = p2p_attr_status()
  739. attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
  740. 0x58, 0x58, 0x04,
  741. 81, 1, 12)
  742. msg['payload'] += ie_p2p(attrs)
  743. mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=50 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  744. invite(dev[0], dev[1])
  745. rx_msg = dev[1].mgmt_rx()
  746. if rx_msg is None:
  747. raise Exception("MGMT-RX timeout")
  748. p2p = parse_p2p_public_action(rx_msg['payload'])
  749. if p2p is None:
  750. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  751. if p2p['subtype'] != P2P_INVITATION_REQ:
  752. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  753. # missing mandatory Channel List attribute (ignored as a workaround)
  754. msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
  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, rx_msg['freq'], binascii.hexlify(msg['payload'])))
  758. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
  759. if ev is None:
  760. raise Exception("Group was not started")
  761. def test_p2p_msg_pd_req(dev, apdev):
  762. """P2P protocol tests for provision discovery request processing"""
  763. dst, src, hapd, channel = start_p2p(dev, apdev)
  764. dialog_token = 0
  765. # Too short attribute header
  766. dialog_token += 1
  767. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  768. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  769. msg['payload'] += ie_p2p(attrs)
  770. hapd.mgmt_tx(msg)
  771. if hapd.mgmt_rx(timeout=0.5) is not None:
  772. raise Exception("Unexpected management frame received")
  773. # No attributes
  774. dialog_token += 1
  775. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  776. attrs = ""
  777. msg['payload'] += ie_p2p(attrs)
  778. hapd.mgmt_tx(msg)
  779. if hapd.mgmt_rx(timeout=1) is None:
  780. raise Exception("No PD response " + str(dialog_token))
  781. # Valid request
  782. time.sleep(0.1)
  783. dialog_token += 1
  784. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  785. attrs = wsc_attr_config_methods(methods=0x1008)
  786. msg['payload'] += ie_wsc(attrs)
  787. attrs = p2p_attr_capability()
  788. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  789. msg['payload'] += ie_p2p(attrs)
  790. hapd.mgmt_tx(msg)
  791. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  792. if ev is None:
  793. raise Exception("Timeout on device found event")
  794. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  795. if ev is None:
  796. raise Exception("Timeout on PD event")
  797. if hapd.mgmt_rx(timeout=1) is None:
  798. raise Exception("No PD response " + str(dialog_token))
  799. # Unknown group
  800. time.sleep(0.1)
  801. dialog_token += 1
  802. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  803. attrs = wsc_attr_config_methods(methods=0x1008)
  804. msg['payload'] += ie_wsc(attrs)
  805. attrs = p2p_attr_capability()
  806. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  807. attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
  808. msg['payload'] += ie_p2p(attrs)
  809. hapd.mgmt_tx(msg)
  810. if hapd.mgmt_rx(timeout=1) is None:
  811. raise Exception("No PD response " + str(dialog_token))
  812. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
  813. if ev is not None:
  814. raise Exception("Unexpected PD event")
  815. # Listen channel is not yet known
  816. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  817. raise Exception("Unexpected P2P_PROV_DISC success")
  818. # Unknown peer
  819. if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
  820. raise Exception("Unexpected P2P_PROV_DISC success (2)")
  821. def test_p2p_msg_pd(dev, apdev):
  822. """P2P protocol tests for provision discovery request processing (known)"""
  823. dst, src, hapd, channel = start_p2p(dev, apdev)
  824. dialog_token = 0
  825. p2p_probe(hapd, src, chan=channel)
  826. time.sleep(0.1)
  827. # Valid request
  828. dialog_token += 1
  829. msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
  830. attrs = wsc_attr_config_methods(methods=0x1008)
  831. msg['payload'] += ie_wsc(attrs)
  832. attrs = p2p_attr_capability()
  833. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  834. msg['payload'] += ie_p2p(attrs)
  835. hapd.mgmt_tx(msg)
  836. ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
  837. if ev is None:
  838. raise Exception("Timeout on device found event")
  839. ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  840. if ev is None:
  841. raise Exception("Timeout on PD event")
  842. if hapd.mgmt_rx(timeout=1) is None:
  843. raise Exception("No PD response " + str(dialog_token))
  844. if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
  845. raise Exception("Unexpected P2P_PROV_DISC failure")
  846. frame = hapd.mgmt_rx(timeout=1)
  847. if frame is None:
  848. raise Exception("No PD request " + str(dialog_token))
  849. p2p = parse_p2p_public_action(frame['payload'])
  850. if p2p is None:
  851. raise Exception("Failed to parse PD request")
  852. # invalid dialog token
  853. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  854. dialog_token=p2p['dialog_token'] + 1)
  855. hapd.mgmt_tx(msg)
  856. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  857. if ev is not None:
  858. raise Exception("Unexpected PD result event")
  859. # valid dialog token
  860. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  861. dialog_token=p2p['dialog_token'])
  862. hapd.mgmt_tx(msg)
  863. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
  864. if ev is None:
  865. raise Exception("Timeout on PD result event")
  866. # valid dialog token
  867. msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
  868. dialog_token=p2p['dialog_token'])
  869. hapd.mgmt_tx(msg)
  870. ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
  871. if ev is not None:
  872. raise Exception("Unexpected PD result event")
  873. def check_p2p_response(hapd, dialog_token, status):
  874. resp = hapd.mgmt_rx(timeout=1)
  875. if resp is None:
  876. raise Exception("No GO Neg Response " + str(dialog_token))
  877. p2p = parse_p2p_public_action(resp['payload'])
  878. if p2p is None:
  879. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  880. if dialog_token != p2p['dialog_token']:
  881. raise Exception("Unexpected dialog token in response")
  882. if p2p['p2p_status'] != status:
  883. raise Exception("Unexpected status code %s in response (expected %d)" % (p2p['p2p_status'], status))
  884. def test_p2p_msg_go_neg_both_start(dev, apdev):
  885. """P2P protocol test for simultaneous GO Neg initiation"""
  886. addr0 = dev[0].p2p_dev_addr()
  887. addr1 = dev[1].p2p_dev_addr()
  888. dev[0].p2p_listen()
  889. dev[1].discover_peer(addr0)
  890. dev[1].p2p_listen()
  891. dev[0].discover_peer(addr1)
  892. dev[0].p2p_listen()
  893. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
  894. raise Exception("Failed to enable external management frame handling")
  895. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
  896. raise Exception("Failed to enable external management frame handling")
  897. dev[0].request("P2P_CONNECT {} pbc".format(addr1))
  898. dev[1].request("P2P_CONNECT {} pbc".format(addr0))
  899. msg = dev[0].mgmt_rx()
  900. if msg is None:
  901. raise Exception("MGMT-RX timeout")
  902. msg = dev[1].mgmt_rx()
  903. if msg is None:
  904. raise Exception("MGMT-RX timeout(2)")
  905. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 0"):
  906. raise Exception("Failed to disable external management frame handling")
  907. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=2)
  908. if ev is not None:
  909. raise Exception("Unexpected GO Neg success")
  910. if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
  911. raise Exception("Failed to disable external management frame handling")
  912. ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  913. if ev is None:
  914. raise Exception("GO Neg did not succeed")
  915. ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
  916. if ev is None:
  917. raise Exception("Group formation not succeed")
  918. ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
  919. if ev is None:
  920. raise Exception("Group formation not succeed")
  921. def test_p2p_msg_go_neg_req(dev, apdev):
  922. """P2P protocol tests for invitation request from unknown peer"""
  923. dst, src, hapd, channel = start_p2p(dev, apdev)
  924. dialog_token = 0
  925. # invalid attribute
  926. dialog_token += 1
  927. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  928. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  929. msg['payload'] += ie_p2p(attrs)
  930. hapd.mgmt_tx(msg)
  931. frame = hapd.mgmt_rx(timeout=0.1)
  932. if frame is not None:
  933. print frame
  934. raise Exception("Unexpected GO Neg Response")
  935. # missing atributes
  936. dialog_token += 1
  937. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  938. attrs = p2p_attr_capability()
  939. attrs += p2p_attr_go_intent()
  940. attrs += p2p_attr_config_timeout()
  941. #attrs += p2p_attr_listen_channel()
  942. attrs += p2p_attr_ext_listen_timing()
  943. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  944. attrs += p2p_attr_channel_list()
  945. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  946. attrs += p2p_attr_operating_channel()
  947. msg['payload'] += ie_p2p(attrs)
  948. hapd.mgmt_tx(msg)
  949. if hapd.mgmt_rx(timeout=1) is None:
  950. raise Exception("No GO Neg Response " + str(dialog_token))
  951. time.sleep(0.1)
  952. dialog_token += 1
  953. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  954. attrs = p2p_attr_capability()
  955. attrs += p2p_attr_go_intent()
  956. attrs += p2p_attr_config_timeout()
  957. attrs += p2p_attr_listen_channel()
  958. attrs += p2p_attr_ext_listen_timing()
  959. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  960. attrs += p2p_attr_channel_list()
  961. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  962. #attrs += p2p_attr_operating_channel()
  963. msg['payload'] += ie_p2p(attrs)
  964. hapd.mgmt_tx(msg)
  965. if hapd.mgmt_rx(timeout=1) is None:
  966. raise Exception("No GO Neg Response " + str(dialog_token))
  967. time.sleep(0.1)
  968. dialog_token += 1
  969. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  970. attrs = p2p_attr_capability()
  971. attrs += p2p_attr_go_intent()
  972. attrs += p2p_attr_config_timeout()
  973. attrs += p2p_attr_listen_channel()
  974. attrs += p2p_attr_ext_listen_timing()
  975. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  976. #attrs += p2p_attr_channel_list()
  977. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  978. attrs += p2p_attr_operating_channel()
  979. msg['payload'] += ie_p2p(attrs)
  980. hapd.mgmt_tx(msg)
  981. if hapd.mgmt_rx(timeout=1) is None:
  982. raise Exception("No GO Neg Response " + str(dialog_token))
  983. time.sleep(0.1)
  984. dialog_token += 1
  985. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  986. attrs = p2p_attr_capability()
  987. attrs += p2p_attr_go_intent()
  988. attrs += p2p_attr_config_timeout()
  989. attrs += p2p_attr_listen_channel()
  990. attrs += p2p_attr_ext_listen_timing()
  991. #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  992. attrs += p2p_attr_channel_list()
  993. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  994. attrs += p2p_attr_operating_channel()
  995. msg['payload'] += ie_p2p(attrs)
  996. hapd.mgmt_tx(msg)
  997. if hapd.mgmt_rx(timeout=1) is None:
  998. raise Exception("No GO Neg Response " + str(dialog_token))
  999. time.sleep(0.1)
  1000. dialog_token += 1
  1001. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1002. attrs = p2p_attr_capability()
  1003. attrs += p2p_attr_go_intent()
  1004. attrs += p2p_attr_config_timeout()
  1005. attrs += p2p_attr_listen_channel()
  1006. attrs += p2p_attr_ext_listen_timing()
  1007. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1008. attrs += p2p_attr_channel_list()
  1009. #attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1010. attrs += p2p_attr_operating_channel()
  1011. msg['payload'] += ie_p2p(attrs)
  1012. hapd.mgmt_tx(msg)
  1013. if hapd.mgmt_rx(timeout=1) is None:
  1014. raise Exception("No GO Neg Response " + str(dialog_token))
  1015. time.sleep(0.1)
  1016. # SA != P2P Device address
  1017. dialog_token += 1
  1018. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1019. attrs = p2p_attr_capability()
  1020. attrs += p2p_attr_go_intent()
  1021. attrs += p2p_attr_config_timeout()
  1022. attrs += p2p_attr_listen_channel()
  1023. attrs += p2p_attr_ext_listen_timing()
  1024. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1025. attrs += p2p_attr_channel_list()
  1026. attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
  1027. attrs += p2p_attr_operating_channel()
  1028. msg['payload'] += ie_p2p(attrs)
  1029. hapd.mgmt_tx(msg)
  1030. if hapd.mgmt_rx(timeout=1) is None:
  1031. raise Exception("No GO Neg Response " + str(dialog_token))
  1032. time.sleep(0.1)
  1033. # unexpected Status attribute
  1034. dialog_token += 1
  1035. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1036. attrs = p2p_attr_capability()
  1037. attrs += p2p_attr_go_intent()
  1038. attrs += p2p_attr_config_timeout()
  1039. attrs += p2p_attr_listen_channel()
  1040. attrs += p2p_attr_ext_listen_timing()
  1041. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1042. attrs += p2p_attr_channel_list()
  1043. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1044. attrs += p2p_attr_operating_channel()
  1045. attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  1046. msg['payload'] += ie_p2p(attrs)
  1047. hapd.mgmt_tx(msg)
  1048. if hapd.mgmt_rx(timeout=1) is None:
  1049. raise Exception("No GO Neg Response(1) " + str(dialog_token))
  1050. time.sleep(0.1)
  1051. # valid (with workarounds) GO Neg Req
  1052. dialog_token += 1
  1053. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1054. #attrs = p2p_attr_capability()
  1055. #attrs += p2p_attr_go_intent()
  1056. #attrs += p2p_attr_config_timeout()
  1057. attrs = p2p_attr_listen_channel()
  1058. attrs += p2p_attr_ext_listen_timing()
  1059. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1060. attrs += p2p_attr_channel_list()
  1061. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1062. attrs += p2p_attr_operating_channel()
  1063. msg['payload'] += ie_p2p(attrs)
  1064. hapd.mgmt_tx(msg)
  1065. check_p2p_response(hapd, dialog_token,
  1066. P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
  1067. ev = dev[0].wait_event(["P2P-GO-NEG-REQUEST"], timeout=1)
  1068. if ev is None:
  1069. raise Exception("Timeout on GO Neg event " + str(dialog_token))
  1070. dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
  1071. # ready - missing attributes (with workarounds) GO Neg Req
  1072. time.sleep(0.1)
  1073. dialog_token += 1
  1074. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1075. #attrs = p2p_attr_capability()
  1076. #attrs += p2p_attr_go_intent()
  1077. #attrs += p2p_attr_config_timeout()
  1078. attrs = p2p_attr_listen_channel()
  1079. attrs += p2p_attr_ext_listen_timing()
  1080. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1081. attrs += p2p_attr_channel_list()
  1082. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1083. attrs += p2p_attr_operating_channel()
  1084. msg['payload'] += ie_p2p(attrs)
  1085. hapd.mgmt_tx(msg)
  1086. if hapd.mgmt_rx(timeout=1) is None:
  1087. raise Exception("No GO Neg Response " + str(dialog_token))
  1088. # ready - invalid GO Intent GO Neg Req
  1089. time.sleep(0.1)
  1090. dialog_token += 1
  1091. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1092. #attrs = p2p_attr_capability()
  1093. attrs = p2p_attr_go_intent(go_intent=16)
  1094. #attrs += p2p_attr_config_timeout()
  1095. attrs += p2p_attr_listen_channel()
  1096. attrs += p2p_attr_ext_listen_timing()
  1097. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1098. attrs += p2p_attr_channel_list()
  1099. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1100. attrs += p2p_attr_operating_channel()
  1101. msg['payload'] += ie_p2p(attrs)
  1102. hapd.mgmt_tx(msg)
  1103. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INVALID_PARAMS)
  1104. # ready - invalid Channel List
  1105. time.sleep(0.1)
  1106. dialog_token += 1
  1107. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1108. attrs = p2p_attr_capability()
  1109. attrs += p2p_attr_go_intent()
  1110. attrs += p2p_attr_config_timeout()
  1111. attrs += p2p_attr_listen_channel()
  1112. attrs += p2p_attr_ext_listen_timing()
  1113. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1114. attrs += struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
  1115. 0x58, 0x58, 0x04,
  1116. 81, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
  1117. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1118. attrs += p2p_attr_operating_channel()
  1119. msg['payload'] += ie_p2p(attrs)
  1120. hapd.mgmt_tx(msg)
  1121. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_NO_COMMON_CHANNELS)
  1122. # ready - invalid GO Neg Req (unsupported Device Password ID)
  1123. time.sleep(0.1)
  1124. dialog_token += 1
  1125. msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
  1126. attrs = p2p_attr_capability()
  1127. attrs += p2p_attr_go_intent()
  1128. attrs += p2p_attr_config_timeout()
  1129. attrs += p2p_attr_listen_channel()
  1130. attrs += p2p_attr_ext_listen_timing()
  1131. attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
  1132. # very long channel list
  1133. attrs += struct.pack("<BH3BBB11B30B", P2P_ATTR_CHANNEL_LIST, 46,
  1134. 0x58, 0x58, 0x04,
  1135. 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  1136. 1, 1, 1, 2, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5,
  1137. 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10)
  1138. attrs += p2p_attr_device_info(src, config_methods=0x0108)
  1139. attrs += p2p_attr_operating_channel()
  1140. msg['payload'] += ie_p2p(attrs)
  1141. hapd.mgmt_tx(msg)
  1142. check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD)
  1143. def mgmt_tx(dev, msg):
  1144. for i in range(0, 20):
  1145. if "FAIL" in dev.request(msg):
  1146. raise Exception("Failed to send Action frame")
  1147. ev = dev.wait_event(["MGMT-TX-STATUS"], timeout=10)
  1148. if ev is None:
  1149. raise Exception("Timeout on MGMT-TX-STATUS")
  1150. if "result=SUCCESS" in ev:
  1151. break
  1152. time.sleep(0.01)
  1153. if "result=SUCCESS" not in ev:
  1154. raise Exception("Peer did not ack Action frame")
  1155. def rx_go_neg_req(dev):
  1156. msg = dev.mgmt_rx()
  1157. if msg is None:
  1158. raise Exception("MGMT-RX timeout")
  1159. p2p = parse_p2p_public_action(msg['payload'])
  1160. if p2p is None:
  1161. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1162. if p2p['subtype'] != P2P_GO_NEG_REQ:
  1163. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  1164. p2p['freq'] = msg['freq']
  1165. return p2p
  1166. def rx_go_neg_conf(dev, status=None, dialog_token=None):
  1167. msg = dev.mgmt_rx()
  1168. if msg is None:
  1169. raise Exception("MGMT-RX timeout")
  1170. p2p = parse_p2p_public_action(msg['payload'])
  1171. if p2p is None:
  1172. raise Exception("Not a P2P Public Action frame " + str(dialog_token))
  1173. if p2p['subtype'] != P2P_GO_NEG_CONF:
  1174. raise Exception("Unexpected subtype %d" % p2p['subtype'])
  1175. if dialog_token is not None and dialog_token != p2p['dialog_token']:
  1176. raise Exception("Unexpected dialog token")
  1177. if status is not None and p2p['p2p_status'] != status:
  1178. raise Exception("Unexpected status %d" % p2p['p2p_status'])
  1179. def check_p2p_go_neg_fail_event(dev, status):
  1180. ev = dev.wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
  1181. if ev is None:
  1182. raise Exception("GO Negotiation failure not reported")
  1183. if "status=%d" % status not in ev:
  1184. raise Exception("Unexpected failure reason: " + ev)
  1185. def test_p2p_msg_go_neg_req_reject(dev, apdev):
  1186. """P2P protocol tests for user reject incorrectly in GO Neg Req"""
  1187. addr0 = dev[0].p2p_dev_addr()
  1188. addr1 = dev[1].p2p_dev_addr()
  1189. dev[0].p2p_listen()
  1190. dev[1].discover_peer(addr0)
  1191. dev[1].group_request("P2P_CONNECT " + addr0 + " pbc")
  1192. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1193. if ev is None:
  1194. raise Exception("Timeout on GO Neg Req")
  1195. peer = dev[0].get_peer(addr1)
  1196. dev[0].p2p_stop_find()
  1197. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_REQ, dialog_token=123)
  1198. attrs = p2p_attr_capability()
  1199. attrs += p2p_attr_status(status=P2P_SC_FAIL_REJECTED_BY_USER)
  1200. attrs += p2p_attr_go_intent()
  1201. attrs += p2p_attr_config_timeout()
  1202. attrs += p2p_attr_listen_channel()
  1203. attrs += p2p_attr_ext_listen_timing()
  1204. attrs += p2p_attr_intended_interface_addr(addr0)
  1205. attrs += p2p_attr_channel_list()
  1206. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1207. attrs += p2p_attr_operating_channel()
  1208. msg['payload'] += ie_p2p(attrs)
  1209. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1210. ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
  1211. if ev is None:
  1212. raise Exception("GO Negotiation failure not reported")
  1213. if "status=%d" % P2P_SC_FAIL_REJECTED_BY_USER not in ev:
  1214. raise Exception("Unexpected failure reason: " + ev)
  1215. def test_p2p_msg_unexpected_go_neg_resp(dev, apdev):
  1216. """P2P protocol tests for unexpected GO Neg Resp"""
  1217. addr0 = dev[0].p2p_dev_addr()
  1218. addr1 = dev[1].p2p_dev_addr()
  1219. dev[1].p2p_listen()
  1220. dev[0].discover_peer(addr1)
  1221. dev[0].p2p_stop_find()
  1222. peer = dev[0].get_peer(addr1)
  1223. logger.debug("GO Neg Resp without GO Neg session")
  1224. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=123)
  1225. attrs = p2p_attr_status()
  1226. attrs += p2p_attr_capability()
  1227. attrs += p2p_attr_go_intent()
  1228. attrs += p2p_attr_config_timeout()
  1229. attrs += p2p_attr_intended_interface_addr(addr0)
  1230. attrs += p2p_attr_channel_list()
  1231. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1232. attrs += p2p_attr_operating_channel()
  1233. msg['payload'] += ie_p2p(attrs)
  1234. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1235. dev[0].p2p_listen()
  1236. dev[1].discover_peer(addr0)
  1237. logger.debug("Unexpected GO Neg Resp while waiting for new GO Neg session")
  1238. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1239. raise Exception("P2P_CONNECT failed")
  1240. ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  1241. if ev is None:
  1242. raise Exception("Timeout on GO Neg Req")
  1243. dev[0].p2p_stop_find()
  1244. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1245. logger.debug("Invalid attribute in GO Neg Response")
  1246. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=197)
  1247. attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
  1248. msg['payload'] += ie_p2p(attrs)
  1249. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
  1250. frame = dev[0].mgmt_rx(timeout=0.1)
  1251. if frame is not None:
  1252. raise Exception("Unexpected GO Neg Confirm")
  1253. logger.debug("GO Neg Resp with unexpected dialog token")
  1254. dev[1].p2p_stop_find()
  1255. if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
  1256. raise Exception("Failed to enable external management frame handling")
  1257. dev[0].p2p_listen()
  1258. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1259. raise Exception("P2P_CONNECT failed(2)")
  1260. p2p = rx_go_neg_req(dev[0])
  1261. dev[0].p2p_stop_find()
  1262. dialog_token = p2p['dialog_token']
  1263. if dialog_token < 255:
  1264. dialog_token += 1
  1265. else:
  1266. dialog_token = 1
  1267. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1268. attrs = p2p_attr_status()
  1269. attrs += p2p_attr_capability()
  1270. attrs += p2p_attr_go_intent()
  1271. attrs += p2p_attr_config_timeout()
  1272. attrs += p2p_attr_intended_interface_addr(addr0)
  1273. attrs += p2p_attr_channel_list()
  1274. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1275. attrs += p2p_attr_operating_channel()
  1276. msg['payload'] += ie_p2p(attrs)
  1277. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1278. logger.debug("GO Neg Resp without Status")
  1279. dev[1].p2p_stop_find()
  1280. dev[0].p2p_listen()
  1281. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1282. raise Exception("P2P_CONNECT failed(2)")
  1283. p2p = rx_go_neg_req(dev[0])
  1284. dev[0].p2p_stop_find()
  1285. dialog_token = p2p['dialog_token']
  1286. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1287. #attrs = p2p_attr_status()
  1288. attrs = p2p_attr_capability()
  1289. attrs += p2p_attr_go_intent()
  1290. attrs += p2p_attr_config_timeout()
  1291. attrs += p2p_attr_intended_interface_addr(addr0)
  1292. attrs += p2p_attr_channel_list()
  1293. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1294. attrs += p2p_attr_operating_channel()
  1295. msg['payload'] += ie_p2p(attrs)
  1296. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1297. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1298. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1299. logger.debug("GO Neg Resp without Intended Address")
  1300. dev[1].p2p_stop_find()
  1301. dev[0].p2p_listen()
  1302. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1303. raise Exception("P2P_CONNECT failed(2)")
  1304. p2p = rx_go_neg_req(dev[0])
  1305. dev[0].p2p_stop_find()
  1306. dialog_token = p2p['dialog_token']
  1307. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1308. attrs = p2p_attr_status()
  1309. #attrs += p2p_attr_capability()
  1310. attrs += p2p_attr_go_intent()
  1311. attrs += p2p_attr_config_timeout()
  1312. #attrs += p2p_attr_intended_interface_addr(addr0)
  1313. attrs += p2p_attr_channel_list()
  1314. #attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1315. attrs += p2p_attr_operating_channel()
  1316. msg['payload'] += ie_p2p(attrs)
  1317. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1318. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1319. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1320. logger.debug("GO Neg Resp without GO Intent")
  1321. dev[1].p2p_stop_find()
  1322. dev[0].p2p_listen()
  1323. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1324. raise Exception("P2P_CONNECT failed(2)")
  1325. p2p = rx_go_neg_req(dev[0])
  1326. dev[0].p2p_stop_find()
  1327. dialog_token = p2p['dialog_token']
  1328. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1329. attrs = p2p_attr_status()
  1330. attrs += p2p_attr_capability()
  1331. #attrs += p2p_attr_go_intent()
  1332. attrs += p2p_attr_config_timeout()
  1333. attrs += p2p_attr_intended_interface_addr(addr0)
  1334. attrs += p2p_attr_channel_list()
  1335. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1336. attrs += p2p_attr_operating_channel()
  1337. msg['payload'] += ie_p2p(attrs)
  1338. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1339. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1340. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1341. logger.debug("GO Neg Resp with invalid GO Intent")
  1342. dev[1].p2p_stop_find()
  1343. dev[0].p2p_listen()
  1344. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
  1345. raise Exception("P2P_CONNECT failed(2)")
  1346. p2p = rx_go_neg_req(dev[0])
  1347. dev[0].p2p_stop_find()
  1348. dialog_token = p2p['dialog_token']
  1349. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1350. attrs = p2p_attr_status()
  1351. attrs += p2p_attr_capability()
  1352. attrs += p2p_attr_go_intent(go_intent=16)
  1353. attrs += p2p_attr_config_timeout()
  1354. attrs += p2p_attr_intended_interface_addr(addr0)
  1355. attrs += p2p_attr_channel_list()
  1356. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1357. attrs += p2p_attr_operating_channel()
  1358. msg['payload'] += ie_p2p(attrs)
  1359. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1360. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1361. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1362. logger.debug("GO Neg Resp with incompatible GO Intent")
  1363. dev[1].p2p_stop_find()
  1364. dev[0].p2p_listen()
  1365. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15"):
  1366. raise Exception("P2P_CONNECT failed(2)")
  1367. p2p = rx_go_neg_req(dev[0])
  1368. dev[0].p2p_stop_find()
  1369. dialog_token = p2p['dialog_token']
  1370. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1371. attrs = p2p_attr_status()
  1372. attrs += p2p_attr_capability()
  1373. attrs += p2p_attr_go_intent(go_intent=15)
  1374. attrs += p2p_attr_config_timeout()
  1375. attrs += p2p_attr_intended_interface_addr(addr0)
  1376. attrs += p2p_attr_channel_list()
  1377. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1378. attrs += p2p_attr_operating_channel()
  1379. msg['payload'] += ie_p2p(attrs)
  1380. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1381. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INCOMPATIBLE_PARAMS)
  1382. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INCOMPATIBLE_PARAMS, dialog_token)
  1383. logger.debug("GO Neg Resp without P2P Group ID")
  1384. dev[1].p2p_stop_find()
  1385. dev[0].p2p_listen()
  1386. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1387. raise Exception("P2P_CONNECT failed(2)")
  1388. p2p = rx_go_neg_req(dev[0])
  1389. dev[0].p2p_stop_find()
  1390. dialog_token = p2p['dialog_token']
  1391. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1392. attrs = p2p_attr_status()
  1393. attrs += p2p_attr_capability()
  1394. attrs += p2p_attr_go_intent(go_intent=15)
  1395. attrs += p2p_attr_config_timeout()
  1396. attrs += p2p_attr_intended_interface_addr(addr0)
  1397. attrs += p2p_attr_channel_list()
  1398. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1399. attrs += p2p_attr_operating_channel()
  1400. #attrs += p2p_attr_group_id(src, "DIRECT-foo")
  1401. msg['payload'] += ie_p2p(attrs)
  1402. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1403. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1404. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1405. logger.debug("GO Neg Resp without Operating Channel")
  1406. dev[1].p2p_stop_find()
  1407. dev[0].p2p_listen()
  1408. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1409. raise Exception("P2P_CONNECT failed(2)")
  1410. p2p = rx_go_neg_req(dev[0])
  1411. dev[0].p2p_stop_find()
  1412. dialog_token = p2p['dialog_token']
  1413. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1414. attrs = p2p_attr_status()
  1415. attrs += p2p_attr_capability()
  1416. attrs += p2p_attr_go_intent(go_intent=15)
  1417. #attrs += p2p_attr_config_timeout()
  1418. attrs += p2p_attr_intended_interface_addr(addr0)
  1419. attrs += p2p_attr_channel_list()
  1420. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1421. #attrs += p2p_attr_operating_channel()
  1422. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1423. msg['payload'] += ie_p2p(attrs)
  1424. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1425. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1426. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1427. logger.debug("GO Neg Resp without Channel List")
  1428. dev[1].p2p_stop_find()
  1429. dev[0].p2p_listen()
  1430. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1431. raise Exception("P2P_CONNECT failed(2)")
  1432. p2p = rx_go_neg_req(dev[0])
  1433. dev[0].p2p_stop_find()
  1434. dialog_token = p2p['dialog_token']
  1435. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1436. attrs = p2p_attr_status()
  1437. attrs += p2p_attr_capability()
  1438. attrs += p2p_attr_go_intent(go_intent=15)
  1439. attrs += p2p_attr_config_timeout()
  1440. attrs += p2p_attr_intended_interface_addr(addr0)
  1441. #attrs += p2p_attr_channel_list()
  1442. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1443. attrs += p2p_attr_operating_channel()
  1444. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1445. msg['payload'] += ie_p2p(attrs)
  1446. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1447. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
  1448. rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
  1449. logger.debug("GO Neg Resp without common channels")
  1450. dev[1].p2p_stop_find()
  1451. dev[0].p2p_listen()
  1452. if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
  1453. raise Exception("P2P_CONNECT failed(2)")
  1454. p2p = rx_go_neg_req(dev[0])
  1455. dev[0].p2p_stop_find()
  1456. dialog_token = p2p['dialog_token']
  1457. msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
  1458. attrs = p2p_attr_status()
  1459. attrs += p2p_attr_capability()
  1460. attrs += p2p_attr_go_intent(go_intent=15)
  1461. attrs += p2p_attr_config_timeout()
  1462. attrs += p2p_attr_intended_interface_addr(addr0)
  1463. attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
  1464. 0x58, 0x58, 0x04,
  1465. 81, 0)
  1466. attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
  1467. attrs += p2p_attr_operating_channel()
  1468. attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
  1469. msg['payload'] += ie_p2p(attrs)
  1470. mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
  1471. check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_NO_COMMON_CHANNELS)
  1472. rx_go_neg_conf(dev[0], P2P_SC_FAIL_NO_COMMON_CHANNELS, dialog_token)