2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2010 Michael Tremer & Christian Schmidt #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
20 ###############################################################################
22 function wireless_create
() {
24 local phy
=$
(phy_get
${2})
32 isset mac || mac
=$
(mac_generate
)
34 assert phy_exists
${phy}
35 assert isoneof
type managed __ap
37 iw phy
${phy} interface add ${device} type ${type}
39 if device_exists
${device}; then
40 device_set_address
${device} ${mac}
43 device_set_up
${device}
46 function wireless_remove
() {
49 assert device_exists
${device}
51 device_set_down
${device}
56 function wireless_set_channel
() {
61 assert device_exists
${device}
64 iw dev
${device} set channel
${channel} $@
67 function hostapd_config_dir
() {
70 echo "${RUN_DIR}/hostapd/${device}"
73 function hostapd_config_write
() {
77 assert device_exists
${device}
87 while [ $# -gt 0 ]; do
90 broadcast_ssid
=${1#--broadcast-ssid=}
93 channel
=${1#--channel=}
96 country_code
=${1#--country-code=}
105 encryption
=$
(cli_get_val
${1})
108 key
=$
(cli_get_val
${1})
111 warning_log
"Ignoring unknown argument '${1}'."
117 assert isset broadcast_ssid
118 assert isbool broadcast_ssid
121 assert isinteger channel
123 assert isset country_code
127 # Check if key is set when encryption is used.
128 if isset encryption
; then
129 assert isoneof encryption WPA WPA2 WPA
/WPA2
133 local ignore_broadcast_ssid
134 if enabled broadcast_ssid
; then
135 ignore_broadcast_ssid
="0"
137 ignore_broadcast_ssid
="1"
140 local hw_mode ieee80211n
="0"
141 if [ "${mode}" = "n" ]; then
142 if [ ${channel} -le 15 ]; then
151 ### Hostapd configuration for ${device}
153 # Interface configuration
157 # Wireless configuration
159 country_code=${country_code}
161 ieee80211n=${ieee80211n}
162 ignore_broadcast_ssid=${ignore_broadcast_ssid}
166 dump_file=$(hostapd_config_dir ${device}/dump)
168 ctrl_interface=/var/run/hostapd
169 ctrl_interface_group=0
173 if isset encryption
; then
174 local encryption_mode
=0
175 case "${encryption}" in
187 print
"# Encryption settings."
188 print
"wpa=${encryption_mode}"
189 print
"wpa_passphrase=${key}"
190 print
"wpa_key_mgmt=WPA-PSK"
191 print
"wpa_pairwise=TKIP"
192 print
"rsn_pairwise=CCMP"
199 function hostapd_start
() {
205 local config_dir
=$
(hostapd_config_dir
${device})
206 mkdir
-p ${config_dir}
208 local config_file
=${config_dir}/config
209 hostapd_config_write
${device} $@
> ${config_file}
211 service_start
"hostapd@${device}.service"
216 log DEBUG
"Hostapd was successfully started for '${device}'."
220 error_log
"Could not start hostapd properly for '${device}'."
222 error_log
"Configuration file dump:"
226 done < ${config_file}
233 function hostapd_stop
() {
237 service_stop
"hostapd@${device}.service"
239 rm -rf $
(hostapd_config_dir
${device})
242 function hostapd_get_pid
() {
247 local pid_file
="$(hostapd_config_dir ${device})/pid"
249 [ -e "${pid_file}" ] ||
return ${EXIT_ERROR}
251 cat ${pid_file} 2>/dev
/null
255 function hostapd_is_running
() {
260 local pid
=$
(hostapd_get_pid
${device})
262 if isset pid
&& [ -d "/proc/${pid}" ]; then
269 function wpa_supplicant_config_write
() {
279 while [ $# -gt 0 ]; do
285 encryption
=${1#--encryption=}
295 assert isset encryption
299 # WPA supplicant configuration for ${device}.
305 key_mgmt=${encryption}
314 function wpa_supplicant_config_dir
() {
319 echo "${RUN_DIR}/wireless/${device}"
322 function wpa_supplicant_start
() {
326 assert device_exists
${device}
328 local config_dir
=$
(wpa_supplicant_config_dir
${device})
329 mkdir
-p ${config_dir}
331 local config_file
=${config_dir}/config
332 wpa_supplicant_config_write
${device} $@
> ${config_file}
334 wpa_supplicant
-i ${device} -D wext
-B -c ${config_file} \
338 function wpa_supplicant_stop
() {
343 local pid
=$
(wpa_supplicant_get_pid
${device})
348 warning_log
"Could not find pid file for wpa_supplicant process running for ${device}."
351 rm -rf $
(wpa_supplicant_config_dir
${device})
354 function wpa_supplicant_get_pid
() {
359 local pid_file
="$(wpa_supplicant_config_dir ${device})/pid"
361 [ -e "${pid_file}" ] ||
return ${EXIT_ERROR}
363 cat ${pid_file} 2>/dev
/null
367 function wpa_supplicant_is_running
() {
372 local pid
=$
(wpa_supplicant_get_pid
${device})
374 if isset pid
&& [ -d "/proc/${pid}" ]; then
381 function wpa_supplicant_get_pid
() {
388 function wpa_supplicant_stop
() {
392 killall wpa_supplicant