ZG2100 Network interface source
drv/zg2100/zg_if.c@0:b802fc31f1db, 2010-07-09 (annotated)
- Committer:
- donatien
- Date:
- Fri Jul 09 15:37:23 2010 +0000
- Revision:
- 0:b802fc31f1db
- Child:
- 1:3a7c15057192
Who changed what in which revision?
User | Revision | Line number | New 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 |