00001
00028 #include <ctype.h>
00029
00030 #include "cmd_wl.h"
00031
00032 #include "wl_cm.h"
00033 #include "console.h"
00034 #include "wl_util.h"
00035 #include "util.h"
00036 #include "lwip/netif.h"
00037
00041 cmd_state_t
00042 cmd_scan(int argc, char* argv[], void* ctx)
00043 {
00044
00045
00046
00047 wl_scan();
00048 print_network_list();
00049 return CMD_DONE;
00050 }
00051
00052
00056 cmd_state_t
00057 cmd_connect(int argc, char* argv[], void* ctx)
00058 {
00059 struct wl_ssid_t ssid;
00060 char desired_ssid[WL_SSID_MAX_LENGTH];
00061 int len = 0;
00062
00063 if (argc < 2) {
00064 printk("usage: connect <ssid>\n");
00065 return CMD_DONE;
00066 }
00067
00068 len = join_argv(desired_ssid, sizeof desired_ssid, argc - 1, argv + 1);
00069 if (0 == len) {
00070 return CMD_DONE;
00071 }
00072
00073 memcpy(ssid.ssid, desired_ssid, len);
00074 ssid.len = len;
00075 wl_cm_set_network(&ssid, NULL);
00076 return CMD_DONE;
00077 }
00078
00079
00080 #ifdef WITH_WPA
00081
00085 cmd_state_t
00086 cmd_delpass(int argc, char* argv[], void* ctx)
00087 {
00088 const char *usage = "usage: dpass <ssid>\n";
00089 struct wl_network_t net;
00090 char desired_ssid[WL_SSID_MAX_LENGTH];
00091 int len = 0;
00092
00093 if (argc != 2) {
00094 printk(usage);
00095 return CMD_DONE;
00096 }
00097
00098 memset(&net, 0, sizeof net);
00099 memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet);
00100
00101 len = join_argv(desired_ssid, sizeof desired_ssid, argc - 1, argv + 1);
00102 if (0 == len) {
00103 return CMD_DONE;
00104 }
00105 memcpy(net.ssid.ssid, desired_ssid, len);
00106 net.ssid.len = len;
00107 net.enc_type = ENC_TYPE_AUTO;
00108 if (wl_clear_passphrase(&net) != WL_SUCCESS) {
00109 printk("%s : Failed to delete passphrase\n", __func__);
00110 }
00111
00112 return CMD_DONE;
00113 }
00114
00115
00119 cmd_state_t
00120 cmd_setpass(int argc, char* argv[], void* ctx)
00121 {
00122 const char *usage = "usage: wpass <ssid> <passphrase>\n";
00123 struct wl_network_t net;
00124 char desired_ssid[WL_SSID_MAX_LENGTH];
00125 int len = 0;
00126
00127 if (argc < 3) {
00128 printk(usage);
00129 return CMD_DONE;
00130 }
00131
00132
00133
00134 memset(&net, 0, sizeof net);
00135 memset(net.bssid.octet, 0xFF, sizeof net.bssid.octet);
00136
00137 len = join_argv(desired_ssid, sizeof desired_ssid, argc - 2, argv + 1);
00138 if (0 == len) {
00139 return CMD_DONE;
00140 }
00141
00142 memcpy(net.ssid.ssid, desired_ssid, len);
00143 net.ssid.len = len;
00144 net.enc_type = ENC_TYPE_AUTO;
00145 if (wl_set_passphrase(&net,
00146 argv[argc - 1],
00147 strlen(argv[argc - 1]),
00148 ENC_TYPE_AUTO,
00149 AUTH_MODE_AUTO)
00150 != WL_SUCCESS) {
00151 printk("%s : Failed to add passphrase\n", __func__);
00152 }
00153
00154 return CMD_DONE;
00155 }
00156 #endif
00157
00158
00162 cmd_state_t
00163 cmd_status(int argc, char* argv[], void* ctx)
00164 {
00165 struct wl_network_t* net;
00166 uint8_t mac[WL_MAC_ADDR_LENGTH];
00167
00168 printk("wl_api version " WL_API_RELEASE_NAME "\n");
00169
00170 if (wl_get_mac_addr(mac) != WL_SUCCESS) {
00171 printk("failed to get mac address\n");
00172 return CMD_DONE;
00173 }
00174 printk("hw addr: %s\n", mac2str(mac));
00175
00176
00177 net = wl_get_current_network();
00178 printk("link status: ");
00179 if (!net) {
00180 printk("down\n");
00181 return CMD_DONE;
00182 }
00183 print_network(net);
00184
00185
00186 if (netif_is_up(netif_default))
00187 printk("ip addr: %s\n", ip2str(netif_default->ip_addr));
00188 else
00189 printk("ip addr: none\n");
00190
00191 return CMD_DONE;
00192 }
00193
00194
00198 cmd_state_t
00199 cmd_power(int argc, char* argv[], void* ctx)
00200 {
00201 const char *usage = "usage: powersave <on|off>\n";
00202
00203 if (argc < 2) {
00204 printk(usage);
00205 return CMD_DONE;
00206 }
00207
00208 if (!strcmp(argv[1], "on")) {
00209 if (wl_enable_ps() != WL_SUCCESS) {
00210 printk("could not enable power save\n");
00211 return CMD_DONE;
00212 }
00213 return CMD_DONE;
00214 }
00215 else if(!strcmp(argv[1], "off")) {
00216 if (wl_disable_ps() != WL_SUCCESS) {
00217 printk("could not disable power save\n");
00218 return CMD_DONE;
00219 }
00220 return CMD_DONE;
00221 }
00222
00223 printk(usage);
00224 return CMD_DONE;
00225 }
00226
00227
00231 cmd_state_t
00232 cmd_psconf(int argc, char* argv[], void* ctx)
00233 {
00234 const char *usage =
00235 "usage: psconf <use_ps_poll> (0/1 default 0)\n" \
00236 " <traffic_timeout> ([ms] default 10)\n" \
00237 " <ps_delay> ([ms] default 5000)\n"\
00238 " <rx_all_dtim> (0/1 default 1)\n"\
00239 " <listen_interval> ([beacons] default 20)\n";
00240
00241 uint8_t use_ps_poll;
00242 uint32_t traffic_timeout;
00243 uint32_t ps_delay;
00244 uint8_t rx_all_dtim;
00245 uint16_t listen_interval;
00246
00247 if (argc < 6) {
00248 printk(usage);
00249 return CMD_DONE;
00250 }
00251
00252 use_ps_poll = atoi(argv[1]);
00253 traffic_timeout = atoi(argv[2]);
00254 ps_delay = atoi(argv[3]);
00255 rx_all_dtim = atoi(argv[4]);
00256 listen_interval = atoi(argv[5]);
00257
00258 if (use_ps_poll > 1) {
00259 printk(usage);
00260 return CMD_DONE;
00261 }
00262
00263 if (rx_all_dtim > 1) {
00264 printk(usage);
00265 return CMD_DONE;
00266 }
00267
00268 if (wl_conf_ps(use_ps_poll, traffic_timeout, ps_delay,
00269 rx_all_dtim, listen_interval) != WL_SUCCESS)
00270 printk("configuration failed\n");
00271
00272 return CMD_DONE;
00273 }
00274
00275 #define MAX_KEY_LEN 64
00276
00280 static uint8_t ascii_to_key(char *outp, const char *inp) {
00281 char buf[3];
00282 int len;
00283 buf[2] = '\0';
00284 len = strlen(inp);
00285 if (len % 2) {
00286 printk("Invalid length\n");
00287 }
00288 len = 0;
00289 while (*inp) {
00290 if (! isxdigit(*inp) || ! isxdigit(*(inp+1)) ||
00291 len > MAX_KEY_LEN) {
00292 return 0;
00293 }
00294 buf[0] = *inp++;
00295 buf[1] = *inp++;
00296 *outp++ = strtol(buf, NULL, 16);
00297 len++;
00298 }
00299 return len;
00300 }
00301
00302
00306 cmd_state_t
00307 cmd_setkey(int argc, char* argv[], void* ctx)
00308 {
00309 int idx, len;
00310 char key[13];
00311 struct wl_mac_addr_t bssid;
00312 const char *usage = "usage: setkey <key_idx (0-3)> <key in hex>\n\t "\
00313 "or: setkey none\n";
00314
00315 memset(&bssid.octet, 0xff, sizeof bssid.octet);
00316 if (argc == 2 && strcmp(argv[1], "none") == 0) {
00317 printk("Deleting WEP keys\n");
00318 wl_set_auth_mode(AUTH_MODE_OPEN_SYSTEM);
00319 wl_delete_wep_key(0, &bssid);
00320 wl_delete_wep_key(1, &bssid);
00321 wl_delete_wep_key(2, &bssid);
00322 wl_delete_wep_key(3, &bssid);
00323 return CMD_DONE;
00324 }
00325 if (argc < 3) {
00326 printk(usage);
00327 return CMD_DONE;
00328 }
00329 idx = atoi(argv[1]);
00330 len = ascii_to_key(key, argv[2]);
00331 if (0 == len || idx > 3 || idx < 0 || (idx == 0 && *argv[1] != '0')) {
00332 printk(usage);
00333 return CMD_DONE;
00334 }
00335 if (len != 5 && len != 13) {
00336 printk(" WEP key must be 10 (WEP-40) or 26 (WEP-104) digits\n");
00337 return CMD_DONE;
00338 }
00339 wl_add_wep_key(idx, len, key, &bssid);
00340 wl_set_auth_mode(AUTH_MODE_SHARED_KEY);
00341 wl_set_default_wep_key(idx);
00342
00343 return CMD_DONE;
00344 }