16258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper#include <errno.h>
2159ac52b061c60947a943c102298cd692223274fMark Wielaard
3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include <netlink/genl/genl.h>
46258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper#include <netlink/genl/family.h>
5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include <netlink/genl/ctrl.h>
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include <netlink/msg.h>
76258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper#include <netlink/attr.h>
8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "nl80211.h"
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "iw.h"
11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaardstatic int iw_conn(struct nl80211_state *state, struct nl_cb *cb,
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard		   struct nl_msg *msg, int argc, char **argv,
14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard		   enum id_input id)
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard{
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard	char *end;
17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard	unsigned char bssid[6];
18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard	int freq;
19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard	if (argc < 1)
216258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper		return 1;
226258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper
236258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	/* SSID */
246258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	NLA_PUT(msg, NL80211_ATTR_SSID, strlen(argv[0]), argv[0]);
25de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard	argv++;
26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard	argc--;
27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard
286258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	/* freq */
296258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	if (argc) {
306258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper		freq = strtoul(argv[0], &end, 10);
31b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		if (*end == '\0') {
326258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper			NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
33b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			argv++;
34b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			argc--;
356258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper		}
36b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	}
37b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
38b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	/* bssid */
39b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (argc) {
40159ac52b061c60947a943c102298cd692223274fMark Wielaard		if (mac_addr_a2n(bssid, argv[0]) == 0) {
41b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			NLA_PUT(msg, NL80211_ATTR_MAC, 6, bssid);
42b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			argv++;
43b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			argc--;
44b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		}
45b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	}
46b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
47159ac52b061c60947a943c102298cd692223274fMark Wielaard	if (!argc)
48b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return 0;
49b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
50b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
51b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return 1;
52b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
53b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	argv++;
546258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	argc--;
55b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
56b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	return parse_keys(msg, argv, argc);
57b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh nla_put_failure:
586258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	return -ENOSPC;
59b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh}
60b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
61b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsiehstatic int disconnect(struct nl80211_state *state,
62b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		      struct nl_cb *cb,
63b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		      struct nl_msg *msg,
64b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		      int argc, char **argv,
65b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		      enum id_input id)
66b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh{
67b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	return 0;
68b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh}
69b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung HsiehTOPLEVEL(disconnect, NULL,
70b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	NL80211_CMD_DISCONNECT, 0, CIB_NETDEV, disconnect,
71b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	"Disconnect from the current network.");
72b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
73b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsiehstatic int iw_connect(struct nl80211_state *state, struct nl_cb *cb,
74b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		      struct nl_msg *msg, int argc, char **argv,
75b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		      enum id_input id)
76b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh{
77b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	char **conn_argv, *dev = argv[0];
78b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	static const __u32 cmds[] = {
79b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		NL80211_CMD_CONNECT,
80b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	};
816258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	struct print_event_args printargs = { };
826258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	int conn_argc, err;
83b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	bool wait = false;
84b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	int i;
85b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
86b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	/* strip "wlan0 connect" */
87b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	argc -= 2;
88b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	argv += 2;
89b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
90b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	/* check -w */
91b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (argc && strcmp(argv[0], "-w") == 0) {
92b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		wait = true;
93b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		argc--;
94b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		argv++;
95b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	}
96b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
97b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	err = __prepare_listen_events(state);
98b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (err)
99b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return err;
100b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
101b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	conn_argc = 3 + argc;
102b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	conn_argv = calloc(conn_argc, sizeof(*conn_argv));
103b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (!conn_argv)
10442f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath		return -ENOMEM;
105b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
106b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	conn_argv[0] = dev;
10742f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath	conn_argv[1] = "connect";
108b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	conn_argv[2] = "establish";
109b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	for (i = 0; i < argc; i++)
110b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		conn_argv[i + 3] = argv[i];
111b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	err = handle_cmd(state, id, conn_argc, conn_argv);
112b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	free(conn_argv);
113b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (err)
114b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return err;
115b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
116b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (!wait)
117b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return 0;
118b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
119b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	/*
120b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * WARNING: DO NOT COPY THIS CODE INTO YOUR APPLICATION
121b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 *
122b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * This code has a bug:
123b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 *
12442f686820a19806da629990bf7ae69a6a2fcfb1fRoland McGrath	 * It is possible for a connect result message from another
125b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * connect attempt to be processed here first, because we
126b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * start listening to the multicast group before starting
127b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * our own connect request, which may succeed but we get a
128b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * fail message from a previous attempt that raced with us,
129b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * or similar.
130b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 *
131b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * The only proper way to fix this would be to listen to events
132159ac52b061c60947a943c102298cd692223274fMark Wielaard	 * before sending the command, and for the kernel to send the
133159ac52b061c60947a943c102298cd692223274fMark Wielaard	 * connect request or a cookie along with the event, so that you
134159ac52b061c60947a943c102298cd692223274fMark Wielaard	 * can match up whether the connect _you_ requested was finished
135b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 * or aborted.
136b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 *
137159ac52b061c60947a943c102298cd692223274fMark Wielaard	 * Alas, the kernel doesn't do that (yet).
138b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	 */
139159ac52b061c60947a943c102298cd692223274fMark Wielaard
140159ac52b061c60947a943c102298cd692223274fMark Wielaard	__do_listen_events(state, ARRAY_SIZE(cmds), cmds, &printargs);
141159ac52b061c60947a943c102298cd692223274fMark Wielaard	return 0;
142b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh}
143b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung HsiehTOPLEVEL(connect, "[-w] <SSID> [<freq in MHz>] [<bssid>] [key 0:abcde d:1:6162636465]",
144b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	0, 0, CIB_NETDEV, iw_connect,
145159ac52b061c60947a943c102298cd692223274fMark Wielaard	"Join the network with the given SSID (and frequency, BSSID).\n"
146159ac52b061c60947a943c102298cd692223274fMark Wielaard	"With -w, wait for the connect to finish or fail.");
147159ac52b061c60947a943c102298cd692223274fMark WielaardHIDDEN(connect, establish, "", NL80211_CMD_CONNECT, 0, CIB_NETDEV, iw_conn);
148b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
149b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsiehstatic int iw_auth(struct nl80211_state *state, struct nl_cb *cb,
150b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		   struct nl_msg *msg, int argc, char **argv,
151b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		   enum id_input id)
152b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh{
153159ac52b061c60947a943c102298cd692223274fMark Wielaard	char *end;
154b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	unsigned char bssid[6];
155b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	int freq;
156b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	bool need_key = false;
157b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
158b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (argc < 4)
159159ac52b061c60947a943c102298cd692223274fMark Wielaard		return 1;
160159ac52b061c60947a943c102298cd692223274fMark Wielaard
161159ac52b061c60947a943c102298cd692223274fMark Wielaard	/* SSID */
162159ac52b061c60947a943c102298cd692223274fMark Wielaard	NLA_PUT(msg, NL80211_ATTR_SSID, strlen(argv[0]), argv[0]);
163159ac52b061c60947a943c102298cd692223274fMark Wielaard	argv++;
164b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	argc--;
165b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
166b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	/* bssid */
167b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (mac_addr_a2n(bssid, argv[0]) == 0) {
168b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		NLA_PUT(msg, NL80211_ATTR_MAC, 6, bssid);
169159ac52b061c60947a943c102298cd692223274fMark Wielaard		argv++;
170159ac52b061c60947a943c102298cd692223274fMark Wielaard		argc--;
171159ac52b061c60947a943c102298cd692223274fMark Wielaard	} else {
172159ac52b061c60947a943c102298cd692223274fMark Wielaard		return 1;
173159ac52b061c60947a943c102298cd692223274fMark Wielaard	}
174159ac52b061c60947a943c102298cd692223274fMark Wielaard
175159ac52b061c60947a943c102298cd692223274fMark Wielaard	/* FIXME */
176b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	if (strcmp(argv[0], "open") == 0) {
177b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE,
178b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			    NL80211_AUTHTYPE_OPEN_SYSTEM);
179159ac52b061c60947a943c102298cd692223274fMark Wielaard	} else if (strcmp(argv[0], "shared") == 0) {
180b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		NLA_PUT_U32(msg, NL80211_ATTR_AUTH_TYPE,
181b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh			    NL80211_AUTHTYPE_SHARED_KEY);
182159ac52b061c60947a943c102298cd692223274fMark Wielaard		need_key = true;
183159ac52b061c60947a943c102298cd692223274fMark Wielaard	} else {
184b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return 1;
185b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	}
186b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	argv++;
187b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	argc--;
188b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
189159ac52b061c60947a943c102298cd692223274fMark Wielaard	freq = strtoul(argv[0], &end, 10);
190159ac52b061c60947a943c102298cd692223274fMark Wielaard	if (*end == '\0') {
191b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq);
192159ac52b061c60947a943c102298cd692223274fMark Wielaard		argv++;
193b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		argc--;
194b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	} else {
195b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return 1;
196b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh	}
197ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard
1986258e7486eb3eed6e50005946795c5fbf73aa106Ulrich Drepper	if (!argc && need_key)
199ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard		return 1;
200159ac52b061c60947a943c102298cd692223274fMark Wielaard	if (argc && !need_key)
201ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard		return 1;
202819c349f6339512d6961a6172c539fdf2c2f1328Mark Wielaard	if (!argc)
203159ac52b061c60947a943c102298cd692223274fMark Wielaard		return 0;
204b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
205159ac52b061c60947a943c102298cd692223274fMark Wielaard	if (strcmp(*argv, "key") != 0 && strcmp(*argv, "keys") != 0)
206b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh		return 1;
207b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
208ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard	argv++;
209ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard	argc--;
210b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
211ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard	return parse_keys(msg, argv, argc);
212ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard nla_put_failure:
213ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark Wielaard	return -ENOSPC;
214c76f0b05676f6207affbfd85e75063db3b6eeccfRoland McGrath}
215b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh
216ef431cd30b8a1a6b12a8783516fc95da88a9a636Mark WielaardTOPLEVEL(auth, "<SSID> <bssid> <type:open|shared> <freq in MHz> [key 0:abcde d:1:6162636465]",
217159ac52b061c60947a943c102298cd692223274fMark Wielaard	 NL80211_CMD_AUTHENTICATE, 0, CIB_NETDEV, iw_auth,
218159ac52b061c60947a943c102298cd692223274fMark Wielaard	 "Authenticate with the given network.\n");
219b1450614fd26d1a9b8ee17fe3f0290d23ddd0748Chih-Hung Hsieh