mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
Anna Bridge
Date:
Fri Jun 22 16:45:37 2018 +0100
Revision:
186:707f6e361f3e
Parent:
184:08ed48f1de7f
Child:
188:bcfe06ba3d64
mbed-dev library. Release version 162

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* Ameba implementation of NetworkInterfaceAPI
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2015 ARM Limited
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 #include "mbed.h"
AnnaBridge 167:e84263d55307 18 #include "rtos.h"
AnnaBridge 167:e84263d55307 19
AnnaBridge 167:e84263d55307 20 #include "RTWInterface.h"
AnnaBridge 167:e84263d55307 21 #include "mbed_interface.h"
Anna Bridge 186:707f6e361f3e 22
AnnaBridge 167:e84263d55307 23 #include "rtw_emac.h"
Anna Bridge 186:707f6e361f3e 24 #include "EMAC.h"
AnnaBridge 167:e84263d55307 25 #include "wifi_constants.h"
AnnaBridge 167:e84263d55307 26 #include "wifi_conf.h"
AnnaBridge 167:e84263d55307 27
Anna Bridge 186:707f6e361f3e 28 #include "OnboardNetworkStack.h"
Anna Bridge 186:707f6e361f3e 29 #include "EMACMemoryManager.h"
AnnaBridge 167:e84263d55307 30 #include "osdep_service.h"
AnnaBridge 167:e84263d55307 31
AnnaBridge 167:e84263d55307 32 typedef struct _wifi_scan_hdl {
AnnaBridge 174:b96e65c34a4d 33 _sema scan_sema;
AnnaBridge 167:e84263d55307 34 nsapi_size_t ap_num;
AnnaBridge 167:e84263d55307 35 nsapi_size_t scan_num;
AnnaBridge 167:e84263d55307 36 WiFiAccessPoint *ap_details;
AnnaBridge 167:e84263d55307 37 } wifi_scan_hdl;
AnnaBridge 167:e84263d55307 38
AnnaBridge 167:e84263d55307 39 #define MAX_SCAN_TIMEOUT (15000)
AnnaBridge 167:e84263d55307 40
Anna Bridge 180:96ed750bd169 41 static bool _inited = false;
Anna Bridge 180:96ed750bd169 42
AnnaBridge 167:e84263d55307 43 static rtw_result_t scan_result_handler( rtw_scan_handler_result_t* malloced_scan_result )
AnnaBridge 167:e84263d55307 44 {
AnnaBridge 167:e84263d55307 45 wifi_scan_hdl *scan_handler = (wifi_scan_hdl *)malloced_scan_result->user_data;
AnnaBridge 167:e84263d55307 46 if (malloced_scan_result->scan_complete != RTW_TRUE) {
Anna Bridge 186:707f6e361f3e 47 if (scan_handler->ap_details && scan_handler->scan_num > scan_handler->ap_num) {
Anna Bridge 180:96ed750bd169 48 nsapi_wifi_ap_t ap;
AnnaBridge 167:e84263d55307 49 rtw_scan_result_t* record = &malloced_scan_result->ap_details;
Anna Bridge 180:96ed750bd169 50 record->SSID.val[record->SSID.len] = 0; /* Ensure the SSID is null terminated */
AnnaBridge 167:e84263d55307 51 memset((void*)&ap, 0x00, sizeof(nsapi_wifi_ap_t));
AnnaBridge 167:e84263d55307 52 memcpy(ap.ssid, record->SSID.val, record->SSID.len);
AnnaBridge 167:e84263d55307 53 memcpy(ap.bssid, record->BSSID.octet, 6);
Anna Bridge 186:707f6e361f3e 54 switch (record->security) {
AnnaBridge 167:e84263d55307 55 case RTW_SECURITY_OPEN:
AnnaBridge 167:e84263d55307 56 ap.security = NSAPI_SECURITY_NONE;
AnnaBridge 167:e84263d55307 57 break;
AnnaBridge 167:e84263d55307 58 case RTW_SECURITY_WEP_PSK:
AnnaBridge 167:e84263d55307 59 case RTW_SECURITY_WEP_SHARED:
AnnaBridge 167:e84263d55307 60 ap.security = NSAPI_SECURITY_WEP;
AnnaBridge 167:e84263d55307 61 break;
AnnaBridge 167:e84263d55307 62 case RTW_SECURITY_WPA_TKIP_PSK:
AnnaBridge 167:e84263d55307 63 case RTW_SECURITY_WPA_AES_PSK:
AnnaBridge 167:e84263d55307 64 ap.security = NSAPI_SECURITY_WPA;
AnnaBridge 167:e84263d55307 65 break;
AnnaBridge 167:e84263d55307 66 case RTW_SECURITY_WPA2_AES_PSK:
AnnaBridge 167:e84263d55307 67 case RTW_SECURITY_WPA2_TKIP_PSK:
AnnaBridge 167:e84263d55307 68 case RTW_SECURITY_WPA2_MIXED_PSK:
AnnaBridge 167:e84263d55307 69 ap.security = NSAPI_SECURITY_WPA2;
AnnaBridge 167:e84263d55307 70 break;
AnnaBridge 167:e84263d55307 71 case RTW_SECURITY_WPA_WPA2_MIXED:
AnnaBridge 167:e84263d55307 72 ap.security = NSAPI_SECURITY_WPA_WPA2;
AnnaBridge 167:e84263d55307 73 break;
AnnaBridge 167:e84263d55307 74 default:
AnnaBridge 167:e84263d55307 75 ap.security = NSAPI_SECURITY_UNKNOWN;
AnnaBridge 167:e84263d55307 76 break;
AnnaBridge 167:e84263d55307 77 }
AnnaBridge 167:e84263d55307 78 ap.rssi = record->signal_strength;
AnnaBridge 167:e84263d55307 79 ap.channel = record->channel;
AnnaBridge 172:7d866c31b3c5 80 scan_handler->ap_details[scan_handler->ap_num] = WiFiAccessPoint(ap);
AnnaBridge 167:e84263d55307 81 }
AnnaBridge 167:e84263d55307 82 scan_handler->ap_num++;
Anna Bridge 186:707f6e361f3e 83 } else {
AnnaBridge 167:e84263d55307 84 // scan done
AnnaBridge 167:e84263d55307 85 rtw_up_sema(&scan_handler->scan_sema);
AnnaBridge 167:e84263d55307 86 }
AnnaBridge 167:e84263d55307 87 return RTW_SUCCESS;
AnnaBridge 167:e84263d55307 88 }
AnnaBridge 167:e84263d55307 89
Anna Bridge 186:707f6e361f3e 90 RTWInterface::RTWInterface(RTW_EMAC &get_rtw_emac, OnboardNetworkStack &get_rtw_obn_stack) :
Anna Bridge 186:707f6e361f3e 91 rtw_emac(get_rtw_emac),
Anna Bridge 186:707f6e361f3e 92 rtw_obn_stack(get_rtw_obn_stack),
Anna Bridge 186:707f6e361f3e 93 rtw_interface(NULL),
Anna Bridge 186:707f6e361f3e 94 _dhcp(true),
Anna Bridge 186:707f6e361f3e 95 _ip_address(),
Anna Bridge 186:707f6e361f3e 96 _netmask(),
Anna Bridge 186:707f6e361f3e 97 _gateway(),
Anna Bridge 186:707f6e361f3e 98 _mac_address()
AnnaBridge 167:e84263d55307 99 {
Anna Bridge 186:707f6e361f3e 100 rtw_emac.power_up();
AnnaBridge 167:e84263d55307 101 }
AnnaBridge 167:e84263d55307 102
AnnaBridge 167:e84263d55307 103 RTWInterface::~RTWInterface()
AnnaBridge 167:e84263d55307 104 {
Anna Bridge 186:707f6e361f3e 105 rtw_emac.wlan_emac_link_change(false);
Anna Bridge 186:707f6e361f3e 106 rtw_interface->bringdown();
AnnaBridge 167:e84263d55307 107 }
AnnaBridge 167:e84263d55307 108
AnnaBridge 167:e84263d55307 109 nsapi_error_t RTWInterface::set_network(const char *ip_address, const char *netmask, const char *gateway)
AnnaBridge 167:e84263d55307 110 {
AnnaBridge 167:e84263d55307 111 _dhcp = false;
AnnaBridge 167:e84263d55307 112 strncpy(_ip_address, ip_address ? ip_address : "", sizeof(_ip_address));
AnnaBridge 167:e84263d55307 113 strncpy(_netmask, netmask ? netmask : "", sizeof(_netmask));
AnnaBridge 167:e84263d55307 114 strncpy(_gateway, gateway ? gateway : "", sizeof(_gateway));
AnnaBridge 167:e84263d55307 115 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 116 }
AnnaBridge 167:e84263d55307 117
AnnaBridge 167:e84263d55307 118 nsapi_error_t RTWInterface::set_dhcp(bool dhcp)
AnnaBridge 167:e84263d55307 119 {
AnnaBridge 167:e84263d55307 120 _dhcp = dhcp;
AnnaBridge 167:e84263d55307 121 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 122 }
AnnaBridge 167:e84263d55307 123
AnnaBridge 167:e84263d55307 124 /*
AnnaBridge 167:e84263d55307 125 * we may call connect multiple times
AnnaBridge 167:e84263d55307 126 */
AnnaBridge 167:e84263d55307 127 nsapi_error_t RTWInterface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
AnnaBridge 167:e84263d55307 128 {
Anna Bridge 186:707f6e361f3e 129 if (!ssid) {
Anna Bridge 180:96ed750bd169 130 return NSAPI_ERROR_PARAMETER;
Anna Bridge 180:96ed750bd169 131 }
Anna Bridge 180:96ed750bd169 132
Anna Bridge 180:96ed750bd169 133 switch (security) {
Anna Bridge 180:96ed750bd169 134 case NSAPI_SECURITY_WPA:
Anna Bridge 180:96ed750bd169 135 case NSAPI_SECURITY_WPA2:
Anna Bridge 180:96ed750bd169 136 case NSAPI_SECURITY_WPA_WPA2:
Anna Bridge 180:96ed750bd169 137 case NSAPI_SECURITY_WEP:
Anna Bridge 186:707f6e361f3e 138 if ((strlen(pass) < 8) || (strlen(pass) > 63)) { // 802.11 password 8-63 characters
Anna Bridge 180:96ed750bd169 139 return NSAPI_ERROR_PARAMETER;
Anna Bridge 180:96ed750bd169 140 }
Anna Bridge 180:96ed750bd169 141 break;
Anna Bridge 180:96ed750bd169 142 case NSAPI_SECURITY_NONE:
Anna Bridge 180:96ed750bd169 143 break;
Anna Bridge 180:96ed750bd169 144 default:
Anna Bridge 180:96ed750bd169 145 return NSAPI_ERROR_PARAMETER;
Anna Bridge 180:96ed750bd169 146 }
Anna Bridge 180:96ed750bd169 147
AnnaBridge 167:e84263d55307 148 strncpy(_ssid, ssid, 255);
AnnaBridge 167:e84263d55307 149 strncpy(_pass, pass, 255);
AnnaBridge 167:e84263d55307 150 _security = security;
AnnaBridge 167:e84263d55307 151
AnnaBridge 167:e84263d55307 152 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 153 }
AnnaBridge 167:e84263d55307 154
AnnaBridge 167:e84263d55307 155 nsapi_error_t RTWInterface::connect()
AnnaBridge 167:e84263d55307 156 {
AnnaBridge 167:e84263d55307 157 int ret;
AnnaBridge 167:e84263d55307 158 rtw_security_t sec;
AnnaBridge 167:e84263d55307 159
Anna Bridge 186:707f6e361f3e 160 if (!_ssid || (!_pass && _security != NSAPI_SECURITY_NONE)) {
AnnaBridge 167:e84263d55307 161 printf("Invalid credentials\r\n");
AnnaBridge 167:e84263d55307 162 return NSAPI_ERROR_PARAMETER;
AnnaBridge 167:e84263d55307 163 }
AnnaBridge 167:e84263d55307 164
AnnaBridge 167:e84263d55307 165 switch (_security) {
AnnaBridge 167:e84263d55307 166 case NSAPI_SECURITY_WPA:
AnnaBridge 167:e84263d55307 167 case NSAPI_SECURITY_WPA2:
AnnaBridge 167:e84263d55307 168 case NSAPI_SECURITY_WPA_WPA2:
AnnaBridge 167:e84263d55307 169 sec = RTW_SECURITY_WPA_WPA2_MIXED;
AnnaBridge 167:e84263d55307 170 break;
AnnaBridge 167:e84263d55307 171 case NSAPI_SECURITY_WEP:
AnnaBridge 167:e84263d55307 172 sec = RTW_SECURITY_WEP_PSK;
AnnaBridge 167:e84263d55307 173 break;
AnnaBridge 167:e84263d55307 174 case NSAPI_SECURITY_NONE:
AnnaBridge 167:e84263d55307 175 sec = RTW_SECURITY_OPEN;
Anna Bridge 180:96ed750bd169 176 break;
AnnaBridge 167:e84263d55307 177 default:
AnnaBridge 167:e84263d55307 178 return NSAPI_ERROR_PARAMETER;
AnnaBridge 167:e84263d55307 179 }
AnnaBridge 167:e84263d55307 180
Anna Bridge 186:707f6e361f3e 181 if (_channel > 0 && _channel < 14) {
Anna Bridge 186:707f6e361f3e 182 uint8_t pscan_config = PSCAN_ENABLE;
Anna Bridge 186:707f6e361f3e 183 wifi_set_pscan_chan(&_channel, &pscan_config, 1);
Anna Bridge 186:707f6e361f3e 184 }
Anna Bridge 186:707f6e361f3e 185
AnnaBridge 167:e84263d55307 186 ret = wifi_connect(_ssid, sec, _pass, strlen(_ssid), strlen(_pass), 0, (void *)NULL);
AnnaBridge 167:e84263d55307 187 if (ret != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 188 printf("failed: %d\r\n", ret);
AnnaBridge 167:e84263d55307 189 return NSAPI_ERROR_NO_CONNECTION;
AnnaBridge 167:e84263d55307 190 }
AnnaBridge 167:e84263d55307 191
Anna Bridge 186:707f6e361f3e 192 rtw_emac.wlan_emac_link_change(true);
Anna Bridge 186:707f6e361f3e 193 if (!rtw_interface) {
Anna Bridge 186:707f6e361f3e 194 nsapi_error_t err = rtw_obn_stack.add_ethernet_interface(rtw_emac, true, &rtw_interface);
Anna Bridge 186:707f6e361f3e 195 if (err != NSAPI_ERROR_OK) {
Anna Bridge 186:707f6e361f3e 196 rtw_interface = NULL;
Anna Bridge 186:707f6e361f3e 197 return err;
Anna Bridge 186:707f6e361f3e 198 }
Anna Bridge 186:707f6e361f3e 199 }
Anna Bridge 186:707f6e361f3e 200
Anna Bridge 186:707f6e361f3e 201 int rtw_if_bringup = rtw_interface->bringup(_dhcp,
Anna Bridge 186:707f6e361f3e 202 _ip_address[0] ? _ip_address : 0,
Anna Bridge 186:707f6e361f3e 203 _netmask[0] ? _netmask : 0,
Anna Bridge 186:707f6e361f3e 204 _gateway[0] ? _gateway : 0,
Anna Bridge 186:707f6e361f3e 205 DEFAULT_STACK);
Anna Bridge 186:707f6e361f3e 206 return rtw_if_bringup;
AnnaBridge 167:e84263d55307 207 }
AnnaBridge 167:e84263d55307 208
AnnaBridge 167:e84263d55307 209 nsapi_error_t RTWInterface::scan(WiFiAccessPoint *res, unsigned count)
AnnaBridge 167:e84263d55307 210 {
AnnaBridge 167:e84263d55307 211 static wifi_scan_hdl scan_handler;
AnnaBridge 167:e84263d55307 212 scan_handler.ap_num = 0;
Anna Bridge 186:707f6e361f3e 213 if (!scan_handler.scan_sema) {
AnnaBridge 167:e84263d55307 214 rtw_init_sema(&scan_handler.scan_sema, 0);
Anna Bridge 186:707f6e361f3e 215 }
AnnaBridge 167:e84263d55307 216 scan_handler.scan_num = count;
AnnaBridge 167:e84263d55307 217 scan_handler.ap_details = res;
Anna Bridge 186:707f6e361f3e 218 if (wifi_scan_networks(scan_result_handler, (void *)&scan_handler) != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 219 printf("wifi scan failed\n\r");
AnnaBridge 167:e84263d55307 220 return NSAPI_ERROR_DEVICE_ERROR;
AnnaBridge 167:e84263d55307 221 }
Anna Bridge 186:707f6e361f3e 222 if (rtw_down_timeout_sema( &scan_handler.scan_sema, MAX_SCAN_TIMEOUT ) == RTW_FALSE) {
AnnaBridge 167:e84263d55307 223 printf("wifi scan timeout\r\n");
AnnaBridge 167:e84263d55307 224 return NSAPI_ERROR_DEVICE_ERROR;
AnnaBridge 167:e84263d55307 225 }
Anna Bridge 186:707f6e361f3e 226 if (count <= 0 || count > scan_handler.ap_num) {
AnnaBridge 167:e84263d55307 227 count = scan_handler.ap_num;
Anna Bridge 186:707f6e361f3e 228 }
AnnaBridge 167:e84263d55307 229 return count;
AnnaBridge 167:e84263d55307 230 }
AnnaBridge 167:e84263d55307 231
AnnaBridge 167:e84263d55307 232 nsapi_error_t RTWInterface::set_channel(uint8_t channel)
AnnaBridge 167:e84263d55307 233 {
Anna Bridge 186:707f6e361f3e 234 _channel = channel;
AnnaBridge 167:e84263d55307 235 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 236 }
AnnaBridge 167:e84263d55307 237
AnnaBridge 167:e84263d55307 238 int8_t RTWInterface::get_rssi()
AnnaBridge 167:e84263d55307 239 {
AnnaBridge 167:e84263d55307 240 int rssi = 0;
Anna Bridge 186:707f6e361f3e 241 if (wifi_get_rssi(&rssi) == 0) {
AnnaBridge 167:e84263d55307 242 return (int8_t)rssi;
Anna Bridge 186:707f6e361f3e 243 }
AnnaBridge 167:e84263d55307 244 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 245 }
AnnaBridge 167:e84263d55307 246
AnnaBridge 167:e84263d55307 247 nsapi_error_t RTWInterface::connect(const char *ssid, const char *pass,
Anna Bridge 180:96ed750bd169 248 nsapi_security_t security, uint8_t channel)
AnnaBridge 167:e84263d55307 249 {
Anna Bridge 186:707f6e361f3e 250 set_credentials(ssid, pass, security);
Anna Bridge 186:707f6e361f3e 251 set_channel(channel);
AnnaBridge 167:e84263d55307 252 return connect();
AnnaBridge 167:e84263d55307 253 }
AnnaBridge 167:e84263d55307 254
AnnaBridge 167:e84263d55307 255 nsapi_error_t RTWInterface::disconnect()
AnnaBridge 167:e84263d55307 256 {
AnnaBridge 167:e84263d55307 257 char essid[33];
AnnaBridge 167:e84263d55307 258
Anna Bridge 186:707f6e361f3e 259 rtw_emac.wlan_emac_link_change(false);
Anna Bridge 186:707f6e361f3e 260 rtw_interface->bringdown();
Anna Bridge 186:707f6e361f3e 261 if (wifi_is_connected_to_ap() != RTW_SUCCESS) {
AnnaBridge 167:e84263d55307 262 return NSAPI_ERROR_NO_CONNECTION;
Anna Bridge 186:707f6e361f3e 263 }
Anna Bridge 186:707f6e361f3e 264 if (wifi_disconnect()<0) {
AnnaBridge 167:e84263d55307 265 return NSAPI_ERROR_DEVICE_ERROR;
AnnaBridge 167:e84263d55307 266 }
Anna Bridge 186:707f6e361f3e 267 while(1) {
Anna Bridge 186:707f6e361f3e 268 if (wext_get_ssid(WLAN0_NAME, (unsigned char *) essid) < 0) {
AnnaBridge 167:e84263d55307 269 break;
AnnaBridge 167:e84263d55307 270 }
AnnaBridge 167:e84263d55307 271 }
AnnaBridge 167:e84263d55307 272 return NSAPI_ERROR_OK;
AnnaBridge 167:e84263d55307 273 }
AnnaBridge 167:e84263d55307 274
AnnaBridge 167:e84263d55307 275 int RTWInterface::is_connected()
AnnaBridge 167:e84263d55307 276 {
AnnaBridge 167:e84263d55307 277 return !wifi_is_connected_to_ap();
AnnaBridge 167:e84263d55307 278 }
AnnaBridge 167:e84263d55307 279
AnnaBridge 167:e84263d55307 280 const char *RTWInterface::get_mac_address()
AnnaBridge 167:e84263d55307 281 {
Anna Bridge 186:707f6e361f3e 282 if (rtw_interface->get_mac_address(_mac_address, sizeof _mac_address)) {
Anna Bridge 186:707f6e361f3e 283 return _mac_address;
Anna Bridge 186:707f6e361f3e 284 }
Anna Bridge 186:707f6e361f3e 285 return 0;
AnnaBridge 167:e84263d55307 286 }
AnnaBridge 167:e84263d55307 287
AnnaBridge 167:e84263d55307 288 const char *RTWInterface::get_ip_address()
AnnaBridge 167:e84263d55307 289 {
Anna Bridge 186:707f6e361f3e 290 if (rtw_interface->get_ip_address(_ip_address, sizeof _ip_address)) {
AnnaBridge 167:e84263d55307 291 return _ip_address;
AnnaBridge 167:e84263d55307 292 }
AnnaBridge 167:e84263d55307 293 return 0;
AnnaBridge 167:e84263d55307 294 }
AnnaBridge 167:e84263d55307 295
AnnaBridge 167:e84263d55307 296 const char *RTWInterface::get_netmask()
AnnaBridge 167:e84263d55307 297 {
Anna Bridge 186:707f6e361f3e 298 if (rtw_interface->get_netmask(_netmask, sizeof _netmask)) {
AnnaBridge 167:e84263d55307 299 return _netmask;
AnnaBridge 167:e84263d55307 300 }
AnnaBridge 167:e84263d55307 301 return 0;
AnnaBridge 167:e84263d55307 302 }
AnnaBridge 167:e84263d55307 303
AnnaBridge 167:e84263d55307 304 const char *RTWInterface::get_gateway()
AnnaBridge 167:e84263d55307 305 {
Anna Bridge 186:707f6e361f3e 306 if (rtw_interface->get_gateway(_gateway, sizeof _gateway)) {
AnnaBridge 167:e84263d55307 307 return _gateway;
AnnaBridge 167:e84263d55307 308 }
AnnaBridge 167:e84263d55307 309 return 0;
AnnaBridge 167:e84263d55307 310 }
AnnaBridge 167:e84263d55307 311
AnnaBridge 167:e84263d55307 312 NetworkStack *RTWInterface::get_stack()
AnnaBridge 167:e84263d55307 313 {
Anna Bridge 186:707f6e361f3e 314 return &rtw_obn_stack;
Anna Bridge 180:96ed750bd169 315 }