Murata Type YD Wi-Fi driver

Dependents:   easy-connect-type-yd

Committer:
MACRUM
Date:
Wed Jul 12 10:49:10 2017 +0000
Revision:
0:35a2186cf186
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:35a2186cf186 1 /* Murata Type-YD implementation of NetworkInterfaceAPI
MACRUM 0:35a2186cf186 2 * Copyright (c) 2017 Murat Manufacturing CO., LTD.
MACRUM 0:35a2186cf186 3 *
MACRUM 0:35a2186cf186 4 * Licensed under the Apache License, Version 2.0 (the "License");
MACRUM 0:35a2186cf186 5 * you may not use this file except in compliance with the License.
MACRUM 0:35a2186cf186 6 * You may obtain a copy of the License at
MACRUM 0:35a2186cf186 7 *
MACRUM 0:35a2186cf186 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:35a2186cf186 9 *
MACRUM 0:35a2186cf186 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:35a2186cf186 11 * distributed under the License is distributed on an "AS IS" BASIS,
MACRUM 0:35a2186cf186 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:35a2186cf186 13 * See the License for the specific language governing permissions and
MACRUM 0:35a2186cf186 14 * limitations under the License.
MACRUM 0:35a2186cf186 15 */
MACRUM 0:35a2186cf186 16
MACRUM 0:35a2186cf186 17 #include <string.h>
MACRUM 0:35a2186cf186 18 #include "TypeYDInterface.h"
MACRUM 0:35a2186cf186 19 #include "SNICInterface/Socket/SNIC_Socket.h"
MACRUM 0:35a2186cf186 20 #include "SNICInterface/Socket/Endpoint.h"
MACRUM 0:35a2186cf186 21 #include "SNICInterface/Socket/SNIC_UDPSocket.h"
MACRUM 0:35a2186cf186 22 #include "SNICInterface/Socket/TCPSocketConnection.h"
MACRUM 0:35a2186cf186 23 #include "SNICInterface/Socket/TCPSocketServer.h"
MACRUM 0:35a2186cf186 24
MACRUM 0:35a2186cf186 25 #include "mbed.h"
MACRUM 0:35a2186cf186 26 #include "mbed-trace/mbed_trace.h"
MACRUM 0:35a2186cf186 27 #define TRACE_GROUP "SNIC"
MACRUM 0:35a2186cf186 28
MACRUM 0:35a2186cf186 29 //#define USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 30
MACRUM 0:35a2186cf186 31 // socket structure
MACRUM 0:35a2186cf186 32 struct managed_socket {
MACRUM 0:35a2186cf186 33 nsapi_protocol_t proto;
MACRUM 0:35a2186cf186 34 bool connected;
MACRUM 0:35a2186cf186 35 SnicSocket *snic_socket;
MACRUM 0:35a2186cf186 36 void (*callback)(void *);
MACRUM 0:35a2186cf186 37 void *data;
MACRUM 0:35a2186cf186 38 };
MACRUM 0:35a2186cf186 39
MACRUM 0:35a2186cf186 40
MACRUM 0:35a2186cf186 41 // TypeYDInterface implementation
MACRUM 0:35a2186cf186 42 TypeYDInterface::TypeYDInterface(PinName tx, PinName rx, PinName cts, PinName rts, PinName reset, PinName alarm, int baud)
MACRUM 0:35a2186cf186 43 : _snic(tx, rx, cts, rts, reset, alarm, baud)
MACRUM 0:35a2186cf186 44 {
MACRUM 0:35a2186cf186 45 }
MACRUM 0:35a2186cf186 46
MACRUM 0:35a2186cf186 47 int TypeYDInterface::init()
MACRUM 0:35a2186cf186 48 {
MACRUM 0:35a2186cf186 49 int ret = _snic.init();
MACRUM 0:35a2186cf186 50 if (ret == 0) {
MACRUM 0:35a2186cf186 51 tagWIFI_STATUS_T status;
MACRUM 0:35a2186cf186 52 _snic.getWifiStatus(&status);
MACRUM 0:35a2186cf186 53 memcpy(mac_address, status.mac_address, sizeof(mac_address));
MACRUM 0:35a2186cf186 54 sprintf(str_macaddr, "%02x:%02x:%02x:%02x:%02x:%02x",
MACRUM 0:35a2186cf186 55 mac_address[0], mac_address[1], mac_address[2],
MACRUM 0:35a2186cf186 56 mac_address[3], mac_address[4], mac_address[5]);
MACRUM 0:35a2186cf186 57
MACRUM 0:35a2186cf186 58 ret = _snic.wifi_softap_off();
MACRUM 0:35a2186cf186 59 if (ret != 0) {
MACRUM 0:35a2186cf186 60 tr_error("wifi off error");
MACRUM 0:35a2186cf186 61 }
MACRUM 0:35a2186cf186 62 }
MACRUM 0:35a2186cf186 63 return ret;
MACRUM 0:35a2186cf186 64 }
MACRUM 0:35a2186cf186 65
MACRUM 0:35a2186cf186 66 int TypeYDInterface::getFWVersion(unsigned char *version, int length)
MACRUM 0:35a2186cf186 67 {
MACRUM 0:35a2186cf186 68 int ret = _snic.getFWVersion(version, &length);
MACRUM 0:35a2186cf186 69 return ret;
MACRUM 0:35a2186cf186 70 }
MACRUM 0:35a2186cf186 71
MACRUM 0:35a2186cf186 72 int TypeYDInterface::connect()
MACRUM 0:35a2186cf186 73 {
MACRUM 0:35a2186cf186 74 int ret;
MACRUM 0:35a2186cf186 75
MACRUM 0:35a2186cf186 76 if( _snic.disconnect() != 0 ) {
MACRUM 0:35a2186cf186 77 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 78 }
MACRUM 0:35a2186cf186 79
MACRUM 0:35a2186cf186 80 int ssid_length = strlen(ap_ssid);
MACRUM 0:35a2186cf186 81 int pass_length = strlen(ap_pass);
MACRUM 0:35a2186cf186 82
MACRUM 0:35a2186cf186 83 if (_snic.connect(ap_ssid, ssid_length, ap_esec, ap_pass, pass_length) != 0) {
MACRUM 0:35a2186cf186 84 ret = NSAPI_ERROR_NO_CONNECTION;
MACRUM 0:35a2186cf186 85 }
MACRUM 0:35a2186cf186 86 else if (_snic.setIPConfig(true) != 0) {
MACRUM 0:35a2186cf186 87 ret = NSAPI_ERROR_DHCP_FAILURE;
MACRUM 0:35a2186cf186 88 }
MACRUM 0:35a2186cf186 89 else {
MACRUM 0:35a2186cf186 90 ret = NSAPI_ERROR_OK;
MACRUM 0:35a2186cf186 91 }
MACRUM 0:35a2186cf186 92
MACRUM 0:35a2186cf186 93 return ret;
MACRUM 0:35a2186cf186 94 }
MACRUM 0:35a2186cf186 95
MACRUM 0:35a2186cf186 96
MACRUM 0:35a2186cf186 97 int TypeYDInterface::connect(const char *ssid, const char *pass, nsapi_security_t security,
MACRUM 0:35a2186cf186 98 uint8_t channel)
MACRUM 0:35a2186cf186 99 {
MACRUM 0:35a2186cf186 100 int ret;
MACRUM 0:35a2186cf186 101
MACRUM 0:35a2186cf186 102 if (channel != 0) {
MACRUM 0:35a2186cf186 103 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:35a2186cf186 104 }
MACRUM 0:35a2186cf186 105
MACRUM 0:35a2186cf186 106 set_credentials(ssid, pass, security);
MACRUM 0:35a2186cf186 107 int ssid_length = strlen(ap_ssid);
MACRUM 0:35a2186cf186 108 int pass_length = strlen(ap_pass);
MACRUM 0:35a2186cf186 109 #if 0
MACRUM 0:35a2186cf186 110 int repeat = 0;
MACRUM 0:35a2186cf186 111 bool bFound = false;
MACRUM 0:35a2186cf186 112 do {
MACRUM 0:35a2186cf186 113 tr_info("scan...%d\n", repeat);
MACRUM 0:35a2186cf186 114 WiFiAccessPoint res[10];
MACRUM 0:35a2186cf186 115 ret = scan(res,10);
MACRUM 0:35a2186cf186 116 if (ret < 0) {
MACRUM 0:35a2186cf186 117 tr_info("scan fail %d\n",ret);
MACRUM 0:35a2186cf186 118 }
MACRUM 0:35a2186cf186 119 else {
MACRUM 0:35a2186cf186 120 tr_info("scan result = %d\n", ret);
MACRUM 0:35a2186cf186 121 for (int i = 0; i < ret; i++) {
MACRUM 0:35a2186cf186 122 tr_info("ssid :%s\n", res[i].get_ssid());
MACRUM 0:35a2186cf186 123 tr_info("channel :%d\n", res[i].get_channel());
MACRUM 0:35a2186cf186 124 if (strcmp(ap_ssid, res[i].get_ssid()) == 0) {
MACRUM 0:35a2186cf186 125 bFound = true;
MACRUM 0:35a2186cf186 126 tr_info("-------- BSS ---------\n");
MACRUM 0:35a2186cf186 127 tr_info("ssid :%s\n", res[i].get_ssid());
MACRUM 0:35a2186cf186 128 tr_info("channel :%d\n", res[i].get_channel());
MACRUM 0:35a2186cf186 129 tr_info("rssi :%d\n", res[i].get_rssi());
MACRUM 0:35a2186cf186 130 tr_info("security :%d\n", res[i].get_security());
MACRUM 0:35a2186cf186 131 const uint8_t *bssid = res[i].get_bssid();
MACRUM 0:35a2186cf186 132 tr_info("bssid :%02x-%02x-%02x-%02x-%02x-%02x\n",
MACRUM 0:35a2186cf186 133 bssid[0],bssid[1],bssid[2],
MACRUM 0:35a2186cf186 134 bssid[3],bssid[4],bssid[5]);
MACRUM 0:35a2186cf186 135 break;
MACRUM 0:35a2186cf186 136 }
MACRUM 0:35a2186cf186 137 }
MACRUM 0:35a2186cf186 138 }
MACRUM 0:35a2186cf186 139 }while((bFound == false) && (repeat++ < 10));
MACRUM 0:35a2186cf186 140 #endif
MACRUM 0:35a2186cf186 141 do {
MACRUM 0:35a2186cf186 142 wait(0.5);
MACRUM 0:35a2186cf186 143 if( _snic.disconnect() != 0 ) {
MACRUM 0:35a2186cf186 144 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 145 }
MACRUM 0:35a2186cf186 146 wait(0.5);
MACRUM 0:35a2186cf186 147
MACRUM 0:35a2186cf186 148 /*
MACRUM 0:35a2186cf186 149 ret = _snic.getWifiStatus(&status);
MACRUM 0:35a2186cf186 150 if (ret == 0) {
MACRUM 0:35a2186cf186 151 printf("status:%02x\n", status.status);
MACRUM 0:35a2186cf186 152 printf("mac :%02x-%02x-%02x-%02x-%02x-%02x\n",
MACRUM 0:35a2186cf186 153 status.mac_address[0],status.mac_address[1],status.mac_address[2],
MACRUM 0:35a2186cf186 154 status.mac_address[3],status.mac_address[4],status.mac_address[5]);
MACRUM 0:35a2186cf186 155 }*/
MACRUM 0:35a2186cf186 156 tr_info("TryConnect\r\n");
MACRUM 0:35a2186cf186 157
MACRUM 0:35a2186cf186 158 if (_snic.connect(ap_ssid, ssid_length, ap_esec, ap_pass, pass_length) != 0) {
MACRUM 0:35a2186cf186 159 ret = NSAPI_ERROR_NO_CONNECTION;
MACRUM 0:35a2186cf186 160 }
MACRUM 0:35a2186cf186 161 else if (_snic.setIPConfig(true) != 0) {
MACRUM 0:35a2186cf186 162 ret = NSAPI_ERROR_DHCP_FAILURE;
MACRUM 0:35a2186cf186 163 }
MACRUM 0:35a2186cf186 164 else {
MACRUM 0:35a2186cf186 165 ret = NSAPI_ERROR_OK;
MACRUM 0:35a2186cf186 166 }
MACRUM 0:35a2186cf186 167 } while (ret != NSAPI_ERROR_OK);
MACRUM 0:35a2186cf186 168
MACRUM 0:35a2186cf186 169 return ret;
MACRUM 0:35a2186cf186 170 }
MACRUM 0:35a2186cf186 171
MACRUM 0:35a2186cf186 172
MACRUM 0:35a2186cf186 173 int TypeYDInterface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
MACRUM 0:35a2186cf186 174 {
MACRUM 0:35a2186cf186 175 ap_esec = e_SEC_WPA2_MIXED;
MACRUM 0:35a2186cf186 176 switch(security) {
MACRUM 0:35a2186cf186 177 case NSAPI_SECURITY_NONE: /*!< open access point */
MACRUM 0:35a2186cf186 178 ap_esec = e_SEC_OPEN;
MACRUM 0:35a2186cf186 179 break;
MACRUM 0:35a2186cf186 180 case NSAPI_SECURITY_WEP: /*!< phrase conforms to WEP */
MACRUM 0:35a2186cf186 181 ap_esec = e_SEC_WEP;
MACRUM 0:35a2186cf186 182 break;
MACRUM 0:35a2186cf186 183 case NSAPI_SECURITY_WPA: /*!< phrase conforms to WPA */
MACRUM 0:35a2186cf186 184 ap_esec = e_SEC_WPA_TKIP;
MACRUM 0:35a2186cf186 185 break;
MACRUM 0:35a2186cf186 186 case NSAPI_SECURITY_WPA2: /*!< phrase conforms to WPA2 */
MACRUM 0:35a2186cf186 187 ap_esec = e_SEC_WPA2_MIXED;
MACRUM 0:35a2186cf186 188 break;
MACRUM 0:35a2186cf186 189 case NSAPI_SECURITY_WPA_WPA2: /*!< phrase conforms to WPA/WPA2 */
MACRUM 0:35a2186cf186 190 ap_esec = e_SEC_WPA2_MIXED;
MACRUM 0:35a2186cf186 191 break;
MACRUM 0:35a2186cf186 192 default:
MACRUM 0:35a2186cf186 193 break;
MACRUM 0:35a2186cf186 194 }
MACRUM 0:35a2186cf186 195
MACRUM 0:35a2186cf186 196 strncpy(ap_ssid, ssid, sizeof(ap_ssid));
MACRUM 0:35a2186cf186 197 ap_ssid[sizeof(ap_ssid)-1] = 0;
MACRUM 0:35a2186cf186 198
MACRUM 0:35a2186cf186 199 strncpy(ap_pass, pass, sizeof(ap_pass));
MACRUM 0:35a2186cf186 200 ap_pass[sizeof(ap_pass)-1] = 0;
MACRUM 0:35a2186cf186 201
MACRUM 0:35a2186cf186 202 return 0;
MACRUM 0:35a2186cf186 203 }
MACRUM 0:35a2186cf186 204
MACRUM 0:35a2186cf186 205 int TypeYDInterface::set_channel(uint8_t channel)
MACRUM 0:35a2186cf186 206 {
MACRUM 0:35a2186cf186 207 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:35a2186cf186 208 }
MACRUM 0:35a2186cf186 209
MACRUM 0:35a2186cf186 210 int TypeYDInterface::disconnect()
MACRUM 0:35a2186cf186 211 {
MACRUM 0:35a2186cf186 212 if (!_snic.disconnect()) {
MACRUM 0:35a2186cf186 213 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 214 }
MACRUM 0:35a2186cf186 215
MACRUM 0:35a2186cf186 216 return NSAPI_ERROR_OK;
MACRUM 0:35a2186cf186 217 }
MACRUM 0:35a2186cf186 218
MACRUM 0:35a2186cf186 219 const char *TypeYDInterface::get_ip_address()
MACRUM 0:35a2186cf186 220 {
MACRUM 0:35a2186cf186 221 return _snic.getIPAddress();
MACRUM 0:35a2186cf186 222 }
MACRUM 0:35a2186cf186 223
MACRUM 0:35a2186cf186 224 const char *TypeYDInterface::get_mac_address()
MACRUM 0:35a2186cf186 225 {
MACRUM 0:35a2186cf186 226
MACRUM 0:35a2186cf186 227 return (const char*)str_macaddr;
MACRUM 0:35a2186cf186 228 }
MACRUM 0:35a2186cf186 229
MACRUM 0:35a2186cf186 230 const char *TypeYDInterface::get_gateway()
MACRUM 0:35a2186cf186 231 {
MACRUM 0:35a2186cf186 232 return _snic.getGatewayAddress();
MACRUM 0:35a2186cf186 233 }
MACRUM 0:35a2186cf186 234
MACRUM 0:35a2186cf186 235 const char *TypeYDInterface::get_netmask()
MACRUM 0:35a2186cf186 236 {
MACRUM 0:35a2186cf186 237 return _snic.getSubnetAddress();
MACRUM 0:35a2186cf186 238 }
MACRUM 0:35a2186cf186 239
MACRUM 0:35a2186cf186 240 int8_t TypeYDInterface::get_rssi()
MACRUM 0:35a2186cf186 241 {
MACRUM 0:35a2186cf186 242 signed char rssi;
MACRUM 0:35a2186cf186 243 _snic.getRssi(&rssi);
MACRUM 0:35a2186cf186 244
MACRUM 0:35a2186cf186 245 return (int8_t)rssi;
MACRUM 0:35a2186cf186 246 }
MACRUM 0:35a2186cf186 247
MACRUM 0:35a2186cf186 248 static volatile int _scan_wait = 0;
MACRUM 0:35a2186cf186 249 static WiFiAccessPoint *_scan_results = 0;
MACRUM 0:35a2186cf186 250 static int _scan_count;
MACRUM 0:35a2186cf186 251 static int _scan_limit;
MACRUM 0:35a2186cf186 252 static void scan_results_callback(tagSCAN_RESULT_T *scan_result)
MACRUM 0:35a2186cf186 253 {
MACRUM 0:35a2186cf186 254 nsapi_wifi_ap_t ap;
MACRUM 0:35a2186cf186 255
MACRUM 0:35a2186cf186 256 if (_scan_count < _scan_limit) {
MACRUM 0:35a2186cf186 257 memcpy(ap.ssid, scan_result->ssid, 33);
MACRUM 0:35a2186cf186 258 memcpy(ap.bssid, scan_result->bssid, 6);
MACRUM 0:35a2186cf186 259 switch(scan_result->security) {
MACRUM 0:35a2186cf186 260 case e_SEC_OPEN:
MACRUM 0:35a2186cf186 261 ap.security = NSAPI_SECURITY_NONE;
MACRUM 0:35a2186cf186 262 break;
MACRUM 0:35a2186cf186 263 case e_SEC_WEP:
MACRUM 0:35a2186cf186 264 ap.security = NSAPI_SECURITY_WEP;
MACRUM 0:35a2186cf186 265 break;
MACRUM 0:35a2186cf186 266 case e_SEC_WPA_TKIP:
MACRUM 0:35a2186cf186 267 ap.security = NSAPI_SECURITY_WPA;
MACRUM 0:35a2186cf186 268 break;
MACRUM 0:35a2186cf186 269 case e_SEC_WPA2_AES:
MACRUM 0:35a2186cf186 270 ap.security = NSAPI_SECURITY_WPA2;
MACRUM 0:35a2186cf186 271 break;
MACRUM 0:35a2186cf186 272 case e_SEC_WPA2_MIXED:
MACRUM 0:35a2186cf186 273 ap.security = NSAPI_SECURITY_WPA_WPA2;
MACRUM 0:35a2186cf186 274 break;
MACRUM 0:35a2186cf186 275 case e_SEC_WPA_AES:
MACRUM 0:35a2186cf186 276 ap.security = NSAPI_SECURITY_WPA;
MACRUM 0:35a2186cf186 277 break;
MACRUM 0:35a2186cf186 278 default:
MACRUM 0:35a2186cf186 279 ap.security = NSAPI_SECURITY_UNKNOWN;
MACRUM 0:35a2186cf186 280 break;
MACRUM 0:35a2186cf186 281 }
MACRUM 0:35a2186cf186 282 ap.rssi = scan_result->rssi;
MACRUM 0:35a2186cf186 283 ap.channel = scan_result->channel;
MACRUM 0:35a2186cf186 284 _scan_results[_scan_count++] = WiFiAccessPoint(ap);
MACRUM 0:35a2186cf186 285 }
MACRUM 0:35a2186cf186 286
MACRUM 0:35a2186cf186 287 if (scan_result->is_complete == 0) _scan_wait = 1;
MACRUM 0:35a2186cf186 288 }
MACRUM 0:35a2186cf186 289
MACRUM 0:35a2186cf186 290 int TypeYDInterface::scan(WiFiAccessPoint *res, unsigned count)
MACRUM 0:35a2186cf186 291 {
MACRUM 0:35a2186cf186 292 _scan_results = res;
MACRUM 0:35a2186cf186 293 _scan_limit = count;
MACRUM 0:35a2186cf186 294 _scan_count = 0;
MACRUM 0:35a2186cf186 295 int ret = _snic.scan(NULL, NULL, scan_results_callback);
MACRUM 0:35a2186cf186 296 if (ret == 0) {
MACRUM 0:35a2186cf186 297 _scan_wait = 0;
MACRUM 0:35a2186cf186 298 while(_scan_wait == 0) {
MACRUM 0:35a2186cf186 299 wait(1);
MACRUM 0:35a2186cf186 300 }
MACRUM 0:35a2186cf186 301 }
MACRUM 0:35a2186cf186 302
MACRUM 0:35a2186cf186 303 return _scan_count;
MACRUM 0:35a2186cf186 304 }
MACRUM 0:35a2186cf186 305
MACRUM 0:35a2186cf186 306 nsapi_error_t TypeYDInterface::gethostbyname(const char *name, SocketAddress *address, nsapi_version_t version)
MACRUM 0:35a2186cf186 307 {
MACRUM 0:35a2186cf186 308 int ret;
MACRUM 0:35a2186cf186 309 unsigned char ipaddr[4];
MACRUM 0:35a2186cf186 310
MACRUM 0:35a2186cf186 311 ret = _snic.resolveName(name, ipaddr);
MACRUM 0:35a2186cf186 312 if (ret != 0) {
MACRUM 0:35a2186cf186 313 tr_error("DNS failure\n");
MACRUM 0:35a2186cf186 314 return NSAPI_ERROR_DNS_FAILURE;
MACRUM 0:35a2186cf186 315 }
MACRUM 0:35a2186cf186 316
MACRUM 0:35a2186cf186 317 tr_info("DNS res:%u.%u.%u.%u\n", ipaddr[0], ipaddr[1], ipaddr[2], ipaddr[3]);
MACRUM 0:35a2186cf186 318
MACRUM 0:35a2186cf186 319 address->set_ip_bytes(ipaddr, NSAPI_IPv4);
MACRUM 0:35a2186cf186 320
MACRUM 0:35a2186cf186 321 return NSAPI_ERROR_OK;
MACRUM 0:35a2186cf186 322 }
MACRUM 0:35a2186cf186 323
MACRUM 0:35a2186cf186 324 int TypeYDInterface::socket_open(void **handle, nsapi_protocol_t proto)
MACRUM 0:35a2186cf186 325 {
MACRUM 0:35a2186cf186 326 tr_info("socket_open");
MACRUM 0:35a2186cf186 327
MACRUM 0:35a2186cf186 328 struct managed_socket *socket = new struct managed_socket;
MACRUM 0:35a2186cf186 329 if (!socket) {
MACRUM 0:35a2186cf186 330 return NSAPI_ERROR_NO_SOCKET;
MACRUM 0:35a2186cf186 331 }
MACRUM 0:35a2186cf186 332
MACRUM 0:35a2186cf186 333 socket->proto = proto;
MACRUM 0:35a2186cf186 334 socket->connected = false;
MACRUM 0:35a2186cf186 335 socket->snic_socket = NULL;
MACRUM 0:35a2186cf186 336 socket->callback = NULL;
MACRUM 0:35a2186cf186 337 socket->data = NULL;
MACRUM 0:35a2186cf186 338 *handle = socket;
MACRUM 0:35a2186cf186 339
MACRUM 0:35a2186cf186 340 return 0;
MACRUM 0:35a2186cf186 341 }
MACRUM 0:35a2186cf186 342
MACRUM 0:35a2186cf186 343 int TypeYDInterface::socket_close(void *handle)
MACRUM 0:35a2186cf186 344 {
MACRUM 0:35a2186cf186 345 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 346
MACRUM 0:35a2186cf186 347 tr_info("socket_close");
MACRUM 0:35a2186cf186 348
MACRUM 0:35a2186cf186 349 int err = 0;
MACRUM 0:35a2186cf186 350 if (socket->snic_socket != NULL) {
MACRUM 0:35a2186cf186 351 err = socket->snic_socket->close();
MACRUM 0:35a2186cf186 352 delete socket->snic_socket;
MACRUM 0:35a2186cf186 353 }
MACRUM 0:35a2186cf186 354
MACRUM 0:35a2186cf186 355 delete socket;
MACRUM 0:35a2186cf186 356 return err;
MACRUM 0:35a2186cf186 357 }
MACRUM 0:35a2186cf186 358
MACRUM 0:35a2186cf186 359 int TypeYDInterface::socket_bind(void *handle, const SocketAddress &address)
MACRUM 0:35a2186cf186 360 {
MACRUM 0:35a2186cf186 361 int ret;
MACRUM 0:35a2186cf186 362 uint16_t port;
MACRUM 0:35a2186cf186 363
MACRUM 0:35a2186cf186 364 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 365
MACRUM 0:35a2186cf186 366 port = address.get_port();
MACRUM 0:35a2186cf186 367 if (port == 0) {
MACRUM 0:35a2186cf186 368 #if defined(ST)
MACRUM 0:35a2186cf186 369 srand(HAL_GetTick());
MACRUM 0:35a2186cf186 370 #else
MACRUM 0:35a2186cf186 371 srand(0);
MACRUM 0:35a2186cf186 372 #endif
MACRUM 0:35a2186cf186 373 port = (rand() % 10240) + 20000;
MACRUM 0:35a2186cf186 374 }
MACRUM 0:35a2186cf186 375
MACRUM 0:35a2186cf186 376 tr_info("socket_bind IP:%s:%u\n", address.get_ip_address(), port);
MACRUM 0:35a2186cf186 377
MACRUM 0:35a2186cf186 378 if (socket->proto == NSAPI_UDP) {
MACRUM 0:35a2186cf186 379 SnicUDPSocket *udp = new SnicUDPSocket();
MACRUM 0:35a2186cf186 380 socket->snic_socket = udp;
MACRUM 0:35a2186cf186 381 if (socket->snic_socket == NULL) {
MACRUM 0:35a2186cf186 382 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 383 }
MACRUM 0:35a2186cf186 384 socket->snic_socket->socket_attach(socket->callback, socket->data);
MACRUM 0:35a2186cf186 385 ret = udp->bind(port);
MACRUM 0:35a2186cf186 386 if (ret != 0) {
MACRUM 0:35a2186cf186 387 tr_info("bind err %d\n", ret);
MACRUM 0:35a2186cf186 388 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 389 }
MACRUM 0:35a2186cf186 390 socket->connected = true;
MACRUM 0:35a2186cf186 391 }
MACRUM 0:35a2186cf186 392 else {
MACRUM 0:35a2186cf186 393 TCPSocketConnection *tcp = new TCPSocketConnection();
MACRUM 0:35a2186cf186 394 socket->snic_socket = tcp;
MACRUM 0:35a2186cf186 395 if (socket->snic_socket == NULL) {
MACRUM 0:35a2186cf186 396 tr_error("tcp bind err\n");
MACRUM 0:35a2186cf186 397 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 398 }
MACRUM 0:35a2186cf186 399 socket->snic_socket->socket_attach(socket->callback, socket->data);
MACRUM 0:35a2186cf186 400 ret = tcp->bind(port);
MACRUM 0:35a2186cf186 401 if (ret != 0) {
MACRUM 0:35a2186cf186 402 tr_error("tcp bind err %d\n", ret);
MACRUM 0:35a2186cf186 403 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 404 }
MACRUM 0:35a2186cf186 405 socket->connected = false;
MACRUM 0:35a2186cf186 406 }
MACRUM 0:35a2186cf186 407
MACRUM 0:35a2186cf186 408 return ret;
MACRUM 0:35a2186cf186 409 }
MACRUM 0:35a2186cf186 410
MACRUM 0:35a2186cf186 411 int TypeYDInterface::socket_listen(void *handle, int backlog)
MACRUM 0:35a2186cf186 412 {
MACRUM 0:35a2186cf186 413 int ret;
MACRUM 0:35a2186cf186 414 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 415
MACRUM 0:35a2186cf186 416 if (socket->proto == NSAPI_UDP) {
MACRUM 0:35a2186cf186 417 tr_info("unsupport:socket_listen\n");
MACRUM 0:35a2186cf186 418 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:35a2186cf186 419 }
MACRUM 0:35a2186cf186 420 else {
MACRUM 0:35a2186cf186 421 TCPSocketServer* tcp;
MACRUM 0:35a2186cf186 422 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 423 tcp = dynamic_cast<TCPSocketServer*>(socket->snic_socket);
MACRUM 0:35a2186cf186 424 if (tcp == NULL){
MACRUM 0:35a2186cf186 425 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 426 }
MACRUM 0:35a2186cf186 427 #else
MACRUM 0:35a2186cf186 428 tcp = (TCPSocketServer*)(socket->snic_socket);
MACRUM 0:35a2186cf186 429 #endif
MACRUM 0:35a2186cf186 430 ret = tcp->listen(backlog);
MACRUM 0:35a2186cf186 431 if (ret != 0) {
MACRUM 0:35a2186cf186 432 tr_error("tcp listen err %d\n",ret);
MACRUM 0:35a2186cf186 433 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 434 }
MACRUM 0:35a2186cf186 435 }
MACRUM 0:35a2186cf186 436 return 0;
MACRUM 0:35a2186cf186 437 }
MACRUM 0:35a2186cf186 438
MACRUM 0:35a2186cf186 439 int TypeYDInterface::socket_connect(void *handle, const SocketAddress &addr)
MACRUM 0:35a2186cf186 440 {
MACRUM 0:35a2186cf186 441 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 442
MACRUM 0:35a2186cf186 443 //tr_info("socket_connect(%d)\n",socket->proto);
MACRUM 0:35a2186cf186 444
MACRUM 0:35a2186cf186 445 if (socket->proto == NSAPI_UDP) {
MACRUM 0:35a2186cf186 446 tr_error("un sup:socket_connect");
MACRUM 0:35a2186cf186 447 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 448 }
MACRUM 0:35a2186cf186 449 else {
MACRUM 0:35a2186cf186 450 TCPSocketConnection *tcp;
MACRUM 0:35a2186cf186 451 if (socket->snic_socket == NULL) {
MACRUM 0:35a2186cf186 452 tcp = new TCPSocketConnection();
MACRUM 0:35a2186cf186 453 socket->snic_socket = tcp;
MACRUM 0:35a2186cf186 454 if (socket->snic_socket == NULL) {
MACRUM 0:35a2186cf186 455 tr_error("tcp connect err\n");
MACRUM 0:35a2186cf186 456 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 457 }
MACRUM 0:35a2186cf186 458 socket->snic_socket->socket_attach(socket->callback, socket->data);
MACRUM 0:35a2186cf186 459 }
MACRUM 0:35a2186cf186 460 else {
MACRUM 0:35a2186cf186 461 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 462 tcp = dynamic_cast<TCPSocketConnection*>(socket->snic_socket);
MACRUM 0:35a2186cf186 463 if (tcp == NULL){
MACRUM 0:35a2186cf186 464 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 465 }
MACRUM 0:35a2186cf186 466 #else
MACRUM 0:35a2186cf186 467 tcp = (TCPSocketConnection*)(socket->snic_socket);
MACRUM 0:35a2186cf186 468 #endif
MACRUM 0:35a2186cf186 469 }
MACRUM 0:35a2186cf186 470
MACRUM 0:35a2186cf186 471 tr_info("socket_connect IP:%s:%u\n", addr.get_ip_address(), addr.get_port());
MACRUM 0:35a2186cf186 472 if (tcp->connect(addr.get_ip_address(), addr.get_port()) != 0) {
MACRUM 0:35a2186cf186 473 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 474 }
MACRUM 0:35a2186cf186 475 }
MACRUM 0:35a2186cf186 476
MACRUM 0:35a2186cf186 477 //tr_info("socket_connect success\n");
MACRUM 0:35a2186cf186 478 socket->connected = true;
MACRUM 0:35a2186cf186 479 return 0;
MACRUM 0:35a2186cf186 480 }
MACRUM 0:35a2186cf186 481
MACRUM 0:35a2186cf186 482 int TypeYDInterface::socket_accept(void *handle, void **client_socket, SocketAddress *addr)
MACRUM 0:35a2186cf186 483 {
MACRUM 0:35a2186cf186 484 int ret;
MACRUM 0:35a2186cf186 485 struct managed_socket *server = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 486
MACRUM 0:35a2186cf186 487 if (server->proto == NSAPI_UDP) {
MACRUM 0:35a2186cf186 488 tr_info("unsupport:accept");
MACRUM 0:35a2186cf186 489 return NSAPI_ERROR_UNSUPPORTED;
MACRUM 0:35a2186cf186 490 }
MACRUM 0:35a2186cf186 491 else {
MACRUM 0:35a2186cf186 492 TCPSocketServer *tcp;
MACRUM 0:35a2186cf186 493 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 494 tcp = dynamic_cast<TCPSocketServer*>(server->snic_socket);
MACRUM 0:35a2186cf186 495 if (tcp == NULL){
MACRUM 0:35a2186cf186 496 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 497 }
MACRUM 0:35a2186cf186 498 #else
MACRUM 0:35a2186cf186 499 tcp = (TCPSocketServer*)(server->snic_socket);
MACRUM 0:35a2186cf186 500 #endif
MACRUM 0:35a2186cf186 501 socket_open(client_socket, NSAPI_TCP);
MACRUM 0:35a2186cf186 502 struct managed_socket *client = (struct managed_socket *)*client_socket;
MACRUM 0:35a2186cf186 503 TCPSocketConnection *conn = new TCPSocketConnection();
MACRUM 0:35a2186cf186 504 client->snic_socket = conn;
MACRUM 0:35a2186cf186 505 if (client->snic_socket == NULL) {
MACRUM 0:35a2186cf186 506 tr_error("tcp accept err\n");
MACRUM 0:35a2186cf186 507 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 508 }
MACRUM 0:35a2186cf186 509 ret = tcp->accept(*conn, addr);
MACRUM 0:35a2186cf186 510 if (ret != 0) {
MACRUM 0:35a2186cf186 511 tr_error("tcp listen err %d",ret);
MACRUM 0:35a2186cf186 512 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 513 }
MACRUM 0:35a2186cf186 514 }
MACRUM 0:35a2186cf186 515 return 0;
MACRUM 0:35a2186cf186 516 }
MACRUM 0:35a2186cf186 517
MACRUM 0:35a2186cf186 518 int TypeYDInterface::socket_send(void *handle, const void *data, unsigned size)
MACRUM 0:35a2186cf186 519 {
MACRUM 0:35a2186cf186 520 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 521
MACRUM 0:35a2186cf186 522 //tr_info("socket_send");
MACRUM 0:35a2186cf186 523
MACRUM 0:35a2186cf186 524 if (socket->proto != NSAPI_TCP) {
MACRUM 0:35a2186cf186 525 tr_error("un sup:socket_send");
MACRUM 0:35a2186cf186 526 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 527 }
MACRUM 0:35a2186cf186 528
MACRUM 0:35a2186cf186 529 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 530 TCPSocketConnection *tcp = dynamic_cast<TCPSocketConnection*>(socket->snic_socket);
MACRUM 0:35a2186cf186 531 if ((tcp == NULL) || ) {
MACRUM 0:35a2186cf186 532 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 533 }
MACRUM 0:35a2186cf186 534 #else
MACRUM 0:35a2186cf186 535 TCPSocketConnection *tcp = (TCPSocketConnection*)(socket->snic_socket);
MACRUM 0:35a2186cf186 536 #endif
MACRUM 0:35a2186cf186 537 if (tcp->send((char*)data, size) < 0) {
MACRUM 0:35a2186cf186 538 tr_error("socket_send");
MACRUM 0:35a2186cf186 539 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 540 }
MACRUM 0:35a2186cf186 541
MACRUM 0:35a2186cf186 542 return size;
MACRUM 0:35a2186cf186 543 }
MACRUM 0:35a2186cf186 544
MACRUM 0:35a2186cf186 545 int TypeYDInterface::socket_recv(void *handle, void *data, unsigned size)
MACRUM 0:35a2186cf186 546 {
MACRUM 0:35a2186cf186 547 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 548
MACRUM 0:35a2186cf186 549 //tr_info("socket_recv");
MACRUM 0:35a2186cf186 550
MACRUM 0:35a2186cf186 551 if (socket->proto != NSAPI_TCP) {
MACRUM 0:35a2186cf186 552 tr_error("not sup:socket_recv");
MACRUM 0:35a2186cf186 553 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 554 }
MACRUM 0:35a2186cf186 555
MACRUM 0:35a2186cf186 556 int recv;
MACRUM 0:35a2186cf186 557 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 558 TCPSocketConnection *tcp = dynamic_cast<TCPSocketConnection*>(socket->snic_socket);
MACRUM 0:35a2186cf186 559 if (tcp == NULL){
MACRUM 0:35a2186cf186 560 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 561 }
MACRUM 0:35a2186cf186 562 #else
MACRUM 0:35a2186cf186 563 TCPSocketConnection *tcp = (TCPSocketConnection*)(socket->snic_socket);
MACRUM 0:35a2186cf186 564 #endif
MACRUM 0:35a2186cf186 565 if ((recv = tcp->receive((char*)data, size)) < 0) {
MACRUM 0:35a2186cf186 566 return NSAPI_ERROR_WOULD_BLOCK;
MACRUM 0:35a2186cf186 567 }
MACRUM 0:35a2186cf186 568
MACRUM 0:35a2186cf186 569 return recv;
MACRUM 0:35a2186cf186 570 }
MACRUM 0:35a2186cf186 571
MACRUM 0:35a2186cf186 572 int TypeYDInterface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
MACRUM 0:35a2186cf186 573 {
MACRUM 0:35a2186cf186 574 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 575 int ret;
MACRUM 0:35a2186cf186 576
MACRUM 0:35a2186cf186 577 //tr_info("socket_sendto");
MACRUM 0:35a2186cf186 578
MACRUM 0:35a2186cf186 579 if (!socket->connected) {
MACRUM 0:35a2186cf186 580 int err = socket_connect(socket, addr);
MACRUM 0:35a2186cf186 581 if (err < 0) {
MACRUM 0:35a2186cf186 582 return err;
MACRUM 0:35a2186cf186 583 }
MACRUM 0:35a2186cf186 584 }
MACRUM 0:35a2186cf186 585
MACRUM 0:35a2186cf186 586 if (socket->proto == NSAPI_UDP) {
MACRUM 0:35a2186cf186 587 Endpoint remote;
MACRUM 0:35a2186cf186 588 remote.set_address(addr.get_ip_address(), addr.get_port());
MACRUM 0:35a2186cf186 589 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 590 SnicUDPSocket *udp = dynamic_cast<SnicUDPSocket*>(socket->snic_socket);
MACRUM 0:35a2186cf186 591 if (udp == NULL) {
MACRUM 0:35a2186cf186 592 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 593 }
MACRUM 0:35a2186cf186 594 #else
MACRUM 0:35a2186cf186 595 SnicUDPSocket *udp = (SnicUDPSocket*)(socket->snic_socket);
MACRUM 0:35a2186cf186 596 #endif
MACRUM 0:35a2186cf186 597 ret = udp->sendTo(remote, (char*)data, size);
MACRUM 0:35a2186cf186 598 }
MACRUM 0:35a2186cf186 599 else {
MACRUM 0:35a2186cf186 600 tr_error("TCP sendto\n");
MACRUM 0:35a2186cf186 601 return -1;
MACRUM 0:35a2186cf186 602 }
MACRUM 0:35a2186cf186 603
MACRUM 0:35a2186cf186 604 return ret;
MACRUM 0:35a2186cf186 605 }
MACRUM 0:35a2186cf186 606
MACRUM 0:35a2186cf186 607 int TypeYDInterface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
MACRUM 0:35a2186cf186 608 {
MACRUM 0:35a2186cf186 609 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 610 int recv;
MACRUM 0:35a2186cf186 611
MACRUM 0:35a2186cf186 612 //tr_info("socket_recvfrom");
MACRUM 0:35a2186cf186 613
MACRUM 0:35a2186cf186 614 if (socket->proto == NSAPI_UDP) {
MACRUM 0:35a2186cf186 615 Endpoint remote;
MACRUM 0:35a2186cf186 616 #ifdef USE_DYNAMIC_CAST
MACRUM 0:35a2186cf186 617 SnicUDPSocket *udp = dynamic_cast<SnicUDPSocket*>(socket->snic_socket);
MACRUM 0:35a2186cf186 618 if (udp == NULL) {
MACRUM 0:35a2186cf186 619 return NSAPI_ERROR_DEVICE_ERROR;
MACRUM 0:35a2186cf186 620 }
MACRUM 0:35a2186cf186 621 #else
MACRUM 0:35a2186cf186 622 SnicUDPSocket *udp = (SnicUDPSocket*)(socket->snic_socket);
MACRUM 0:35a2186cf186 623 #endif
MACRUM 0:35a2186cf186 624 recv = udp->receiveFrom(remote, (char*)data, size);
MACRUM 0:35a2186cf186 625 if (recv > 0) {
MACRUM 0:35a2186cf186 626 addr->set_ip_address(remote.get_address());
MACRUM 0:35a2186cf186 627 addr->set_port(remote.get_port());
MACRUM 0:35a2186cf186 628 }
MACRUM 0:35a2186cf186 629 }
MACRUM 0:35a2186cf186 630 else {
MACRUM 0:35a2186cf186 631 tr_error("TCP recvfrom\n");
MACRUM 0:35a2186cf186 632 return -1;
MACRUM 0:35a2186cf186 633 }
MACRUM 0:35a2186cf186 634
MACRUM 0:35a2186cf186 635 return recv;
MACRUM 0:35a2186cf186 636 }
MACRUM 0:35a2186cf186 637
MACRUM 0:35a2186cf186 638
MACRUM 0:35a2186cf186 639 void TypeYDInterface::socket_attach(void *handle, void (*callback)(void *), void *data)
MACRUM 0:35a2186cf186 640 {
MACRUM 0:35a2186cf186 641 struct managed_socket *socket = (struct managed_socket *)handle;
MACRUM 0:35a2186cf186 642
MACRUM 0:35a2186cf186 643 //tr_info("socket_attach");
MACRUM 0:35a2186cf186 644 socket->callback = callback;
MACRUM 0:35a2186cf186 645 socket->data = data;
MACRUM 0:35a2186cf186 646 if (socket->snic_socket != NULL) {
MACRUM 0:35a2186cf186 647 socket->snic_socket->socket_attach(callback, data);
MACRUM 0:35a2186cf186 648 }
MACRUM 0:35a2186cf186 649 }
MACRUM 0:35a2186cf186 650