test_p2p_messages.py 80 KB

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