]>
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_bss
*bss
, *n
;
82 struct wlantest_passphrase
*p
, *pn
;
83 struct wlantest_radius_secret
*s
, *sn
;
84 struct wlantest_radius
*r
, *rn
;
85 struct wlantest_pmk
*pmk
, *np
;
87 if (wt
->ctrl_sock
>= 0)
89 if (wt
->monitor_sock
>= 0)
91 dl_list_for_each_safe(bss
, n
, &wt
->bss
, struct wlantest_bss
, list
)
93 dl_list_for_each_safe(p
, pn
, &wt
->passphrase
,
94 struct wlantest_passphrase
, list
)
96 dl_list_for_each_safe(s
, sn
, &wt
->secret
,
97 struct wlantest_radius_secret
, list
)
99 dl_list_for_each_safe(r
, rn
, &wt
->radius
, struct wlantest_radius
, list
)
101 dl_list_for_each_safe(pmk
, np
, &wt
->pmk
, struct wlantest_pmk
, list
)
103 write_pcap_deinit(wt
);
107 static void add_passphrase(struct wlantest
*wt
, const char *passphrase
)
109 struct wlantest_passphrase
*p
;
110 size_t len
= os_strlen(passphrase
);
112 if (len
< 8 || len
> 63)
114 p
= os_zalloc(sizeof(*p
));
117 os_memcpy(p
->passphrase
, passphrase
, len
);
118 dl_list_add(&wt
->passphrase
, &p
->list
);
122 static void add_secret(struct wlantest
*wt
, const char *secret
)
124 struct wlantest_radius_secret
*s
;
125 size_t len
= os_strlen(secret
);
127 if (len
>= MAX_RADIUS_SECRET_LEN
)
129 s
= os_zalloc(sizeof(*s
));
132 os_memcpy(s
->secret
, secret
, len
);
133 dl_list_add(&wt
->secret
, &s
->list
);
137 int main(int argc
, char *argv
[])
140 const char *read_file
= NULL
;
141 const char *read_wired_file
= NULL
;
142 const char *write_file
= NULL
;
143 const char *ifname
= NULL
;
144 const char *ifname_wired
= NULL
;
148 wpa_debug_level
= MSG_INFO
;
149 wpa_debug_show_keys
= 1;
151 if (os_program_init())
157 c
= getopt(argc
, argv
, "cdhi:I:p:P:qr:R:w:");
165 if (wpa_debug_level
> 0)
175 ifname_wired
= optarg
;
178 add_passphrase(&wt
, optarg
);
181 add_secret(&wt
, optarg
);
190 read_wired_file
= optarg
;
201 if (ifname
== NULL
&& ifname_wired
== NULL
&&
202 read_file
== NULL
&& read_wired_file
== NULL
) {
210 if (write_file
&& write_pcap_init(&wt
, write_file
) < 0)
213 if (read_wired_file
&& read_wired_cap_file(&wt
, read_wired_file
) < 0)
216 if (read_file
&& read_cap_file(&wt
, read_file
) < 0)
219 if (ifname
&& monitor_init(&wt
, ifname
) < 0)
222 if (ifname_wired
&& monitor_init_wired(&wt
, ifname_wired
) < 0)
225 if (ctrl_iface
&& ctrl_init(&wt
) < 0)
228 eloop_register_signal_terminate(wlantest_terminate
, &wt
);
232 wpa_printf(MSG_INFO
, "Processed: rx_mgmt=%u rx_ctrl=%u rx_data=%u "
234 wt
.rx_mgmt
, wt
.rx_ctrl
, wt
.rx_data
, wt
.fcs_error
);
236 wlantest_deinit(&wt
);