]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/hostapd.py
tests: Add a test case for Hotspot 2.0 network selection
[thirdparty/hostap.git] / tests / hwsim / hostapd.py
1 #!/usr/bin/python
2 #
3 # Python class for controlling hostapd
4 # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
5 #
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
8
9 import os
10 import time
11 import logging
12 import wpaspy
13
14 logger = logging.getLogger(__name__)
15 hapd_ctrl = '/var/run/hostapd'
16 hapd_global = 'hostapd-global'
17
18 class HostapdGlobal:
19 def __init__(self):
20 self.ctrl = wpaspy.Ctrl(hapd_global)
21
22 def add(self, ifname):
23 res = self.ctrl.request("ADD " + ifname + " " + hapd_ctrl)
24 if not "OK" in res:
25 raise Exception("Could not add hostapd interface " + ifname)
26
27 def remove(self, ifname):
28 self.ctrl.request("REMOVE " + ifname)
29
30
31 class Hostapd:
32 def __init__(self, ifname):
33 self.ifname = ifname
34 self.ctrl = wpaspy.Ctrl(os.path.join(hapd_ctrl, ifname))
35
36 def request(self, cmd):
37 logger.debug(self.ifname + ": CTRL: " + cmd)
38 return self.ctrl.request(cmd)
39
40 def ping(self):
41 return "PONG" in self.request("PING")
42
43 def set(self, field, value):
44 logger.debug(self.ifname + ": SET " + field + "=" + value)
45 if not "OK" in self.request("SET " + field + " " + value):
46 raise Exception("Failed to set hostapd parameter " + field)
47
48 def set_defaults(self):
49 self.set("driver", "nl80211")
50 self.set("hw_mode", "g")
51 self.set("channel", "1")
52 self.set("ieee80211n", "1")
53
54 def set_open(self, ssid):
55 self.set_defaults()
56 self.set("ssid", ssid)
57
58 def set_wpa2_psk(self, ssid, passphrase):
59 self.set_defaults()
60 self.set("ssid", ssid)
61 self.set("wpa_passphrase", passphrase)
62 self.set("wpa", "2")
63 self.set("wpa_key_mgmt", "WPA-PSK")
64 self.set("rsn_pairwise", "CCMP")
65
66 def set_wpa_psk(self, ssid, passphrase):
67 self.set_defaults()
68 self.set("ssid", ssid)
69 self.set("wpa_passphrase", passphrase)
70 self.set("wpa", "1")
71 self.set("wpa_key_mgmt", "WPA-PSK")
72 self.set("wpa_pairwise", "TKIP")
73
74 def set_wpa_psk_mixed(self, ssid, passphrase):
75 self.set_defaults()
76 self.set("ssid", ssid)
77 self.set("wpa_passphrase", passphrase)
78 self.set("wpa", "3")
79 self.set("wpa_key_mgmt", "WPA-PSK")
80 self.set("wpa_pairwise", "TKIP")
81 self.set("rsn_pairwise", "CCMP")
82
83 def set_wep(self, ssid, key):
84 self.set_defaults()
85 self.set("ssid", ssid)
86 self.set("wep_key0", key)
87
88 def enable(self):
89 if not "OK" in self.ctrl.request("ENABLE"):
90 raise Exception("Failed to enable hostapd interface " + self.ifname)
91
92 def disable(self):
93 if not "OK" in self.ctrl.request("ENABLE"):
94 raise Exception("Failed to disable hostapd interface " + self.ifname)
95
96 def add_ap(ifname, params):
97 logger.info("Starting AP " + ifname)
98 hapd_global = HostapdGlobal()
99 hapd_global.remove(ifname)
100 hapd_global.add(ifname)
101 hapd = Hostapd(ifname)
102 if not hapd.ping():
103 raise Exception("Could not ping hostapd")
104 hapd.set_defaults()
105 fields = [ "ssid", "wpa_passphrase", "wpa_key_mgmt", "wpa",
106 "wpa_pairwise", "rsn_pairwise", "auth_server_addr" ]
107 for field in fields:
108 if field in params:
109 hapd.set(field, params[field])
110 for f,v in params.items():
111 if f in fields:
112 continue
113 if isinstance(v, list):
114 for val in v:
115 hapd.set(f, val)
116 else:
117 hapd.set(f, v)
118 hapd.enable()
119
120 def wpa2_params(ssid=None, passphrase=None):
121 params = { "wpa": "2",
122 "wpa_key_mgmt": "WPA-PSK",
123 "rsn_pairwise": "CCMP" }
124 if ssid:
125 params["ssid"] = ssid
126 if passphrase:
127 params["wpa_passphrase"] = passphrase
128 return params
129
130 def wpa_params(ssid=None, passphrase=None):
131 params = { "wpa": "1",
132 "wpa_key_mgmt": "WPA-PSK",
133 "wpa_pairwise": "TKIP" }
134 if ssid:
135 params["ssid"] = ssid
136 if passphrase:
137 params["wpa_passphrase"] = passphrase
138 return params
139
140 def wpa_mixed_params(ssid=None, passphrase=None):
141 params = { "wpa": "3",
142 "wpa_key_mgmt": "WPA-PSK",
143 "wpa_pairwise": "TKIP",
144 "rsn_pairwise": "CCMP" }
145 if ssid:
146 params["ssid"] = ssid
147 if passphrase:
148 params["wpa_passphrase"] = passphrase
149 return params