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
150 return struct.pack("<BH6B", *t) + struct.pack(">H", config_methods) + struct.pack("8BB", *t2) + struct.pack('>HH', 0x1011, len(name)) +name
152 def p2p_attr_group_id(addr, ssid):
153 val = struct.unpack('6B', binascii.unhexlify(addr.replace(':','')))
154 t = (P2P_ATTR_GROUP_ID, 6 + len(ssid)) + val
155 return struct.pack('<BH6B', *t) + ssid
157 def p2p_attr_operating_channel(op_class=81, chan=1):
158 return struct.pack("<BHBBBBB", P2P_ATTR_OPERATING_CHANNEL, 5,
159 0x58, 0x58, 0x04, op_class, chan)
161 def p2p_attr_invitation_flags(bitmap=0):
162 return struct.pack("<BHB", P2P_ATTR_INVITATION_FLAGS, 1, bitmap)
164 def p2p_hdr_helper(dst, src, type=None, dialog_token=1, req=True):
166 msg['fc'] = MGMT_SUBTYPE_ACTION << 4
173 msg['payload'] = struct.pack("<BBBBBB",
174 ACTION_CATEG_PUBLIC, 9, 0x50, 0x6f, 0x9a, 9)
176 msg['payload'] += struct.pack("<B", type)
178 msg['payload'] += struct.pack("<B", dialog_token)
181 def p2p_hdr(dst, src, type=None, dialog_token=1):
182 return p2p_hdr_helper(dst, src, type, dialog_token, True)
184 def p2p_hdr_resp(dst, src, type=None, dialog_token=1):
185 return p2p_hdr_helper(dst, src, type, dialog_token, False)
187 def start_p2p(dev, apdev):
188 addr0 = dev[0].p2p_dev_addr()
190 dev[1].p2p_find(social=True)
191 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
193 raise Exception("Device discovery timed out")
194 dev[1].p2p_stop_find()
195 peer = dev[1].get_peer(addr0)
197 bssid = apdev[0]['bssid']
198 params = { 'ssid': "test", 'beacon_int': "2000" }
199 if peer['listen_freq'] == "2412":
200 params['channel'] = '1'
201 elif peer['listen_freq'] == "2437":
202 params['channel'] = '6'
203 elif peer['listen_freq'] == "2462":
204 params['channel'] = '11'
205 hapd = hostapd.add_ap(apdev[0]['ifname'], params)
206 hapd.set("ext_mgmt_frame_handling", "1")
207 return addr0, bssid, hapd, int(params['channel'])
209 def p2p_probe(hapd, src, chan=1):
211 msg['fc'] = MGMT_SUBTYPE_PROBE_REQ << 4
212 msg['da'] = "ff:ff:ff:ff:ff:ff"
214 msg['bssid'] = "ff:ff:ff:ff:ff:ff"
215 attrs = p2p_attr_listen_channel(chan=chan)
216 msg['payload'] = ie_ssid("DIRECT-") + ie_supp_rates() + ie_p2p(attrs)
219 def parse_p2p_public_action(payload):
221 (category, action) = struct.unpack('BB', pos[0:2])
222 if category != ACTION_CATEG_PUBLIC:
227 (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
228 if oui1 != 0x50 or oui2 != 0x6f or oui3 != 0x9a or subtype != 9:
231 (subtype,dialog_token) = struct.unpack('BB', pos[0:2])
233 p2p['subtype'] = subtype
234 p2p['dialog_token'] = dialog_token
236 p2p['elements'] = pos
238 (id,elen) = struct.unpack('BB', pos[0:2])
241 raise Exception("Truncated IE in P2P Public Action frame (elen=%d left=%d)" % (elen, len(pos)))
242 if id == WLAN_EID_VENDOR_SPECIFIC:
244 raise Exception("Too short vendor specific IE in P2P Public Action frame (elen=%d)" % elen)
245 (oui1,oui2,oui3,subtype) = struct.unpack('BBBB', pos[0:4])
246 if oui1 == 0x50 and oui2 == 0x6f and oui3 == 0x9a and subtype == 9:
248 p2p['p2p'] += pos[4:elen]
250 p2p['p2p'] = pos[4:elen]
251 if oui1 == 0x00 and oui2 == 0x50 and oui3 == 0xf2 and subtype == 4:
252 p2p['wsc'] = pos[4:elen]
255 raise Exception("Invalid element in P2P Public Action frame")
258 p2p['p2p_attrs'] = {}
261 (id,alen) = struct.unpack('<BH', pos[0:3])
264 logger.info("P2P payload: " + binascii.hexlify(p2p['p2p']))
265 raise Exception("Truncated P2P attribute in P2P Public Action frame (alen=%d left=%d p2p-payload=%d)" % (alen, len(pos), len(p2p['p2p'])))
266 p2p['p2p_attrs'][id] = pos[0:alen]
268 if P2P_ATTR_STATUS in p2p['p2p_attrs']:
269 p2p['p2p_status'] = struct.unpack('B', p2p['p2p_attrs'][P2P_ATTR_STATUS])[0]
272 p2p['wsc_attrs'] = {}
275 (id,alen) = struct.unpack('>HH', pos[0:4])
278 logger.info("WSC payload: " + binascii.hexlify(p2p['wsc']))
279 raise Exception("Truncated WSC attribute in P2P Public Action frame (alen=%d left=%d wsc-payload=%d)" % (alen, len(pos), len(p2p['wsc'])))
280 p2p['wsc_attrs'][id] = pos[0:alen]
285 def test_p2p_msg_empty(dev, apdev):
286 """P2P protocol test: empty P2P Public Action frame"""
287 dst, src, hapd, channel = start_p2p(dev, apdev)
288 msg = p2p_hdr(dst, src)
291 def test_p2p_msg_long_ssid(dev, apdev):
292 """P2P protocol test: Too long SSID in P2P Public Action frame"""
293 dst, src, hapd, channel = start_p2p(dev, apdev)
295 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=1)
296 attrs = p2p_attr_config_timeout()
297 attrs += p2p_attr_invitation_flags()
298 attrs += p2p_attr_operating_channel()
299 attrs += p2p_attr_group_bssid(src)
300 attrs += p2p_attr_channel_list()
301 attrs += p2p_attr_group_id(src, 'DIRECT-foo')
302 attrs += p2p_attr_device_info(src, config_methods=0x0108)
303 msg['payload'] += ie_p2p(attrs)
304 msg['payload'] += ie_ssid(255 * 'A')
306 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=5)
308 raise Exception("Timeout on device found event")
310 def test_p2p_msg_long_dev_name(dev, apdev):
311 """P2P protocol test: Too long Device Name in P2P Public Action frame"""
312 dst, src, hapd, channel = start_p2p(dev, apdev)
314 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=1)
315 attrs = p2p_attr_config_timeout()
316 attrs += p2p_attr_invitation_flags()
317 attrs += p2p_attr_operating_channel()
318 attrs += p2p_attr_group_bssid(src)
319 attrs += p2p_attr_channel_list()
320 attrs += p2p_attr_group_id(src, 'DIRECT-foo')
321 attrs += p2p_attr_device_info(src, config_methods=0x0108,
322 name="123456789012345678901234567890123")
323 msg['payload'] += ie_p2p(attrs)
325 ev = dev[0].wait_event(["P2P-DEVICE-FOUND"], timeout=0.1)
327 raise Exception("Unexpected device found event")
329 def test_p2p_msg_invitation_req(dev, apdev):
330 """P2P protocol tests for invitation request processing"""
331 dst, src, hapd, channel = start_p2p(dev, apdev)
333 # Empty P2P Invitation Request (missing dialog token)
334 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=None)
338 # Various p2p_parse() failure cases due to invalid attributes
340 # Too short attribute header
342 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
343 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
344 msg['payload'] += ie_p2p(attrs)
347 # Minimal attribute underflow
349 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
350 attrs = struct.pack("<BH", P2P_ATTR_CAPABILITY, 1)
351 msg['payload'] += ie_p2p(attrs)
354 # Large attribute underflow
356 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
357 attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 0xffff, 1)
358 msg['payload'] += ie_p2p(attrs)
361 # Too short Capability attribute
363 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
364 attrs = struct.pack("<BHB", P2P_ATTR_CAPABILITY, 1, 0)
365 msg['payload'] += ie_p2p(attrs)
368 # Too short Device ID attribute
370 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
371 val = struct.unpack('5B', binascii.unhexlify("1122334455"))
372 t = (P2P_ATTR_DEVICE_ID, 5) + val
373 attrs = struct.pack('<BH5B', *t)
374 msg['payload'] += ie_p2p(attrs)
377 # Too short GO Intent attribute
379 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
380 attrs = struct.pack("<BH", P2P_ATTR_GROUP_OWNER_INTENT, 0)
381 msg['payload'] += ie_p2p(attrs)
384 # Too short Status attribute
386 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
387 attrs = struct.pack("<BH", P2P_ATTR_STATUS, 0)
388 msg['payload'] += ie_p2p(attrs)
391 # null Listen channel and too short Listen Channel attribute
393 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
394 attrs = struct.pack("<BH", P2P_ATTR_LISTEN_CHANNEL, 0)
395 attrs += struct.pack("<BHB", P2P_ATTR_LISTEN_CHANNEL, 1, 0)
396 msg['payload'] += ie_p2p(attrs)
399 # null Operating channel and too short Operating Channel attribute
401 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
402 attrs = struct.pack("<BH", P2P_ATTR_OPERATING_CHANNEL, 0)
403 attrs += struct.pack("<BHB", P2P_ATTR_OPERATING_CHANNEL, 1, 0)
404 msg['payload'] += ie_p2p(attrs)
407 # Too short Channel List attribute
409 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
410 attrs = struct.pack("<BHBB", P2P_ATTR_CHANNEL_LIST, 2, 1, 2)
411 msg['payload'] += ie_p2p(attrs)
414 # Too short Device Info attribute
416 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
417 attrs = struct.pack("<BHBB", P2P_ATTR_DEVICE_INFO, 2, 1, 2)
418 msg['payload'] += ie_p2p(attrs)
421 # Truncated Secondary Device Types in Device Info attribute
423 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
424 attrs = struct.pack("<BH6BH8BB", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1,
427 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x11, 0x22,
429 msg['payload'] += ie_p2p(attrs)
432 # Missing Device Name in Device Info attribute
434 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
435 attrs = struct.pack("<BH6BH8BB8B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8,
438 0, 0, 0, 0, 0, 0, 0, 0,
440 1, 2, 3, 4, 5, 6, 7, 8)
441 msg['payload'] += ie_p2p(attrs)
444 # Invalid Device Name header in Device Info attribute
446 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
447 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
450 0, 0, 0, 0, 0, 0, 0, 0,
452 1, 2, 3, 4, 5, 6, 7, 8,
454 msg['payload'] += ie_p2p(attrs)
457 # Invalid Device Name header length in Device Info attribute
459 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
460 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4,
463 0, 0, 0, 0, 0, 0, 0, 0,
465 1, 2, 3, 4, 5, 6, 7, 8,
466 0x10, 0x11, 0xff, 0xff)
467 msg['payload'] += ie_p2p(attrs)
470 # Invalid Device Name header length in Device Info attribute
472 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
474 attrs = struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
477 0, 0, 0, 0, 0, 0, 0, 0,
479 1, 2, 3, 4, 5, 6, 7, 8,
480 0x10, 0x11, 0, len(devname) + 1) + devname
481 msg['payload'] += ie_p2p(attrs)
484 # Device Name filtering and too long Device Name in Device Info attribute
486 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
487 attrs = struct.pack("<BH6BH8BB8B4B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + 4,
490 0, 0, 0, 0, 0, 0, 0, 0,
492 1, 2, 3, 4, 5, 6, 7, 8,
495 devname = '123456789012345678901234567890123'
496 attrs += struct.pack("<BH6BH8BB8B4B", P2P_ATTR_DEVICE_INFO, 6 + 2 + 8 + 1 + 8 + 4 + len(devname),
499 0, 0, 0, 0, 0, 0, 0, 0,
501 1, 2, 3, 4, 5, 6, 7, 8,
502 0x10, 0x11, 0, len(devname)) + devname
503 msg['payload'] += ie_p2p(attrs)
506 # Too short Configuration Timeout attribute
508 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
509 attrs = struct.pack("<BHB", P2P_ATTR_CONFIGURATION_TIMEOUT, 1, 1)
510 msg['payload'] += ie_p2p(attrs)
513 # Too short Intended P2P Interface Address attribute
515 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
516 attrs = struct.pack("<BHB", P2P_ATTR_INTENDED_INTERFACE_ADDR, 1, 1)
517 msg['payload'] += ie_p2p(attrs)
520 # Too short P2P Group BSSID attribute
522 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
523 attrs = struct.pack("<BHB", P2P_ATTR_GROUP_BSSID, 1, 1)
524 msg['payload'] += ie_p2p(attrs)
527 # Too short P2P Group ID attribute
529 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
530 attrs = struct.pack("<BHB", P2P_ATTR_GROUP_ID, 1, 1)
531 msg['payload'] += ie_p2p(attrs)
534 # Too long P2P Group ID attribute
536 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
537 attrs = struct.pack("<BH6B", P2P_ATTR_GROUP_ID, 6 + 33, 0, 0, 0, 0, 0, 0) + "123456789012345678901234567890123"
538 msg['payload'] += ie_p2p(attrs)
541 # Too short Invitation Flags attribute
543 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
544 attrs = struct.pack("<BH", P2P_ATTR_INVITATION_FLAGS, 0)
545 msg['payload'] += ie_p2p(attrs)
548 # Valid and too short Manageability attribute
550 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
551 attrs = p2p_attr_manageability()
552 attrs += struct.pack("<BH", P2P_ATTR_MANAGEABILITY, 0)
553 msg['payload'] += ie_p2p(attrs)
556 # Too short NoA attribute
558 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
559 attrs = struct.pack("<BHB", P2P_ATTR_NOTICE_OF_ABSENCE, 1, 1)
560 msg['payload'] += ie_p2p(attrs)
563 # Valid and too short Extended Listen Timing attributes
565 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
566 attrs = p2p_attr_ext_listen_timing(period=100, interval=50)
567 attrs += struct.pack("<BHBBB", P2P_ATTR_EXT_LISTEN_TIMING, 3, 0, 0, 0)
568 msg['payload'] += ie_p2p(attrs)
571 # Valid and too short Minor Reason Code attributes
573 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
574 attrs = p2p_attr_minor_reason_code(code=2)
575 attrs += struct.pack("<BH", P2P_ATTR_MINOR_REASON_CODE, 0)
576 msg['payload'] += ie_p2p(attrs)
579 # Unknown attribute and too short OOB GO Negotiation Channel attribute
581 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
582 attrs = struct.pack("<BHB", 99, 1, 1)
583 attrs += struct.pack("<BHB", P2P_ATTR_OOB_GO_NEG_CHANNEL, 1, 1)
584 msg['payload'] += ie_p2p(attrs)
587 # Too short Service Hash attribute
589 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
590 attrs = struct.pack("<BH5B", P2P_ATTR_SERVICE_HASH, 5, 1, 2, 3, 4, 5)
591 msg['payload'] += ie_p2p(attrs)
594 # Too short Connection Capability attribute
596 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
597 attrs = struct.pack("<BH", P2P_ATTR_CONNECTION_CAPABILITY, 0)
598 msg['payload'] += ie_p2p(attrs)
601 # Too short Advertisement ID attribute
603 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
604 attrs = struct.pack("<BH9B", P2P_ATTR_ADVERTISEMENT_ID, 9, 1, 2, 3, 4, 5,
606 msg['payload'] += ie_p2p(attrs)
609 # Truncated and too short Service Instance attributes
611 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
612 attrs = struct.pack("<BH8B", P2P_ATTR_ADVERTISED_SERVICE, 8, 1, 2, 3, 4, 5,
614 attrs += struct.pack("<BH7B", P2P_ATTR_ADVERTISED_SERVICE, 7, 1, 2, 3, 4, 5,
616 msg['payload'] += ie_p2p(attrs)
619 # Too short Session ID attribute
621 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
622 attrs = struct.pack("<BH4B", P2P_ATTR_SESSION_ID, 4, 1, 2, 3, 4)
623 msg['payload'] += ie_p2p(attrs)
626 # Too short Feature Capability attribute
628 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
629 attrs = struct.pack("<BH", P2P_ATTR_FEATURE_CAPABILITY, 0)
630 msg['payload'] += ie_p2p(attrs)
633 # Too short Persistent Group attribute
635 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
636 attrs = struct.pack("<BH5B", P2P_ATTR_PERSISTENT_GROUP, 5, 1, 2, 3, 4, 5)
637 msg['payload'] += ie_p2p(attrs)
640 # Too long Persistent Group attribute
642 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
643 attrs = struct.pack("<BH9L3B", P2P_ATTR_PERSISTENT_GROUP, 6 + 32 + 1,
644 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3)
645 msg['payload'] += ie_p2p(attrs)
648 if hapd.mgmt_rx(timeout=0.5) is not None:
649 raise Exception("Unexpected management frame received")
651 dev[0].dump_monitor()
653 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
654 attrs = p2p_attr_config_timeout()
655 attrs += p2p_attr_invitation_flags()
656 attrs += p2p_attr_operating_channel()
657 attrs += p2p_attr_group_bssid(src)
658 attrs += p2p_attr_channel_list()
659 attrs += p2p_attr_group_id(src, "DIRECT-foo")
660 attrs += p2p_attr_device_info(src, config_methods=0x0108)
661 msg['payload'] += ie_p2p(attrs)
663 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
665 raise Exception("Timeout on device found event")
666 ev = dev[0].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=5)
668 raise Exception("Timeout on invitation event " + str(dialog_token))
669 if hapd.mgmt_rx(timeout=1) is None:
670 raise Exception("No invitation response " + str(dialog_token))
673 dev[0].dump_monitor()
675 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
676 attrs = p2p_attr_config_timeout()
677 attrs += p2p_attr_invitation_flags()
678 attrs += p2p_attr_operating_channel()
679 attrs += p2p_attr_group_bssid(src)
680 attrs += p2p_attr_channel_list()
681 attrs += p2p_attr_group_id(src, "DIRECT-foo")
682 attrs += p2p_attr_device_info(src, config_methods=0x0108)
683 msg['payload'] += ie_p2p(attrs)
685 ev = dev[0].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=5)
687 raise Exception("Timeout on invitation event " + str(dialog_token))
688 if hapd.mgmt_rx(timeout=1) is None:
689 raise Exception("No invitation response " + str(dialog_token))
692 dev[0].dump_monitor()
694 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
695 #attrs = p2p_attr_config_timeout()
696 attrs = p2p_attr_invitation_flags()
697 attrs += p2p_attr_operating_channel()
698 attrs += p2p_attr_group_bssid(src)
699 attrs += p2p_attr_channel_list()
700 attrs += p2p_attr_group_id(src, "DIRECT-foo")
701 attrs += p2p_attr_device_info(src, config_methods=0x0108)
702 msg['payload'] += ie_p2p(attrs)
704 if hapd.mgmt_rx(timeout=1) is None:
705 raise Exception("No invitation response " + str(dialog_token))
708 dev[0].dump_monitor()
710 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
711 attrs = p2p_attr_config_timeout()
712 #attrs = p2p_attr_invitation_flags()
713 attrs += p2p_attr_operating_channel()
714 attrs += p2p_attr_group_bssid(src)
715 attrs += p2p_attr_channel_list()
716 attrs += p2p_attr_group_id(src, "DIRECT-foo")
717 attrs += p2p_attr_device_info(src, config_methods=0x0108)
718 msg['payload'] += ie_p2p(attrs)
720 if hapd.mgmt_rx(timeout=1) is None:
721 raise Exception("No invitation response " + str(dialog_token))
724 dev[0].dump_monitor()
726 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
727 attrs = p2p_attr_config_timeout()
728 attrs = p2p_attr_invitation_flags()
729 #attrs += p2p_attr_operating_channel()
730 attrs += p2p_attr_group_bssid(src)
731 attrs += p2p_attr_channel_list()
732 attrs += p2p_attr_group_id(src, "DIRECT-foo")
733 attrs += p2p_attr_device_info(src, config_methods=0x0108)
734 msg['payload'] += ie_p2p(attrs)
736 if hapd.mgmt_rx(timeout=1) is None:
737 raise Exception("No invitation response " + str(dialog_token))
740 dev[0].dump_monitor()
742 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
743 attrs = p2p_attr_config_timeout()
744 attrs = p2p_attr_invitation_flags()
745 attrs += p2p_attr_operating_channel()
746 #attrs += p2p_attr_group_bssid(src)
747 attrs += p2p_attr_channel_list()
748 attrs += p2p_attr_group_id(src, "DIRECT-foo")
749 attrs += p2p_attr_device_info(src, config_methods=0x0108)
750 msg['payload'] += ie_p2p(attrs)
752 if hapd.mgmt_rx(timeout=1) is None:
753 raise Exception("No invitation response " + str(dialog_token))
756 dev[0].dump_monitor()
758 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
759 attrs = p2p_attr_config_timeout()
760 attrs = p2p_attr_invitation_flags()
761 attrs += p2p_attr_operating_channel()
762 attrs += p2p_attr_group_bssid(src)
763 #attrs += p2p_attr_channel_list()
764 attrs += p2p_attr_group_id(src, "DIRECT-foo")
765 attrs += p2p_attr_device_info(src, config_methods=0x0108)
766 msg['payload'] += ie_p2p(attrs)
768 if hapd.mgmt_rx(timeout=1) is None:
769 raise Exception("No invitation response " + str(dialog_token))
772 dev[0].dump_monitor()
774 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
775 attrs = p2p_attr_config_timeout()
776 attrs = p2p_attr_invitation_flags()
777 attrs += p2p_attr_operating_channel()
778 attrs += p2p_attr_group_bssid(src)
779 attrs += p2p_attr_channel_list()
780 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
781 attrs += p2p_attr_device_info(src, config_methods=0x0108)
782 msg['payload'] += ie_p2p(attrs)
784 if hapd.mgmt_rx(timeout=1) is None:
785 raise Exception("No invitation response " + str(dialog_token))
788 dev[0].dump_monitor()
790 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
791 attrs = p2p_attr_config_timeout()
792 attrs = p2p_attr_invitation_flags()
793 attrs += p2p_attr_operating_channel()
794 attrs += p2p_attr_group_bssid(src)
795 attrs += p2p_attr_channel_list()
796 attrs += p2p_attr_group_id(src, "DIRECT-foo")
797 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
798 msg['payload'] += ie_p2p(attrs)
800 if hapd.mgmt_rx(timeout=1) is None:
801 raise Exception("No invitation response " + str(dialog_token))
804 dev[0].dump_monitor()
806 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
808 if hapd.mgmt_rx(timeout=1) is None:
809 raise Exception("No invitation response " + str(dialog_token))
811 # Unusable peer operating channel preference
813 dev[0].dump_monitor()
815 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
816 attrs = p2p_attr_config_timeout()
817 attrs = p2p_attr_invitation_flags()
818 attrs += p2p_attr_operating_channel(chan=15)
819 attrs += p2p_attr_group_bssid(src)
820 attrs += p2p_attr_channel_list()
821 attrs += p2p_attr_group_id(src, "DIRECT-foo")
822 attrs += p2p_attr_device_info(src, config_methods=0x0108)
823 msg['payload'] += ie_p2p(attrs)
825 if hapd.mgmt_rx(timeout=1) is None:
826 raise Exception("No invitation response " + str(dialog_token))
828 def test_p2p_msg_invitation_req_to_go(dev, apdev):
829 """P2P protocol tests for invitation request processing on GO device"""
830 res = form(dev[0], dev[1])
831 dev[0].dump_monitor()
832 dev[1].dump_monitor()
833 addr0 = dev[0].p2p_dev_addr()
834 addr1 = dev[1].p2p_dev_addr()
835 peer = dev[1].get_peer(addr0)
836 listen_freq = peer['listen_freq']
838 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
839 raise Exception("Failed to enable external management frame handling")
841 networks = dev[0].list_networks()
842 if len(networks) != 1:
843 raise Exception("Unexpected number of networks")
844 if "[P2P-PERSISTENT]" not in networks[0]['flags']:
845 raise Exception("Not the persistent group data")
846 dev[0].p2p_start_go(persistent=networks[0]['id'], freq=listen_freq)
850 # Unusable peer operating channel preference
852 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
853 dialog_token=dialog_token)
854 attrs = p2p_attr_config_timeout()
855 attrs = p2p_attr_invitation_flags(bitmap=1)
856 attrs += p2p_attr_operating_channel(chan=15)
857 attrs += p2p_attr_channel_list()
858 attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
859 attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
860 msg['payload'] += ie_p2p(attrs)
862 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
864 rx_msg = dev[1].mgmt_rx()
866 raise Exception("MGMT-RX timeout")
867 p2p = parse_p2p_public_action(rx_msg['payload'])
869 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
870 if p2p['subtype'] != P2P_INVITATION_RESP:
871 raise Exception("Unexpected subtype %d" % p2p['subtype'])
872 if p2p['p2p_status'] != 0:
873 raise Exception("Unexpected status %d" % p2p['p2p_status'])
875 # Forced channel re-selection due to channel list
877 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_REQ,
878 dialog_token=dialog_token)
879 attrs = p2p_attr_config_timeout()
880 attrs = p2p_attr_invitation_flags(bitmap=1)
881 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
884 attrs += p2p_attr_group_id(res['go_dev_addr'], res['ssid'])
885 attrs += p2p_attr_device_info(addr1, config_methods=0x0108)
886 msg['payload'] += ie_p2p(attrs)
888 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
890 rx_msg = dev[1].mgmt_rx()
892 raise Exception("MGMT-RX timeout")
893 p2p = parse_p2p_public_action(rx_msg['payload'])
895 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
896 if p2p['subtype'] != P2P_INVITATION_RESP:
897 raise Exception("Unexpected subtype %d" % p2p['subtype'])
898 if p2p['p2p_status'] != 7 and dev[1].get_mcc() <= 1:
899 raise Exception("Unexpected status %d" % p2p['p2p_status'])
901 def test_p2p_msg_invitation_req_unknown(dev, apdev):
902 """P2P protocol tests for invitation request from unknown peer"""
903 dst, src, hapd, channel = start_p2p(dev, apdev)
907 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
908 attrs = p2p_attr_config_timeout()
909 attrs += p2p_attr_invitation_flags()
910 attrs += p2p_attr_operating_channel()
911 attrs += p2p_attr_group_bssid(src)
912 attrs += p2p_attr_channel_list()
913 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
914 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
915 msg['payload'] += ie_p2p(attrs)
917 ev = dev[0].wait_global_event(["P2P-INVITATION-RECEIVED"], timeout=5)
919 raise Exception("Timeout on invitation event " + str(dialog_token))
920 if hapd.mgmt_rx(timeout=1) is None:
921 raise Exception("No invitation response " + str(dialog_token))
923 def test_p2p_msg_invitation_no_common_channels(dev, apdev):
924 """P2P protocol tests for invitation request without common channels"""
925 dst, src, hapd, channel = start_p2p(dev, apdev)
929 msg = p2p_hdr(dst, src, type=P2P_INVITATION_REQ, dialog_token=dialog_token)
930 attrs = p2p_attr_config_timeout()
931 attrs += p2p_attr_invitation_flags()
932 attrs += p2p_attr_operating_channel()
933 attrs += p2p_attr_group_bssid(src)
934 attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
937 attrs += p2p_attr_group_id(src, "DIRECT-foo")
938 attrs += p2p_attr_device_info(src, config_methods=0x0108)
939 msg['payload'] += ie_p2p(attrs)
941 if hapd.mgmt_rx(timeout=1) is None:
942 raise Exception("No invitation response " + str(dialog_token))
943 ev = dev[0].wait_event(["P2P-INVITATION-RECEIVED"], timeout=0.1)
945 raise Exception("Unexpected invitation event")
947 def test_p2p_msg_invitation_resp(dev, apdev):
948 """P2P protocol tests for invitation response processing"""
950 dev[0].dump_monitor()
951 dev[1].dump_monitor()
953 dst, src, hapd, channel = start_p2p(dev, apdev)
955 addr0 = dev[0].p2p_dev_addr()
956 addr1 = dev[1].p2p_dev_addr()
957 peer = dev[1].get_peer(addr0)
959 # P2P Invitation Response from unknown peer
960 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=1)
963 # P2P Invitation Response from peer that is not in invitation
964 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=2)
965 attrs = p2p_attr_status()
966 msg['payload'] += ie_p2p(attrs)
967 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, peer['listen_freq'], binascii.hexlify(msg['payload'])))
970 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
971 raise Exception("Failed to enable external management frame handling")
973 invite(dev[0], dev[1])
974 rx_msg = dev[1].mgmt_rx()
976 raise Exception("MGMT-RX timeout")
977 p2p = parse_p2p_public_action(rx_msg['payload'])
979 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
980 if p2p['subtype'] != P2P_INVITATION_REQ:
981 raise Exception("Unexpected subtype %d" % p2p['subtype'])
983 # Invalid attribute to cause p2p_parse() failure
984 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
985 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
986 msg['payload'] += ie_p2p(attrs)
987 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
989 invite(dev[0], dev[1])
990 rx_msg = dev[1].mgmt_rx()
992 raise Exception("MGMT-RX timeout")
993 p2p = parse_p2p_public_action(rx_msg['payload'])
995 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
996 if p2p['subtype'] != P2P_INVITATION_REQ:
997 raise Exception("Unexpected subtype %d" % p2p['subtype'])
999 # missing mandatory Status attribute
1000 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1001 attrs = p2p_attr_channel_list()
1002 msg['payload'] += ie_p2p(attrs)
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'])))
1005 invite(dev[0], dev[1])
1006 rx_msg = dev[1].mgmt_rx()
1008 raise Exception("MGMT-RX timeout")
1009 p2p = parse_p2p_public_action(rx_msg['payload'])
1011 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1012 if p2p['subtype'] != P2P_INVITATION_REQ:
1013 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1015 # no channel match (no common channel found at all)
1016 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1017 attrs = p2p_attr_status()
1018 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
1021 msg['payload'] += ie_p2p(attrs)
1022 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1024 invite(dev[0], dev[1])
1025 rx_msg = dev[1].mgmt_rx()
1027 raise Exception("MGMT-RX timeout")
1028 p2p = parse_p2p_public_action(rx_msg['payload'])
1030 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1031 if p2p['subtype'] != P2P_INVITATION_REQ:
1032 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1034 # no channel match (no acceptable P2P channel)
1035 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1036 attrs = p2p_attr_status()
1037 attrs += struct.pack("<BH3BBBB", P2P_ATTR_CHANNEL_LIST, 6,
1040 msg['payload'] += ie_p2p(attrs)
1041 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1043 invite(dev[0], dev[1])
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 # missing mandatory Channel List attribute (ignored as a workaround)
1054 msg = p2p_hdr(dst, src, type=P2P_INVITATION_RESP, dialog_token=p2p['dialog_token'])
1055 attrs = p2p_attr_status()
1056 msg['payload'] += ie_p2p(attrs)
1057 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1059 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1061 raise Exception("Group was not started")
1063 def test_p2p_msg_invitation_resend(dev, apdev):
1064 """P2P protocol tests for invitation resending on no-common-channels"""
1065 form(dev[0], dev[1])
1066 dev[0].dump_monitor()
1067 dev[1].dump_monitor()
1068 addr0 = dev[0].p2p_dev_addr()
1069 addr1 = dev[1].p2p_dev_addr()
1071 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1072 raise Exception("Failed to enable external management frame handling")
1074 logger.info("Forced channel in invitation")
1075 invite(dev[0], dev[1], extra="freq=2422")
1076 rx_msg = dev[1].mgmt_rx()
1078 raise Exception("MGMT-RX timeout")
1079 p2p = parse_p2p_public_action(rx_msg['payload'])
1081 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1082 if p2p['subtype'] != P2P_INVITATION_REQ:
1083 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1084 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1085 dialog_token=p2p['dialog_token'])
1086 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1087 msg['payload'] += ie_p2p(attrs)
1088 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1089 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
1091 raise Exception("Timeout on invitation result");
1092 if "status=7" not in ev:
1093 raise Exception("Unexpected invitation result: " + ev)
1095 logger.info("Any channel allowed, only preference provided in invitation");
1096 invite(dev[0], dev[1], extra="pref=2422")
1097 rx_msg = dev[1].mgmt_rx()
1099 raise Exception("MGMT-RX timeout")
1100 p2p = parse_p2p_public_action(rx_msg['payload'])
1102 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1103 if p2p['subtype'] != P2P_INVITATION_REQ:
1104 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1105 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1106 dialog_token=p2p['dialog_token'])
1107 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1108 msg['payload'] += ie_p2p(attrs)
1109 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
1110 raise Exception("Failed to disable external management frame handling")
1111 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1112 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=15)
1114 raise Exception("Timeout on invitation result");
1115 if "status=0" not in ev:
1116 raise Exception("Unexpected invitation result: " + ev)
1118 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1120 raise Exception("Group was not started on dev0")
1121 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15);
1123 raise Exception("Group was not started on dev1")
1125 def test_p2p_msg_invitation_resend_duplicate(dev, apdev):
1126 """P2P protocol tests for invitation resending on no-common-channels and duplicated response"""
1127 form(dev[0], dev[1])
1128 dev[0].dump_monitor()
1129 dev[1].dump_monitor()
1130 addr0 = dev[0].p2p_dev_addr()
1131 addr1 = dev[1].p2p_dev_addr()
1133 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1134 raise Exception("Failed to enable external management frame handling")
1136 logger.info("Any channel allowed, only preference provided in invitation");
1137 invite(dev[0], dev[1], extra="pref=2422")
1138 rx_msg = dev[1].mgmt_rx()
1140 raise Exception("MGMT-RX timeout")
1141 p2p = parse_p2p_public_action(rx_msg['payload'])
1143 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1144 if p2p['subtype'] != P2P_INVITATION_REQ:
1145 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1146 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1147 dialog_token=p2p['dialog_token'])
1148 attrs = p2p_attr_status(status=P2P_SC_FAIL_NO_COMMON_CHANNELS)
1149 msg['payload'] += ie_p2p(attrs)
1150 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1152 rx_msg = dev[1].mgmt_rx()
1154 raise Exception("MGMT-RX timeout")
1155 p2p = parse_p2p_public_action(rx_msg['payload'])
1157 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1158 if p2p['subtype'] != P2P_INVITATION_REQ:
1159 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1161 logger.info("Retransmit duplicate of previous response")
1162 mgmt_tx(dev[1], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr0, addr0, rx_msg['freq'], binascii.hexlify(msg['payload'])))
1164 logger.info("Transmit real response")
1165 msg = p2p_hdr(addr0, addr1, type=P2P_INVITATION_RESP,
1166 dialog_token=p2p['dialog_token'])
1167 attrs = p2p_attr_status(status=P2P_SC_SUCCESS)
1168 attrs += p2p_attr_channel_list()
1169 msg['payload'] += ie_p2p(attrs)
1170 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']))):
1171 raise Exception("Failed to transmit real response")
1172 dev[1].request("SET ext_mgmt_frame_handling 0")
1174 ev = dev[0].wait_global_event(["P2P-INVITATION-RESULT"], timeout=10)
1176 raise Exception("Timeout on invitation result");
1177 if "status=0" not in ev:
1178 raise Exception("Unexpected invitation result: " + ev)
1179 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1181 raise Exception("Group formation timed out")
1182 dev[0].group_form_result(ev)
1183 dev[0].remove_group()
1185 def test_p2p_msg_pd_req(dev, apdev):
1186 """P2P protocol tests for provision discovery request processing"""
1187 dst, src, hapd, channel = start_p2p(dev, apdev)
1190 # Too short attribute header
1192 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1193 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1194 msg['payload'] += ie_p2p(attrs)
1197 if hapd.mgmt_rx(timeout=0.5) is not None:
1198 raise Exception("Unexpected management frame received")
1202 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1204 msg['payload'] += ie_p2p(attrs)
1206 if hapd.mgmt_rx(timeout=1) is None:
1207 raise Exception("No PD response " + str(dialog_token))
1212 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1213 attrs = wsc_attr_config_methods(methods=0x1008)
1214 msg['payload'] += ie_wsc(attrs)
1215 attrs = p2p_attr_capability()
1216 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1217 msg['payload'] += ie_p2p(attrs)
1219 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
1221 raise Exception("Timeout on device found event")
1222 ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
1224 raise Exception("Timeout on PD event")
1225 if hapd.mgmt_rx(timeout=1) is None:
1226 raise Exception("No PD response " + str(dialog_token))
1231 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1232 attrs = wsc_attr_config_methods(methods=0x1008)
1233 msg['payload'] += ie_wsc(attrs)
1234 attrs = p2p_attr_capability()
1235 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1236 attrs += p2p_attr_group_id("02:02:02:02:02:02", "DIRECT-foo")
1237 msg['payload'] += ie_p2p(attrs)
1239 if hapd.mgmt_rx(timeout=1) is None:
1240 raise Exception("No PD response " + str(dialog_token))
1241 ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=1)
1243 raise Exception("Unexpected PD event")
1245 # Listen channel is not yet known
1246 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
1247 raise Exception("Unexpected P2P_PROV_DISC success")
1250 if "FAIL" not in dev[0].global_request("P2P_PROV_DISC 02:03:04:05:06:07 display"):
1251 raise Exception("Unexpected P2P_PROV_DISC success (2)")
1253 def test_p2p_msg_pd(dev, apdev):
1254 """P2P protocol tests for provision discovery request processing (known)"""
1255 dst, src, hapd, channel = start_p2p(dev, apdev)
1258 p2p_probe(hapd, src, chan=channel)
1263 msg = p2p_hdr(dst, src, type=P2P_PROV_DISC_REQ, dialog_token=dialog_token)
1264 attrs = wsc_attr_config_methods(methods=0x1008)
1265 msg['payload'] += ie_wsc(attrs)
1266 attrs = p2p_attr_capability()
1267 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1268 msg['payload'] += ie_p2p(attrs)
1270 ev = dev[0].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5)
1272 raise Exception("Timeout on device found event")
1273 ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
1275 raise Exception("Timeout on PD event")
1276 if hapd.mgmt_rx(timeout=1) is None:
1277 raise Exception("No PD response " + str(dialog_token))
1279 if "FAIL" in dev[0].global_request("P2P_PROV_DISC " + src + " display"):
1280 raise Exception("Unexpected P2P_PROV_DISC failure")
1281 frame = hapd.mgmt_rx(timeout=1)
1283 raise Exception("No PD request " + str(dialog_token))
1284 p2p = parse_p2p_public_action(frame['payload'])
1286 raise Exception("Failed to parse PD request")
1288 # invalid dialog token
1289 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1290 dialog_token=p2p['dialog_token'] + 1)
1292 ev = dev[0].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
1294 raise Exception("Unexpected PD result event")
1296 # valid dialog token
1297 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1298 dialog_token=p2p['dialog_token'])
1300 ev = dev[0].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=5)
1302 raise Exception("Timeout on PD result event")
1304 # valid dialog token
1305 msg = p2p_hdr_resp(dst, src, type=P2P_PROV_DISC_RESP,
1306 dialog_token=p2p['dialog_token'])
1308 ev = dev[0].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=0.1)
1310 raise Exception("Unexpected PD result event")
1312 def check_p2p_response(hapd, dialog_token, status):
1313 resp = hapd.mgmt_rx(timeout=2)
1315 raise Exception("No GO Neg Response " + str(dialog_token))
1316 p2p = parse_p2p_public_action(resp['payload'])
1318 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1319 if dialog_token != p2p['dialog_token']:
1320 raise Exception("Unexpected dialog token in response")
1321 if p2p['p2p_status'] != status:
1322 raise Exception("Unexpected status code %s in response (expected %d)" % (p2p['p2p_status'], status))
1324 def test_p2p_msg_go_neg_both_start(dev, apdev):
1325 """P2P protocol test for simultaneous GO Neg initiation"""
1326 addr0 = dev[0].p2p_dev_addr()
1327 addr1 = dev[1].p2p_dev_addr()
1329 dev[1].discover_peer(addr0)
1331 dev[0].discover_peer(addr1)
1333 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
1334 raise Exception("Failed to enable external management frame handling")
1335 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 1"):
1336 raise Exception("Failed to enable external management frame handling")
1337 dev[0].request("P2P_CONNECT {} pbc".format(addr1))
1338 dev[1].request("P2P_CONNECT {} pbc".format(addr0))
1339 msg = dev[0].mgmt_rx()
1341 raise Exception("MGMT-RX timeout")
1342 msg = dev[1].mgmt_rx()
1344 raise Exception("MGMT-RX timeout(2)")
1345 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 0"):
1346 raise Exception("Failed to disable external management frame handling")
1347 ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=2)
1349 raise Exception("Unexpected GO Neg success")
1350 if "FAIL" in dev[1].request("SET ext_mgmt_frame_handling 0"):
1351 raise Exception("Failed to disable external management frame handling")
1352 ev = dev[0].wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
1354 raise Exception("GO Neg did not succeed")
1355 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
1357 raise Exception("Group formation not succeed")
1358 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=5);
1360 raise Exception("Group formation not succeed")
1362 def test_p2p_msg_go_neg_req(dev, apdev):
1363 """P2P protocol tests for invitation request from unknown peer"""
1364 dst, src, hapd, channel = start_p2p(dev, apdev)
1369 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1370 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1371 msg['payload'] += ie_p2p(attrs)
1373 frame = hapd.mgmt_rx(timeout=0.1)
1374 if frame is not None:
1376 raise Exception("Unexpected GO Neg Response")
1380 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1381 attrs = p2p_attr_capability()
1382 attrs += p2p_attr_go_intent()
1383 attrs += p2p_attr_config_timeout()
1384 #attrs += p2p_attr_listen_channel()
1385 attrs += p2p_attr_ext_listen_timing()
1386 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1387 attrs += p2p_attr_channel_list()
1388 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1389 attrs += p2p_attr_operating_channel()
1390 msg['payload'] += ie_p2p(attrs)
1392 if hapd.mgmt_rx(timeout=2) is None:
1393 raise Exception("No GO Neg Response " + str(dialog_token))
1397 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1398 attrs = p2p_attr_capability()
1399 attrs += p2p_attr_go_intent()
1400 attrs += p2p_attr_config_timeout()
1401 attrs += p2p_attr_listen_channel()
1402 attrs += p2p_attr_ext_listen_timing()
1403 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1404 attrs += p2p_attr_channel_list()
1405 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1406 #attrs += p2p_attr_operating_channel()
1407 msg['payload'] += ie_p2p(attrs)
1409 if hapd.mgmt_rx(timeout=2) is None:
1410 raise Exception("No GO Neg Response " + str(dialog_token))
1414 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1415 attrs = p2p_attr_capability()
1416 attrs += p2p_attr_go_intent()
1417 attrs += p2p_attr_config_timeout()
1418 attrs += p2p_attr_listen_channel()
1419 attrs += p2p_attr_ext_listen_timing()
1420 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1421 #attrs += p2p_attr_channel_list()
1422 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1423 attrs += p2p_attr_operating_channel()
1424 msg['payload'] += ie_p2p(attrs)
1426 if hapd.mgmt_rx(timeout=2) is None:
1427 raise Exception("No GO Neg Response " + str(dialog_token))
1431 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1432 attrs = p2p_attr_capability()
1433 attrs += p2p_attr_go_intent()
1434 attrs += p2p_attr_config_timeout()
1435 attrs += p2p_attr_listen_channel()
1436 attrs += p2p_attr_ext_listen_timing()
1437 #attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1438 attrs += p2p_attr_channel_list()
1439 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1440 attrs += p2p_attr_operating_channel()
1441 msg['payload'] += ie_p2p(attrs)
1443 if hapd.mgmt_rx(timeout=2) is None:
1444 raise Exception("No GO Neg Response " + str(dialog_token))
1448 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1449 attrs = p2p_attr_capability()
1450 attrs += p2p_attr_go_intent()
1451 attrs += p2p_attr_config_timeout()
1452 attrs += p2p_attr_listen_channel()
1453 attrs += p2p_attr_ext_listen_timing()
1454 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1455 attrs += p2p_attr_channel_list()
1456 #attrs += p2p_attr_device_info(src, config_methods=0x0108)
1457 attrs += p2p_attr_operating_channel()
1458 msg['payload'] += ie_p2p(attrs)
1460 if hapd.mgmt_rx(timeout=2) is None:
1461 raise Exception("No GO Neg Response " + str(dialog_token))
1464 # SA != P2P Device address
1466 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1467 attrs = p2p_attr_capability()
1468 attrs += p2p_attr_go_intent()
1469 attrs += p2p_attr_config_timeout()
1470 attrs += p2p_attr_listen_channel()
1471 attrs += p2p_attr_ext_listen_timing()
1472 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1473 attrs += p2p_attr_channel_list()
1474 attrs += p2p_attr_device_info("02:02:02:02:02:02", config_methods=0x0108)
1475 attrs += p2p_attr_operating_channel()
1476 msg['payload'] += ie_p2p(attrs)
1478 if hapd.mgmt_rx(timeout=2) is None:
1479 raise Exception("No GO Neg Response " + str(dialog_token))
1482 # unexpected Status attribute
1484 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1485 attrs = p2p_attr_capability()
1486 attrs += p2p_attr_go_intent()
1487 attrs += p2p_attr_config_timeout()
1488 attrs += p2p_attr_listen_channel()
1489 attrs += p2p_attr_ext_listen_timing()
1490 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1491 attrs += p2p_attr_channel_list()
1492 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1493 attrs += p2p_attr_operating_channel()
1494 attrs += p2p_attr_status(status=P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
1495 msg['payload'] += ie_p2p(attrs)
1497 if hapd.mgmt_rx(timeout=2) is None:
1498 raise Exception("No GO Neg Response(1) " + str(dialog_token))
1501 # valid (with workarounds) GO Neg Req
1503 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1504 #attrs = p2p_attr_capability()
1505 #attrs += p2p_attr_go_intent()
1506 #attrs += p2p_attr_config_timeout()
1507 attrs = p2p_attr_listen_channel()
1508 attrs += p2p_attr_ext_listen_timing()
1509 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1510 attrs += p2p_attr_channel_list()
1511 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1512 attrs += p2p_attr_operating_channel()
1513 msg['payload'] += ie_p2p(attrs)
1515 check_p2p_response(hapd, dialog_token,
1516 P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
1517 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=2)
1519 raise Exception("Timeout on GO Neg event " + str(dialog_token))
1521 dev[0].request("P2P_CONNECT " + src + " 12345670 display auth")
1523 # ready - missing attributes (with workarounds) GO Neg Req
1526 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1527 #attrs = p2p_attr_capability()
1528 #attrs += p2p_attr_go_intent()
1529 #attrs += p2p_attr_config_timeout()
1530 attrs = p2p_attr_listen_channel()
1531 attrs += p2p_attr_ext_listen_timing()
1532 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1533 attrs += p2p_attr_channel_list()
1534 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1535 attrs += p2p_attr_operating_channel()
1536 msg['payload'] += ie_p2p(attrs)
1538 if hapd.mgmt_rx(timeout=2) is None:
1539 raise Exception("No GO Neg Response " + str(dialog_token))
1541 # ready - invalid GO Intent GO Neg Req
1544 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1545 #attrs = p2p_attr_capability()
1546 attrs = p2p_attr_go_intent(go_intent=16)
1547 #attrs += p2p_attr_config_timeout()
1548 attrs += p2p_attr_listen_channel()
1549 attrs += p2p_attr_ext_listen_timing()
1550 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1551 attrs += p2p_attr_channel_list()
1552 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1553 attrs += p2p_attr_operating_channel()
1554 msg['payload'] += ie_p2p(attrs)
1556 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INVALID_PARAMS)
1558 # ready - invalid Channel List
1561 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1562 attrs = p2p_attr_capability()
1563 attrs += p2p_attr_go_intent()
1564 attrs += p2p_attr_config_timeout()
1565 attrs += p2p_attr_listen_channel()
1566 attrs += p2p_attr_ext_listen_timing()
1567 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1568 attrs += struct.pack("<BH3BBB11B", P2P_ATTR_CHANNEL_LIST, 16,
1570 81, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)
1571 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1572 attrs += p2p_attr_operating_channel()
1573 msg['payload'] += ie_p2p(attrs)
1575 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_NO_COMMON_CHANNELS)
1577 # ready - invalid GO Neg Req (unsupported Device Password ID)
1580 msg = p2p_hdr(dst, src, type=P2P_GO_NEG_REQ, dialog_token=dialog_token)
1581 attrs = p2p_attr_capability()
1582 attrs += p2p_attr_go_intent()
1583 attrs += p2p_attr_config_timeout()
1584 attrs += p2p_attr_listen_channel()
1585 attrs += p2p_attr_ext_listen_timing()
1586 attrs += p2p_attr_intended_interface_addr("02:02:02:02:02:02")
1587 # very long channel list
1588 attrs += struct.pack("<BH3BBB11B30B", P2P_ATTR_CHANNEL_LIST, 46,
1590 81, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1591 1, 1, 1, 2, 1, 2, 3, 1, 3, 4, 1, 4, 5, 1, 5,
1592 6, 1, 6, 7, 1, 7, 8, 1, 8, 9, 1, 9, 10, 1, 10)
1593 attrs += p2p_attr_device_info(src, config_methods=0x0108)
1594 attrs += p2p_attr_operating_channel()
1595 msg['payload'] += ie_p2p(attrs)
1597 check_p2p_response(hapd, dialog_token, P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD)
1599 def mgmt_tx(dev, msg):
1600 for i in range(0, 20):
1601 if "FAIL" in dev.request(msg):
1602 raise Exception("Failed to send Action frame")
1603 ev = dev.wait_event(["MGMT-TX-STATUS"], timeout=10)
1605 raise Exception("Timeout on MGMT-TX-STATUS")
1606 if "result=SUCCESS" in ev:
1609 if "result=SUCCESS" not in ev:
1610 raise Exception("Peer did not ack Action frame")
1612 def rx_go_neg_req(dev):
1615 raise Exception("MGMT-RX timeout")
1616 p2p = parse_p2p_public_action(msg['payload'])
1618 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1619 if p2p['subtype'] != P2P_GO_NEG_REQ:
1620 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1621 p2p['freq'] = msg['freq']
1624 def rx_go_neg_conf(dev, status=None, dialog_token=None):
1627 raise Exception("MGMT-RX timeout")
1628 p2p = parse_p2p_public_action(msg['payload'])
1630 raise Exception("Not a P2P Public Action frame " + str(dialog_token))
1631 if p2p['subtype'] != P2P_GO_NEG_CONF:
1632 raise Exception("Unexpected subtype %d" % p2p['subtype'])
1633 if dialog_token is not None and dialog_token != p2p['dialog_token']:
1634 raise Exception("Unexpected dialog token")
1635 if status is not None and p2p['p2p_status'] != status:
1636 raise Exception("Unexpected status %d" % p2p['p2p_status'])
1638 def check_p2p_go_neg_fail_event(dev, status):
1639 ev = dev.wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
1641 raise Exception("GO Negotiation failure not reported")
1642 if "status=%d" % status not in ev:
1643 raise Exception("Unexpected failure reason: " + ev)
1645 def test_p2p_msg_go_neg_req_reject(dev, apdev):
1646 """P2P protocol tests for user reject incorrectly in GO Neg Req"""
1647 addr0 = dev[0].p2p_dev_addr()
1648 addr1 = dev[1].p2p_dev_addr()
1650 dev[1].discover_peer(addr0)
1651 dev[1].group_request("P2P_CONNECT " + addr0 + " pbc")
1652 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
1654 raise Exception("Timeout on GO Neg Req")
1656 peer = dev[0].get_peer(addr1)
1657 dev[0].p2p_stop_find()
1659 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_REQ, dialog_token=123)
1660 attrs = p2p_attr_capability()
1661 attrs += p2p_attr_status(status=P2P_SC_FAIL_REJECTED_BY_USER)
1662 attrs += p2p_attr_go_intent()
1663 attrs += p2p_attr_config_timeout()
1664 attrs += p2p_attr_listen_channel()
1665 attrs += p2p_attr_ext_listen_timing()
1666 attrs += p2p_attr_intended_interface_addr(addr0)
1667 attrs += p2p_attr_channel_list()
1668 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1669 attrs += p2p_attr_operating_channel()
1670 msg['payload'] += ie_p2p(attrs)
1672 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1674 ev = dev[1].wait_global_event(["P2P-GO-NEG-FAILURE"], timeout=5)
1676 raise Exception("GO Negotiation failure not reported")
1677 if "status=%d" % P2P_SC_FAIL_REJECTED_BY_USER not in ev:
1678 raise Exception("Unexpected failure reason: " + ev)
1680 def test_p2p_msg_unexpected_go_neg_resp(dev, apdev):
1681 """P2P protocol tests for unexpected GO Neg Resp"""
1682 addr0 = dev[0].p2p_dev_addr()
1683 addr1 = dev[1].p2p_dev_addr()
1685 dev[0].discover_peer(addr1)
1686 dev[0].p2p_stop_find()
1688 peer = dev[0].get_peer(addr1)
1690 logger.debug("GO Neg Resp without GO Neg session")
1691 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=123)
1692 attrs = p2p_attr_status()
1693 attrs += p2p_attr_capability()
1694 attrs += p2p_attr_go_intent()
1695 attrs += p2p_attr_config_timeout()
1696 attrs += p2p_attr_intended_interface_addr(addr0)
1697 attrs += p2p_attr_channel_list()
1698 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1699 attrs += p2p_attr_operating_channel()
1700 msg['payload'] += ie_p2p(attrs)
1701 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1704 dev[1].discover_peer(addr0)
1706 logger.debug("Unexpected GO Neg Resp while waiting for new GO Neg session")
1707 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1708 raise Exception("P2P_CONNECT failed")
1709 ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
1711 raise Exception("Timeout on GO Neg Req")
1712 dev[0].p2p_stop_find()
1713 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1715 logger.debug("Invalid attribute in GO Neg Response")
1716 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=197)
1717 attrs = struct.pack("<BB", P2P_ATTR_CAPABILITY, 0)
1718 msg['payload'] += ie_p2p(attrs)
1719 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr1, peer['listen_freq'], binascii.hexlify(msg['payload'])))
1720 frame = dev[0].mgmt_rx(timeout=0.1)
1721 if frame is not None:
1722 raise Exception("Unexpected GO Neg Confirm")
1724 logger.debug("GO Neg Resp with unexpected dialog token")
1725 dev[1].p2p_stop_find()
1726 if "FAIL" in dev[0].request("SET ext_mgmt_frame_handling 1"):
1727 raise Exception("Failed to enable external management frame handling")
1729 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1730 raise Exception("P2P_CONNECT failed(2)")
1731 p2p = rx_go_neg_req(dev[0])
1732 dev[0].p2p_stop_find()
1733 dialog_token = p2p['dialog_token']
1734 if dialog_token < 255:
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()
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'])))
1750 logger.debug("GO Neg Resp without Status")
1751 dev[1].p2p_stop_find()
1753 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1754 raise Exception("P2P_CONNECT failed(2)")
1755 p2p = rx_go_neg_req(dev[0])
1756 dev[0].p2p_stop_find()
1757 dialog_token = p2p['dialog_token']
1758 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1759 #attrs = p2p_attr_status()
1760 attrs = p2p_attr_capability()
1761 attrs += p2p_attr_go_intent()
1762 attrs += p2p_attr_config_timeout()
1763 attrs += p2p_attr_intended_interface_addr(addr0)
1764 attrs += p2p_attr_channel_list()
1765 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1766 attrs += p2p_attr_operating_channel()
1767 msg['payload'] += ie_p2p(attrs)
1768 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1769 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1770 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1772 logger.debug("GO Neg Resp without Intended Address")
1773 dev[1].p2p_stop_find()
1775 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1776 raise Exception("P2P_CONNECT failed(2)")
1777 p2p = rx_go_neg_req(dev[0])
1778 dev[0].p2p_stop_find()
1779 dialog_token = p2p['dialog_token']
1780 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1781 attrs = p2p_attr_status()
1782 #attrs += p2p_attr_capability()
1783 attrs += p2p_attr_go_intent()
1784 attrs += p2p_attr_config_timeout()
1785 #attrs += p2p_attr_intended_interface_addr(addr0)
1786 attrs += p2p_attr_channel_list()
1787 #attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1788 attrs += p2p_attr_operating_channel()
1789 msg['payload'] += ie_p2p(attrs)
1790 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1791 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1792 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1794 logger.debug("GO Neg Resp without GO Intent")
1795 dev[1].p2p_stop_find()
1797 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1798 raise Exception("P2P_CONNECT failed(2)")
1799 p2p = rx_go_neg_req(dev[0])
1800 dev[0].p2p_stop_find()
1801 dialog_token = p2p['dialog_token']
1802 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1803 attrs = p2p_attr_status()
1804 attrs += p2p_attr_capability()
1805 #attrs += p2p_attr_go_intent()
1806 attrs += p2p_attr_config_timeout()
1807 attrs += p2p_attr_intended_interface_addr(addr0)
1808 attrs += p2p_attr_channel_list()
1809 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1810 attrs += p2p_attr_operating_channel()
1811 msg['payload'] += ie_p2p(attrs)
1812 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1813 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1814 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1816 logger.debug("GO Neg Resp with invalid GO Intent")
1817 dev[1].p2p_stop_find()
1819 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc"):
1820 raise Exception("P2P_CONNECT failed(2)")
1821 p2p = rx_go_neg_req(dev[0])
1822 dev[0].p2p_stop_find()
1823 dialog_token = p2p['dialog_token']
1824 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1825 attrs = p2p_attr_status()
1826 attrs += p2p_attr_capability()
1827 attrs += p2p_attr_go_intent(go_intent=16)
1828 attrs += p2p_attr_config_timeout()
1829 attrs += p2p_attr_intended_interface_addr(addr0)
1830 attrs += p2p_attr_channel_list()
1831 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1832 attrs += p2p_attr_operating_channel()
1833 msg['payload'] += ie_p2p(attrs)
1834 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1835 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1836 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1838 logger.debug("GO Neg Resp with incompatible GO Intent")
1839 dev[1].p2p_stop_find()
1841 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=15"):
1842 raise Exception("P2P_CONNECT failed(2)")
1843 p2p = rx_go_neg_req(dev[0])
1844 dev[0].p2p_stop_find()
1845 dialog_token = p2p['dialog_token']
1846 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1847 attrs = p2p_attr_status()
1848 attrs += p2p_attr_capability()
1849 attrs += p2p_attr_go_intent(go_intent=15)
1850 attrs += p2p_attr_config_timeout()
1851 attrs += p2p_attr_intended_interface_addr(addr0)
1852 attrs += p2p_attr_channel_list()
1853 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1854 attrs += p2p_attr_operating_channel()
1855 msg['payload'] += ie_p2p(attrs)
1856 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1857 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INCOMPATIBLE_PARAMS)
1858 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INCOMPATIBLE_PARAMS, dialog_token)
1860 logger.debug("GO Neg Resp without P2P Group ID")
1861 dev[1].p2p_stop_find()
1863 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1864 raise Exception("P2P_CONNECT failed(2)")
1865 p2p = rx_go_neg_req(dev[0])
1866 dev[0].p2p_stop_find()
1867 dialog_token = p2p['dialog_token']
1868 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1869 attrs = p2p_attr_status()
1870 attrs += p2p_attr_capability()
1871 attrs += p2p_attr_go_intent(go_intent=15)
1872 attrs += p2p_attr_config_timeout()
1873 attrs += p2p_attr_intended_interface_addr(addr0)
1874 attrs += p2p_attr_channel_list()
1875 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1876 attrs += p2p_attr_operating_channel()
1877 #attrs += p2p_attr_group_id(src, "DIRECT-foo")
1878 msg['payload'] += ie_p2p(attrs)
1879 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1880 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1881 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1883 logger.debug("GO Neg Resp without Operating Channel")
1884 dev[1].p2p_stop_find()
1886 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1887 raise Exception("P2P_CONNECT failed(2)")
1888 p2p = rx_go_neg_req(dev[0])
1889 dev[0].p2p_stop_find()
1890 dialog_token = p2p['dialog_token']
1891 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1892 attrs = p2p_attr_status()
1893 attrs += p2p_attr_capability()
1894 attrs += p2p_attr_go_intent(go_intent=15)
1895 #attrs += p2p_attr_config_timeout()
1896 attrs += p2p_attr_intended_interface_addr(addr0)
1897 attrs += p2p_attr_channel_list()
1898 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1899 #attrs += p2p_attr_operating_channel()
1900 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1901 msg['payload'] += ie_p2p(attrs)
1902 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1903 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1904 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1906 logger.debug("GO Neg Resp without Channel List")
1907 dev[1].p2p_stop_find()
1909 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1910 raise Exception("P2P_CONNECT failed(2)")
1911 p2p = rx_go_neg_req(dev[0])
1912 dev[0].p2p_stop_find()
1913 dialog_token = p2p['dialog_token']
1914 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1915 attrs = p2p_attr_status()
1916 attrs += p2p_attr_capability()
1917 attrs += p2p_attr_go_intent(go_intent=15)
1918 attrs += p2p_attr_config_timeout()
1919 attrs += p2p_attr_intended_interface_addr(addr0)
1920 #attrs += p2p_attr_channel_list()
1921 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1922 attrs += p2p_attr_operating_channel()
1923 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1924 msg['payload'] += ie_p2p(attrs)
1925 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1926 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_INVALID_PARAMS)
1927 rx_go_neg_conf(dev[0], P2P_SC_FAIL_INVALID_PARAMS, dialog_token)
1929 logger.debug("GO Neg Resp without common channels")
1930 dev[1].p2p_stop_find()
1932 if "FAIL" in dev[1].global_request("P2P_CONNECT " + addr0 + " pbc go_intent=0"):
1933 raise Exception("P2P_CONNECT failed(2)")
1934 p2p = rx_go_neg_req(dev[0])
1935 dev[0].p2p_stop_find()
1936 dialog_token = p2p['dialog_token']
1937 msg = p2p_hdr(addr1, addr0, type=P2P_GO_NEG_RESP, dialog_token=dialog_token)
1938 attrs = p2p_attr_status()
1939 attrs += p2p_attr_capability()
1940 attrs += p2p_attr_go_intent(go_intent=15)
1941 attrs += p2p_attr_config_timeout()
1942 attrs += p2p_attr_intended_interface_addr(addr0)
1943 attrs += struct.pack("<BH3BBB", P2P_ATTR_CHANNEL_LIST, 5,
1946 attrs += p2p_attr_device_info(addr0, config_methods=0x0108)
1947 attrs += p2p_attr_operating_channel()
1948 attrs += p2p_attr_group_id(addr0, "DIRECT-foo")
1949 msg['payload'] += ie_p2p(attrs)
1950 mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=200 no_cck=1 action={}".format(addr1, addr1, p2p['freq'], binascii.hexlify(msg['payload'])))
1951 check_p2p_go_neg_fail_event(dev[1], P2P_SC_FAIL_NO_COMMON_CHANNELS)
1952 rx_go_neg_conf(dev[0], P2P_SC_FAIL_NO_COMMON_CHANNELS, dialog_token)