]>
git.ipfire.org Git - thirdparty/hostap.git/blob - wlantest/wlantest.c
2 * wlantest - IEEE 802.11 protocol monitoring and testing tool
3 * Copyright (c) 2010, Jouni Malinen <j@w1.fi>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * Alternatively, this software may be distributed under the terms of BSD
12 * See README and COPYING for more details.
15 #include "utils/includes.h"
17 #include "utils/common.h"
18 #include "utils/eloop.h"
22 extern int wpa_debug_level
;
23 extern int wpa_debug_show_keys
;
26 static void wlantest_terminate(int sig
, void *signal_ctx
)
32 static void usage(void)
34 printf("wlantest [-cddhqq] [-i<ifname>] [-r<pcap file>] "
36 " [-I<wired ifname>] [-R<wired pcap file>] "
37 "[-P<RADIUS shared secret>]\n"
38 " [-w<write pcap file>]\n");
42 static void passphrase_deinit(struct wlantest_passphrase
*p
)
44 dl_list_del(&p
->list
);
49 static void secret_deinit(struct wlantest_radius_secret
*r
)
51 dl_list_del(&r
->list
);
56 static void wlantest_init(struct wlantest
*wt
)
59 os_memset(wt
, 0, sizeof(*wt
));
60 wt
->monitor_sock
= -1;
62 for (i
= 0; i
< MAX_CTRL_CONNECTIONS
; i
++)
63 wt
->ctrl_socks
[i
] = -1;
64 dl_list_init(&wt
->passphrase
);
65 dl_list_init(&wt
->bss
);
66 dl_list_init(&wt
->secret
);
67 dl_list_init(&wt
->radius
);
68 dl_list_init(&wt
->pmk
);
72 void radius_deinit(struct wlantest_radius
*r
)
74 dl_list_del(&r
->list
);
79 static void wlantest_deinit(struct wlantest
*wt
)
81 struct wlantest_passphrase
*p
, *pn
;
82 struct wlantest_radius_secret
*s
, *sn
;
83 struct wlantest_radius
*r
, *rn
;
84 struct wlantest_pmk
*pmk
, *np
;
86 if (wt
->ctrl_sock
>= 0)
88 if (wt
->monitor_sock
>= 0)
91 dl_list_for_each_safe(p
, pn
, &wt
->passphrase
,
92 struct wlantest_passphrase
, list
)
94 dl_list_for_each_safe(s
, sn
, &wt
->secret
,
95 struct wlantest_radius_secret
, list
)
97 dl_list_for_each_safe(r
, rn
, &wt
->radius
, struct wlantest_radius
, list
)
99 dl_list_for_each_safe(pmk
, np
, &wt
->pmk
, struct wlantest_pmk
, list
)
101 write_pcap_deinit(wt
);
105 static void add_passphrase(struct wlantest
*wt
, const char *passphrase
)
107 struct wlantest_passphrase
*p
;
108 size_t len
= os_strlen(passphrase
);
110 if (len
< 8 || len
> 63)
112 p
= os_zalloc(sizeof(*p
));
115 os_memcpy(p
->passphrase
, passphrase
, len
);
116 dl_list_add(&wt
->passphrase
, &p
->list
);
120 static void add_secret(struct wlantest
*wt
, const char *secret
)
122 struct wlantest_radius_secret
*s
;
123 size_t len
= os_strlen(secret
);
125 if (len
>= MAX_RADIUS_SECRET_LEN
)
127 s
= os_zalloc(sizeof(*s
));
130 os_memcpy(s
->secret
, secret
, len
);
131 dl_list_add(&wt
->secret
, &s
->list
);
135 int main(int argc
, char *argv
[])
138 const char *read_file
= NULL
;
139 const char *read_wired_file
= NULL
;
140 const char *write_file
= NULL
;
141 const char *ifname
= NULL
;
142 const char *ifname_wired
= NULL
;
146 wpa_debug_level
= MSG_INFO
;
147 wpa_debug_show_keys
= 1;
149 if (os_program_init())
155 c
= getopt(argc
, argv
, "cdhi:I:p:P:qr:R:w:");
163 if (wpa_debug_level
> 0)
173 ifname_wired
= optarg
;
176 add_passphrase(&wt
, optarg
);
179 add_secret(&wt
, optarg
);
188 read_wired_file
= optarg
;
199 if (ifname
== NULL
&& ifname_wired
== NULL
&&
200 read_file
== NULL
&& read_wired_file
== NULL
) {
208 if (write_file
&& write_pcap_init(&wt
, write_file
) < 0)
211 if (read_wired_file
&& read_wired_cap_file(&wt
, read_wired_file
) < 0)
214 if (read_file
&& read_cap_file(&wt
, read_file
) < 0)
217 if (ifname
&& monitor_init(&wt
, ifname
) < 0)
220 if (ifname_wired
&& monitor_init_wired(&wt
, ifname_wired
) < 0)
223 if (ctrl_iface
&& ctrl_init(&wt
) < 0)
226 eloop_register_signal_terminate(wlantest_terminate
, &wt
);
230 wpa_printf(MSG_INFO
, "Processed: rx_mgmt=%u rx_ctrl=%u rx_data=%u "
232 wt
.rx_mgmt
, wt
.rx_ctrl
, wt
.rx_data
, wt
.fcs_error
);
234 wlantest_deinit(&wt
);