test_p2p_messages.py 88 KB

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