test_p2p_messages.py 75 KB

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