Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / tests / hwsim / test_hostapd_oom.py
1 # hostapd and out-of-memory error paths
2 # Copyright (c) 2015, Jouni Malinen
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import logging
8 logger = logging.getLogger()
9 import time
10
11 import hostapd
12 from utils import HwsimSkip
13
14 def hostapd_oom_loop(apdev, params, start_func="main"):
15     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "ctrl" })
16     hapd_global = hostapd.HostapdGlobal()
17
18     count = 0
19     for i in range(1, 1000):
20         if "OK" not in hapd.request("TEST_ALLOC_FAIL %d:%s" % (i, start_func)):
21             raise HwsimSkip("TEST_ALLOC_FAIL not supported")
22         try:
23             hostapd.add_ap(apdev[1]['ifname'], params)
24             logger.info("Iteration %d - success" % i)
25             hapd_global.remove(apdev[1]['ifname'])
26
27             state = hapd.request('GET_ALLOC_FAIL')
28             logger.info("GET_ALLOC_FAIL: " + state)
29             hapd.request("TEST_ALLOC_FAIL 0:")
30             if i < 3:
31                 raise Exception("AP setup succeeded during out-of-memory")
32             if state.startswith('0:'):
33                 count = 0
34             else:
35                 count += 1
36                 if count == 5:
37                     break
38         except Exception, e:
39             logger.info("Iteration %d - %s" % (i, str(e)))
40
41 def test_hostapd_oom_open(dev, apdev):
42     """hostapd failing to setup open mode due to OOM"""
43     params = { "ssid": "open" }
44     hostapd_oom_loop(apdev, params)
45
46 def test_hostapd_oom_wpa2_psk(dev, apdev):
47     """hostapd failing to setup WPA2-PSK mode due to OOM"""
48     params = hostapd.wpa2_params(ssid="test", passphrase="12345678")
49     params['wpa_psk_file'] = 'hostapd.wpa_psk'
50     hostapd_oom_loop(apdev, params)
51
52 def test_hostapd_oom_wpa2_eap(dev, apdev):
53     """hostapd failing to setup WPA2-EAP mode due to OOM"""
54     params = hostapd.wpa2_eap_params(ssid="test")
55     params['acct_server_addr'] = "127.0.0.1"
56     params['acct_server_port'] = "1813"
57     params['acct_server_shared_secret'] = "radius"
58     hostapd_oom_loop(apdev, params)
59
60 def test_hostapd_oom_wpa2_eap_radius(dev, apdev):
61     """hostapd failing to setup WPA2-EAP mode due to OOM in RADIUS"""
62     params = hostapd.wpa2_eap_params(ssid="test")
63     params['acct_server_addr'] = "127.0.0.1"
64     params['acct_server_port'] = "1813"
65     params['acct_server_shared_secret'] = "radius"
66     hostapd_oom_loop(apdev, params, start_func="accounting_init")
67
68 def test_hostapd_oom_wpa2_psk_connect(dev, apdev):
69     """hostapd failing during WPA2-PSK mode connection due to OOM"""
70     params = hostapd.wpa2_params(ssid="test-wpa2-psk", passphrase="12345678")
71     hapd = hostapd.add_ap(apdev[0]['ifname'], params)
72
73     dev[0].request("SCAN_INTERVAL 1")
74     count = 0
75     for i in range(1, 1000):
76         logger.info("Iteration %d" % i)
77         if "OK" not in hapd.request("TEST_ALLOC_FAIL %d:main" % i):
78             raise HwsimSkip("TEST_ALLOC_FAIL not supported")
79         id = dev[0].connect("test-wpa2-psk", psk="12345678",
80                             scan_freq="2412", wait_connect=False)
81         ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
82                                 "CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=5)
83         if ev is None:
84             logger.info("Timeout while waiting for connection in iteration %d" % i)
85             dev[0].request("REMOVE_NETWORK all")
86             time.sleep(0.1)
87         else:
88             if "CTRL-EVENT-SSID-TEMP-DISABLED" in ev:
89                 logger.info("Re-select to avoid long wait for temp disavle")
90                 dev[0].select_network(id)
91                 dev[0].wait_connected()
92             dev[0].request("REMOVE_NETWORK all")
93             dev[0].wait_disconnected()
94         for i in range(3):
95             dev[i].dump_monitor()
96         hapd.dump_monitor()
97
98         state = hapd.request('GET_ALLOC_FAIL')
99         logger.info("GET_ALLOC_FAIL: " + state)
100         hapd.request("TEST_ALLOC_FAIL 0:")
101         if state.startswith('0:'):
102             count = 0
103         else:
104             count += 1
105             if count == 5:
106                 break
107     dev[0].request("SCAN_INTERVAL 5")
108
109 def test_hostapd_oom_wpa2_eap_connect(dev, apdev, params):
110     """hostapd failing during WPA2-EAP mode connection due to OOM"""
111     if not params['long']:
112         raise HwsimSkip("Skip test case with long duration due to --long not specified")
113     params = hostapd.wpa2_eap_params(ssid="test-wpa2-eap")
114     params['acct_server_addr'] = "127.0.0.1"
115     params['acct_server_port'] = "1813"
116     params['acct_server_shared_secret'] = "radius"
117     hapd = hostapd.add_ap(apdev[0]['ifname'], params)
118
119     dev[0].request("SCAN_INTERVAL 1")
120     count = 0
121     for i in range(1, 1000):
122         logger.info("Iteration %d" % i)
123         if "OK" not in hapd.request("TEST_ALLOC_FAIL %d:main" % i):
124             raise HwsimSkip("TEST_ALLOC_FAIL not supported")
125         id = dev[0].connect("test-wpa2-eap", key_mgmt="WPA-EAP",
126                             eap="GPSK", identity="gpsk user",
127                             password="abcdefghijklmnop0123456789abcdef",
128                             scan_freq="2412", wait_connect=False)
129         ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
130                                 "CTRL-EVENT-SSID-TEMP-DISABLED"], timeout=5)
131         if ev is None:
132             logger.info("Timeout while waiting for connection in iteration %d" % i)
133             dev[0].request("REMOVE_NETWORK all")
134             time.sleep(0.1)
135         else:
136             if "CTRL-EVENT-SSID-TEMP-DISABLED" in ev:
137                 logger.info("Re-select to avoid long wait for temp disavle")
138                 dev[0].select_network(id)
139                 dev[0].wait_connected()
140             dev[0].request("REMOVE_NETWORK all")
141             dev[0].wait_disconnected()
142         for i in range(3):
143             dev[i].dump_monitor()
144         hapd.dump_monitor()
145
146         state = hapd.request('GET_ALLOC_FAIL')
147         logger.info("GET_ALLOC_FAIL: " + state)
148         hapd.request("TEST_ALLOC_FAIL 0:")
149         if state.startswith('0:'):
150             count = 0
151         else:
152             count += 1
153             if count == 5:
154                 break
155     dev[0].request("SCAN_INTERVAL 5")