1#!/bin/sh
2
3DIR="$( cd "$( dirname "$0" )" && pwd )"
4WPAS=$DIR/../../wpa_supplicant/wpa_supplicant
5WPACLI=$DIR/../../wpa_supplicant/wpa_cli
6HAPD=$DIR/../../hostapd/hostapd
7HAPD_AS=$DIR/../../hostapd/hostapd
8HAPDCLI=$DIR/../../hostapd/hostapd_cli
9WLANTEST=$DIR/../../wlantest/wlantest
10HLR_AUC_GW=$DIR/../../hostapd/hlr_auc_gw
11
12if [ -z "$LOGDIR" ] ; then
13    DATE="$(date +%s)"
14    LOGDIR="$DIR/logs/$DATE"
15    mkdir -p $LOGDIR
16else
17    if [ -e $LOGDIR/alt-wpa_supplicant/wpa_supplicant/wpa_supplicant ]; then
18	WPAS=$LOGDIR/alt-wpa_supplicant/wpa_supplicant/wpa_supplicant
19	WPACLI=$LOGDIR/alt-wpa_supplicant/wpa_supplicant/wpa_cli
20	# extra code coverage
21	$WPAS > /dev/null 2>&1
22	$WPAS -efoo -Ifoo -mfoo -ofoo -Ofoo -pfoo -Pfoo -h > /dev/null 2>&1
23	$WPAS -bfoo -B -Cfoo -q -W -N -L > /dev/null 2>&1
24	$WPAS -T -v > /dev/null 2>&1
25	$WPAS -u -z > /dev/null 2>&1
26    fi
27    if [ -e $LOGDIR/alt-hostapd/hostapd/hostapd ]; then
28	HAPD=$LOGDIR/alt-hostapd/hostapd/hostapd
29	HAPDCLI=$LOGDIR/alt-hostapd/hostapd/hostapd_cli
30	# extra code coverage
31	$HAPD > /dev/null 2>&1
32	$HAPD -v > /dev/null 2>&1
33	$HAPD -B -efoo -Pfoo -T -bfoo -h > /dev/null 2>&1
34	$HAPD -ufoo > /dev/null 2>&1
35	$HAPD -u00:11:22:33:44:55 > /dev/null 2>&1
36	$HAPD -gfoo > /dev/null 2>&1
37	$HAPD -Gfoo-not-exists > /dev/null 2>&1
38	$HAPD -z > /dev/null 2>&1
39	$HAPD -i foo1,foo2,foo3 > /dev/null 2>&1
40    fi
41    if [ -e $LOGDIR/alt-hostapd-as/hostapd/hostapd ]; then
42	HAPD_AS=$LOGDIR/alt-hostapd-as/hostapd/hostapd
43    fi
44    if [ -e $LOGDIR/alt-hlr_auc_gw/hostapd/hlr_auc_gw ]; then
45	HLR_AUC_GW=$LOGDIR/alt-hlr_auc_gw/hostapd/hlr_auc_gw
46	# extra code coverage
47	$HLR_AUC_GW > /dev/null 2>&1
48	$HLR_AUC_GW -Dfoo -i7 -sfoo -h > /dev/null 2>&1
49	$HLR_AUC_GW -i100 > /dev/null 2>&1
50	$HLR_AUC_GW -z > /dev/null 2>&1
51    fi
52fi
53
54LOGBASEDIR="$( cd "$(dirname "$LOGDIR")" && pwd )"
55if test "$LOGBASEDIR" = "$DIR/logs" -a -w "$LOGBASEDIR" ; then
56    rm -rf "$LOGBASEDIR/current"
57    ln -sf "$(basename "$LOGDIR")" "$LOGBASEDIR/current"
58fi
59
60if groups | tr ' ' "\n" | grep -q ^admin$; then
61    GROUP=admin
62elif groups | tr ' ' "\n" | grep -q ^wheel$; then
63    GROUP=wheel
64else
65    GROUP=adm
66fi
67
68for i in 0 1 2; do
69    sed "s/ GROUP=.*$/ GROUP=$GROUP/" "$DIR/p2p$i.conf" > "$LOGDIR/p2p$i.conf"
70done
71
72sed "s/group=admin/group=$GROUP/;s%LOGDIR%$LOGDIR%g" "$DIR/auth_serv/as.conf" > "$LOGDIR/as.conf"
73sed "s/group=admin/group=$GROUP/;s%LOGDIR%$LOGDIR%g" "$DIR/auth_serv/as2.conf" > "$LOGDIR/as2.conf"
74
75unset VM
76if [ "$1" = "VM" ]; then
77    VM="y"
78    shift
79fi
80
81if [ "$1" = "valgrind" ]; then
82    VALGRIND=y
83    if [ -r "$DIR/valgrind.suppressions" ]; then
84	VALGRIND_SUPP=" --gen-suppressions=all --suppressions=$DIR/valgrind.suppressions"
85    else
86	VALGRIND_SUPP=""
87    fi
88    VALGRIND_WPAS="valgrind --log-file=$LOGDIR/valgrind-wlan%d --leak-check=full --num-callers=20$VALGRIND_SUPP"
89    VALGRIND_HAPD="valgrind --log-file=$LOGDIR/valgrind-hostapd --leak-check=full --num-callers=20$VALGRIND_SUPP"
90    chmod -f a+rx $WPAS
91    chmod -f a+rx $HAPD
92    chmod -f a+rx $HAPD_AS
93    HAPD_AS="valgrind --log-file=$LOGDIR/valgrind-auth-serv --leak-check=full --num-callers=20$VALGRIND_SUPP $HAPD_AS"
94    shift
95else
96    unset VALGRIND
97    VALGRIND_WPAS=
98    VALGRIND_HAPD=
99fi
100
101if [ "$1" = "trace" ]; then
102    TRACE="T"
103    shift
104else
105    TRACE=""
106fi
107
108$DIR/stop.sh
109
110TMP=$1
111if [ x${TMP%=[0-9]*} = "xchannels" ]; then
112	NUM_CH=${TMP#channels=}
113	shift
114else
115	NUM_CH=1
116fi
117
118test -d /sys/module/mac80211_hwsim || sudo modprobe mac80211_hwsim radios=7 channels=$NUM_CH support_p2p_device=0 dyndbg=+p
119
120sudo ip link set hwsim0 up
121sudo $WLANTEST -i hwsim0 -n $LOGDIR/hwsim0.pcapng -c -dtN -L $LOGDIR/hwsim0 &
122for i in 0 1 2; do
123    DBUSARG=""
124    if [ $i = "0" ] && ([ -r /var/run/dbus/pid ] || [ -r /var/run/dbus/system_bus_socket ]); then
125	if $WPAS | grep -q -- -u; then
126	    DBUSARG="-u"
127	fi
128    fi
129    sudo $(printf -- "$VALGRIND_WPAS" $i) $WPAS -g /tmp/wpas-wlan$i -G$GROUP -Dnl80211 -iwlan$i -c $LOGDIR/p2p$i.conf \
130         -ddKt$TRACE -f $LOGDIR/log$i $DBUSARG &
131done
132sudo $(printf -- "$VALGRIND_WPAS" 5) $WPAS -g /tmp/wpas-wlan5 -G$GROUP \
133    -ddKt$TRACE -f $LOGDIR/log5 &
134sudo $VALGRIND_HAPD $HAPD -ddKt$TRACE -g /var/run/hostapd-global -G $GROUP -f $LOGDIR/hostapd &
135HPID=$!
136
137if [ -z "$VM" ]; then
138    # Sleep a bit, otherwise pgrep may run before the child is forked
139    sleep 0.1
140    pgrep -P $HPID > $LOGDIR/hostapd-test.pid
141else
142    echo $HPID > $LOGDIR/hostapd-test.pid
143fi
144
145if [ -x $HLR_AUC_GW ]; then
146    cp $DIR/auth_serv/hlr_auc_gw.milenage_db $LOGDIR/hlr_auc_gw.milenage_db
147    sudo $HLR_AUC_GW -u -m $LOGDIR/hlr_auc_gw.milenage_db -g $DIR/auth_serv/hlr_auc_gw.gsm > $LOGDIR/hlr_auc_gw &
148fi
149
150openssl ocsp -index $DIR/auth_serv/index.txt \
151    -rsigner $DIR/auth_serv/ocsp-responder.pem \
152    -rkey $DIR/auth_serv/ocsp-responder.key \
153    -CA $DIR/auth_serv/ca.pem \
154    -issuer $DIR/auth_serv/ca.pem \
155    -verify_other $DIR/auth_serv/ca.pem -trust_other \
156    -ndays 7 \
157    -reqin $DIR/auth_serv/ocsp-req.der \
158    -respout $LOGDIR/ocsp-server-cache.der > $LOGDIR/ocsp.log 2>&1
159if [ ! -r $LOGDIR/ocsp-server-cache.der ]; then
160    cp $DIR/auth_serv/ocsp-server-cache.der $LOGDIR/ocsp-server-cache.der
161fi
162
163touch $LOGDIR/hostapd.db
164sudo $HAPD_AS -ddKt $LOGDIR/as.conf $LOGDIR/as2.conf > $LOGDIR/auth_serv &
165
166# wait for programs to be fully initialized
167for i in 0 1 2 3 4 5 6 7 8 9; do
168    if [ -e /tmp/wpas-wlan0 ]; then
169	break
170    fi
171    sleep 0.05
172done
173for i in 0 1 2; do
174    for j in `seq 1 10`; do
175	if $WPACLI -g /tmp/wpas-wlan$i ping | grep -q PONG; then
176	    break
177	fi
178	if [ $j = "10" ]; then
179	    echo "Could not connect to /tmp/wpas-wlan$i"
180	    exit 1
181	fi
182	sleep 1
183    done
184done
185
186for j in `seq 1 10`; do
187    if $WPACLI -g /var/run/hostapd-global ping | grep -q PONG; then
188	break
189    fi
190    if [ $j = "10" ]; then
191	echo "Could not connect to /var/run/hostapd-global"
192	exit 1
193    fi
194    sleep 1
195done
196
197for j in `seq 1 10`; do
198    if $HAPDCLI -i as ping | grep -q PONG; then
199	break
200    fi
201    if [ $j = "10" ]; then
202	echo "Could not connect to hostapd-as-RADIUS-server"
203	exit 1
204    fi
205    sleep 1
206done
207
208if [ $USER = "0" -o $USER = "root" ]; then
209    exit 0
210fi
211
212sleep 0.75
213sudo chown -f $USER $LOGDIR/hwsim0.pcapng $LOGDIR/hwsim0 $LOGDIR/log* $LOGDIR/hostapd
214if [ "x$VALGRIND" = "xy" ]; then
215    sudo chown -f $USER $LOGDIR/*valgrind*
216fi
217
218exit 0
219