This is LWIPBP3595Interface class library. The base library is LWIPInterface.

Dependents:   LWIPBP3595Interface_STA

Committer:
tousaki
Date:
Tue May 31 05:56:27 2016 +0000
Revision:
1:abb17eced903
Parent:
0:a933851e5d22
Fixed the return type of connect()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tousaki 0:a933851e5d22 1 /* LWIPBP3595Interface.cpp */
tousaki 0:a933851e5d22 2 /* Copyright (C) 2016 Grape Systems, Inc. */
tousaki 0:a933851e5d22 3 /* The base file is LWIPInterface.cpp. */
tousaki 0:a933851e5d22 4
tousaki 0:a933851e5d22 5 /* LWIPInterface.cpp */
tousaki 0:a933851e5d22 6 /* LWIP implementation of NetworkInterfaceAPI
tousaki 0:a933851e5d22 7 * Copyright (c) 2015 ARM Limited
tousaki 0:a933851e5d22 8 *
tousaki 0:a933851e5d22 9 * Licensed under the Apache License, Version 2.0 (the "License");
tousaki 0:a933851e5d22 10 * you may not use this file except in compliance with the License.
tousaki 0:a933851e5d22 11 * You may obtain a copy of the License at
tousaki 0:a933851e5d22 12 *
tousaki 0:a933851e5d22 13 * http://www.apache.org/licenses/LICENSE-2.0
tousaki 0:a933851e5d22 14 *
tousaki 0:a933851e5d22 15 * Unless required by applicable law or agreed to in writing, software
tousaki 0:a933851e5d22 16 * distributed under the License is distributed on an "AS IS" BASIS,
tousaki 0:a933851e5d22 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tousaki 0:a933851e5d22 18 * See the License for the specific language governing permissions and
tousaki 0:a933851e5d22 19 * limitations under the License.
tousaki 0:a933851e5d22 20 */
tousaki 0:a933851e5d22 21
tousaki 0:a933851e5d22 22 #include "mbed.h"
tousaki 0:a933851e5d22 23 #include "LWIPBP3595Interface.h"
tousaki 0:a933851e5d22 24 #include "LWIPBP3595Interface_BssType.h"
tousaki 0:a933851e5d22 25 #include "WlanBP3595.h"
tousaki 0:a933851e5d22 26
tousaki 0:a933851e5d22 27 #include "lwip/inet.h"
tousaki 0:a933851e5d22 28 #include "lwip/netif.h"
tousaki 0:a933851e5d22 29 #include "lwip/dhcp.h"
tousaki 0:a933851e5d22 30 #include "lwip/tcpip.h"
tousaki 0:a933851e5d22 31 #include "lwip/sockets.h"
tousaki 0:a933851e5d22 32 #include "lwip/netdb.h"
tousaki 0:a933851e5d22 33 #include "netif/etharp.h"
tousaki 0:a933851e5d22 34 #include "wifi_arch.h"
tousaki 0:a933851e5d22 35 #include "lwip/netif.h"
tousaki 0:a933851e5d22 36 #include "lwip/udp.h"
tousaki 0:a933851e5d22 37 #include "lwip/tcp.h"
tousaki 0:a933851e5d22 38 #include "lwip/tcp_impl.h"
tousaki 0:a933851e5d22 39 #include "lwip/timers.h"
tousaki 0:a933851e5d22 40 #include "lwip/dns.h"
tousaki 0:a933851e5d22 41 #include "lwip/def.h"
tousaki 0:a933851e5d22 42 #include "lwip/ip_addr.h"
tousaki 0:a933851e5d22 43
tousaki 0:a933851e5d22 44 #define LWIP_TIMEOUT 180000
tousaki 0:a933851e5d22 45
tousaki 0:a933851e5d22 46 /* TCP/IP and Network Interface Initialisation */
tousaki 0:a933851e5d22 47 static struct netif netif;
tousaki 0:a933851e5d22 48
tousaki 0:a933851e5d22 49 static char ip_addr[NSAPI_IP_SIZE] = "\0";
tousaki 0:a933851e5d22 50 static char mac_addr[NSAPI_MAC_SIZE] = "\0";
tousaki 0:a933851e5d22 51
tousaki 0:a933851e5d22 52 static Semaphore tcpip_inited(0);
tousaki 0:a933851e5d22 53 static Semaphore netif_linked(0);
tousaki 0:a933851e5d22 54 static Semaphore netif_up(0);
tousaki 0:a933851e5d22 55
tousaki 0:a933851e5d22 56 static void tcpip_init_irq(void *)
tousaki 0:a933851e5d22 57 {
tousaki 0:a933851e5d22 58 tcpip_inited.release();
tousaki 0:a933851e5d22 59 }
tousaki 0:a933851e5d22 60
tousaki 0:a933851e5d22 61 static void netif_link_irq(struct netif *netif)
tousaki 0:a933851e5d22 62 {
tousaki 0:a933851e5d22 63 if (netif_is_link_up(netif)) {
tousaki 0:a933851e5d22 64 netif_linked.release();
tousaki 0:a933851e5d22 65 }
tousaki 0:a933851e5d22 66 }
tousaki 0:a933851e5d22 67
tousaki 0:a933851e5d22 68 static void netif_status_irq(struct netif *netif)
tousaki 0:a933851e5d22 69 {
tousaki 0:a933851e5d22 70 if (netif_is_up(netif)) {
tousaki 0:a933851e5d22 71 strcpy(ip_addr, inet_ntoa(netif->ip_addr));
tousaki 0:a933851e5d22 72 netif_up.release();
tousaki 0:a933851e5d22 73 }
tousaki 0:a933851e5d22 74 }
tousaki 0:a933851e5d22 75
tousaki 0:a933851e5d22 76 static void init_netif(ip_addr_t *ipaddr, ip_addr_t *netmask, ip_addr_t *gw)
tousaki 0:a933851e5d22 77 {
tousaki 0:a933851e5d22 78 tcpip_init(tcpip_init_irq, NULL);
tousaki 0:a933851e5d22 79 tcpip_inited.wait();
tousaki 0:a933851e5d22 80
tousaki 0:a933851e5d22 81 memset((void*) &netif, 0, sizeof(netif));
tousaki 0:a933851e5d22 82 netif_add(&netif, ipaddr, netmask, gw, NULL, wifi_arch_enetif_init, tcpip_input);
tousaki 0:a933851e5d22 83 netif_set_default(&netif);
tousaki 0:a933851e5d22 84
tousaki 0:a933851e5d22 85 netif_set_link_callback (&netif, netif_link_irq);
tousaki 0:a933851e5d22 86 netif_set_status_callback(&netif, netif_status_irq);
tousaki 0:a933851e5d22 87 }
tousaki 0:a933851e5d22 88
tousaki 0:a933851e5d22 89 static void set_mac_address(void)
tousaki 0:a933851e5d22 90 {
tousaki 0:a933851e5d22 91 snprintf(mac_addr, 19, "%02x:%02x:%02x:%02x:%02x:%02x", netif.hwaddr[0], netif.hwaddr[1],
tousaki 0:a933851e5d22 92 netif.hwaddr[2], netif.hwaddr[3], netif.hwaddr[4], netif.hwaddr[5]);
tousaki 0:a933851e5d22 93 }
tousaki 0:a933851e5d22 94
tousaki 0:a933851e5d22 95 static void _wlan_inf_callback(uint8_t ucType, uint16_t usWid, uint16_t usSize, uint8_t *pucData) {
tousaki 0:a933851e5d22 96 if ((ucType == 'I') && (usWid == 0x0005)) {
tousaki 0:a933851e5d22 97 if (pucData[0] == 0x01) { // CONNECTED
tousaki 0:a933851e5d22 98 /* Notify the EthernetInterface driver that WLAN was connected */
tousaki 0:a933851e5d22 99 WlanBP3595_Connected();
tousaki 0:a933851e5d22 100 } else {
tousaki 0:a933851e5d22 101 /* Notify the EthernetInterface driver that WLAN was disconnected */
tousaki 0:a933851e5d22 102 WlanBP3595_Disconnected();
tousaki 0:a933851e5d22 103 }
tousaki 0:a933851e5d22 104 }
tousaki 0:a933851e5d22 105 }
tousaki 0:a933851e5d22 106
tousaki 0:a933851e5d22 107 static int _wlan_init() {
tousaki 0:a933851e5d22 108 uint32_t status;
tousaki 0:a933851e5d22 109
tousaki 0:a933851e5d22 110 /* Initialize WlanBP3595 */
tousaki 0:a933851e5d22 111 if (WlanBP3595_Init(&_wlan_inf_callback) != 0) {
tousaki 0:a933851e5d22 112 return -1;
tousaki 0:a933851e5d22 113 }
tousaki 0:a933851e5d22 114
tousaki 0:a933851e5d22 115 /* Wait until WLAN_BP3595_START timeout 60s */
tousaki 0:a933851e5d22 116 while (1) {
tousaki 0:a933851e5d22 117 Thread::wait(200);
tousaki 0:a933851e5d22 118 status = WlanBP3595_GetWlanSts();
tousaki 0:a933851e5d22 119 if (status == WLAN_BP3595_START) {
tousaki 0:a933851e5d22 120 break;
tousaki 0:a933851e5d22 121 }
tousaki 0:a933851e5d22 122 }
tousaki 0:a933851e5d22 123
tousaki 0:a933851e5d22 124 return 0;
tousaki 0:a933851e5d22 125 }
tousaki 0:a933851e5d22 126
tousaki 0:a933851e5d22 127 static int _wlan_setting(const char *ssid, const char *pass, nsapi_security_t security)
tousaki 0:a933851e5d22 128 {
tousaki 0:a933851e5d22 129 int ret;
tousaki 0:a933851e5d22 130 grp_u8 ucWidData8; // 8bit wid data
tousaki 0:a933851e5d22 131 grp_wld_byte_array tBAWidData; // byte array wid data
tousaki 0:a933851e5d22 132
tousaki 0:a933851e5d22 133 // Set BSS type
tousaki 0:a933851e5d22 134 ucWidData8 = BSS_TYPE;
tousaki 0:a933851e5d22 135 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_BSS_TYPE, &ucWidData8);
tousaki 0:a933851e5d22 136 if (ret != 0) {
tousaki 0:a933851e5d22 137 return -1;
tousaki 0:a933851e5d22 138 }
tousaki 0:a933851e5d22 139
tousaki 0:a933851e5d22 140 // Set SSID
tousaki 0:a933851e5d22 141 tBAWidData.pucData = (grp_u8 *)ssid;
tousaki 0:a933851e5d22 142 tBAWidData.ulSize = strlen((char *)tBAWidData.pucData);
tousaki 0:a933851e5d22 143 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_SSID, &tBAWidData);
tousaki 0:a933851e5d22 144 if (ret != 0) {
tousaki 0:a933851e5d22 145 return -1;
tousaki 0:a933851e5d22 146 }
tousaki 0:a933851e5d22 147
tousaki 0:a933851e5d22 148 if ((security == NSAPI_SECURITY_WPA) || (security == NSAPI_SECURITY_WPA2)) {
tousaki 0:a933851e5d22 149 // Set PSK
tousaki 0:a933851e5d22 150 tBAWidData.pucData = (grp_u8 *)pass;
tousaki 0:a933851e5d22 151 tBAWidData.ulSize = strlen((char *)tBAWidData.pucData);
tousaki 0:a933851e5d22 152 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_11I_PSK, &tBAWidData);
tousaki 0:a933851e5d22 153 if (ret != 0) {
tousaki 0:a933851e5d22 154 return -1;
tousaki 0:a933851e5d22 155 }
tousaki 0:a933851e5d22 156 }
tousaki 0:a933851e5d22 157
tousaki 0:a933851e5d22 158 // Set 11i mode
tousaki 0:a933851e5d22 159 switch (security) {
tousaki 0:a933851e5d22 160 case NSAPI_SECURITY_WEP:
tousaki 0:a933851e5d22 161 ret = strlen(pass);
tousaki 0:a933851e5d22 162 if (ret == 5) {
tousaki 0:a933851e5d22 163 ucWidData8 = 0x03; // WEP64
tousaki 0:a933851e5d22 164 } else if (ret == 13) {
tousaki 0:a933851e5d22 165 ucWidData8 = 0x07; // WEP128
tousaki 0:a933851e5d22 166 } else {
tousaki 0:a933851e5d22 167 return -1;
tousaki 0:a933851e5d22 168 }
tousaki 0:a933851e5d22 169 break;
tousaki 0:a933851e5d22 170 case NSAPI_SECURITY_WPA:
tousaki 0:a933851e5d22 171 case NSAPI_SECURITY_WPA2:
tousaki 0:a933851e5d22 172 ucWidData8 = 0x79; // WPA/WPA2 Mixed
tousaki 0:a933851e5d22 173 break;
tousaki 0:a933851e5d22 174 case NSAPI_SECURITY_NONE:
tousaki 0:a933851e5d22 175 default:
tousaki 0:a933851e5d22 176 ucWidData8 = 0x00;
tousaki 0:a933851e5d22 177 break;
tousaki 0:a933851e5d22 178 }
tousaki 0:a933851e5d22 179 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_11I_MODE, &ucWidData8);
tousaki 0:a933851e5d22 180 if (ret != 0) {
tousaki 0:a933851e5d22 181 return -1;
tousaki 0:a933851e5d22 182 }
tousaki 0:a933851e5d22 183
tousaki 0:a933851e5d22 184 if (security == NSAPI_SECURITY_WEP) {
tousaki 0:a933851e5d22 185 // Set WEP KEY
tousaki 0:a933851e5d22 186 tBAWidData.pucData = (grp_u8 *)pass;
tousaki 0:a933851e5d22 187 tBAWidData.ulSize = strlen((char *)tBAWidData.pucData);
tousaki 0:a933851e5d22 188 ret = WlanBP3595_Ioctl(GRP_WLD_IOCTL_SET_WEP_KEY, &tBAWidData);
tousaki 0:a933851e5d22 189 if (ret != 0) {
tousaki 0:a933851e5d22 190 return -1;
tousaki 0:a933851e5d22 191 }
tousaki 0:a933851e5d22 192 }
tousaki 0:a933851e5d22 193
tousaki 0:a933851e5d22 194 return 0;
tousaki 0:a933851e5d22 195 }
tousaki 0:a933851e5d22 196
tousaki 0:a933851e5d22 197 // LWIPBP3595Interface implementation
tousaki 0:a933851e5d22 198 int LWIPBP3595Interface::connect(
tousaki 0:a933851e5d22 199 const char *ssid,
tousaki 0:a933851e5d22 200 const char *pass,
tousaki 0:a933851e5d22 201 nsapi_security_t security)
tousaki 0:a933851e5d22 202 {
tousaki 0:a933851e5d22 203 _wlan_init();
tousaki 0:a933851e5d22 204
tousaki 0:a933851e5d22 205 // Set up network
tousaki 0:a933851e5d22 206 init_netif(0, 0, 0);
tousaki 0:a933851e5d22 207 set_mac_address();
tousaki 0:a933851e5d22 208
tousaki 0:a933851e5d22 209 _wlan_setting(ssid, pass, security);
tousaki 0:a933851e5d22 210
tousaki 0:a933851e5d22 211 // Connect to network
tousaki 0:a933851e5d22 212 wifi_arch_enable_interrupts();
tousaki 0:a933851e5d22 213
tousaki 0:a933851e5d22 214 dhcp_start(&netif);
tousaki 0:a933851e5d22 215
tousaki 0:a933851e5d22 216 // Wait for an IP Address
tousaki 0:a933851e5d22 217 // -1: error, 0: timeout
tousaki 0:a933851e5d22 218 if (netif_up.wait(LWIP_TIMEOUT) < 0) {
tousaki 0:a933851e5d22 219 return NSAPI_ERROR_DHCP_FAILURE;
tousaki 0:a933851e5d22 220 }
tousaki 0:a933851e5d22 221
tousaki 0:a933851e5d22 222 return 0;
tousaki 0:a933851e5d22 223 }
tousaki 0:a933851e5d22 224
tousaki 0:a933851e5d22 225 int LWIPBP3595Interface::disconnect()
tousaki 0:a933851e5d22 226 {
tousaki 0:a933851e5d22 227 dhcp_release(&netif);
tousaki 0:a933851e5d22 228 dhcp_stop(&netif);
tousaki 0:a933851e5d22 229
tousaki 0:a933851e5d22 230 wifi_arch_disable_interrupts();
tousaki 0:a933851e5d22 231
tousaki 0:a933851e5d22 232 return 0;
tousaki 0:a933851e5d22 233 }
tousaki 0:a933851e5d22 234
tousaki 0:a933851e5d22 235 const char *LWIPBP3595Interface::get_ip_address()
tousaki 0:a933851e5d22 236 {
tousaki 0:a933851e5d22 237 return ip_addr;
tousaki 0:a933851e5d22 238 }
tousaki 0:a933851e5d22 239
tousaki 0:a933851e5d22 240 const char *LWIPBP3595Interface::get_mac_address()
tousaki 0:a933851e5d22 241 {
tousaki 0:a933851e5d22 242 return mac_addr;
tousaki 0:a933851e5d22 243 }