valid interface combinations:
* #{ managed } <= 2048, #{ AP, mesh point } <= 8, #{ P2P-client, P2P-GO } <= 1,
total <= 2048, #channels <= 1, STA/AP BI must match
* #{ WDS } <= 2048,
total <= 2048, #channels <= 1, STA/AP BI must match
A saída acima mostra que o AP e os canais da estação devem coincidir: ou
#channels <= 1
ou
STA/AP BI must match
significa a mesma coisa, que a estação e o canal AP devem corresponder. Então você não está livre para especificar qualquer canal no arquivo hostapd.conf , você deve se certificar de que o canal no arquivo é o mesmo que você já está ligado através do seu gerenciado (ou estação , mesma coisa) interface.
Quanto às interfaces names , por algum motivo eu não consigo fazer hostapd trabalhar com nomes como new0 e new1 , mas se eu usar wlan0 e wlan1 tudo funciona bem, de acordo com o meu post.
Abaixo, você encontra um script simples que fará isso para você:
#!/bin/bash
# If you need to debug, uncomment the following statement
#set -x
# and comment out the "exec" statement.
[ "$USER" != "root" ] && exec sudo $0 "$@"
exec 2>/var/log/$(basename $0).log
if [ $# != 2 ]; then
echo "Usage $0 interface action"
echo "where interface is the name of the wireless interface to be used"
echo "and action is one of start/stop "
exit 1
fi
MY_IF=$1
HPID=/tmp/host$USER.pid
DPID=/tmp/dnsm$USER.pid
WPID=/tmp/wpas$USER.pid
[ -x /usr/bin/srm ] && RM=/usr/bin/srm || RM="/bin/rm -f"
stop() {
kill -9 $(cat $HPID)
kill -9 $(cat $DPID)
dhclient -r
kill -9 $(cat $WPID)
rm /tmp/*.my_conf
rm /tmp/*$USER.pid
iw dev wlan1 del
ip link set dev $MY_IF down
ip addr flush dev $MY_IF
ip link set dev $MY_IF up
iptables -t nat -D POSTROUTING -o $MY_IF -j MASQUERADE
service network-manager start
}
my_exit() {
case $1 in
2)
echo "wpa_supplicant failed" >>&2
;;
3)
echo "dhclient failed" >>&2
;;
4)
echo "hostapd failed" >>&2
;;
5)
echo "dnsmasq failed" >>&2
;;
esac
stop >>&2
exit $1
}
start() {
service network-manager stop
iw phy phy0 interface add wlan1 type __ap
ip addr flush dev $MY_IF
ip link set dev $MY_IF up
ip link set dev wlan1 up
pkill -9 wpa_supplicant
MYSECRET=$(mktemp /tmp/XXXXXX.my_conf)
echo -e "Please enter BSSID and Password of the Wifi network which\n"
echo -e "you wish to connect to:"
read BSSID PASSWORD
wpa_passphrase $BSSID $PASSWORD > $MYSECRET
wpa_supplicant -B -i $MY_IF -c $MYSECRET -Dnl80211 -P $WPID 1> /dev/null
EXIT_CODE=$?
$RM $MYSECRET
[[ $EXIT_CODE == 0 ]] && : || my_exit 2
pkill -9 dhclient
dhclient $MY_IF
[[ $EXIT_CODE == 0 ]] && : || my_exit 3
MYTEMPH=$(mktemp /tmp/XXXXXX.my_conf)
MYTEMPD=$(mktemp /tmp/XXXXXX.my_conf)
cat > $MYTEMPH <<EOF
interface=wlan1
driver=nl80211
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
ssid=wtf
hw_mode=g
channel=3
macaddr_acl=0
auth_algs=3
ignore_broadcast_ssid=0
eap_server=0
wpa=2
wpa_passphrase=12345678
wpa_pairwise=TKIP CCMP
rsn_pairwise=TKIP CCMP
EOF
pkill -9 hostapd
/usr/sbin/hostapd -B -P $HPID $MYTEMPH 1> /dev/null
sleep 3
ps ax | grep hostapd | grep -v grep >/dev/null
if [[ ! $? == 0 ]]; then
/usr/sbin/hostapd -B -P $HPID $MYTEMPH 1> /dev/null
fi
[[ $? == 0 ]] && : || my_exit 4
echo 1 >/proc/sys/net/ipv4/ip_forward
ip addr add 10.111.113.1/24 dev wlan1
cat > $MYTEMPD <<EOF
domain-needed
bogus-priv
dhcp-authoritative
no-dhcp-interface=$MY_IF
no-dhcp-interface=lo
interface=wlan1
server=8.8.8.8
server=8.8.4.4
expand-hosts
dhcp-range=10.111.113.2,10.111.113.100,12h
EOF
pkill -9 dnsmasq
dnsmasq -C $MYTEMPD -x $DPID
[[ $? == 0 ]] && : || my_exit 5
iptables -t nat -A POSTROUTING -o $MY_IF -j MASQUERADE
}
case $2 in
start)
stop >>&2
start
;;
stop)
stop
;;
*)
echo "Usage $0 interface action"
echo "where interface is the name of the wireless interface to be used"
echo "and action is one of start/stop "
;;
esac
certifique-se de que o canal de hostapd.conf dentro do script acima (a linha canal = 3 ) corresponde ao do AP que você deseja se conectar. Eu tenho não deixado, acima, set -x , o que permite que você veja erros, se houver, conforme o script progride: se você precisar fazer alguma depuração, você pode un comentá-lo. Eu não consegui fazer hostapd , quando chamado de um script como acima, trabalhar com qualquer coisa, mas country_code = us , mas você pode ter mais sorte. Além disso, minha versão de hostapd falha todas as outras vezes, então eu adicionei uma condição que testa se hostapd está em execução ou não, e tenta exatamente mais uma vez para começar.