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