aboutsummaryrefslogtreecommitdiff
path: root/firmwares/wifishield/wifiHD/src/util.c
diff options
context:
space:
mode:
authorDavid A. Mellis <d.mellis@arduino.cc>2012-09-13 10:42:25 -0400
committerDavid A. Mellis <d.mellis@arduino.cc>2012-09-13 10:42:25 -0400
commitbd45bf50c7c68ec35c3aad8c5e7bf4d3db9cafc1 (patch)
treec02065cc7b15ce5f0a8eaa9f0030a268b37c89bb /firmwares/wifishield/wifiHD/src/util.c
parent6225a8596005bfb0be68fa641f5b47d01a95c12d (diff)
parent0d9a111face4f3629bcae8e52af843792af3b453 (diff)
Merge branch 'master' of ../wifishield
Diffstat (limited to 'firmwares/wifishield/wifiHD/src/util.c')
-rw-r--r--firmwares/wifishield/wifiHD/src/util.c260
1 files changed, 260 insertions, 0 deletions
diff --git a/firmwares/wifishield/wifiHD/src/util.c b/firmwares/wifishield/wifiHD/src/util.c
new file mode 100644
index 0000000..c01edeb
--- /dev/null
+++ b/firmwares/wifishield/wifiHD/src/util.c
@@ -0,0 +1,260 @@
+/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
+
+/*! \page License
+ * Copyright (C) 2009, H&D Wireless AB All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
+ * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <top_defs.h>
+#include <util.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <wl_api.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <string.h>
+#include <printf-stdarg.h>
+
+const char* ip2str(struct ip_addr addr)
+{
+ static char buf[16];
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu",
+ addr.addr & 0xff,
+ (addr.addr >> 8) & 0xff,
+ (addr.addr >> 16) & 0xff,
+ (addr.addr >> 24) & 0xff);
+ return buf;
+#else
+ sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu",
+ (addr.addr >> 24) & 0xff,
+ (addr.addr >> 16) & 0xff,
+ (addr.addr >> 8) & 0xff,
+ (addr.addr) & 0xff);
+ return buf;
+#endif
+}
+
+struct ip_addr str2ip(const char* str)
+{
+ int a,b,c,d;
+ uint32_t ip = 0;
+ struct ip_addr addr;
+
+ if (siscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d) != 4)
+ goto out;
+
+ if (a < 0 || a > 255 || b < 0 || b > 255 ||
+ c < 0 || c > 255 || d < 0 || d > 255) {
+ goto out;
+ }
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ ip = (d << 24) | (c << 16) | (b << 8) | a;
+#else
+ ip = (a << 24) | (b << 16) | (c << 8) | d;
+#endif
+
+ out:
+ addr.addr = ip;
+ return addr;
+}
+
+uint8_t ascii_to_key(char *outp, const char *inp) {
+ char buf[3];
+ int len;
+ buf[2] = '\0';
+ len = strlen(inp);
+ if (len % 2) {
+ printk("Invalid length\n");
+ }
+ len = 0;
+ while (*inp) {
+ if (! isxdigit(*inp) || ! isxdigit(*(inp+1)) ||
+ len > WL_MAX_PASS_LEN) {
+ return 0;
+ }
+ buf[0] = *inp++;
+ buf[1] = *inp++;
+ *outp++ = strtol(buf, NULL, 16);
+ len++;
+ }
+ return len;
+}
+
+
+
+void printbuf(const char *prefix, const void *data, size_t len)
+{
+ const unsigned char *s = data;
+ int i, j;
+
+ for (i = 0; i < len; i += 16)
+ {
+ printk("%s ", prefix);
+ for(j = 0; j < 16; j++) {
+ if(i + j >= len)
+ printk(" ");
+ else
+ printk("%02X ", (uint16_t)s[i + j]);
+ }
+ printk(": ");
+ for(j = 0; j < 16; j++) {
+ if(i + j >= len)
+ break;
+ if(s[i+j] >= 32 && s[i+j] < 127)
+ printk("%c", s[i + j]);
+ else
+ printk(".");
+ }
+ printk("\n");
+ }
+}
+
+
+void print_network(struct wl_network_t* wl_network)
+{
+ printk("%s ", mac2str(wl_network->bssid.octet));
+ printk("\"%s\"", ssid2str(&wl_network->ssid));
+ printk(" RSSI %d dBm ", wl_network->rssi);
+ switch(wl_network->net_type) {
+ case WL_CONN_TYPE_ADHOC:
+ printk(" Ad-Hoc ");
+ break;
+ default :
+ break;
+ }
+ switch (wl_network->enc_type) {
+ case ENC_TYPE_WEP :
+ printk(" (WEP encryption)");
+ break;
+ case ENC_TYPE_TKIP :
+ printk(" (TKIP encryption)");
+ break;
+ case ENC_TYPE_CCMP :
+ printk(" (CCMP encryption)");
+ break;
+ case ENC_TYPE_NONE :
+ break;
+ }
+ printk("\n");
+
+}
+
+void print_network_list(void)
+{
+ struct wl_network_list_t* wl_network_list;
+ uint8_t i;
+
+ wl_get_network_list(&wl_network_list);
+
+ if (wl_network_list->cnt == 0)
+ printk("no nets found\n");
+
+ for (i = 0; i < wl_network_list->cnt; i++)
+ print_network(wl_network_list->net[i]);
+}
+
+int join_argv(char *dst, size_t dst_len, int argc, char* argv[]) {
+ char *p = dst;
+ int i;
+ int len = 0;
+
+ /* Not really kosher, an ssid may legally contain 0-bytes but
+ * the console interface does not deal with that.
+ */
+ for (i = 0; i < argc; i++) {
+ len += strlen(argv[i]);
+ if (len > dst_len) {
+ printk("ssid too long (max %d)\n", (int) dst_len);
+ return 0;
+ }
+ p += sniprintf(p,
+ dst_len - (p - dst),
+ "%s ",
+ argv[i]);
+ }
+ if (p == dst) {
+ return 0;
+ }
+ p--;
+ *p = '\0'; /* Delete last space */
+
+ return p - dst;
+}
+
+const char* ssid2str(struct wl_ssid_t *ssid) {
+ static char buf[WL_SSID_MAX_LENGTH + 1];
+
+ memset(buf, 0, sizeof buf);
+ memcpy(buf, ssid->ssid, ssid->len);
+
+ return buf;
+}
+
+
+const char* mac2str(uint8_t* mac)
+{
+ static char buf[18];
+ sniprintf(buf, sizeof(buf), "%02x-%02x-%02x-%02x-%02x-%02x",
+ mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
+ return buf;
+}
+
+
+char* enc_type2str(enum wl_enc_type enc_type)
+{
+ switch(enc_type) {
+ case ENC_TYPE_WEP:
+ return "WEP";
+ case ENC_TYPE_CCMP:
+ return "CCMP";
+ case ENC_TYPE_TKIP:
+ return "TKIP";
+ default:
+ return "";
+ };
+}
+
+int equal_ssid(const struct wl_ssid_t* ssid1,
+ const struct wl_ssid_t* ssid2) {
+ if (ssid1->len == ssid2->len &&
+ (memcmp(ssid1->ssid, ssid2->ssid, ssid1->len) == 0)) {
+ return 1;
+ }
+ return 0;
+}
+
+int equal_bssid(const struct wl_mac_addr_t* bssid1,
+ const struct wl_mac_addr_t* bssid2) {
+ if (memcmp(bssid1, bssid2, sizeof *bssid1) == 0) {
+ return 1;
+ }
+ return 0;
+}
+
+