1 # P2P protocol tests for various messages
2 # Copyright (c) 2014, Jouni Malinen <j@w1.fi>
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
11 logger = logging.getLogger()
14 from test_p2p_persistent import form
15 from test_p2p_persistent import invite
17 MGMT_SUBTYPE_PROBE_REQ = 4
18 MGMT_SUBTYPE_ACTION = 13
19 ACTION_CATEG_PUBLIC = 4
24 P2P_INVITATION_REQ = 3
25 P2P_INVITATION_RESP = 4
29 P2P_PROV_DISC_RESP = 8
32 P2P_ATTR_MINOR_REASON_CODE = 1
33 P2P_ATTR_CAPABILITY = 2
34 P2P_ATTR_DEVICE_ID = 3
35 P2P_ATTR_GROUP_OWNER_INTENT = 4
36 P2P_ATTR_CONFIGURATION_TIMEOUT = 5
37 P2P_ATTR_LISTEN_CHANNEL = 6
38 P2P_ATTR_GROUP_BSSID = 7
39 P2P_ATTR_EXT_LISTEN_TIMING = 8
40 P2P_ATTR_INTENDED_INTERFACE_ADDR = 9
41 P2P_ATTR_MANAGEABILITY = 10
42 P2P_ATTR_CHANNEL_LIST = 11
43 P2P_ATTR_NOTICE_OF_ABSENCE = 12
44 P2P_ATTR_DEVICE_INFO = 13
45 P2P_ATTR_GROUP_INFO = 14
46 P2P_ATTR_GROUP_ID = 15
47 P2P_ATTR_INTERFACE = 16
48 P2P_ATTR_OPERATING_CHANNEL = 17
49 P2P_ATTR_INVITATION_FLAGS = 18
50 P2P_ATTR_OOB_GO_NEG_CHANNEL = 19
51 P2P_ATTR_VENDOR_SPECIFIC = 221
54 P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE = 1
55 P2P_SC_FAIL_INCOMPATIBLE_PARAMS = 2
56 P2P_SC_FAIL_LIMIT_REACHED = 3
57 P2P_SC_FAIL_INVALID_PARAMS = 4
58 P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE = 5
59 P2P_SC_FAIL_PREV_PROTOCOL_ERROR = 6
60 P2P_SC_FAIL_NO_COMMON_CHANNELS = 7
61 P2P_SC_FAIL_UNKNOWN_GROUP = 8
62 P2P_SC_FAIL_BOTH_GO_INTENT_15 = 9
63 P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10
64 P2P_SC_FAIL_REJECTED_BY_USER = 11
66 WSC_ATTR_CONFIG_METHODS = 0x1008
69 WLAN_EID_SUPP_RATES = 1
70 WLAN_EID_VENDOR_SPECIFIC = 221
73 return struct.pack("<BB", WLAN_EID_SSID, len(ssid)) + ssid
76 return struct.pack("<BBBBBBBBBB", WLAN_EID_SUPP_RATES, 8,
77 2*6, 2*9, 2*12, 2*18, 2*24, 2*36, 2*48, 2*54)
80 return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
81 0x50, 0x6f, 0x9a, 9) + attrs
84 return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
85 0x00, 0x50, 0xf2, 4) + attrs
87 def wsc_attr_config_methods(methods=0):
88 return struct.pack(">HHH", WSC_ATTR_CONFIG_METHODS, 2, methods)
90 def p2p_attr_status(status=P2P_SC_SUCCESS):
91 return struct.pack("<BHB", P2P_ATTR_STATUS, 1, status)
93 def p2p_attr_minor_reason_code(code=0):
94 return struct.pack("<BHB", P2P_ATTR_MINOR_REASON_CODE, 1, code)
96 def p2p_attr_capability(dev_capab=0, group_capab=0):
97 return struct.pack("<BHBB", P2P_ATTR_CAPABILITY, 2, dev_capab, group_capab)
99 def p2p_attr_device_id(addr):
100 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
101 t = (P2P_ATTR_DEVICE_ID, 6) + val
102 return struct.pack('<BH6B', *t)
104 def p2p_attr_go_intent(go_intent=0, tie_breaker=0):
105 return struct.pack("<BHB", P2P_ATTR_GROUP_OWNER_INTENT, 1,
106 (go_intent << 1) | (tie_breaker & 0x01))
108 def p2p_attr_config_timeout(go_config_timeout=0, client_config_timeout=0):
109 return struct.pack("<BHBB", P2P_ATTR_CONFIGURATION_TIMEOUT, 2,
110 go_config_timeout, client_config_timeout)
112 def p2p_attr_listen_channel(op_class=81, chan=1):
113 return struct.pack("<BHBBBBB", P2P_ATTR_LISTEN_CHANNEL, 5,
114 0x58, 0x58, 0x04, op_class, chan)
116 def p2p_attr_group_bssid(addr):
117 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
118 t = (P2P_ATTR_GROUP_BSSID, 6) + val
119 return struct.pack('<BH6B', *t)
121 def p2p_attr_ext_listen_timing(period=0, interval=0):
122 return struct.pack("<BHHH", P2P_ATTR_EXT_LISTEN_TIMING, 4, period, interval)
124 def p2p_attr_intended_interface_addr(addr):
125 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
126 t = (P2P_ATTR_INTENDED_INTERFACE_ADDR, 6) + val
127 return struct.pack('<BH6B', *t)
129 def p2p_attr_manageability(bitmap=0):
130 return struct.pack("<BHB", P2P_ATTR_MANAGEABILITY, 1, bitmap)
132 def p2p_attr_channel_list():
133 return struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
135 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
137 def p2p_attr_device_info(addr, name="Test", config_methods=0, dev_type="00010050F2040001"):
138 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
139 val2 = struct.unpack('8B', binascii.unhexlify(dev_type))
140 t = (P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 4 + len(name)) + val + (config_methods,) + val2 + (0,)
141 return struct.pack("<BH6BH8BB", *t) + struct.pack('>HH', 0x1011, len(name)) +name
143 def p2p_attr_group_id(addr, ssid):
144 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
145 t = (P2P_ATTR_GROUP_ID, 6 + len(ssid)) + val
146 return struct.pack('<BH6B', *t) + ssid
148 def p2p_attr_operating_channel(op_class=81, chan=1):
149 return struct.pack("<BHBBBBB", P2P_ATTR_OPERATING_CHANNEL, 5,
150 0x58, 0x58, 0x04, op_class, chan)
152 def p2p_attr_invitation_flags(bitmap=0):
153 return struct.pack("<BHB", P2P_ATTR_INVITATION_FLAGS, 1, bitmap)
155 def p2p_hdr_helper(dst, src, type=None, dialog_token=1, req=True):
157 msg['fc'] = MGMT_SUBTYPE_ACTION << 4
164 msg['payload'] = struct.pack("<BBBBBB",
165 ACTION_CATEG_PUBLIC, 9, 0x50, 0x6f, 0x9a, 9)
167 msg['payload'] += struct.pack("<B", type)
169 msg['payload'] += struct.pack("<B", dialog_token)
172 def p2p_hdr(dst, src, type=None, dialog_token=1):
173 return p2p_hdr_helper(dst, src, type, dialog_token, True)
175 def p2p_hdr_resp(dst, src, type=None, dialog_token=1):
176 return p2p_hdr_helper(dst, src, type, dialog_token, False)
178 def start_p2p(dev, apdev):
179 addr0 = dev[0].p2p_dev_addr()
181 dev[1].p2p_find(social=True)
182 ev = dev[1].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
184 raise Exception("Device discovery timed out")
185 dev[1].p2p_stop_find()
186 peer = dev[1].get_peer(addr0)
188 bssid = apdev[0]['bssid']
189 params = { 'ssid': "test", 'beacon_int': "2000" }
190 if peer['listen_freq'] == "2412":
191 params['channel'] = '1'
192 elif peer['listen_freq'] == "2437":
193 params['channel'] = '6'
194 elif peer['listen_freq'] == "2462":
195 params['channel'] = '11'
196 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
197 hapd.set("ext_mgmt_frame_handling", "1")
198 return addr0, bssid, hapd, int(params['channel'])
200 def p2p_probe(hapd, src, chan=1):
202 msg['fc'] = MGMT_SUBTYPE_PROBE_REQ << 4
203 msg['da'] = "ff:ff:ff:ff:ff:ff"
205 msg['bssid'] = "ff:ff:ff:ff:ff:ff"
206 attrs = p2p_attr_listen_channel(chan=chan)
207 msg['payload'] = ie_ssid("DIRECT-") + ie_supp_rates() + ie_p2p(attrs)
210 def parse_p2p_public_action(payload):
212 (category, action) = struct.unpack('BB', pos[0:2])
213 if category != ACTION_CATEG_PUBLIC:
218 (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
219 if oui1 != 0x50 or oui2 != 0x6f or oui3 != 0x9a or subtype != 9:
222 (subtype,dialog_token) = struct.unpack('BB', pos[0:2])
224 p2p['subtype'] = subtype
225 p2p['dialog_token'] = dialog_token
227 p2p['elements'] = pos
229 (id,elen) = struct.unpack('BB', pos[0:2])
232 raise Exception("Truncated IE in P2P Public Action frame (elen=%d left=%d)" % (elen, len(pos)))
233 if id == WLAN_EID_VENDOR_SPECIFIC:
235 raise Exception("Too short vendor specific IE in P2P Public Action frame (elen=%d)" % elen)
236 (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
237 if oui1 == 0x50 and oui2 == 0x6f and oui3 == 0x9a and subtype == 9:
239 p2p['p2p'] += pos[4:elen]
241 p2p['p2p'] = pos[4:elen]
242 if oui1 == 0x00 and oui2 == 0x50 and oui3 == 0xf2 and subtype == 4:
243 p2p['wsc'] = pos[4:elen]
246 raise Exception("Invalid element in P2P Public Action frame")
249 p2p['p2p_attrs'] = {}
252 (id,alen) = struct.unpack('<BH', pos[0:3])
255 logger.info("P2P payload: " + binascii.hexlify(p2p['p2p']))
256 raise Exception("Truncated P2P attribute in P2P Public Action frame (alen=%d left=%d p2p-payload=%d)" % (alen, len(pos), len(p2p['p2p'])))
257 p2p['p2p_attrs'][id] = pos[0:alen]
259 if P2P_ATTR_STATUS in p2p['p2p_attrs']:
260 p2p['p2p_status'] = struct.unpack('B', p2p['p2p_attrs'][P2P_ATTR_STATUS])[0]
263 p2p['wsc_attrs'] = {}
266 (id,alen) = struct.unpack('>HH', pos[0:4])
269 logger.info("WSC payload: " + binascii.hexlify(p2p['wsc']))
270 raise Exception("Truncated WSC attribute in P2P Public Action frame (alen=%d left=%d wsc-payload=%d)" % (alen, len(pos), len(p2p['wsc'])))
271 p2p['wsc_attrs'][id] = pos[0:alen]
276 def test_p2p_msg_empty(dev, apdev):
277 """P2P protocol test: empty P2P Public Action frame"""
278 dst, src, hapd, channel = start_p2p(dev, apdev)
279 msg = p2p_hdr(dst, src)
282 def test_p2p_msg_invitation_req(dev, apdev):
283 """P2P protocol tests for invitation request processing"""
284 dst, src, hapd, channel = start_p2p(dev, apdev)
286 # Empty P2P Invitation Request (missing dialog token)
287 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=None)
291 # Various p2p_parse() failure cases due to invalid attributes
293 # Too short attribute header
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)
300 # Minimal attribute underflow
302 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
303 attrs = struct.pack("<BH", P2P_ATTR_CAPABILITY, 1)
304 msg['payload'] += ie_p2p(attrs)
307 # Large attribute underflow
309 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
310 attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 0xffff, 1)
311 msg['payload'] += ie_p2p(attrs)
314 # Too short Capability attribute
316 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
317 attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 1, 0)
318 msg['payload'] += ie_p2p(attrs)
321 # Too short Device ID attribute
323 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
324 val = struct.unpack('5B', binascii.unhexlify("1122334455"))
325 t = (P2P_ATTR_DEVICE_ID, 5) + val
326 attrs = struct.pack('<BH5B', *t)
327 msg['payload'] += ie_p2p(attrs)
330 # Too short GO Intent attribute
332 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
333 attrs = struct.pack("<BH", P2P_ATTR_GROUP_OWNER_INTENT, 0)
334 msg['payload'] += ie_p2p(attrs)
337 # Too short Status attribute
339 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
340 attrs = struct.pack("<BH", P2P_ATTR_STATUS, 0)
341 msg['payload'] += ie_p2p(attrs)
344 # null Listen channel and too short Listen Channel attribute
346 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
347 attrs = struct.pack("<BH", P2P_ATTR_LISTEN_CHANNEL, 0)
348 attrs += struct.pack("<BHB", P2P_ATTR_LISTEN_CHANNEL, 1, 0)
349 msg['payload'] += ie_p2p(attrs)
352 # null Operating channel and too short Operating Channel attribute
354 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
355 attrs = struct.pack("<BH", P2P_ATTR_OPERATING_CHANNEL, 0)
356 attrs += struct.pack("<BHB", P2P_ATTR_OPERATING_CHANNEL, 1, 0)
357 msg['payload'] += ie_p2p(attrs)
360 # Too short Channel List attribute
362 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
363 attrs = struct.pack("<BHBB", P2P_ATTR_CHANNEL_LIST, 2, 1, 2)
364 msg['payload'] += ie_p2p(attrs)
367 # Too short Device Info attribute
369 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
370 attrs = struct.pack("<BHBB", P2P_ATTR_DEVICE_INFO, 2, 1, 2)
371 msg['payload'] += ie_p2p(attrs)
374 # Truncated Secondary Device Types in Device Info attribute
376 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
377 attrs = struct.pack("<BH6BH8BB", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1,
380 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22,
382 msg['payload'] += ie_p2p(attrs)
385 # Missing Device Name in Device Info attribute
387 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
388 attrs = struct.pack("<BH6BH8BB8B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8,
391 0, 0, 0, 0, 0, 0, 0, 0,
393 1, 2, 3, 4, 5, 6, 7, 8)
394 msg['payload'] += ie_p2p(attrs)
397 # Invalid Device Name header in Device Info attribute
399 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
400 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
403 0, 0, 0, 0, 0, 0, 0, 0,
405 1, 2, 3, 4, 5, 6, 7, 8,
407 msg['payload'] += ie_p2p(attrs)
410 # Invalid Device Name header length in Device Info attribute
412 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
413 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
416 0, 0, 0, 0, 0, 0, 0, 0,
418 1, 2, 3, 4, 5, 6, 7, 8,
419 0x10, 0x11, 0xff, 0xff)
420 msg['payload'] += ie_p2p(attrs)
423 # Invalid Device Name header length in Device Info attribute
425 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
427 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
430 0, 0, 0, 0, 0, 0, 0, 0,
432 1, 2, 3, 4, 5, 6, 7, 8,
433 0x10, 0x11, 0, len(devname) + 1) + devname
434 msg['payload'] += ie_p2p(attrs)
437 # Device Name filtering and too long Device Name in Device Info attribute
439 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
440 attrs = struct.pack("<BH6BH8BB8B4B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + 4,
443 0, 0, 0, 0, 0, 0, 0, 0,
445 1, 2, 3, 4, 5, 6, 7, 8,
448 devname = '123456789012345678901234567890123'
449 attrs += struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
452 0, 0, 0, 0, 0, 0, 0, 0,
454 1, 2, 3, 4, 5, 6, 7, 8,
455 0x10, 0x11, 0, len(devname)) + devname
456 msg['payload'] += ie_p2p(attrs)
459 # Too short Configuration Timeout attribute
461 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
462 attrs = struct.pack("<BHB", P2P_ATTR_CONFIGURATION_TIMEOUT, 1, 1)
463 msg['payload'] += ie_p2p(attrs)
466 # Too short Intended P2P Interface Address attribute
468 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
469 attrs = struct.pack("<BHB", P2P_ATTR_INTENDED_INTERFACE_ADDR, 1, 1)
470 msg['payload'] += ie_p2p(attrs)
473 # Too short P2P Group BSSID attribute
475 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
476 attrs = struct.pack("<BHB", P2P_ATTR_GROUP_BSSID, 1, 1)
477 msg['payload'] += ie_p2p(attrs)
480 # Too short P2P Group ID attribute
482 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
483 attrs = struct.pack("<BHB", P2P_ATTR_GROUP_ID, 1, 1)
484 msg['payload'] += ie_p2p(attrs)
487 # Too long P2P Group ID attribute
489 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
490 attrs = struct.pack("<BH6B", P2P_ATTR_GROUP_ID, 6 + 33, 0, 0, 0, 0, 0, 0) + "123456789012345678901234567890123"
491 msg['payload'] += ie_p2p(attrs)
494 # Too short Invitation Flags attribute
496 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
497 attrs = struct.pack("<BH", P2P_ATTR_INVITATION_FLAGS, 0)
498 msg['payload'] += ie_p2p(attrs)
501 # Valid and too short Manageability attribute
503 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
504 attrs = p2p_attr_manageability()
505 attrs += struct.pack("<BH", P2P_ATTR_MANAGEABILITY, 0)
506 msg['payload'] += ie_p2p(attrs)
509 # Too short NoA attribute
511 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
512 attrs = struct.pack("<BHB", P2P_ATTR_NOTICE_OF_ABSENCE, 1, 1)
513 msg['payload'] += ie_p2p(attrs)
516 # Valid and too short Extended Listen Timing attributes
518 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
519 attrs = p2p_attr_ext_listen_timing(period=100, interval=50)
520 attrs += struct.pack("<BHBBB", P2P_ATTR_EXT_LISTEN_TIMING, 3, 0, 0, 0)
521 msg['payload'] += ie_p2p(attrs)
524 # Valid and too short Minor Reason Code attributes
526 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
527 attrs = p2p_attr_minor_reason_code(code=2)
528 attrs += struct.pack("<BH", P2P_ATTR_MINOR_REASON_CODE, 0)
529 msg['payload'] += ie_p2p(attrs)
532 # Unknown attribute and too short OOB GO Negotiation Channel attribute
534 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
535 attrs = struct.pack("<BHB", 99, 1, 1)
536 attrs += struct.pack("<BHB", P2P_ATTR_OOB_GO_NEG_CHANNEL, 1, 1)
537 msg['payload'] += ie_p2p(attrs)
540 if hapd.mgmt_rx(timeout=0.5) is not None:
541 raise Exception("Unexpected management frame received")
543 dev[0].dump_monitor()
545 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
546 attrs = p2p_attr_config_timeout()
547 attrs += p2p_attr_invitation_flags()
548 attrs += p2p_attr_operating_channel()
549 attrs += p2p_attr_group_bssid(src)
550 attrs += p2p_attr_channel_list()
551 attrs += p2p_attr_group_id(src, "DIRECT-foo")
552 attrs += p2p_attr_device_info(src, config_methods=0x0108)
553 msg['payload'] += ie_p2p(attrs)
555 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
557 raise Exception("Timeout on device found event")
558 ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
560 raise Exception("Timeout on invitation event " + str(dialog_token))
561 if hapd.mgmt_rx(timeout=1) is None:
562 raise Exception("No invitation response " + str(dialog_token))
565 dev[0].dump_monitor()
567 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
568 attrs = p2p_attr_config_timeout()
569 attrs += p2p_attr_invitation_flags()
570 attrs += p2p_attr_operating_channel()
571 attrs += p2p_attr_group_bssid(src)
572 attrs += p2p_attr_channel_list()
573 attrs += p2p_attr_group_id(src, "DIRECT-foo")
574 attrs += p2p_attr_device_info(src, config_methods=0x0108)
575 msg['payload'] += ie_p2p(attrs)
577 ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
579 raise Exception("Timeout on invitation event " + str(dialog_token))
580 if hapd.mgmt_rx(timeout=1) is None:
581 raise Exception("No invitation response " + str(dialog_token))
584 dev[0].dump_monitor()
586 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
587 #attrs = p2p_attr_config_timeout()
588 attrs = p2p_attr_invitation_flags()
589 attrs += p2p_attr_operating_channel()
590 attrs += p2p_attr_group_bssid(src)
591 attrs += p2p_attr_channel_list()
592 attrs += p2p_attr_group_id(src, "DIRECT-foo")
593 attrs += p2p_attr_device_info(src, config_methods=0x0108)
594 msg['payload'] += ie_p2p(attrs)
596 if hapd.mgmt_rx(timeout=1) is None:
597 raise Exception("No invitation response " + str(dialog_token))
600 dev[0].dump_monitor()
602 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
603 attrs = p2p_attr_config_timeout()
604 #attrs = p2p_attr_invitation_flags()
605 attrs += p2p_attr_operating_channel()
606 attrs += p2p_attr_group_bssid(src)
607 attrs += p2p_attr_channel_list()
608 attrs += p2p_attr_group_id(src, "DIRECT-foo")
609 attrs += p2p_attr_device_info(src, config_methods=0x0108)
610 msg['payload'] += ie_p2p(attrs)
612 if hapd.mgmt_rx(timeout=1) is None:
613 raise Exception("No invitation response " + str(dialog_token))
616 dev[0].dump_monitor()
618 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
619 attrs = p2p_attr_config_timeout()
620 attrs = p2p_attr_invitation_flags()
621 #attrs += p2p_attr_operating_channel()
622 attrs += p2p_attr_group_bssid(src)
623 attrs += p2p_attr_channel_list()
624 attrs += p2p_attr_group_id(src, "DIRECT-foo")
625 attrs += p2p_attr_device_info(src, config_methods=0x0108)
626 msg['payload'] += ie_p2p(attrs)
628 if hapd.mgmt_rx(timeout=1) is None:
629 raise Exception("No invitation response " + str(dialog_token))
632 dev[0].dump_monitor()
634 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
635 attrs = p2p_attr_config_timeout()
636 attrs = p2p_attr_invitation_flags()
637 attrs += p2p_attr_operating_channel()
638 #attrs += p2p_attr_group_bssid(src)
639 attrs += p2p_attr_channel_list()
640 attrs += p2p_attr_group_id(src, "DIRECT-foo")
641 attrs += p2p_attr_device_info(src, config_methods=0x0108)
642 msg['payload'] += ie_p2p(attrs)
644 if hapd.mgmt_rx(timeout=1) is None:
645 raise Exception("No invitation response " + str(dialog_token))
648 dev[0].dump_monitor()
650 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
651 attrs = p2p_attr_config_timeout()
652 attrs = p2p_attr_invitation_flags()
653 attrs += p2p_attr_operating_channel()
654 attrs += p2p_attr_group_bssid(src)
655 #attrs += p2p_attr_channel_list()
656 attrs += p2p_attr_group_id(src, "DIRECT-foo")
657 attrs += p2p_attr_device_info(src, config_methods=0x0108)
658 msg['payload'] += ie_p2p(attrs)
660 if hapd.mgmt_rx(timeout=1) is None:
661 raise Exception("No invitation response " + str(dialog_token))
664 dev[0].dump_monitor()
666 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
667 attrs = p2p_attr_config_timeout()
668 attrs = p2p_attr_invitation_flags()
669 attrs += p2p_attr_operating_channel()
670 attrs += p2p_attr_group_bssid(src)
671 attrs += p2p_attr_channel_list()
672 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
673 attrs += p2p_attr_device_info(src, config_methods=0x0108)
674 msg['payload'] += ie_p2p(attrs)
676 if hapd.mgmt_rx(timeout=1) is None:
677 raise Exception("No invitation response " + str(dialog_token))
680 dev[0].dump_monitor()
682 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
683 attrs = p2p_attr_config_timeout()
684 attrs = p2p_attr_invitation_flags()
685 attrs += p2p_attr_operating_channel()
686 attrs += p2p_attr_group_bssid(src)
687 attrs += p2p_attr_channel_list()
688 attrs += p2p_attr_group_id(src, "DIRECT-foo")
689 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
690 msg['payload'] += ie_p2p(attrs)
692 if hapd.mgmt_rx(timeout=1) is None:
693 raise Exception("No invitation response " + str(dialog_token))
696 dev[0].dump_monitor()
698 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
700 if hapd.mgmt_rx(timeout=1) is None:
701 raise Exception("No invitation response " + str(dialog_token))
703 # Unusable peer operating channel preference
705 dev[0].dump_monitor()
707 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
708 attrs = p2p_attr_config_timeout()
709 attrs = p2p_attr_invitation_flags()
710 attrs += p2p_attr_operating_channel(chan=15)
711 attrs += p2p_attr_group_bssid(src)
712 attrs += p2p_attr_channel_list()
713 attrs += p2p_attr_group_id(src, "DIRECT-foo")
714 attrs += p2p_attr_device_info(src, config_methods=0x0108)
715 msg['payload'] += ie_p2p(attrs)
717 if hapd.mgmt_rx(timeout=1) is None:
718 raise Exception("No invitation response " + str(dialog_token))
720 def test_p2p_msg_invitation_req_to_go(dev, apdev):
721 """P2P protocol tests for invitation request processing on GO device"""
722 res = form(dev[0], dev[1])
723 dev[0].dump_monitor()
724 dev[1].dump_monitor()
725 addr0 = dev[0].p2p_dev_addr()
726 addr1 = dev[1].p2p_dev_addr()
727 peer = dev[1].get_peer(addr0)
728 listen_freq = peer['listen_freq']
730 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
731 raise Exception("Failed to enable external management frame handling")
733 networks = dev[0].list_networks()
734 if len(networks) != 1:
735 raise Exception("Unexpected number of networks")
736 if "[P2P-PERSISTENT]" not in networks[0]['flags']:
737 raise Exception("Not the persistent group data")
738 dev[0].p2p_start_go(persistent=networks[0]['id'], freq=listen_freq)
742 # Unusable peer operating channel preference
744 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
745 dialog_token=dialog_token)
746 attrs = p2p_attr_config_timeout()
747 attrs = p2p_attr_invitation_flags(bitmap=1)
748 attrs += p2p_attr_operating_channel(chan=15)
749 attrs += p2p_attr_channel_list()
750 attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
751 attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
752 msg['payload'] += ie_p2p(attrs)
754 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
756 rx_msg = dev[1].mgmt_rx()
758 raise Exception("MGMT-RX timeout")
759 p2p = parse_p2p_public_action(rx_msg['payload'])
761 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
762 if p2p['subtype'] != P2P_INVITATION_RESP:
763 raise Exception("Unexpected subtype %d" % p2p['subtype'])
764 if p2p['p2p_status'] != 0:
765 raise Exception("Unexpected status %d" % p2p['p2p_status'])
767 # Forced channel re-selection due to channel list
769 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
770 dialog_token=dialog_token)
771 attrs = p2p_attr_config_timeout()
772 attrs = p2p_attr_invitation_flags(bitmap=1)
773 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
776 attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
777 attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
778 msg['payload'] += ie_p2p(attrs)
780 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
782 rx_msg = dev[1].mgmt_rx()
784 raise Exception("MGMT-RX timeout")
785 p2p = parse_p2p_public_action(rx_msg['payload'])
787 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
788 if p2p['subtype'] != P2P_INVITATION_RESP:
789 raise Exception("Unexpected subtype %d" % p2p['subtype'])
790 if p2p['p2p_status'] != 7:
791 raise Exception("Unexpected status %d" % p2p['p2p_status'])
793 def test_p2p_msg_invitation_req_unknown(dev, apdev):
794 """P2P protocol tests for invitation request from unknown peer"""
795 dst, src, hapd, channel = start_p2p(dev, apdev)
799 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
800 attrs = p2p_attr_config_timeout()
801 attrs += p2p_attr_invitation_flags()
802 attrs += p2p_attr_operating_channel()
803 attrs += p2p_attr_group_bssid(src)
804 attrs += p2p_attr_channel_list()
805 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
806 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
807 msg['payload'] += ie_p2p(attrs)
809 ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=5)
811 raise Exception("Timeout on invitation event " + str(dialog_token))
812 if hapd.mgmt_rx(timeout=1) is None:
813 raise Exception("No invitation response " + str(dialog_token))
815 def test_p2p_msg_invitation_no_common_channels(dev, apdev):
816 """P2P protocol tests for invitation request without common channels"""
817 dst, src, hapd, channel = start_p2p(dev, apdev)
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,
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)
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)
837 raise Exception("Unexpected invitation event")
839 def test_p2p_msg_invitation_resp(dev, apdev):
840 """P2P protocol tests for invitation response processing"""
842 dev[0].dump_monitor()
843 dev[1].dump_monitor()
845 dst, src, hapd, channel = start_p2p(dev, apdev)
847 addr0 = dev[0].p2p_dev_addr()
848 addr1 = dev[1].p2p_dev_addr()
849 peer = dev[1].get_peer(addr0)
851 # P2P Invitation Response from unknown peer
852 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=1)
855 # P2P Invitation Response from peer that is not in invitation
856 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=2)
857 attrs = p2p_attr_status()
858 msg['payload'] += ie_p2p(attrs)
859 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
862 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
863 raise Exception("Failed to enable external management frame handling")
865 invite(dev[0], dev[1])
866 rx_msg = dev[1].mgmt_rx()
868 raise Exception("MGMT-RX timeout")
869 p2p = parse_p2p_public_action(rx_msg['payload'])
871 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
872 if p2p['subtype'] != P2P_INVITATION_REQ:
873 raise Exception("Unexpected subtype %d" % p2p['subtype'])
875 # Invalid attribute to cause p2p_parse() failure
876 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
877 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
878 msg['payload'] += ie_p2p(attrs)
879 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
881 invite(dev[0], dev[1])
882 rx_msg = dev[1].mgmt_rx()
884 raise Exception("MGMT-RX timeout")
885 p2p = parse_p2p_public_action(rx_msg['payload'])
887 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
888 if p2p['subtype'] != P2P_INVITATION_REQ:
889 raise Exception("Unexpected subtype %d" % p2p['subtype'])
891 # missing mandatory Status attribute
892 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
893 attrs = p2p_attr_channel_list()
894 msg['payload'] += ie_p2p(attrs)
895 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
897 invite(dev[0], dev[1])
898 rx_msg = dev[1].mgmt_rx()
900 raise Exception("MGMT-RX timeout")
901 p2p = parse_p2p_public_action(rx_msg['payload'])
903 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
904 if p2p['subtype'] != P2P_INVITATION_REQ:
905 raise Exception("Unexpected subtype %d" % p2p['subtype'])
907 # no channel match (no common channel found at all)
908 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
909 attrs = p2p_attr_status()
910 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
913 msg['payload'] += ie_p2p(attrs)
914 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
916 invite(dev[0], dev[1])
917 rx_msg = dev[1].mgmt_rx()
919 raise Exception("MGMT-RX timeout")
920 p2p = parse_p2p_public_action(rx_msg['payload'])
922 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
923 if p2p['subtype'] != P2P_INVITATION_REQ:
924 raise Exception("Unexpected subtype %d" % p2p['subtype'])
926 # no channel match (no acceptable P2P channel)
927 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
928 attrs = p2p_attr_status()
929 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
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'])))
935 invite(dev[0], dev[1])
936 rx_msg = dev[1].mgmt_rx()
938 raise Exception("MGMT-RX timeout")
939 p2p = parse_p2p_public_action(rx_msg['payload'])
941 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
942 if p2p['subtype'] != P2P_INVITATION_REQ:
943 raise Exception("Unexpected subtype %d" % p2p['subtype'])
945 # missing mandatory Channel List attribute (ignored as a workaround)
946 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
947 attrs = p2p_attr_status()
948 msg['payload'] += ie_p2p(attrs)
949 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
951 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
953 raise Exception("Group was not started")
955 def test_p2p_msg_invitation_resend(dev, apdev):
956 """P2P protocol tests for invitation resending on no-common-channels"""
958 dev[0].dump_monitor()
959 dev[1].dump_monitor()
960 addr0 = dev[0].p2p_dev_addr()
961 addr1 = dev[1].p2p_dev_addr()
963 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
964 raise Exception("Failed to enable external management frame handling")
966 logger.info("Forced channel in invitation")
967 invite(dev[0], dev[1], extra="freq=2422")
968 rx_msg = dev[1].mgmt_rx()
970 raise Exception("MGMT-RX timeout")
971 p2p = parse_p2p_public_action(rx_msg['payload'])
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 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
981 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
983 raise Exception("Timeout on invitation result");
984 if "status=7" not in ev:
985 raise Exception("Unexpected invitation result: " + ev)
987 logger.info("Any channel allowed, only preference provided in invitation");
988 invite(dev[0], dev[1], extra="pref=2422")
989 rx_msg = dev[1].mgmt_rx()
991 raise Exception("MGMT-RX timeout")
992 p2p = parse_p2p_public_action(rx_msg['payload'])
994 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
995 if p2p['subtype'] != P2P_INVITATION_REQ:
996 raise Exception("Unexpected subtype %d" % p2p['subtype'])
997 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
998 dialog_token=p2p['dialog_token'])
999 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1000 msg['payload'] += ie_p2p(attrs)
1001 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
1002 raise Exception("Failed to disable external management frame handling")
1003 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1004 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
1006 raise Exception("Timeout on invitation result");
1007 if "status=0" not in ev:
1008 raise Exception("Unexpected invitation result: " + ev)
1010 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1012 raise Exception("Group was not started on dev0")
1013 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1015 raise Exception("Group was not started on dev1")
1017 def test_p2p_msg_invitation_resend_duplicate(dev, apdev):
1018 """P2P protocol tests for invitation resending on no-common-channels and duplicated response"""
1019 form(dev[0], dev[1])
1020 dev[0].dump_monitor()
1021 dev[1].dump_monitor()
1022 addr0 = dev[0].p2p_dev_addr()
1023 addr1 = dev[1].p2p_dev_addr()
1025 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1026 raise Exception("Failed to enable external management frame handling")
1028 logger.info("Any channel allowed, only preference provided in invitation");
1029 invite(dev[0], dev[1], extra="pref=2422")
1030 rx_msg = dev[1].mgmt_rx()
1032 raise Exception("MGMT-RX timeout")
1033 p2p = parse_p2p_public_action(rx_msg['payload'])
1035 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1036 if p2p['subtype'] != P2P_INVITATION_REQ:
1037 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1038 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1039 dialog_token=p2p['dialog_token'])
1040 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1041 msg['payload'] += ie_p2p(attrs)
1042 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1044 rx_msg = dev[1].mgmt_rx()
1046 raise Exception("MGMT-RX timeout")
1047 p2p = parse_p2p_public_action(rx_msg['payload'])
1049 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1050 if p2p['subtype'] != P2P_INVITATION_REQ:
1051 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1053 logger.info("Retransmit duplicate of previous response")
1054 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1056 logger.info("Transmit real response")
1057 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1058 dialog_token=p2p['dialog_token'])
1059 attrs = p2p_attr_status(status=P2P_SC_SUCCESS)
1060 attrs += p2p_attr_channel_list()
1061 msg['payload'] += ie_p2p(attrs)
1062 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']))):
1063 raise Exception("Failed to transmit real response")
1064 dev[1].request("SET ext_mgmt_frame_handling 0")
1066 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=10)
1068 raise Exception("Timeout on invitation result");
1069 if "status=0" not in ev:
1070 raise Exception("Unexpected invitation result: " + ev)
1071 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1073 raise Exception("Group formation timed out")
1074 dev[0].group_form_result(ev)
1075 dev[0].remove_group()
1077 def test_p2p_msg_pd_req(dev, apdev):
1078 """P2P protocol tests for provision discovery request processing"""
1079 dst, src, hapd, channel = start_p2p(dev, apdev)
1082 # Too short attribute header
1084 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1085 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1086 msg['payload'] += ie_p2p(attrs)
1089 if hapd.mgmt_rx(timeout=0.5) is not None:
1090 raise Exception("Unexpected management frame received")
1094 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1096 msg['payload'] += ie_p2p(attrs)
1098 if hapd.mgmt_rx(timeout=1) is None:
1099 raise Exception("No PD response " + str(dialog_token))
1104 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1105 attrs = wsc_attr_config_methods(methods=0x1008)
1106 msg['payload'] += ie_wsc(attrs)
1107 attrs = p2p_attr_capability()
1108 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1109 msg['payload'] += ie_p2p(attrs)
1111 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
1113 raise Exception("Timeout on device found event")
1114 ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
1116 raise Exception("Timeout on PD event")
1117 if hapd.mgmt_rx(timeout=1) is None:
1118 raise Exception("No PD response " + str(dialog_token))
1123 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1124 attrs = wsc_attr_config_methods(methods=0x1008)
1125 msg['payload'] += ie_wsc(attrs)
1126 attrs = p2p_attr_capability()
1127 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1128 attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
1129 msg['payload'] += ie_p2p(attrs)
1131 if hapd.mgmt_rx(timeout=1) is None:
1132 raise Exception("No PD response " + str(dialog_token))
1133 ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
1135 raise Exception("Unexpected PD event")
1137 # Listen channel is not yet known
1138 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
1139 raise Exception("Unexpected P2P_PROV_DISC success")
1142 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
1143 raise Exception("Unexpected P2P_PROV_DISC success (2)")
1145 def test_p2p_msg_pd(dev, apdev):
1146 """P2P protocol tests for provision discovery request processing (known)"""
1147 dst, src, hapd, channel = start_p2p(dev, apdev)
1150 p2p_probe(hapd, src, chan=channel)
1155 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1156 attrs = wsc_attr_config_methods(methods=0x1008)
1157 msg['payload'] += ie_wsc(attrs)
1158 attrs = p2p_attr_capability()
1159 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1160 msg['payload'] += ie_p2p(attrs)
1162 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
1164 raise Exception("Timeout on device found event")
1165 ev = dev[0].wait_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
1167 raise Exception("Timeout on PD event")
1168 if hapd.mgmt_rx(timeout=1) is None:
1169 raise Exception("No PD response " + str(dialog_token))
1171 if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
1172 raise Exception("Unexpected P2P_PROV_DISC failure")
1173 frame = hapd.mgmt_rx(timeout=1)
1175 raise Exception("No PD request " + str(dialog_token))
1176 p2p = parse_p2p_public_action(frame['payload'])
1178 raise Exception("Failed to parse PD request")
1180 # invalid dialog token
1181 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1182 dialog_token=p2p['dialog_token'] + 1)
1184 ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
1186 raise Exception("Unexpected PD result event")
1188 # valid dialog token
1189 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1190 dialog_token=p2p['dialog_token'])
1192 ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
1194 raise Exception("Timeout on PD result event")
1196 # valid dialog token
1197 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1198 dialog_token=p2p['dialog_token'])
1200 ev = dev[0].wait_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
1202 raise Exception("Unexpected PD result event")
1204 def check_p2p_response(hapd, dialog_token, status):
1205 resp = hapd.mgmt_rx(timeout=1)
1207 raise Exception("No GO Neg Response " + str(dialog_token))
1208 p2p = parse_p2p_public_action(resp['payload'])
1210 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1211 if dialog_token != p2p['dialog_token']:
1212 raise Exception("Unexpected dialog token in response")
1213 if p2p['p2p_status'] != status:
1214 raise Exception("Unexpected status code %s in response (expected %d)" % (p2p['p2p_status'], status))
1216 def test_p2p_msg_go_neg_both_start(dev, apdev):
1217 """P2P protocol test for simultaneous GO Neg initiation"""
1218 addr0 = dev[0].p2p_dev_addr()
1219 addr1 = dev[1].p2p_dev_addr()
1221 dev[1].discover_peer(addr0)
1223 dev[0].discover_peer(addr1)
1225 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
1226 raise Exception("Failed to enable external management frame handling")
1227 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1228 raise Exception("Failed to enable external management frame handling")
1229 dev[0].request("P2P_CONNECT {} pbc".format(addr1))
1230 dev[1].request("P2P_CONNECT {} pbc".format(addr0))
1231 msg = dev[0].mgmt_rx()
1233 raise Exception("MGMT-RX timeout")
1234 msg = dev[1].mgmt_rx()
1236 raise Exception("MGMT-RX timeout(2)")
1237 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 0"):
1238 raise Exception("Failed to disable external management frame handling")
1239 ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=2)
1241 raise Exception("Unexpected GO Neg success")
1242 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
1243 raise Exception("Failed to disable external management frame handling")
1244 ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
1246 raise Exception("GO Neg did not succeed")
1247 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
1249 raise Exception("Group formation not succeed")
1250 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
1252 raise Exception("Group formation not succeed")
1254 def test_p2p_msg_go_neg_req(dev, apdev):
1255 """P2P protocol tests for invitation request from unknown peer"""
1256 dst, src, hapd, channel = start_p2p(dev, apdev)
1261 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1262 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1263 msg['payload'] += ie_p2p(attrs)
1265 frame = hapd.mgmt_rx(timeout=0.1)
1266 if frame is not None:
1268 raise Exception("Unexpected GO Neg Response")
1272 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1273 attrs = p2p_attr_capability()
1274 attrs += p2p_attr_go_intent()
1275 attrs += p2p_attr_config_timeout()
1276 #attrs += p2p_attr_listen_channel()
1277 attrs += p2p_attr_ext_listen_timing()
1278 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1279 attrs += p2p_attr_channel_list()
1280 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1281 attrs += p2p_attr_operating_channel()
1282 msg['payload'] += ie_p2p(attrs)
1284 if hapd.mgmt_rx(timeout=1) is None:
1285 raise Exception("No GO Neg Response " + str(dialog_token))
1289 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1290 attrs = p2p_attr_capability()
1291 attrs += p2p_attr_go_intent()
1292 attrs += p2p_attr_config_timeout()
1293 attrs += p2p_attr_listen_channel()
1294 attrs += p2p_attr_ext_listen_timing()
1295 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1296 attrs += p2p_attr_channel_list()
1297 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1298 #attrs += p2p_attr_operating_channel()
1299 msg['payload'] += ie_p2p(attrs)
1301 if hapd.mgmt_rx(timeout=1) is None:
1302 raise Exception("No GO Neg Response " + str(dialog_token))
1306 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1307 attrs = p2p_attr_capability()
1308 attrs += p2p_attr_go_intent()
1309 attrs += p2p_attr_config_timeout()
1310 attrs += p2p_attr_listen_channel()
1311 attrs += p2p_attr_ext_listen_timing()
1312 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1313 #attrs += p2p_attr_channel_list()
1314 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1315 attrs += p2p_attr_operating_channel()
1316 msg['payload'] += ie_p2p(attrs)
1318 if hapd.mgmt_rx(timeout=1) is None:
1319 raise Exception("No GO Neg Response " + str(dialog_token))
1323 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1324 attrs = p2p_attr_capability()
1325 attrs += p2p_attr_go_intent()
1326 attrs += p2p_attr_config_timeout()
1327 attrs += p2p_attr_listen_channel()
1328 attrs += p2p_attr_ext_listen_timing()
1329 #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1330 attrs += p2p_attr_channel_list()
1331 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1332 attrs += p2p_attr_operating_channel()
1333 msg['payload'] += ie_p2p(attrs)
1335 if hapd.mgmt_rx(timeout=1) is None:
1336 raise Exception("No GO Neg Response " + str(dialog_token))
1340 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1341 attrs = p2p_attr_capability()
1342 attrs += p2p_attr_go_intent()
1343 attrs += p2p_attr_config_timeout()
1344 attrs += p2p_attr_listen_channel()
1345 attrs += p2p_attr_ext_listen_timing()
1346 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1347 attrs += p2p_attr_channel_list()
1348 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
1349 attrs += p2p_attr_operating_channel()
1350 msg['payload'] += ie_p2p(attrs)
1352 if hapd.mgmt_rx(timeout=1) is None:
1353 raise Exception("No GO Neg Response " + str(dialog_token))
1356 # SA != P2P Device address
1358 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1359 attrs = p2p_attr_capability()
1360 attrs += p2p_attr_go_intent()
1361 attrs += p2p_attr_config_timeout()
1362 attrs += p2p_attr_listen_channel()
1363 attrs += p2p_attr_ext_listen_timing()
1364 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1365 attrs += p2p_attr_channel_list()
1366 attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
1367 attrs += p2p_attr_operating_channel()
1368 msg['payload'] += ie_p2p(attrs)
1370 if hapd.mgmt_rx(timeout=1) is None:
1371 raise Exception("No GO Neg Response " + str(dialog_token))
1374 # unexpected Status attribute
1376 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1377 attrs = p2p_attr_capability()
1378 attrs += p2p_attr_go_intent()
1379 attrs += p2p_attr_config_timeout()
1380 attrs += p2p_attr_listen_channel()
1381 attrs += p2p_attr_ext_listen_timing()
1382 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1383 attrs += p2p_attr_channel_list()
1384 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1385 attrs += p2p_attr_operating_channel()
1386 attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
1387 msg['payload'] += ie_p2p(attrs)
1389 if hapd.mgmt_rx(timeout=1) is None:
1390 raise Exception("No GO Neg Response(1) " + str(dialog_token))
1393 # valid (with workarounds) GO Neg Req
1395 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1396 #attrs = p2p_attr_capability()
1397 #attrs += p2p_attr_go_intent()
1398 #attrs += p2p_attr_config_timeout()
1399 attrs = p2p_attr_listen_channel()
1400 attrs += p2p_attr_ext_listen_timing()
1401 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1402 attrs += p2p_attr_channel_list()
1403 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1404 attrs += p2p_attr_operating_channel()
1405 msg['payload'] += ie_p2p(attrs)
1407 check_p2p_response(hapd, dialog_token,
1408 P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
1409 ev = dev[0].wait_event(["P2P-GO-NEG-REQUEST"], timeout=1)
1411 raise Exception("Timeout on GO Neg event " + str(dialog_token))
1413 dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
1415 # ready - missing attributes (with workarounds) GO Neg Req
1418 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1419 #attrs = p2p_attr_capability()
1420 #attrs += p2p_attr_go_intent()
1421 #attrs += p2p_attr_config_timeout()
1422 attrs = p2p_attr_listen_channel()
1423 attrs += p2p_attr_ext_listen_timing()
1424 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1425 attrs += p2p_attr_channel_list()
1426 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1427 attrs += p2p_attr_operating_channel()
1428 msg['payload'] += ie_p2p(attrs)
1430 if hapd.mgmt_rx(timeout=1) is None:
1431 raise Exception("No GO Neg Response " + str(dialog_token))
1433 # ready - invalid GO Intent GO Neg Req
1436 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1437 #attrs = p2p_attr_capability()
1438 attrs = p2p_attr_go_intent(go_intent=16)
1439 #attrs += p2p_attr_config_timeout()
1440 attrs += p2p_attr_listen_channel()
1441 attrs += p2p_attr_ext_listen_timing()
1442 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1443 attrs += p2p_attr_channel_list()
1444 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1445 attrs += p2p_attr_operating_channel()
1446 msg['payload'] += ie_p2p(attrs)
1448 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INVALID_PARAMS)
1450 # ready - invalid Channel List
1453 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1454 attrs = p2p_attr_capability()
1455 attrs += p2p_attr_go_intent()
1456 attrs += p2p_attr_config_timeout()
1457 attrs += p2p_attr_listen_channel()
1458 attrs += p2p_attr_ext_listen_timing()
1459 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1460 attrs += struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
1462 81, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
1463 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1464 attrs += p2p_attr_operating_channel()
1465 msg['payload'] += ie_p2p(attrs)
1467 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_NO_COMMON_CHANNELS)
1469 # ready - invalid GO Neg Req (unsupported Device Password ID)
1472 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1473 attrs = p2p_attr_capability()
1474 attrs += p2p_attr_go_intent()
1475 attrs += p2p_attr_config_timeout()
1476 attrs += p2p_attr_listen_channel()
1477 attrs += p2p_attr_ext_listen_timing()
1478 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1479 # very long channel list
1480 attrs += struct.pack("<BH3BBB11B30B", P2P_ATTR_CHANNEL_LIST, 46,
1482 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1483 1, 1, 1, 2, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5,
1484 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10)
1485 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1486 attrs += p2p_attr_operating_channel()
1487 msg['payload'] += ie_p2p(attrs)
1489 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD)
1491 def mgmt_tx(dev, msg):
1492 for i in range(0, 20):
1493 if "FAIL" in dev.request(msg):
1494 raise Exception("Failed to send Action frame")
1495 ev = dev.wait_event(["MGMT-TX-STATUS"], timeout=10)
1497 raise Exception("Timeout on MGMT-TX-STATUS")
1498 if "result=SUCCESS" in ev:
1501 if "result=SUCCESS" not in ev:
1502 raise Exception("Peer did not ack Action frame")
1504 def rx_go_neg_req(dev):
1507 raise Exception("MGMT-RX timeout")
1508 p2p = parse_p2p_public_action(msg['payload'])
1510 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1511 if p2p['subtype'] != P2P_GO_NEG_REQ:
1512 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1513 p2p['freq'] = msg['freq']
1516 def rx_go_neg_conf(dev, status=None, dialog_token=None):
1519 raise Exception("MGMT-RX timeout")
1520 p2p = parse_p2p_public_action(msg['payload'])
1522 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1523 if p2p['subtype'] != P2P_GO_NEG_CONF:
1524 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1525 if dialog_token is not None and dialog_token != p2p['dialog_token']:
1526 raise Exception("Unexpected dialog token")
1527 if status is not None and p2p['p2p_status'] != status:
1528 raise Exception("Unexpected status %d" % p2p['p2p_status'])
1530 def check_p2p_go_neg_fail_event(dev, status):
1531 ev = dev.wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
1533 raise Exception("GO Negotiation failure not reported")
1534 if "status=%d" % status not in ev:
1535 raise Exception("Unexpected failure reason: " + ev)
1537 def test_p2p_msg_go_neg_req_reject(dev, apdev):
1538 """P2P protocol tests for user reject incorrectly in GO Neg Req"""
1539 addr0 = dev[0].p2p_dev_addr()
1540 addr1 = dev[1].p2p_dev_addr()
1542 dev[1].discover_peer(addr0)
1543 dev[1].group_request("P2P_CONNECT " + addr0 + " pbc")
1544 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
1546 raise Exception("Timeout on GO Neg Req")
1548 peer = dev[0].get_peer(addr1)
1549 dev[0].p2p_stop_find()
1551 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_REQ, dialog_token=123)
1552 attrs = p2p_attr_capability()
1553 attrs += p2p_attr_status(status=P2P_SC_FAIL_REJECTED_BY_USER)
1554 attrs += p2p_attr_go_intent()
1555 attrs += p2p_attr_config_timeout()
1556 attrs += p2p_attr_listen_channel()
1557 attrs += p2p_attr_ext_listen_timing()
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)
1564 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1566 ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
1568 raise Exception("GO Negotiation failure not reported")
1569 if "status=%d" % P2P_SC_FAIL_REJECTED_BY_USER not in ev:
1570 raise Exception("Unexpected failure reason: " + ev)
1572 def test_p2p_msg_unexpected_go_neg_resp(dev, apdev):
1573 """P2P protocol tests for unexpected GO Neg Resp"""
1574 addr0 = dev[0].p2p_dev_addr()
1575 addr1 = dev[1].p2p_dev_addr()
1577 dev[0].discover_peer(addr1)
1578 dev[0].p2p_stop_find()
1580 peer = dev[0].get_peer(addr1)
1582 logger.debug("GO Neg Resp without GO Neg session")
1583 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=123)
1584 attrs = p2p_attr_status()
1585 attrs += p2p_attr_capability()
1586 attrs += p2p_attr_go_intent()
1587 attrs += p2p_attr_config_timeout()
1588 attrs += p2p_attr_intended_interface_addr(addr0)
1589 attrs += p2p_attr_channel_list()
1590 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1591 attrs += p2p_attr_operating_channel()
1592 msg['payload'] += ie_p2p(attrs)
1593 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1596 dev[1].discover_peer(addr0)
1598 logger.debug("Unexpected GO Neg Resp while waiting for new GO Neg session")
1599 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1600 raise Exception("P2P_CONNECT failed")
1601 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
1603 raise Exception("Timeout on GO Neg Req")
1604 dev[0].p2p_stop_find()
1605 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1607 logger.debug("Invalid attribute in GO Neg Response")
1608 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=197)
1609 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1610 msg['payload'] += ie_p2p(attrs)
1611 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1612 frame = dev[0].mgmt_rx(timeout=0.1)
1613 if frame is not None:
1614 raise Exception("Unexpected GO Neg Confirm")
1616 logger.debug("GO Neg Resp with unexpected dialog token")
1617 dev[1].p2p_stop_find()
1618 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
1619 raise Exception("Failed to enable external management frame handling")
1621 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1622 raise Exception("P2P_CONNECT failed(2)")
1623 p2p = rx_go_neg_req(dev[0])
1624 dev[0].p2p_stop_find()
1625 dialog_token = p2p['dialog_token']
1626 if dialog_token < 255:
1630 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1631 attrs = p2p_attr_status()
1632 attrs += p2p_attr_capability()
1633 attrs += p2p_attr_go_intent()
1634 attrs += p2p_attr_config_timeout()
1635 attrs += p2p_attr_intended_interface_addr(addr0)
1636 attrs += p2p_attr_channel_list()
1637 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1638 attrs += p2p_attr_operating_channel()
1639 msg['payload'] += ie_p2p(attrs)
1640 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1642 logger.debug("GO Neg Resp without Status")
1643 dev[1].p2p_stop_find()
1645 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1646 raise Exception("P2P_CONNECT failed(2)")
1647 p2p = rx_go_neg_req(dev[0])
1648 dev[0].p2p_stop_find()
1649 dialog_token = p2p['dialog_token']
1650 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1651 #attrs = p2p_attr_status()
1652 attrs = p2p_attr_capability()
1653 attrs += p2p_attr_go_intent()
1654 attrs += p2p_attr_config_timeout()
1655 attrs += p2p_attr_intended_interface_addr(addr0)
1656 attrs += p2p_attr_channel_list()
1657 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1658 attrs += p2p_attr_operating_channel()
1659 msg['payload'] += ie_p2p(attrs)
1660 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1661 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1662 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1664 logger.debug("GO Neg Resp without Intended Address")
1665 dev[1].p2p_stop_find()
1667 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1668 raise Exception("P2P_CONNECT failed(2)")
1669 p2p = rx_go_neg_req(dev[0])
1670 dev[0].p2p_stop_find()
1671 dialog_token = p2p['dialog_token']
1672 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1673 attrs = p2p_attr_status()
1674 #attrs += p2p_attr_capability()
1675 attrs += p2p_attr_go_intent()
1676 attrs += p2p_attr_config_timeout()
1677 #attrs += p2p_attr_intended_interface_addr(addr0)
1678 attrs += p2p_attr_channel_list()
1679 #attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1680 attrs += p2p_attr_operating_channel()
1681 msg['payload'] += ie_p2p(attrs)
1682 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1683 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1684 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1686 logger.debug("GO Neg Resp without GO Intent")
1687 dev[1].p2p_stop_find()
1689 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1690 raise Exception("P2P_CONNECT failed(2)")
1691 p2p = rx_go_neg_req(dev[0])
1692 dev[0].p2p_stop_find()
1693 dialog_token = p2p['dialog_token']
1694 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1695 attrs = p2p_attr_status()
1696 attrs += p2p_attr_capability()
1697 #attrs += p2p_attr_go_intent()
1698 attrs += p2p_attr_config_timeout()
1699 attrs += p2p_attr_intended_interface_addr(addr0)
1700 attrs += p2p_attr_channel_list()
1701 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1702 attrs += p2p_attr_operating_channel()
1703 msg['payload'] += ie_p2p(attrs)
1704 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1705 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1706 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1708 logger.debug("GO Neg Resp with invalid GO Intent")
1709 dev[1].p2p_stop_find()
1711 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1712 raise Exception("P2P_CONNECT failed(2)")
1713 p2p = rx_go_neg_req(dev[0])
1714 dev[0].p2p_stop_find()
1715 dialog_token = p2p['dialog_token']
1716 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1717 attrs = p2p_attr_status()
1718 attrs += p2p_attr_capability()
1719 attrs += p2p_attr_go_intent(go_intent=16)
1720 attrs += p2p_attr_config_timeout()
1721 attrs += p2p_attr_intended_interface_addr(addr0)
1722 attrs += p2p_attr_channel_list()
1723 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1724 attrs += p2p_attr_operating_channel()
1725 msg['payload'] += ie_p2p(attrs)
1726 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1727 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1728 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1730 logger.debug("GO Neg Resp with incompatible GO Intent")
1731 dev[1].p2p_stop_find()
1733 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15"):
1734 raise Exception("P2P_CONNECT failed(2)")
1735 p2p = rx_go_neg_req(dev[0])
1736 dev[0].p2p_stop_find()
1737 dialog_token = p2p['dialog_token']
1738 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1739 attrs = p2p_attr_status()
1740 attrs += p2p_attr_capability()
1741 attrs += p2p_attr_go_intent(go_intent=15)
1742 attrs += p2p_attr_config_timeout()
1743 attrs += p2p_attr_intended_interface_addr(addr0)
1744 attrs += p2p_attr_channel_list()
1745 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1746 attrs += p2p_attr_operating_channel()
1747 msg['payload'] += ie_p2p(attrs)
1748 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1749 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INCOMPATIBLE_PARAMS)
1750 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INCOMPATIBLE_PARAMS, dialog_token)
1752 logger.debug("GO Neg Resp without P2P Group ID")
1753 dev[1].p2p_stop_find()
1755 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1756 raise Exception("P2P_CONNECT failed(2)")
1757 p2p = rx_go_neg_req(dev[0])
1758 dev[0].p2p_stop_find()
1759 dialog_token = p2p['dialog_token']
1760 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1761 attrs = p2p_attr_status()
1762 attrs += p2p_attr_capability()
1763 attrs += p2p_attr_go_intent(go_intent=15)
1764 attrs += p2p_attr_config_timeout()
1765 attrs += p2p_attr_intended_interface_addr(addr0)
1766 attrs += p2p_attr_channel_list()
1767 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1768 attrs += p2p_attr_operating_channel()
1769 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
1770 msg['payload'] += ie_p2p(attrs)
1771 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1772 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1773 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1775 logger.debug("GO Neg Resp without Operating Channel")
1776 dev[1].p2p_stop_find()
1778 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1779 raise Exception("P2P_CONNECT failed(2)")
1780 p2p = rx_go_neg_req(dev[0])
1781 dev[0].p2p_stop_find()
1782 dialog_token = p2p['dialog_token']
1783 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1784 attrs = p2p_attr_status()
1785 attrs += p2p_attr_capability()
1786 attrs += p2p_attr_go_intent(go_intent=15)
1787 #attrs += p2p_attr_config_timeout()
1788 attrs += p2p_attr_intended_interface_addr(addr0)
1789 attrs += p2p_attr_channel_list()
1790 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1791 #attrs += p2p_attr_operating_channel()
1792 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1793 msg['payload'] += ie_p2p(attrs)
1794 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1795 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1796 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1798 logger.debug("GO Neg Resp without Channel List")
1799 dev[1].p2p_stop_find()
1801 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1802 raise Exception("P2P_CONNECT failed(2)")
1803 p2p = rx_go_neg_req(dev[0])
1804 dev[0].p2p_stop_find()
1805 dialog_token = p2p['dialog_token']
1806 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1807 attrs = p2p_attr_status()
1808 attrs += p2p_attr_capability()
1809 attrs += p2p_attr_go_intent(go_intent=15)
1810 attrs += p2p_attr_config_timeout()
1811 attrs += p2p_attr_intended_interface_addr(addr0)
1812 #attrs += p2p_attr_channel_list()
1813 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1814 attrs += p2p_attr_operating_channel()
1815 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1816 msg['payload'] += ie_p2p(attrs)
1817 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1818 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1819 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1821 logger.debug("GO Neg Resp without common channels")
1822 dev[1].p2p_stop_find()
1824 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1825 raise Exception("P2P_CONNECT failed(2)")
1826 p2p = rx_go_neg_req(dev[0])
1827 dev[0].p2p_stop_find()
1828 dialog_token = p2p['dialog_token']
1829 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1830 attrs = p2p_attr_status()
1831 attrs += p2p_attr_capability()
1832 attrs += p2p_attr_go_intent(go_intent=15)
1833 attrs += p2p_attr_config_timeout()
1834 attrs += p2p_attr_intended_interface_addr(addr0)
1835 attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
1838 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1839 attrs += p2p_attr_operating_channel()
1840 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1841 msg['payload'] += ie_p2p(attrs)
1842 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1843 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_NO_COMMON_CHANNELS)
1844 rx_go_neg_conf(dev[0], P2P_SC_FAIL_NO_COMMON_CHANNELS, dialog_token)