ZG2100 Network interface source

Committer:
donatien
Date:
Fri Jul 09 15:37:23 2010 +0000
Revision:
0:b802fc31f1db
Child:
1:3a7c15057192

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:b802fc31f1db 1
donatien 0:b802fc31f1db 2 /*
donatien 0:b802fc31f1db 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
donatien 0:b802fc31f1db 4
donatien 0:b802fc31f1db 5 Permission is hereby granted, free of charge, to any person obtaining a copy
donatien 0:b802fc31f1db 6 of this software and associated documentation files (the "Software"), to deal
donatien 0:b802fc31f1db 7 in the Software without restriction, including without limitation the rights
donatien 0:b802fc31f1db 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
donatien 0:b802fc31f1db 9 copies of the Software, and to permit persons to whom the Software is
donatien 0:b802fc31f1db 10 furnished to do so, subject to the following conditions:
donatien 0:b802fc31f1db 11
donatien 0:b802fc31f1db 12 The above copyright notice and this permission notice shall be included in
donatien 0:b802fc31f1db 13 all copies or substantial portions of the Software.
donatien 0:b802fc31f1db 14
donatien 0:b802fc31f1db 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:b802fc31f1db 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:b802fc31f1db 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:b802fc31f1db 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:b802fc31f1db 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:b802fc31f1db 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
donatien 0:b802fc31f1db 21 THE SOFTWARE.
donatien 0:b802fc31f1db 22 */
donatien 0:b802fc31f1db 23
donatien 0:b802fc31f1db 24 #include "netCfg.h"
donatien 0:b802fc31f1db 25 #if NET_ZG2100
donatien 0:b802fc31f1db 26
donatien 0:b802fc31f1db 27 #include "zg_defs.h"
donatien 0:b802fc31f1db 28 #include "zg_drv.h"
donatien 0:b802fc31f1db 29 #include "zg_if.h"
donatien 0:b802fc31f1db 30
donatien 0:b802fc31f1db 31 //#define __DEBUG
donatien 0:b802fc31f1db 32 #include "dbg/dbg.h"
donatien 0:b802fc31f1db 33
donatien 0:b802fc31f1db 34 #include "string.h"
donatien 0:b802fc31f1db 35
donatien 0:b802fc31f1db 36 char m_ssid[ZG_SSID_LEN+1] = {0};
donatien 0:b802fc31f1db 37 zg_err connection_result = (zg_err)0; //Disc
donatien 0:b802fc31f1db 38
donatien 0:b802fc31f1db 39 #ifdef __DEBUG
donatien 0:b802fc31f1db 40 /*inline*/ void hexdump(byte* buffer, int size) {
donatien 0:b802fc31f1db 41 for(int i = 0; i < size; ++i) {
donatien 0:b802fc31f1db 42 if((i%16)!=0) {
donatien 0:b802fc31f1db 43 DBG(" ");
donatien 0:b802fc31f1db 44 } else {
donatien 0:b802fc31f1db 45 DBG("%04X: ", (i));
donatien 0:b802fc31f1db 46 }
donatien 0:b802fc31f1db 47 printf("%02hhx", buffer[i]);
donatien 0:b802fc31f1db 48 if((i%16) == 7) {
donatien 0:b802fc31f1db 49 DBG(" ");
donatien 0:b802fc31f1db 50 }
donatien 0:b802fc31f1db 51 if((i%16) == 15) {
donatien 0:b802fc31f1db 52 DBG("\n");
donatien 0:b802fc31f1db 53 }
donatien 0:b802fc31f1db 54 }
donatien 0:b802fc31f1db 55 printf("\n\n\n");
donatien 0:b802fc31f1db 56 }
donatien 0:b802fc31f1db 57 #else
donatien 0:b802fc31f1db 58 #define hexdump(a,b)
donatien 0:b802fc31f1db 59 #endif
donatien 0:b802fc31f1db 60
donatien 0:b802fc31f1db 61 void zg_scan(byte channel)
donatien 0:b802fc31f1db 62 {
donatien 0:b802fc31f1db 63 //Prepare request
donatien 0:b802fc31f1db 64 ZG_SCAN_REQ* req = (ZG_SCAN_REQ*)fifo_buf;
donatien 0:b802fc31f1db 65 memset((void*)req, 0, sizeof(ZG_SCAN_REQ));
donatien 0:b802fc31f1db 66
donatien 0:b802fc31f1db 67 req->probe_delay = HTODS(ZG_SCAN_PROBE_DELAY);
donatien 0:b802fc31f1db 68
donatien 0:b802fc31f1db 69 req->min_chan_time = HTODS(ZG_SCAN_MIN_CHAN_TIME);
donatien 0:b802fc31f1db 70 req->max_chan_time = HTODS(ZG_SCAN_MAX_CHAN_TIME);
donatien 0:b802fc31f1db 71
donatien 0:b802fc31f1db 72 memset(req->bssid_mask, 0xFF, ZG_MACADDR_LEN); //Broadcast
donatien 0:b802fc31f1db 73
donatien 0:b802fc31f1db 74 req->bss_type = ZG_BSS_ANY;
donatien 0:b802fc31f1db 75 req->probe_req = ZG_PROBE_ACTIVE;
donatien 0:b802fc31f1db 76
donatien 0:b802fc31f1db 77 req->ssid_len = 0; //Do not filter by SSID
donatien 0:b802fc31f1db 78
donatien 0:b802fc31f1db 79 req->channels_count = 1; //Scan on all ETSI channels (1~13)
donatien 0:b802fc31f1db 80 req->channels[0] = channel;
donatien 0:b802fc31f1db 81
donatien 0:b802fc31f1db 82 //hexdump(fifo_buf, sizeof(ZG_SCAN_REQ));
donatien 0:b802fc31f1db 83
donatien 0:b802fc31f1db 84 DBG("\r\n\r\n");
donatien 0:b802fc31f1db 85
donatien 0:b802fc31f1db 86 //Send request
donatien 0:b802fc31f1db 87 zg_mgmt_req(ZG_FIFO_MGMT_SCAN, fifo_buf, sizeof(ZG_SCAN_REQ));
donatien 0:b802fc31f1db 88 }
donatien 0:b802fc31f1db 89
donatien 0:b802fc31f1db 90 void zg_on_scan_results(byte* buf, int len)
donatien 0:b802fc31f1db 91 {
donatien 0:b802fc31f1db 92 int i;
donatien 0:b802fc31f1db 93 int j;
donatien 0:b802fc31f1db 94 uint32_t rate;
donatien 0:b802fc31f1db 95 char ssid[ZG_SSID_LEN + 1];
donatien 0:b802fc31f1db 96 ZG_SCAN_ITEM* it;
donatien 0:b802fc31f1db 97 //Get result header
donatien 0:b802fc31f1db 98 ZG_SCAN_RES* res = (ZG_SCAN_RES*)buf;
donatien 0:b802fc31f1db 99
donatien 0:b802fc31f1db 100 //hexdump(buf, len);
donatien 0:b802fc31f1db 101
donatien 0:b802fc31f1db 102 DBG("\r\nScan result %d, with %d networks found\r\n",
donatien 0:b802fc31f1db 103 res->result, res->results_count);
donatien 0:b802fc31f1db 104
donatien 0:b802fc31f1db 105 if( res->result != 1 )
donatien 0:b802fc31f1db 106 {
donatien 0:b802fc31f1db 107 return; //Error
donatien 0:b802fc31f1db 108 }
donatien 0:b802fc31f1db 109 it = (ZG_SCAN_ITEM*)(buf + sizeof(ZG_SCAN_RES));
donatien 0:b802fc31f1db 110 for( i = 0; i < res->results_count; i++ )
donatien 0:b802fc31f1db 111 {
donatien 0:b802fc31f1db 112 //Display info
donatien 0:b802fc31f1db 113 DBG("\r\n---Result #%2d---\r\n",i+1);
donatien 0:b802fc31f1db 114
donatien 0:b802fc31f1db 115 memset(ssid, 0, ZG_SSID_LEN + 1);
donatien 0:b802fc31f1db 116 memcpy(ssid, it->ssid, it->ssid_len);
donatien 0:b802fc31f1db 117 DBG("SSID : %s\r\n", ssid);
donatien 0:b802fc31f1db 118
donatien 0:b802fc31f1db 119 DBG("BSSID : %02x:%02x:%02x:%02x:%02x:%02x\r\n",
donatien 0:b802fc31f1db 120 it->bssid[0], it->bssid[1], it->bssid[2],
donatien 0:b802fc31f1db 121 it->bssid[3], it->bssid[4], it->bssid[5]);
donatien 0:b802fc31f1db 122
donatien 0:b802fc31f1db 123 DBG("Supported rates : ");
donatien 0:b802fc31f1db 124 for( j = 0; j < it->supported_rates_count; j++ )
donatien 0:b802fc31f1db 125 {
donatien 0:b802fc31f1db 126 rate = it->supported_rates[j];
donatien 0:b802fc31f1db 127 rate = rate * 500;
donatien 0:b802fc31f1db 128 DBG("%u Kbps; ", rate);
donatien 0:b802fc31f1db 129 }
donatien 0:b802fc31f1db 130 DBG("\r\n");
donatien 0:b802fc31f1db 131
donatien 0:b802fc31f1db 132 DBG("RSSI : %d\r\n", it->rssi);
donatien 0:b802fc31f1db 133 DBG("Channel : %d\r\n", it->channel);
donatien 0:b802fc31f1db 134 DBG("Type : %d\r\n", it->bss_type);
donatien 0:b802fc31f1db 135
donatien 0:b802fc31f1db 136 DBG("---------------\r\n");
donatien 0:b802fc31f1db 137
donatien 0:b802fc31f1db 138 it++; //Next result
donatien 0:b802fc31f1db 139 }
donatien 0:b802fc31f1db 140 }
donatien 0:b802fc31f1db 141
donatien 0:b802fc31f1db 142 void zg_set_ssid(const char* ssid)
donatien 0:b802fc31f1db 143 {
donatien 0:b802fc31f1db 144 strcpy(m_ssid, ssid);
donatien 0:b802fc31f1db 145 }
donatien 0:b802fc31f1db 146
donatien 0:b802fc31f1db 147 void zg_set_wep_key(const byte* key, int len)
donatien 0:b802fc31f1db 148 {
donatien 0:b802fc31f1db 149 //Write 4 wep keys
donatien 0:b802fc31f1db 150 ZG_WEP_REQ* req = (ZG_WEP_REQ*)fifo_buf;
donatien 0:b802fc31f1db 151 memset((void*)req, 0, sizeof(ZG_WEP_REQ));
donatien 0:b802fc31f1db 152
donatien 0:b802fc31f1db 153 req->slot = 3; //WEP key slot
donatien 0:b802fc31f1db 154
donatien 0:b802fc31f1db 155 req->key_size = len; //FIXME: Assert 5 or 13 bytes long
donatien 0:b802fc31f1db 156 req->default_key = 0;
donatien 0:b802fc31f1db 157
donatien 0:b802fc31f1db 158 strncpy(req->ssid, m_ssid, ZG_SSID_LEN);
donatien 0:b802fc31f1db 159 req->ssid_len = strlen(m_ssid);
donatien 0:b802fc31f1db 160
donatien 0:b802fc31f1db 161 memcpy((void*)req->keys, key, len);
donatien 0:b802fc31f1db 162
donatien 0:b802fc31f1db 163 //Send request
donatien 0:b802fc31f1db 164 zg_mgmt_req(ZG_FIFO_MGMT_WEP_KEY, fifo_buf, sizeof(ZG_WEP_REQ));
donatien 0:b802fc31f1db 165 }
donatien 0:b802fc31f1db 166
donatien 0:b802fc31f1db 167 void zg_set_wpa_pass(const char* pass)
donatien 0:b802fc31f1db 168 {
donatien 0:b802fc31f1db 169 //Compute PNK key with this passphrase
donatien 0:b802fc31f1db 170 //On completion, zg_on_psk_key will be called
donatien 0:b802fc31f1db 171 ZG_PSK_CALC_REQ* req = (ZG_PSK_CALC_REQ*)fifo_buf;
donatien 0:b802fc31f1db 172 memset((void*)req, 0, sizeof(ZG_PSK_CALC_REQ));
donatien 0:b802fc31f1db 173
donatien 0:b802fc31f1db 174 req->config = 0;
donatien 0:b802fc31f1db 175
donatien 0:b802fc31f1db 176 req->phrase_len = strlen(pass);
donatien 0:b802fc31f1db 177
donatien 0:b802fc31f1db 178 strncpy(req->ssid, m_ssid, ZG_SSID_LEN);
donatien 0:b802fc31f1db 179 req->ssid_len = strlen(m_ssid);
donatien 0:b802fc31f1db 180
donatien 0:b802fc31f1db 181 strncpy(req->pass_phrase, pass, ZG_WPA_PASS_LEN);
donatien 0:b802fc31f1db 182
donatien 0:b802fc31f1db 183 //Send request
donatien 0:b802fc31f1db 184 zg_mgmt_req(ZG_FIFO_MGMT_PSK_CALC, fifo_buf, sizeof(ZG_PSK_CALC_REQ));
donatien 0:b802fc31f1db 185 }
donatien 0:b802fc31f1db 186
donatien 0:b802fc31f1db 187 void zg_on_psk_key(byte* buf, int len)
donatien 0:b802fc31f1db 188 {
donatien 0:b802fc31f1db 189 //Now the key has been computed and we can write it
donatien 0:b802fc31f1db 190 ZG_PSK_CALC_RES* res = (ZG_PSK_CALC_RES*) buf;
donatien 0:b802fc31f1db 191 if( (res->result != 1) || (res->key_returned != 1) )
donatien 0:b802fc31f1db 192 {
donatien 0:b802fc31f1db 193 DBG("\r\nCould not compute key, error %d\r\n", res->result);
donatien 0:b802fc31f1db 194 return; //Error
donatien 0:b802fc31f1db 195 }
donatien 0:b802fc31f1db 196
donatien 0:b802fc31f1db 197 DBG("\r\nPMK key is :\r\n");
donatien 0:b802fc31f1db 198 hexdump(res->key, ZG_PMK_LEN);
donatien 0:b802fc31f1db 199
donatien 0:b802fc31f1db 200 byte key[ZG_PMK_LEN];
donatien 0:b802fc31f1db 201 memcpy(key, res->key, ZG_PMK_LEN);
donatien 0:b802fc31f1db 202
donatien 0:b802fc31f1db 203 //Send next request
donatien 0:b802fc31f1db 204 zg_set_psk_key(key, ZG_PMK_LEN);
donatien 0:b802fc31f1db 205 }
donatien 0:b802fc31f1db 206
donatien 0:b802fc31f1db 207 void zg_set_psk_key(const byte* key, int len)
donatien 0:b802fc31f1db 208 {
donatien 0:b802fc31f1db 209 ZG_PMK_REQ* req = (ZG_PMK_REQ*)fifo_buf;
donatien 0:b802fc31f1db 210 memset((void*)req, 0, sizeof(ZG_PMK_REQ));
donatien 0:b802fc31f1db 211
donatien 0:b802fc31f1db 212 req->slot = 0; //WPA/WPA2 PSK slot
donatien 0:b802fc31f1db 213
donatien 0:b802fc31f1db 214 strncpy(req->ssid, m_ssid, ZG_SSID_LEN);
donatien 0:b802fc31f1db 215 req->ssid_len = strlen(m_ssid);
donatien 0:b802fc31f1db 216
donatien 0:b802fc31f1db 217 memcpy(req->key, key, ZG_PMK_LEN);
donatien 0:b802fc31f1db 218
donatien 0:b802fc31f1db 219 //Send request
donatien 0:b802fc31f1db 220 zg_mgmt_req(ZG_FIFO_MGMT_PMK_KEY, fifo_buf, sizeof(ZG_FIFO_MGMT_PMK_KEY));
donatien 0:b802fc31f1db 221 }
donatien 0:b802fc31f1db 222
donatien 0:b802fc31f1db 223 void zg_connect(ZG_BSS_TYPE type, ZG_SECURITY security)
donatien 0:b802fc31f1db 224 {
donatien 0:b802fc31f1db 225 ZG_CONNECT_REQ* req = (ZG_CONNECT_REQ*)fifo_buf;
donatien 0:b802fc31f1db 226 memset((void*)req, 0, sizeof(ZG_CONNECT_REQ));
donatien 0:b802fc31f1db 227
donatien 0:b802fc31f1db 228 req->security = security;
donatien 0:b802fc31f1db 229
donatien 0:b802fc31f1db 230 strncpy(req->ssid, m_ssid, ZG_SSID_LEN);
donatien 0:b802fc31f1db 231 req->ssid_len = strlen(m_ssid);
donatien 0:b802fc31f1db 232
donatien 0:b802fc31f1db 233 req->sleep_duration = HTODS( 0 );
donatien 0:b802fc31f1db 234
donatien 0:b802fc31f1db 235 req->bss_type = type;
donatien 0:b802fc31f1db 236
donatien 0:b802fc31f1db 237 //Send request
donatien 0:b802fc31f1db 238 zg_mgmt_req(ZG_FIFO_MGMT_CONNECT, fifo_buf, sizeof(ZG_CONNECT_REQ));
donatien 0:b802fc31f1db 239 }
donatien 0:b802fc31f1db 240
donatien 0:b802fc31f1db 241 void zg_on_connect(zg_err result)
donatien 0:b802fc31f1db 242 {
donatien 0:b802fc31f1db 243 connection_result = result;
donatien 0:b802fc31f1db 244 }
donatien 0:b802fc31f1db 245
donatien 0:b802fc31f1db 246 zg_err zg_get_connection_result()
donatien 0:b802fc31f1db 247 {
donatien 0:b802fc31f1db 248 return connection_result;
donatien 0:b802fc31f1db 249 }
donatien 0:b802fc31f1db 250
donatien 0:b802fc31f1db 251 void zg_disconnect()
donatien 0:b802fc31f1db 252 {
donatien 0:b802fc31f1db 253 ZG_DISCONNECT_REQ* req = (ZG_DISCONNECT_REQ*)fifo_buf;
donatien 0:b802fc31f1db 254 memset((void*)req, 0, sizeof(ZG_DISCONNECT_REQ));
donatien 0:b802fc31f1db 255
donatien 0:b802fc31f1db 256 req->reason_code = HTODS( 0 );
donatien 0:b802fc31f1db 257 req->disconnect = true;
donatien 0:b802fc31f1db 258 req->deauth_frame = true;
donatien 0:b802fc31f1db 259
donatien 0:b802fc31f1db 260 //Send request
donatien 0:b802fc31f1db 261 zg_mgmt_req(ZG_FIFO_MGMT_DISC, fifo_buf, sizeof(ZG_DISCONNECT_REQ));
donatien 0:b802fc31f1db 262
donatien 0:b802fc31f1db 263 connection_result = (zg_err)0;
donatien 0:b802fc31f1db 264 }
donatien 0:b802fc31f1db 265
donatien 0:b802fc31f1db 266 #endif