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_SERVICE_HASH = 21
52 P2P_ATTR_SESSION_INFORMATION_DATA = 22
53 P2P_ATTR_CONNECTION_CAPABILITY = 23
54 P2P_ATTR_ADVERTISEMENT_ID = 24
55 P2P_ATTR_ADVERTISED_SERVICE = 25
56 P2P_ATTR_SESSION_ID = 26
57 P2P_ATTR_FEATURE_CAPABILITY = 27
58 P2P_ATTR_PERSISTENT_GROUP = 28
59 P2P_ATTR_VENDOR_SPECIFIC = 221
62 P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE = 1
63 P2P_SC_FAIL_INCOMPATIBLE_PARAMS = 2
64 P2P_SC_FAIL_LIMIT_REACHED = 3
65 P2P_SC_FAIL_INVALID_PARAMS = 4
66 P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE = 5
67 P2P_SC_FAIL_PREV_PROTOCOL_ERROR = 6
68 P2P_SC_FAIL_NO_COMMON_CHANNELS = 7
69 P2P_SC_FAIL_UNKNOWN_GROUP = 8
70 P2P_SC_FAIL_BOTH_GO_INTENT_15 = 9
71 P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD = 10
72 P2P_SC_FAIL_REJECTED_BY_USER = 11
74 WSC_ATTR_CONFIG_METHODS = 0x1008
77 WLAN_EID_SUPP_RATES = 1
78 WLAN_EID_VENDOR_SPECIFIC = 221
81 return struct.pack("<BB", WLAN_EID_SSID, len(ssid)) + ssid
84 return struct.pack("<BBBBBBBBBB", WLAN_EID_SUPP_RATES, 8,
85 2*6, 2*9, 2*12, 2*18, 2*24, 2*36, 2*48, 2*54)
88 return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
89 0x50, 0x6f, 0x9a, 9) + attrs
92 return struct.pack("<BBBBBB", WLAN_EID_VENDOR_SPECIFIC, 4 + len(attrs),
93 0x00, 0x50, 0xf2, 4) + attrs
95 def wsc_attr_config_methods(methods=0):
96 return struct.pack(">HHH", WSC_ATTR_CONFIG_METHODS, 2, methods)
98 def p2p_attr_status(status=P2P_SC_SUCCESS):
99 return struct.pack("<BHB", P2P_ATTR_STATUS, 1, status)
101 def p2p_attr_minor_reason_code(code=0):
102 return struct.pack("<BHB", P2P_ATTR_MINOR_REASON_CODE, 1, code)
104 def p2p_attr_capability(dev_capab=0, group_capab=0):
105 return struct.pack("<BHBB", P2P_ATTR_CAPABILITY, 2, dev_capab, group_capab)
107 def p2p_attr_device_id(addr):
108 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
109 t = (P2P_ATTR_DEVICE_ID, 6) + val
110 return struct.pack('<BH6B', *t)
112 def p2p_attr_go_intent(go_intent=0, tie_breaker=0):
113 return struct.pack("<BHB", P2P_ATTR_GROUP_OWNER_INTENT, 1,
114 (go_intent << 1) | (tie_breaker & 0x01))
116 def p2p_attr_config_timeout(go_config_timeout=0, client_config_timeout=0):
117 return struct.pack("<BHBB", P2P_ATTR_CONFIGURATION_TIMEOUT, 2,
118 go_config_timeout, client_config_timeout)
120 def p2p_attr_listen_channel(op_class=81, chan=1):
121 return struct.pack("<BHBBBBB", P2P_ATTR_LISTEN_CHANNEL, 5,
122 0x58, 0x58, 0x04, op_class, chan)
124 def p2p_attr_group_bssid(addr):
125 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
126 t = (P2P_ATTR_GROUP_BSSID, 6) + val
127 return struct.pack('<BH6B', *t)
129 def p2p_attr_ext_listen_timing(period=0, interval=0):
130 return struct.pack("<BHHH", P2P_ATTR_EXT_LISTEN_TIMING, 4, period, interval)
132 def p2p_attr_intended_interface_addr(addr):
133 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
134 t = (P2P_ATTR_INTENDED_INTERFACE_ADDR, 6) + val
135 return struct.pack('<BH6B', *t)
137 def p2p_attr_manageability(bitmap=0):
138 return struct.pack("<BHB", P2P_ATTR_MANAGEABILITY, 1, bitmap)
140 def p2p_attr_channel_list():
141 return struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
143 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
145 def p2p_attr_device_info(addr, name="Test", config_methods=0, dev_type="00010050F2040001"):
146 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
147 val2 = struct.unpack('8B', binascii.unhexlify(dev_type))
148 t = (P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 4 + len(name)) + val + (config_methods,) + val2 + (0,)
149 return struct.pack("<BH6BH8BB", *t) + struct.pack('>HH', 0x1011, len(name)) +name
151 def p2p_attr_group_id(addr, ssid):
152 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
153 t = (P2P_ATTR_GROUP_ID, 6 + len(ssid)) + val
154 return struct.pack('<BH6B', *t) + ssid
156 def p2p_attr_operating_channel(op_class=81, chan=1):
157 return struct.pack("<BHBBBBB", P2P_ATTR_OPERATING_CHANNEL, 5,
158 0x58, 0x58, 0x04, op_class, chan)
160 def p2p_attr_invitation_flags(bitmap=0):
161 return struct.pack("<BHB", P2P_ATTR_INVITATION_FLAGS, 1, bitmap)
163 def p2p_hdr_helper(dst, src, type=None, dialog_token=1, req=True):
165 msg['fc'] = MGMT_SUBTYPE_ACTION << 4
172 msg['payload'] = struct.pack("<BBBBBB",
173 ACTION_CATEG_PUBLIC, 9, 0x50, 0x6f, 0x9a, 9)
175 msg['payload'] += struct.pack("<B", type)
177 msg['payload'] += struct.pack("<B", dialog_token)
180 def p2p_hdr(dst, src, type=None, dialog_token=1):
181 return p2p_hdr_helper(dst, src, type, dialog_token, True)
183 def p2p_hdr_resp(dst, src, type=None, dialog_token=1):
184 return p2p_hdr_helper(dst, src, type, dialog_token, False)
186 def start_p2p(dev, apdev):
187 addr0 = dev[0].p2p_dev_addr()
189 dev[1].p2p_find(social=True)
190 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
192 raise Exception("Device discovery timed out")
193 dev[1].p2p_stop_find()
194 peer = dev[1].get_peer(addr0)
196 bssid = apdev[0]['bssid']
197 params = { 'ssid': "test", 'beacon_int': "2000" }
198 if peer['listen_freq'] == "2412":
199 params['channel'] = '1'
200 elif peer['listen_freq'] == "2437":
201 params['channel'] = '6'
202 elif peer['listen_freq'] == "2462":
203 params['channel'] = '11'
204 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
205 hapd.set("ext_mgmt_frame_handling", "1")
206 return addr0, bssid, hapd, int(params['channel'])
208 def p2p_probe(hapd, src, chan=1):
210 msg['fc'] = MGMT_SUBTYPE_PROBE_REQ << 4
211 msg['da'] = "ff:ff:ff:ff:ff:ff"
213 msg['bssid'] = "ff:ff:ff:ff:ff:ff"
214 attrs = p2p_attr_listen_channel(chan=chan)
215 msg['payload'] = ie_ssid("DIRECT-") + ie_supp_rates() + ie_p2p(attrs)
218 def parse_p2p_public_action(payload):
220 (category, action) = struct.unpack('BB', pos[0:2])
221 if category != ACTION_CATEG_PUBLIC:
226 (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
227 if oui1 != 0x50 or oui2 != 0x6f or oui3 != 0x9a or subtype != 9:
230 (subtype,dialog_token) = struct.unpack('BB', pos[0:2])
232 p2p['subtype'] = subtype
233 p2p['dialog_token'] = dialog_token
235 p2p['elements'] = pos
237 (id,elen) = struct.unpack('BB', pos[0:2])
240 raise Exception("Truncated IE in P2P Public Action frame (elen=%d left=%d)" % (elen, len(pos)))
241 if id == WLAN_EID_VENDOR_SPECIFIC:
243 raise Exception("Too short vendor specific IE in P2P Public Action frame (elen=%d)" % elen)
244 (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
245 if oui1 == 0x50 and oui2 == 0x6f and oui3 == 0x9a and subtype == 9:
247 p2p['p2p'] += pos[4:elen]
249 p2p['p2p'] = pos[4:elen]
250 if oui1 == 0x00 and oui2 == 0x50 and oui3 == 0xf2 and subtype == 4:
251 p2p['wsc'] = pos[4:elen]
254 raise Exception("Invalid element in P2P Public Action frame")
257 p2p['p2p_attrs'] = {}
260 (id,alen) = struct.unpack('<BH', pos[0:3])
263 logger.info("P2P payload: " + binascii.hexlify(p2p['p2p']))
264 raise Exception("Truncated P2P attribute in P2P Public Action frame (alen=%d left=%d p2p-payload=%d)" % (alen, len(pos), len(p2p['p2p'])))
265 p2p['p2p_attrs'][id] = pos[0:alen]
267 if P2P_ATTR_STATUS in p2p['p2p_attrs']:
268 p2p['p2p_status'] = struct.unpack('B', p2p['p2p_attrs'][P2P_ATTR_STATUS])[0]
271 p2p['wsc_attrs'] = {}
274 (id,alen) = struct.unpack('>HH', pos[0:4])
277 logger.info("WSC payload: " + binascii.hexlify(p2p['wsc']))
278 raise Exception("Truncated WSC attribute in P2P Public Action frame (alen=%d left=%d wsc-payload=%d)" % (alen, len(pos), len(p2p['wsc'])))
279 p2p['wsc_attrs'][id] = pos[0:alen]
284 def test_p2p_msg_empty(dev, apdev):
285 """P2P protocol test: empty P2P Public Action frame"""
286 dst, src, hapd, channel = start_p2p(dev, apdev)
287 msg = p2p_hdr(dst, src)
290 def test_p2p_msg_long_ssid(dev, apdev):
291 """P2P protocol test: Too long SSID in P2P Public Action frame"""
292 dst, src, hapd, channel = start_p2p(dev, apdev)
294 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=1)
295 attrs = p2p_attr_config_timeout()
296 attrs += p2p_attr_invitation_flags()
297 attrs += p2p_attr_operating_channel()
298 attrs += p2p_attr_group_bssid(src)
299 attrs += p2p_attr_channel_list()
300 attrs += p2p_attr_group_id(src, 'DIRECT-foo')
301 attrs += p2p_attr_device_info(src, config_methods=0x0108)
302 msg['payload'] += ie_p2p(attrs)
303 msg['payload'] += ie_ssid(255 * 'A')
305 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
307 raise Exception("Timeout on device found event")
309 def test_p2p_msg_long_dev_name(dev, apdev):
310 """P2P protocol test: Too long Device Name in P2P Public Action frame"""
311 dst, src, hapd, channel = start_p2p(dev, apdev)
313 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=1)
314 attrs = p2p_attr_config_timeout()
315 attrs += p2p_attr_invitation_flags()
316 attrs += p2p_attr_operating_channel()
317 attrs += p2p_attr_group_bssid(src)
318 attrs += p2p_attr_channel_list()
319 attrs += p2p_attr_group_id(src, 'DIRECT-foo')
320 attrs += p2p_attr_device_info(src, config_methods=0x0108,
321 name="123456789012345678901234567890123")
322 msg['payload'] += ie_p2p(attrs)
324 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=0.1)
326 raise Exception("Unexpected device found event")
328 def test_p2p_msg_invitation_req(dev, apdev):
329 """P2P protocol tests for invitation request processing"""
330 dst, src, hapd, channel = start_p2p(dev, apdev)
332 # Empty P2P Invitation Request (missing dialog token)
333 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=None)
337 # Various p2p_parse() failure cases due to invalid attributes
339 # Too short attribute header
341 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
342 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
343 msg['payload'] += ie_p2p(attrs)
346 # Minimal attribute underflow
348 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
349 attrs = struct.pack("<BH", P2P_ATTR_CAPABILITY, 1)
350 msg['payload'] += ie_p2p(attrs)
353 # Large attribute underflow
355 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
356 attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 0xffff, 1)
357 msg['payload'] += ie_p2p(attrs)
360 # Too short Capability attribute
362 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
363 attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 1, 0)
364 msg['payload'] += ie_p2p(attrs)
367 # Too short Device ID attribute
369 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
370 val = struct.unpack('5B', binascii.unhexlify("1122334455"))
371 t = (P2P_ATTR_DEVICE_ID, 5) + val
372 attrs = struct.pack('<BH5B', *t)
373 msg['payload'] += ie_p2p(attrs)
376 # Too short GO Intent attribute
378 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
379 attrs = struct.pack("<BH", P2P_ATTR_GROUP_OWNER_INTENT, 0)
380 msg['payload'] += ie_p2p(attrs)
383 # Too short Status attribute
385 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
386 attrs = struct.pack("<BH", P2P_ATTR_STATUS, 0)
387 msg['payload'] += ie_p2p(attrs)
390 # null Listen channel and too short Listen Channel attribute
392 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
393 attrs = struct.pack("<BH", P2P_ATTR_LISTEN_CHANNEL, 0)
394 attrs += struct.pack("<BHB", P2P_ATTR_LISTEN_CHANNEL, 1, 0)
395 msg['payload'] += ie_p2p(attrs)
398 # null Operating channel and too short Operating Channel attribute
400 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
401 attrs = struct.pack("<BH", P2P_ATTR_OPERATING_CHANNEL, 0)
402 attrs += struct.pack("<BHB", P2P_ATTR_OPERATING_CHANNEL, 1, 0)
403 msg['payload'] += ie_p2p(attrs)
406 # Too short Channel List attribute
408 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
409 attrs = struct.pack("<BHBB", P2P_ATTR_CHANNEL_LIST, 2, 1, 2)
410 msg['payload'] += ie_p2p(attrs)
413 # Too short Device Info attribute
415 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
416 attrs = struct.pack("<BHBB", P2P_ATTR_DEVICE_INFO, 2, 1, 2)
417 msg['payload'] += ie_p2p(attrs)
420 # Truncated Secondary Device Types in Device Info attribute
422 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
423 attrs = struct.pack("<BH6BH8BB", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1,
426 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22,
428 msg['payload'] += ie_p2p(attrs)
431 # Missing Device Name in Device Info attribute
433 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
434 attrs = struct.pack("<BH6BH8BB8B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8,
437 0, 0, 0, 0, 0, 0, 0, 0,
439 1, 2, 3, 4, 5, 6, 7, 8)
440 msg['payload'] += ie_p2p(attrs)
443 # Invalid Device Name header in Device Info attribute
445 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
446 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
449 0, 0, 0, 0, 0, 0, 0, 0,
451 1, 2, 3, 4, 5, 6, 7, 8,
453 msg['payload'] += ie_p2p(attrs)
456 # Invalid Device Name header length in Device Info attribute
458 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
459 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
462 0, 0, 0, 0, 0, 0, 0, 0,
464 1, 2, 3, 4, 5, 6, 7, 8,
465 0x10, 0x11, 0xff, 0xff)
466 msg['payload'] += ie_p2p(attrs)
469 # Invalid Device Name header length in Device Info attribute
471 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
473 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
476 0, 0, 0, 0, 0, 0, 0, 0,
478 1, 2, 3, 4, 5, 6, 7, 8,
479 0x10, 0x11, 0, len(devname) + 1) + devname
480 msg['payload'] += ie_p2p(attrs)
483 # Device Name filtering and too long Device Name in Device Info attribute
485 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
486 attrs = struct.pack("<BH6BH8BB8B4B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + 4,
489 0, 0, 0, 0, 0, 0, 0, 0,
491 1, 2, 3, 4, 5, 6, 7, 8,
494 devname = '123456789012345678901234567890123'
495 attrs += struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
498 0, 0, 0, 0, 0, 0, 0, 0,
500 1, 2, 3, 4, 5, 6, 7, 8,
501 0x10, 0x11, 0, len(devname)) + devname
502 msg['payload'] += ie_p2p(attrs)
505 # Too short Configuration Timeout attribute
507 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
508 attrs = struct.pack("<BHB", P2P_ATTR_CONFIGURATION_TIMEOUT, 1, 1)
509 msg['payload'] += ie_p2p(attrs)
512 # Too short Intended P2P Interface Address attribute
514 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
515 attrs = struct.pack("<BHB", P2P_ATTR_INTENDED_INTERFACE_ADDR, 1, 1)
516 msg['payload'] += ie_p2p(attrs)
519 # Too short P2P Group BSSID attribute
521 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
522 attrs = struct.pack("<BHB", P2P_ATTR_GROUP_BSSID, 1, 1)
523 msg['payload'] += ie_p2p(attrs)
526 # Too short P2P Group ID attribute
528 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
529 attrs = struct.pack("<BHB", P2P_ATTR_GROUP_ID, 1, 1)
530 msg['payload'] += ie_p2p(attrs)
533 # Too long P2P Group ID attribute
535 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
536 attrs = struct.pack("<BH6B", P2P_ATTR_GROUP_ID, 6 + 33, 0, 0, 0, 0, 0, 0) + "123456789012345678901234567890123"
537 msg['payload'] += ie_p2p(attrs)
540 # Too short Invitation Flags attribute
542 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
543 attrs = struct.pack("<BH", P2P_ATTR_INVITATION_FLAGS, 0)
544 msg['payload'] += ie_p2p(attrs)
547 # Valid and too short Manageability attribute
549 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
550 attrs = p2p_attr_manageability()
551 attrs += struct.pack("<BH", P2P_ATTR_MANAGEABILITY, 0)
552 msg['payload'] += ie_p2p(attrs)
555 # Too short NoA attribute
557 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
558 attrs = struct.pack("<BHB", P2P_ATTR_NOTICE_OF_ABSENCE, 1, 1)
559 msg['payload'] += ie_p2p(attrs)
562 # Valid and too short Extended Listen Timing attributes
564 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
565 attrs = p2p_attr_ext_listen_timing(period=100, interval=50)
566 attrs += struct.pack("<BHBBB", P2P_ATTR_EXT_LISTEN_TIMING, 3, 0, 0, 0)
567 msg['payload'] += ie_p2p(attrs)
570 # Valid and too short Minor Reason Code attributes
572 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
573 attrs = p2p_attr_minor_reason_code(code=2)
574 attrs += struct.pack("<BH", P2P_ATTR_MINOR_REASON_CODE, 0)
575 msg['payload'] += ie_p2p(attrs)
578 # Unknown attribute and too short OOB GO Negotiation Channel attribute
580 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
581 attrs = struct.pack("<BHB", 99, 1, 1)
582 attrs += struct.pack("<BHB", P2P_ATTR_OOB_GO_NEG_CHANNEL, 1, 1)
583 msg['payload'] += ie_p2p(attrs)
586 # Too short Service Hash attribute
588 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
589 attrs = struct.pack("<BH5B", P2P_ATTR_SERVICE_HASH, 5, 1, 2, 3, 4, 5)
590 msg['payload'] += ie_p2p(attrs)
593 # Too short Connection Capability attribute
595 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
596 attrs = struct.pack("<BH", P2P_ATTR_CONNECTION_CAPABILITY, 0)
597 msg['payload'] += ie_p2p(attrs)
600 # Too short Advertisement ID attribute
602 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
603 attrs = struct.pack("<BH9B", P2P_ATTR_ADVERTISEMENT_ID, 9, 1, 2, 3, 4, 5,
605 msg['payload'] += ie_p2p(attrs)
608 # Truncated and too short Service Instance attributes
610 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
611 attrs = struct.pack("<BH8B", P2P_ATTR_ADVERTISED_SERVICE, 8, 1, 2, 3, 4, 5,
613 attrs += struct.pack("<BH7B", P2P_ATTR_ADVERTISED_SERVICE, 7, 1, 2, 3, 4, 5,
615 msg['payload'] += ie_p2p(attrs)
618 # Too short Session ID attribute
620 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
621 attrs = struct.pack("<BH4B", P2P_ATTR_SESSION_ID, 4, 1, 2, 3, 4)
622 msg['payload'] += ie_p2p(attrs)
625 # Too short Feature Capability attribute
627 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
628 attrs = struct.pack("<BH", P2P_ATTR_FEATURE_CAPABILITY, 0)
629 msg['payload'] += ie_p2p(attrs)
632 # Too short Persistent Group attribute
634 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
635 attrs = struct.pack("<BH5B", P2P_ATTR_PERSISTENT_GROUP, 5, 1, 2, 3, 4, 5)
636 msg['payload'] += ie_p2p(attrs)
639 # Too long Persistent Group attribute
641 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
642 attrs = struct.pack("<BH9L3B", P2P_ATTR_PERSISTENT_GROUP, 6 + 32 + 1,
643 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3)
644 msg['payload'] += ie_p2p(attrs)
647 if hapd.mgmt_rx(timeout=0.5) is not None:
648 raise Exception("Unexpected management frame received")
650 dev[0].dump_monitor()
652 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
653 attrs = p2p_attr_config_timeout()
654 attrs += p2p_attr_invitation_flags()
655 attrs += p2p_attr_operating_channel()
656 attrs += p2p_attr_group_bssid(src)
657 attrs += p2p_attr_channel_list()
658 attrs += p2p_attr_group_id(src, "DIRECT-foo")
659 attrs += p2p_attr_device_info(src, config_methods=0x0108)
660 msg['payload'] += ie_p2p(attrs)
662 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
664 raise Exception("Timeout on device found event")
665 ev = dev[0].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=5)
667 raise Exception("Timeout on invitation event " + str(dialog_token))
668 if hapd.mgmt_rx(timeout=1) is None:
669 raise Exception("No invitation response " + str(dialog_token))
672 dev[0].dump_monitor()
674 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
675 attrs = p2p_attr_config_timeout()
676 attrs += p2p_attr_invitation_flags()
677 attrs += p2p_attr_operating_channel()
678 attrs += p2p_attr_group_bssid(src)
679 attrs += p2p_attr_channel_list()
680 attrs += p2p_attr_group_id(src, "DIRECT-foo")
681 attrs += p2p_attr_device_info(src, config_methods=0x0108)
682 msg['payload'] += ie_p2p(attrs)
684 ev = dev[0].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=5)
686 raise Exception("Timeout on invitation event " + str(dialog_token))
687 if hapd.mgmt_rx(timeout=1) is None:
688 raise Exception("No invitation response " + str(dialog_token))
691 dev[0].dump_monitor()
693 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
694 #attrs = p2p_attr_config_timeout()
695 attrs = p2p_attr_invitation_flags()
696 attrs += p2p_attr_operating_channel()
697 attrs += p2p_attr_group_bssid(src)
698 attrs += p2p_attr_channel_list()
699 attrs += p2p_attr_group_id(src, "DIRECT-foo")
700 attrs += p2p_attr_device_info(src, config_methods=0x0108)
701 msg['payload'] += ie_p2p(attrs)
703 if hapd.mgmt_rx(timeout=1) is None:
704 raise Exception("No invitation response " + str(dialog_token))
707 dev[0].dump_monitor()
709 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
710 attrs = p2p_attr_config_timeout()
711 #attrs = p2p_attr_invitation_flags()
712 attrs += p2p_attr_operating_channel()
713 attrs += p2p_attr_group_bssid(src)
714 attrs += p2p_attr_channel_list()
715 attrs += p2p_attr_group_id(src, "DIRECT-foo")
716 attrs += p2p_attr_device_info(src, config_methods=0x0108)
717 msg['payload'] += ie_p2p(attrs)
719 if hapd.mgmt_rx(timeout=1) is None:
720 raise Exception("No invitation response " + str(dialog_token))
723 dev[0].dump_monitor()
725 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
726 attrs = p2p_attr_config_timeout()
727 attrs = p2p_attr_invitation_flags()
728 #attrs += p2p_attr_operating_channel()
729 attrs += p2p_attr_group_bssid(src)
730 attrs += p2p_attr_channel_list()
731 attrs += p2p_attr_group_id(src, "DIRECT-foo")
732 attrs += p2p_attr_device_info(src, config_methods=0x0108)
733 msg['payload'] += ie_p2p(attrs)
735 if hapd.mgmt_rx(timeout=1) is None:
736 raise Exception("No invitation response " + str(dialog_token))
739 dev[0].dump_monitor()
741 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
742 attrs = p2p_attr_config_timeout()
743 attrs = p2p_attr_invitation_flags()
744 attrs += p2p_attr_operating_channel()
745 #attrs += p2p_attr_group_bssid(src)
746 attrs += p2p_attr_channel_list()
747 attrs += p2p_attr_group_id(src, "DIRECT-foo")
748 attrs += p2p_attr_device_info(src, config_methods=0x0108)
749 msg['payload'] += ie_p2p(attrs)
751 if hapd.mgmt_rx(timeout=1) is None:
752 raise Exception("No invitation response " + str(dialog_token))
755 dev[0].dump_monitor()
757 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
758 attrs = p2p_attr_config_timeout()
759 attrs = p2p_attr_invitation_flags()
760 attrs += p2p_attr_operating_channel()
761 attrs += p2p_attr_group_bssid(src)
762 #attrs += p2p_attr_channel_list()
763 attrs += p2p_attr_group_id(src, "DIRECT-foo")
764 attrs += p2p_attr_device_info(src, config_methods=0x0108)
765 msg['payload'] += ie_p2p(attrs)
767 if hapd.mgmt_rx(timeout=1) is None:
768 raise Exception("No invitation response " + str(dialog_token))
771 dev[0].dump_monitor()
773 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
774 attrs = p2p_attr_config_timeout()
775 attrs = p2p_attr_invitation_flags()
776 attrs += p2p_attr_operating_channel()
777 attrs += p2p_attr_group_bssid(src)
778 attrs += p2p_attr_channel_list()
779 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
780 attrs += p2p_attr_device_info(src, config_methods=0x0108)
781 msg['payload'] += ie_p2p(attrs)
783 if hapd.mgmt_rx(timeout=1) is None:
784 raise Exception("No invitation response " + str(dialog_token))
787 dev[0].dump_monitor()
789 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
790 attrs = p2p_attr_config_timeout()
791 attrs = p2p_attr_invitation_flags()
792 attrs += p2p_attr_operating_channel()
793 attrs += p2p_attr_group_bssid(src)
794 attrs += p2p_attr_channel_list()
795 attrs += p2p_attr_group_id(src, "DIRECT-foo")
796 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
797 msg['payload'] += ie_p2p(attrs)
799 if hapd.mgmt_rx(timeout=1) is None:
800 raise Exception("No invitation response " + str(dialog_token))
803 dev[0].dump_monitor()
805 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
807 if hapd.mgmt_rx(timeout=1) is None:
808 raise Exception("No invitation response " + str(dialog_token))
810 # Unusable peer operating channel preference
812 dev[0].dump_monitor()
814 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
815 attrs = p2p_attr_config_timeout()
816 attrs = p2p_attr_invitation_flags()
817 attrs += p2p_attr_operating_channel(chan=15)
818 attrs += p2p_attr_group_bssid(src)
819 attrs += p2p_attr_channel_list()
820 attrs += p2p_attr_group_id(src, "DIRECT-foo")
821 attrs += p2p_attr_device_info(src, config_methods=0x0108)
822 msg['payload'] += ie_p2p(attrs)
824 if hapd.mgmt_rx(timeout=1) is None:
825 raise Exception("No invitation response " + str(dialog_token))
827 def test_p2p_msg_invitation_req_to_go(dev, apdev):
828 """P2P protocol tests for invitation request processing on GO device"""
829 res = form(dev[0], dev[1])
830 dev[0].dump_monitor()
831 dev[1].dump_monitor()
832 addr0 = dev[0].p2p_dev_addr()
833 addr1 = dev[1].p2p_dev_addr()
834 peer = dev[1].get_peer(addr0)
835 listen_freq = peer['listen_freq']
837 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
838 raise Exception("Failed to enable external management frame handling")
840 networks = dev[0].list_networks()
841 if len(networks) != 1:
842 raise Exception("Unexpected number of networks")
843 if "[P2P-PERSISTENT]" not in networks[0]['flags']:
844 raise Exception("Not the persistent group data")
845 dev[0].p2p_start_go(persistent=networks[0]['id'], freq=listen_freq)
849 # Unusable peer operating channel preference
851 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
852 dialog_token=dialog_token)
853 attrs = p2p_attr_config_timeout()
854 attrs = p2p_attr_invitation_flags(bitmap=1)
855 attrs += p2p_attr_operating_channel(chan=15)
856 attrs += p2p_attr_channel_list()
857 attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
858 attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
859 msg['payload'] += ie_p2p(attrs)
861 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
863 rx_msg = dev[1].mgmt_rx()
865 raise Exception("MGMT-RX timeout")
866 p2p = parse_p2p_public_action(rx_msg['payload'])
868 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
869 if p2p['subtype'] != P2P_INVITATION_RESP:
870 raise Exception("Unexpected subtype %d" % p2p['subtype'])
871 if p2p['p2p_status'] != 0:
872 raise Exception("Unexpected status %d" % p2p['p2p_status'])
874 # Forced channel re-selection due to channel list
876 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
877 dialog_token=dialog_token)
878 attrs = p2p_attr_config_timeout()
879 attrs = p2p_attr_invitation_flags(bitmap=1)
880 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
883 attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
884 attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
885 msg['payload'] += ie_p2p(attrs)
887 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
889 rx_msg = dev[1].mgmt_rx()
891 raise Exception("MGMT-RX timeout")
892 p2p = parse_p2p_public_action(rx_msg['payload'])
894 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
895 if p2p['subtype'] != P2P_INVITATION_RESP:
896 raise Exception("Unexpected subtype %d" % p2p['subtype'])
897 if p2p['p2p_status'] != 7 and dev[1].get_mcc() <= 1:
898 raise Exception("Unexpected status %d" % p2p['p2p_status'])
900 def test_p2p_msg_invitation_req_unknown(dev, apdev):
901 """P2P protocol tests for invitation request from unknown peer"""
902 dst, src, hapd, channel = start_p2p(dev, apdev)
906 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
907 attrs = p2p_attr_config_timeout()
908 attrs += p2p_attr_invitation_flags()
909 attrs += p2p_attr_operating_channel()
910 attrs += p2p_attr_group_bssid(src)
911 attrs += p2p_attr_channel_list()
912 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
913 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
914 msg['payload'] += ie_p2p(attrs)
916 ev = dev[0].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=5)
918 raise Exception("Timeout on invitation event " + str(dialog_token))
919 if hapd.mgmt_rx(timeout=1) is None:
920 raise Exception("No invitation response " + str(dialog_token))
922 def test_p2p_msg_invitation_no_common_channels(dev, apdev):
923 """P2P protocol tests for invitation request without common channels"""
924 dst, src, hapd, channel = start_p2p(dev, apdev)
928 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
929 attrs = p2p_attr_config_timeout()
930 attrs += p2p_attr_invitation_flags()
931 attrs += p2p_attr_operating_channel()
932 attrs += p2p_attr_group_bssid(src)
933 attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
936 attrs += p2p_attr_group_id(src, "DIRECT-foo")
937 attrs += p2p_attr_device_info(src, config_methods=0x0108)
938 msg['payload'] += ie_p2p(attrs)
940 if hapd.mgmt_rx(timeout=1) is None:
941 raise Exception("No invitation response " + str(dialog_token))
942 ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=0.1)
944 raise Exception("Unexpected invitation event")
946 def test_p2p_msg_invitation_resp(dev, apdev):
947 """P2P protocol tests for invitation response processing"""
949 dev[0].dump_monitor()
950 dev[1].dump_monitor()
952 dst, src, hapd, channel = start_p2p(dev, apdev)
954 addr0 = dev[0].p2p_dev_addr()
955 addr1 = dev[1].p2p_dev_addr()
956 peer = dev[1].get_peer(addr0)
958 # P2P Invitation Response from unknown peer
959 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=1)
962 # P2P Invitation Response from peer that is not in invitation
963 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=2)
964 attrs = p2p_attr_status()
965 msg['payload'] += ie_p2p(attrs)
966 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
969 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
970 raise Exception("Failed to enable external management frame handling")
972 invite(dev[0], dev[1])
973 rx_msg = dev[1].mgmt_rx()
975 raise Exception("MGMT-RX timeout")
976 p2p = parse_p2p_public_action(rx_msg['payload'])
978 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
979 if p2p['subtype'] != P2P_INVITATION_REQ:
980 raise Exception("Unexpected subtype %d" % p2p['subtype'])
982 # Invalid attribute to cause p2p_parse() failure
983 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
984 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
985 msg['payload'] += ie_p2p(attrs)
986 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
988 invite(dev[0], dev[1])
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'])
998 # missing mandatory Status attribute
999 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1000 attrs = p2p_attr_channel_list()
1001 msg['payload'] += ie_p2p(attrs)
1002 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 invite(dev[0], dev[1])
1005 rx_msg = dev[1].mgmt_rx()
1007 raise Exception("MGMT-RX timeout")
1008 p2p = parse_p2p_public_action(rx_msg['payload'])
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'])
1014 # no channel match (no common channel found at all)
1015 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1016 attrs = p2p_attr_status()
1017 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
1020 msg['payload'] += ie_p2p(attrs)
1021 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1023 invite(dev[0], dev[1])
1024 rx_msg = dev[1].mgmt_rx()
1026 raise Exception("MGMT-RX timeout")
1027 p2p = parse_p2p_public_action(rx_msg['payload'])
1029 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1030 if p2p['subtype'] != P2P_INVITATION_REQ:
1031 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1033 # no channel match (no acceptable P2P channel)
1034 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1035 attrs = p2p_attr_status()
1036 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
1039 msg['payload'] += ie_p2p(attrs)
1040 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1042 invite(dev[0], dev[1])
1043 rx_msg = dev[1].mgmt_rx()
1045 raise Exception("MGMT-RX timeout")
1046 p2p = parse_p2p_public_action(rx_msg['payload'])
1048 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1049 if p2p['subtype'] != P2P_INVITATION_REQ:
1050 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1052 # missing mandatory Channel List attribute (ignored as a workaround)
1053 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1054 attrs = p2p_attr_status()
1055 msg['payload'] += ie_p2p(attrs)
1056 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1058 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1060 raise Exception("Group was not started")
1062 def test_p2p_msg_invitation_resend(dev, apdev):
1063 """P2P protocol tests for invitation resending on no-common-channels"""
1064 form(dev[0], dev[1])
1065 dev[0].dump_monitor()
1066 dev[1].dump_monitor()
1067 addr0 = dev[0].p2p_dev_addr()
1068 addr1 = dev[1].p2p_dev_addr()
1070 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1071 raise Exception("Failed to enable external management frame handling")
1073 logger.info("Forced channel in invitation")
1074 invite(dev[0], dev[1], extra="freq=2422")
1075 rx_msg = dev[1].mgmt_rx()
1077 raise Exception("MGMT-RX timeout")
1078 p2p = parse_p2p_public_action(rx_msg['payload'])
1080 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1081 if p2p['subtype'] != P2P_INVITATION_REQ:
1082 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1083 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1084 dialog_token=p2p['dialog_token'])
1085 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1086 msg['payload'] += ie_p2p(attrs)
1087 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1088 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
1090 raise Exception("Timeout on invitation result");
1091 if "status=7" not in ev:
1092 raise Exception("Unexpected invitation result: " + ev)
1094 logger.info("Any channel allowed, only preference provided in invitation");
1095 invite(dev[0], dev[1], extra="pref=2422")
1096 rx_msg = dev[1].mgmt_rx()
1098 raise Exception("MGMT-RX timeout")
1099 p2p = parse_p2p_public_action(rx_msg['payload'])
1101 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1102 if p2p['subtype'] != P2P_INVITATION_REQ:
1103 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1104 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1105 dialog_token=p2p['dialog_token'])
1106 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1107 msg['payload'] += ie_p2p(attrs)
1108 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
1109 raise Exception("Failed to disable external management frame handling")
1110 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1111 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
1113 raise Exception("Timeout on invitation result");
1114 if "status=0" not in ev:
1115 raise Exception("Unexpected invitation result: " + ev)
1117 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1119 raise Exception("Group was not started on dev0")
1120 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1122 raise Exception("Group was not started on dev1")
1124 def test_p2p_msg_invitation_resend_duplicate(dev, apdev):
1125 """P2P protocol tests for invitation resending on no-common-channels and duplicated response"""
1126 form(dev[0], dev[1])
1127 dev[0].dump_monitor()
1128 dev[1].dump_monitor()
1129 addr0 = dev[0].p2p_dev_addr()
1130 addr1 = dev[1].p2p_dev_addr()
1132 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1133 raise Exception("Failed to enable external management frame handling")
1135 logger.info("Any channel allowed, only preference provided in invitation");
1136 invite(dev[0], dev[1], extra="pref=2422")
1137 rx_msg = dev[1].mgmt_rx()
1139 raise Exception("MGMT-RX timeout")
1140 p2p = parse_p2p_public_action(rx_msg['payload'])
1142 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1143 if p2p['subtype'] != P2P_INVITATION_REQ:
1144 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1145 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1146 dialog_token=p2p['dialog_token'])
1147 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1148 msg['payload'] += ie_p2p(attrs)
1149 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1151 rx_msg = dev[1].mgmt_rx()
1153 raise Exception("MGMT-RX timeout")
1154 p2p = parse_p2p_public_action(rx_msg['payload'])
1156 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1157 if p2p['subtype'] != P2P_INVITATION_REQ:
1158 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1160 logger.info("Retransmit duplicate of previous response")
1161 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1163 logger.info("Transmit real response")
1164 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1165 dialog_token=p2p['dialog_token'])
1166 attrs = p2p_attr_status(status=P2P_SC_SUCCESS)
1167 attrs += p2p_attr_channel_list()
1168 msg['payload'] += ie_p2p(attrs)
1169 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']))):
1170 raise Exception("Failed to transmit real response")
1171 dev[1].request("SET ext_mgmt_frame_handling 0")
1173 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=10)
1175 raise Exception("Timeout on invitation result");
1176 if "status=0" not in ev:
1177 raise Exception("Unexpected invitation result: " + ev)
1178 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1180 raise Exception("Group formation timed out")
1181 dev[0].group_form_result(ev)
1182 dev[0].remove_group()
1184 def test_p2p_msg_pd_req(dev, apdev):
1185 """P2P protocol tests for provision discovery request processing"""
1186 dst, src, hapd, channel = start_p2p(dev, apdev)
1189 # Too short attribute header
1191 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1192 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1193 msg['payload'] += ie_p2p(attrs)
1196 if hapd.mgmt_rx(timeout=0.5) is not None:
1197 raise Exception("Unexpected management frame received")
1201 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1203 msg['payload'] += ie_p2p(attrs)
1205 if hapd.mgmt_rx(timeout=1) is None:
1206 raise Exception("No PD response " + str(dialog_token))
1211 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1212 attrs = wsc_attr_config_methods(methods=0x1008)
1213 msg['payload'] += ie_wsc(attrs)
1214 attrs = p2p_attr_capability()
1215 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1216 msg['payload'] += ie_p2p(attrs)
1218 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
1220 raise Exception("Timeout on device found event")
1221 ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
1223 raise Exception("Timeout on PD event")
1224 if hapd.mgmt_rx(timeout=1) is None:
1225 raise Exception("No PD response " + str(dialog_token))
1230 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1231 attrs = wsc_attr_config_methods(methods=0x1008)
1232 msg['payload'] += ie_wsc(attrs)
1233 attrs = p2p_attr_capability()
1234 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1235 attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
1236 msg['payload'] += ie_p2p(attrs)
1238 if hapd.mgmt_rx(timeout=1) is None:
1239 raise Exception("No PD response " + str(dialog_token))
1240 ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
1242 raise Exception("Unexpected PD event")
1244 # Listen channel is not yet known
1245 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
1246 raise Exception("Unexpected P2P_PROV_DISC success")
1249 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
1250 raise Exception("Unexpected P2P_PROV_DISC success (2)")
1252 def test_p2p_msg_pd(dev, apdev):
1253 """P2P protocol tests for provision discovery request processing (known)"""
1254 dst, src, hapd, channel = start_p2p(dev, apdev)
1257 p2p_probe(hapd, src, chan=channel)
1262 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1263 attrs = wsc_attr_config_methods(methods=0x1008)
1264 msg['payload'] += ie_wsc(attrs)
1265 attrs = p2p_attr_capability()
1266 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1267 msg['payload'] += ie_p2p(attrs)
1269 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
1271 raise Exception("Timeout on device found event")
1272 ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
1274 raise Exception("Timeout on PD event")
1275 if hapd.mgmt_rx(timeout=1) is None:
1276 raise Exception("No PD response " + str(dialog_token))
1278 if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
1279 raise Exception("Unexpected P2P_PROV_DISC failure")
1280 frame = hapd.mgmt_rx(timeout=1)
1282 raise Exception("No PD request " + str(dialog_token))
1283 p2p = parse_p2p_public_action(frame['payload'])
1285 raise Exception("Failed to parse PD request")
1287 # invalid dialog token
1288 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1289 dialog_token=p2p['dialog_token'] + 1)
1291 ev = dev[0].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
1293 raise Exception("Unexpected PD result event")
1295 # valid dialog token
1296 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1297 dialog_token=p2p['dialog_token'])
1299 ev = dev[0].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
1301 raise Exception("Timeout on PD result event")
1303 # valid dialog token
1304 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1305 dialog_token=p2p['dialog_token'])
1307 ev = dev[0].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
1309 raise Exception("Unexpected PD result event")
1311 def check_p2p_response(hapd, dialog_token, status):
1312 resp = hapd.mgmt_rx(timeout=2)
1314 raise Exception("No GO Neg Response " + str(dialog_token))
1315 p2p = parse_p2p_public_action(resp['payload'])
1317 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1318 if dialog_token != p2p['dialog_token']:
1319 raise Exception("Unexpected dialog token in response")
1320 if p2p['p2p_status'] != status:
1321 raise Exception("Unexpected status code %s in response (expected %d)" % (p2p['p2p_status'], status))
1323 def test_p2p_msg_go_neg_both_start(dev, apdev):
1324 """P2P protocol test for simultaneous GO Neg initiation"""
1325 addr0 = dev[0].p2p_dev_addr()
1326 addr1 = dev[1].p2p_dev_addr()
1328 dev[1].discover_peer(addr0)
1330 dev[0].discover_peer(addr1)
1332 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
1333 raise Exception("Failed to enable external management frame handling")
1334 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1335 raise Exception("Failed to enable external management frame handling")
1336 dev[0].request("P2P_CONNECT {} pbc".format(addr1))
1337 dev[1].request("P2P_CONNECT {} pbc".format(addr0))
1338 msg = dev[0].mgmt_rx()
1340 raise Exception("MGMT-RX timeout")
1341 msg = dev[1].mgmt_rx()
1343 raise Exception("MGMT-RX timeout(2)")
1344 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 0"):
1345 raise Exception("Failed to disable external management frame handling")
1346 ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=2)
1348 raise Exception("Unexpected GO Neg success")
1349 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
1350 raise Exception("Failed to disable external management frame handling")
1351 ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
1353 raise Exception("GO Neg did not succeed")
1354 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
1356 raise Exception("Group formation not succeed")
1357 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
1359 raise Exception("Group formation not succeed")
1361 def test_p2p_msg_go_neg_req(dev, apdev):
1362 """P2P protocol tests for invitation request from unknown peer"""
1363 dst, src, hapd, channel = start_p2p(dev, apdev)
1368 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1369 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1370 msg['payload'] += ie_p2p(attrs)
1372 frame = hapd.mgmt_rx(timeout=0.1)
1373 if frame is not None:
1375 raise Exception("Unexpected GO Neg Response")
1379 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1380 attrs = p2p_attr_capability()
1381 attrs += p2p_attr_go_intent()
1382 attrs += p2p_attr_config_timeout()
1383 #attrs += p2p_attr_listen_channel()
1384 attrs += p2p_attr_ext_listen_timing()
1385 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1386 attrs += p2p_attr_channel_list()
1387 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1388 attrs += p2p_attr_operating_channel()
1389 msg['payload'] += ie_p2p(attrs)
1391 if hapd.mgmt_rx(timeout=2) is None:
1392 raise Exception("No GO Neg Response " + str(dialog_token))
1396 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1397 attrs = p2p_attr_capability()
1398 attrs += p2p_attr_go_intent()
1399 attrs += p2p_attr_config_timeout()
1400 attrs += p2p_attr_listen_channel()
1401 attrs += p2p_attr_ext_listen_timing()
1402 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1403 attrs += p2p_attr_channel_list()
1404 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1405 #attrs += p2p_attr_operating_channel()
1406 msg['payload'] += ie_p2p(attrs)
1408 if hapd.mgmt_rx(timeout=2) is None:
1409 raise Exception("No GO Neg Response " + str(dialog_token))
1413 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1414 attrs = p2p_attr_capability()
1415 attrs += p2p_attr_go_intent()
1416 attrs += p2p_attr_config_timeout()
1417 attrs += p2p_attr_listen_channel()
1418 attrs += p2p_attr_ext_listen_timing()
1419 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1420 #attrs += p2p_attr_channel_list()
1421 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1422 attrs += p2p_attr_operating_channel()
1423 msg['payload'] += ie_p2p(attrs)
1425 if hapd.mgmt_rx(timeout=2) is None:
1426 raise Exception("No GO Neg Response " + str(dialog_token))
1430 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1431 attrs = p2p_attr_capability()
1432 attrs += p2p_attr_go_intent()
1433 attrs += p2p_attr_config_timeout()
1434 attrs += p2p_attr_listen_channel()
1435 attrs += p2p_attr_ext_listen_timing()
1436 #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1437 attrs += p2p_attr_channel_list()
1438 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1439 attrs += p2p_attr_operating_channel()
1440 msg['payload'] += ie_p2p(attrs)
1442 if hapd.mgmt_rx(timeout=2) is None:
1443 raise Exception("No GO Neg Response " + str(dialog_token))
1447 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1448 attrs = p2p_attr_capability()
1449 attrs += p2p_attr_go_intent()
1450 attrs += p2p_attr_config_timeout()
1451 attrs += p2p_attr_listen_channel()
1452 attrs += p2p_attr_ext_listen_timing()
1453 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1454 attrs += p2p_attr_channel_list()
1455 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
1456 attrs += p2p_attr_operating_channel()
1457 msg['payload'] += ie_p2p(attrs)
1459 if hapd.mgmt_rx(timeout=2) is None:
1460 raise Exception("No GO Neg Response " + str(dialog_token))
1463 # SA != P2P Device address
1465 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1466 attrs = p2p_attr_capability()
1467 attrs += p2p_attr_go_intent()
1468 attrs += p2p_attr_config_timeout()
1469 attrs += p2p_attr_listen_channel()
1470 attrs += p2p_attr_ext_listen_timing()
1471 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1472 attrs += p2p_attr_channel_list()
1473 attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
1474 attrs += p2p_attr_operating_channel()
1475 msg['payload'] += ie_p2p(attrs)
1477 if hapd.mgmt_rx(timeout=2) is None:
1478 raise Exception("No GO Neg Response " + str(dialog_token))
1481 # unexpected Status attribute
1483 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1484 attrs = p2p_attr_capability()
1485 attrs += p2p_attr_go_intent()
1486 attrs += p2p_attr_config_timeout()
1487 attrs += p2p_attr_listen_channel()
1488 attrs += p2p_attr_ext_listen_timing()
1489 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1490 attrs += p2p_attr_channel_list()
1491 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1492 attrs += p2p_attr_operating_channel()
1493 attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
1494 msg['payload'] += ie_p2p(attrs)
1496 if hapd.mgmt_rx(timeout=2) is None:
1497 raise Exception("No GO Neg Response(1) " + str(dialog_token))
1500 # valid (with workarounds) GO Neg Req
1502 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1503 #attrs = p2p_attr_capability()
1504 #attrs += p2p_attr_go_intent()
1505 #attrs += p2p_attr_config_timeout()
1506 attrs = p2p_attr_listen_channel()
1507 attrs += p2p_attr_ext_listen_timing()
1508 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1509 attrs += p2p_attr_channel_list()
1510 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1511 attrs += p2p_attr_operating_channel()
1512 msg['payload'] += ie_p2p(attrs)
1514 check_p2p_response(hapd, dialog_token,
1515 P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
1516 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=2)
1518 raise Exception("Timeout on GO Neg event " + str(dialog_token))
1520 dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
1522 # ready - missing attributes (with workarounds) GO Neg Req
1525 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1526 #attrs = p2p_attr_capability()
1527 #attrs += p2p_attr_go_intent()
1528 #attrs += p2p_attr_config_timeout()
1529 attrs = p2p_attr_listen_channel()
1530 attrs += p2p_attr_ext_listen_timing()
1531 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1532 attrs += p2p_attr_channel_list()
1533 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1534 attrs += p2p_attr_operating_channel()
1535 msg['payload'] += ie_p2p(attrs)
1537 if hapd.mgmt_rx(timeout=2) is None:
1538 raise Exception("No GO Neg Response " + str(dialog_token))
1540 # ready - invalid GO Intent GO Neg Req
1543 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1544 #attrs = p2p_attr_capability()
1545 attrs = p2p_attr_go_intent(go_intent=16)
1546 #attrs += p2p_attr_config_timeout()
1547 attrs += p2p_attr_listen_channel()
1548 attrs += p2p_attr_ext_listen_timing()
1549 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1550 attrs += p2p_attr_channel_list()
1551 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1552 attrs += p2p_attr_operating_channel()
1553 msg['payload'] += ie_p2p(attrs)
1555 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INVALID_PARAMS)
1557 # ready - invalid Channel List
1560 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1561 attrs = p2p_attr_capability()
1562 attrs += p2p_attr_go_intent()
1563 attrs += p2p_attr_config_timeout()
1564 attrs += p2p_attr_listen_channel()
1565 attrs += p2p_attr_ext_listen_timing()
1566 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1567 attrs += struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
1569 81, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
1570 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1571 attrs += p2p_attr_operating_channel()
1572 msg['payload'] += ie_p2p(attrs)
1574 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_NO_COMMON_CHANNELS)
1576 # ready - invalid GO Neg Req (unsupported Device Password ID)
1579 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1580 attrs = p2p_attr_capability()
1581 attrs += p2p_attr_go_intent()
1582 attrs += p2p_attr_config_timeout()
1583 attrs += p2p_attr_listen_channel()
1584 attrs += p2p_attr_ext_listen_timing()
1585 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1586 # very long channel list
1587 attrs += struct.pack("<BH3BBB11B30B", P2P_ATTR_CHANNEL_LIST, 46,
1589 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1590 1, 1, 1, 2, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5,
1591 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10)
1592 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1593 attrs += p2p_attr_operating_channel()
1594 msg['payload'] += ie_p2p(attrs)
1596 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD)
1598 def mgmt_tx(dev, msg):
1599 for i in range(0, 20):
1600 if "FAIL" in dev.request(msg):
1601 raise Exception("Failed to send Action frame")
1602 ev = dev.wait_event(["MGMT-TX-STATUS"], timeout=10)
1604 raise Exception("Timeout on MGMT-TX-STATUS")
1605 if "result=SUCCESS" in ev:
1608 if "result=SUCCESS" not in ev:
1609 raise Exception("Peer did not ack Action frame")
1611 def rx_go_neg_req(dev):
1614 raise Exception("MGMT-RX timeout")
1615 p2p = parse_p2p_public_action(msg['payload'])
1617 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1618 if p2p['subtype'] != P2P_GO_NEG_REQ:
1619 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1620 p2p['freq'] = msg['freq']
1623 def rx_go_neg_conf(dev, status=None, dialog_token=None):
1626 raise Exception("MGMT-RX timeout")
1627 p2p = parse_p2p_public_action(msg['payload'])
1629 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1630 if p2p['subtype'] != P2P_GO_NEG_CONF:
1631 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1632 if dialog_token is not None and dialog_token != p2p['dialog_token']:
1633 raise Exception("Unexpected dialog token")
1634 if status is not None and p2p['p2p_status'] != status:
1635 raise Exception("Unexpected status %d" % p2p['p2p_status'])
1637 def check_p2p_go_neg_fail_event(dev, status):
1638 ev = dev.wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
1640 raise Exception("GO Negotiation failure not reported")
1641 if "status=%d" % status not in ev:
1642 raise Exception("Unexpected failure reason: " + ev)
1644 def test_p2p_msg_go_neg_req_reject(dev, apdev):
1645 """P2P protocol tests for user reject incorrectly in GO Neg Req"""
1646 addr0 = dev[0].p2p_dev_addr()
1647 addr1 = dev[1].p2p_dev_addr()
1649 dev[1].discover_peer(addr0)
1650 dev[1].group_request("P2P_CONNECT " + addr0 + " pbc")
1651 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
1653 raise Exception("Timeout on GO Neg Req")
1655 peer = dev[0].get_peer(addr1)
1656 dev[0].p2p_stop_find()
1658 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_REQ, dialog_token=123)
1659 attrs = p2p_attr_capability()
1660 attrs += p2p_attr_status(status=P2P_SC_FAIL_REJECTED_BY_USER)
1661 attrs += p2p_attr_go_intent()
1662 attrs += p2p_attr_config_timeout()
1663 attrs += p2p_attr_listen_channel()
1664 attrs += p2p_attr_ext_listen_timing()
1665 attrs += p2p_attr_intended_interface_addr(addr0)
1666 attrs += p2p_attr_channel_list()
1667 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1668 attrs += p2p_attr_operating_channel()
1669 msg['payload'] += ie_p2p(attrs)
1671 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1673 ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
1675 raise Exception("GO Negotiation failure not reported")
1676 if "status=%d" % P2P_SC_FAIL_REJECTED_BY_USER not in ev:
1677 raise Exception("Unexpected failure reason: " + ev)
1679 def test_p2p_msg_unexpected_go_neg_resp(dev, apdev):
1680 """P2P protocol tests for unexpected GO Neg Resp"""
1681 addr0 = dev[0].p2p_dev_addr()
1682 addr1 = dev[1].p2p_dev_addr()
1684 dev[0].discover_peer(addr1)
1685 dev[0].p2p_stop_find()
1687 peer = dev[0].get_peer(addr1)
1689 logger.debug("GO Neg Resp without GO Neg session")
1690 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=123)
1691 attrs = p2p_attr_status()
1692 attrs += p2p_attr_capability()
1693 attrs += p2p_attr_go_intent()
1694 attrs += p2p_attr_config_timeout()
1695 attrs += p2p_attr_intended_interface_addr(addr0)
1696 attrs += p2p_attr_channel_list()
1697 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1698 attrs += p2p_attr_operating_channel()
1699 msg['payload'] += ie_p2p(attrs)
1700 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1703 dev[1].discover_peer(addr0)
1705 logger.debug("Unexpected GO Neg Resp while waiting for new GO Neg session")
1706 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1707 raise Exception("P2P_CONNECT failed")
1708 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
1710 raise Exception("Timeout on GO Neg Req")
1711 dev[0].p2p_stop_find()
1712 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1714 logger.debug("Invalid attribute in GO Neg Response")
1715 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=197)
1716 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1717 msg['payload'] += ie_p2p(attrs)
1718 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1719 frame = dev[0].mgmt_rx(timeout=0.1)
1720 if frame is not None:
1721 raise Exception("Unexpected GO Neg Confirm")
1723 logger.debug("GO Neg Resp with unexpected dialog token")
1724 dev[1].p2p_stop_find()
1725 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
1726 raise Exception("Failed to enable external management frame handling")
1728 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1729 raise Exception("P2P_CONNECT failed(2)")
1730 p2p = rx_go_neg_req(dev[0])
1731 dev[0].p2p_stop_find()
1732 dialog_token = p2p['dialog_token']
1733 if dialog_token < 255:
1737 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1738 attrs = p2p_attr_status()
1739 attrs += p2p_attr_capability()
1740 attrs += p2p_attr_go_intent()
1741 attrs += p2p_attr_config_timeout()
1742 attrs += p2p_attr_intended_interface_addr(addr0)
1743 attrs += p2p_attr_channel_list()
1744 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1745 attrs += p2p_attr_operating_channel()
1746 msg['payload'] += ie_p2p(attrs)
1747 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1749 logger.debug("GO Neg Resp without Status")
1750 dev[1].p2p_stop_find()
1752 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1753 raise Exception("P2P_CONNECT failed(2)")
1754 p2p = rx_go_neg_req(dev[0])
1755 dev[0].p2p_stop_find()
1756 dialog_token = p2p['dialog_token']
1757 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1758 #attrs = p2p_attr_status()
1759 attrs = p2p_attr_capability()
1760 attrs += p2p_attr_go_intent()
1761 attrs += p2p_attr_config_timeout()
1762 attrs += p2p_attr_intended_interface_addr(addr0)
1763 attrs += p2p_attr_channel_list()
1764 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1765 attrs += p2p_attr_operating_channel()
1766 msg['payload'] += ie_p2p(attrs)
1767 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1768 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1769 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1771 logger.debug("GO Neg Resp without Intended Address")
1772 dev[1].p2p_stop_find()
1774 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1775 raise Exception("P2P_CONNECT failed(2)")
1776 p2p = rx_go_neg_req(dev[0])
1777 dev[0].p2p_stop_find()
1778 dialog_token = p2p['dialog_token']
1779 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1780 attrs = p2p_attr_status()
1781 #attrs += p2p_attr_capability()
1782 attrs += p2p_attr_go_intent()
1783 attrs += p2p_attr_config_timeout()
1784 #attrs += p2p_attr_intended_interface_addr(addr0)
1785 attrs += p2p_attr_channel_list()
1786 #attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1787 attrs += p2p_attr_operating_channel()
1788 msg['payload'] += ie_p2p(attrs)
1789 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1790 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1791 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1793 logger.debug("GO Neg Resp without GO Intent")
1794 dev[1].p2p_stop_find()
1796 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1797 raise Exception("P2P_CONNECT failed(2)")
1798 p2p = rx_go_neg_req(dev[0])
1799 dev[0].p2p_stop_find()
1800 dialog_token = p2p['dialog_token']
1801 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1802 attrs = p2p_attr_status()
1803 attrs += p2p_attr_capability()
1804 #attrs += p2p_attr_go_intent()
1805 attrs += p2p_attr_config_timeout()
1806 attrs += p2p_attr_intended_interface_addr(addr0)
1807 attrs += p2p_attr_channel_list()
1808 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1809 attrs += p2p_attr_operating_channel()
1810 msg['payload'] += ie_p2p(attrs)
1811 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1812 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1813 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1815 logger.debug("GO Neg Resp with invalid GO Intent")
1816 dev[1].p2p_stop_find()
1818 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1819 raise Exception("P2P_CONNECT failed(2)")
1820 p2p = rx_go_neg_req(dev[0])
1821 dev[0].p2p_stop_find()
1822 dialog_token = p2p['dialog_token']
1823 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1824 attrs = p2p_attr_status()
1825 attrs += p2p_attr_capability()
1826 attrs += p2p_attr_go_intent(go_intent=16)
1827 attrs += p2p_attr_config_timeout()
1828 attrs += p2p_attr_intended_interface_addr(addr0)
1829 attrs += p2p_attr_channel_list()
1830 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1831 attrs += p2p_attr_operating_channel()
1832 msg['payload'] += ie_p2p(attrs)
1833 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1834 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1835 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1837 logger.debug("GO Neg Resp with incompatible GO Intent")
1838 dev[1].p2p_stop_find()
1840 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15"):
1841 raise Exception("P2P_CONNECT failed(2)")
1842 p2p = rx_go_neg_req(dev[0])
1843 dev[0].p2p_stop_find()
1844 dialog_token = p2p['dialog_token']
1845 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1846 attrs = p2p_attr_status()
1847 attrs += p2p_attr_capability()
1848 attrs += p2p_attr_go_intent(go_intent=15)
1849 attrs += p2p_attr_config_timeout()
1850 attrs += p2p_attr_intended_interface_addr(addr0)
1851 attrs += p2p_attr_channel_list()
1852 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1853 attrs += p2p_attr_operating_channel()
1854 msg['payload'] += ie_p2p(attrs)
1855 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1856 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INCOMPATIBLE_PARAMS)
1857 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INCOMPATIBLE_PARAMS, dialog_token)
1859 logger.debug("GO Neg Resp without P2P Group ID")
1860 dev[1].p2p_stop_find()
1862 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1863 raise Exception("P2P_CONNECT failed(2)")
1864 p2p = rx_go_neg_req(dev[0])
1865 dev[0].p2p_stop_find()
1866 dialog_token = p2p['dialog_token']
1867 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1868 attrs = p2p_attr_status()
1869 attrs += p2p_attr_capability()
1870 attrs += p2p_attr_go_intent(go_intent=15)
1871 attrs += p2p_attr_config_timeout()
1872 attrs += p2p_attr_intended_interface_addr(addr0)
1873 attrs += p2p_attr_channel_list()
1874 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1875 attrs += p2p_attr_operating_channel()
1876 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
1877 msg['payload'] += ie_p2p(attrs)
1878 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1879 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1880 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1882 logger.debug("GO Neg Resp without Operating Channel")
1883 dev[1].p2p_stop_find()
1885 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1886 raise Exception("P2P_CONNECT failed(2)")
1887 p2p = rx_go_neg_req(dev[0])
1888 dev[0].p2p_stop_find()
1889 dialog_token = p2p['dialog_token']
1890 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1891 attrs = p2p_attr_status()
1892 attrs += p2p_attr_capability()
1893 attrs += p2p_attr_go_intent(go_intent=15)
1894 #attrs += p2p_attr_config_timeout()
1895 attrs += p2p_attr_intended_interface_addr(addr0)
1896 attrs += p2p_attr_channel_list()
1897 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1898 #attrs += p2p_attr_operating_channel()
1899 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1900 msg['payload'] += ie_p2p(attrs)
1901 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1902 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1903 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1905 logger.debug("GO Neg Resp without Channel List")
1906 dev[1].p2p_stop_find()
1908 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1909 raise Exception("P2P_CONNECT failed(2)")
1910 p2p = rx_go_neg_req(dev[0])
1911 dev[0].p2p_stop_find()
1912 dialog_token = p2p['dialog_token']
1913 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1914 attrs = p2p_attr_status()
1915 attrs += p2p_attr_capability()
1916 attrs += p2p_attr_go_intent(go_intent=15)
1917 attrs += p2p_attr_config_timeout()
1918 attrs += p2p_attr_intended_interface_addr(addr0)
1919 #attrs += p2p_attr_channel_list()
1920 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1921 attrs += p2p_attr_operating_channel()
1922 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1923 msg['payload'] += ie_p2p(attrs)
1924 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1925 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1926 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1928 logger.debug("GO Neg Resp without common channels")
1929 dev[1].p2p_stop_find()
1931 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1932 raise Exception("P2P_CONNECT failed(2)")
1933 p2p = rx_go_neg_req(dev[0])
1934 dev[0].p2p_stop_find()
1935 dialog_token = p2p['dialog_token']
1936 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1937 attrs = p2p_attr_status()
1938 attrs += p2p_attr_capability()
1939 attrs += p2p_attr_go_intent(go_intent=15)
1940 attrs += p2p_attr_config_timeout()
1941 attrs += p2p_attr_intended_interface_addr(addr0)
1942 attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
1945 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1946 attrs += p2p_attr_operating_channel()
1947 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1948 msg['payload'] += ie_p2p(attrs)
1949 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1950 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_NO_COMMON_CHANNELS)
1951 rx_go_neg_conf(dev[0], P2P_SC_FAIL_NO_COMMON_CHANNELS, dialog_token)