source: arduino-1-6-7/trunk/fuentes/arduino-ide-amd64/hardware/arduino/avr/firmwares/wifishield/wifiHD/src/util.c @ 4837

Last change on this file since 4837 was 4837, checked in by daduve, 2 years ago

Adding new version

File size: 7.4 KB
Line 
1/* This source file is part of the ATMEL AVR-UC3-SoftwareFramework-1.7.0 Release */
2
3/*! \page License
4 * Copyright (C) 2009, H&D Wireless AB All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice,
10 * this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice,
13 * this list of conditions and the following disclaimer in the documentation
14 * and/or other materials provided with the distribution.
15 *
16 * 3. The name of H&D Wireless AB may not be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY H&D WIRELESS AB ``AS IS'' AND ANY EXPRESS OR IMPLIED
20 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
22 * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30#include <top_defs.h>
31#include <util.h>
32#include <stdint.h>
33#include <stdlib.h>
34#include <wl_api.h>
35#include <stdio.h>
36#include <ctype.h>
37#include <errno.h>
38#include <string.h>
39#include <printf-stdarg.h>
40
41const char* ip2str(struct ip_addr addr)
42{
43    static char buf[16];
44
45#if BYTE_ORDER == LITTLE_ENDIAN
46        sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu",
47                  addr.addr & 0xff,
48                  (addr.addr >> 8) & 0xff,
49                  (addr.addr >> 16) & 0xff,
50                  (addr.addr >> 24) & 0xff);
51        return buf;
52#else
53        sniprintf(buf, sizeof(buf), "%lu.%lu.%lu.%lu",
54                 (addr.addr >> 24) & 0xff,
55                 (addr.addr >> 16) & 0xff,
56                 (addr.addr >> 8) & 0xff,
57                 (addr.addr) & 0xff);
58        return buf;
59#endif
60}
61
62struct ip_addr str2ip(const char* str)
63{
64        int a,b,c,d;
65        uint32_t ip = 0;
66        struct ip_addr addr;
67       
68        if (siscanf(str,"%d.%d.%d.%d",&a,&b,&c,&d) != 4)
69                goto out;
70
71        if (a < 0 || a > 255 || b < 0 || b > 255 ||
72            c < 0 || c > 255 || d < 0 || d > 255) {
73                goto out;
74        }
75
76#if BYTE_ORDER == LITTLE_ENDIAN
77        ip = (d << 24) | (c << 16) | (b << 8) | a;
78#else
79        ip = (a << 24) | (b << 16) | (c << 8) | d;
80#endif
81
82 out:
83        addr.addr = ip;
84        return addr;
85}
86
87uint8_t ascii_to_key(char *outp, const char *inp) {
88        char buf[3];
89        int len;
90        buf[2] = '\0';
91        len = strlen(inp);
92        if (len % 2) {
93                printk("Invalid length\n");
94        }
95        len = 0;
96        while (*inp) {
97                if (! isxdigit(*inp) || ! isxdigit(*(inp+1)) ||
98                    len > WL_MAX_PASS_LEN) {
99                        return 0;
100                }
101                buf[0] = *inp++;
102                buf[1] = *inp++;
103                *outp++ = strtol(buf, NULL, 16);
104                len++;
105        }
106        return len;
107}
108
109
110
111void printbuf(const char *prefix, const void *data, size_t len)
112{
113        const unsigned char *s = data;
114        int i, j;
115
116        for (i = 0; i < len; i += 16) 
117        {
118                printk("%s ", prefix);
119                for(j = 0; j < 16; j++) {
120                        if(i + j >= len)
121                                printk("   ");
122                        else
123                                printk("%02X ", (uint16_t)s[i + j]);
124                }
125                printk(": ");
126                for(j = 0; j < 16; j++) {
127                        if(i + j >= len)
128                                break;
129                        if(s[i+j] >= 32 && s[i+j] < 127)
130                                printk("%c", s[i + j]);
131                        else
132                                printk(".");
133                }
134                printk("\n");
135        }
136}
137
138
139void print_network(struct wl_network_t* wl_network)
140{
141        printk("%s ", mac2str(wl_network->bssid.octet));
142        printk("\"%s\"", ssid2str(&wl_network->ssid));
143        printk(" RSSI %d dBm ", wl_network->rssi);
144        switch(wl_network->net_type) {
145        case WL_CONN_TYPE_ADHOC:
146                printk(" Ad-Hoc ");
147                break;
148        default :
149                break;
150        }
151        switch (wl_network->enc_type) {
152        case ENC_TYPE_WEP :
153                printk(" (WEP encryption)");
154                break;
155        case ENC_TYPE_TKIP :
156                printk(" (TKIP encryption)");
157                break;
158        case ENC_TYPE_CCMP :
159                printk(" (CCMP encryption)");
160                break;
161        case ENC_TYPE_NONE :
162                break;
163        }
164        printk("\n");
165       
166}
167
168void print_network_list(void)
169{
170        struct wl_network_list_t* wl_network_list;
171        uint8_t i;
172       
173        wl_get_network_list(&wl_network_list);
174
175        if (wl_network_list->cnt == 0)
176                printk("no nets found\n");
177
178        for (i = 0; i < wl_network_list->cnt; i++)
179                print_network(wl_network_list->net[i]);
180}
181
182int join_argv(char *dst, size_t dst_len, int argc, char* argv[]) {
183        char *p = dst;
184        int i;
185        int len = 0;
186
187        /* Not really kosher, an ssid may legally contain 0-bytes but
188         * the console interface does not deal with that.
189         */
190        for (i = 0; i < argc; i++) {
191                len += strlen(argv[i]);
192                if (len > dst_len) {
193                        printk("ssid too long (max %d)\n", (int) dst_len);
194                        return 0;
195                }
196                p += sniprintf(p,
197                               dst_len - (p - dst), 
198                               "%s ", 
199                               argv[i]);
200        }
201        if (p == dst) {
202                return 0;
203        }
204        p--;
205        *p = '\0'; /* Delete last space */
206
207        return p - dst;
208}
209
210const char* ssid2str(struct wl_ssid_t *ssid) {
211        static char buf[WL_SSID_MAX_LENGTH + 1];
212
213        memset(buf, 0, sizeof buf);
214        memcpy(buf, ssid->ssid, ssid->len);
215
216        return buf;
217}
218
219
220const char* mac2str(uint8_t* mac)
221{
222        static char buf[18];
223        sniprintf(buf, sizeof(buf), "%02x-%02x-%02x-%02x-%02x-%02x",
224                 mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
225        return buf;
226}
227
228
229char* enc_type2str(enum wl_enc_type enc_type)
230{
231        switch(enc_type) {
232        case ENC_TYPE_WEP:
233                return "WEP";
234        case ENC_TYPE_CCMP:
235                return "CCMP";
236        case ENC_TYPE_TKIP:
237                return "TKIP";
238        default:
239                return "";
240        };
241}
242
243int equal_ssid(const struct wl_ssid_t* ssid1, 
244                const struct wl_ssid_t* ssid2) {
245        if (ssid1->len == ssid2->len &&
246            (memcmp(ssid1->ssid, ssid2->ssid, ssid1->len) == 0)) {
247                return 1;
248        }
249        return 0;
250}
251
252int equal_bssid(const struct wl_mac_addr_t* bssid1, 
253                 const struct wl_mac_addr_t* bssid2) {
254        if (memcmp(bssid1, bssid2, sizeof *bssid1) == 0) {
255                return 1;
256        }
257        return 0;
258}
259
260
Note: See TracBrowser for help on using the repository browser.