USB Host Library for Sprint Dongles

Dependencies:   Socket USBHostWANDongleSprint lwip-sys lwip

Dependents:   SprintUSBModemWebsocketTest SprintUSBModemHTTPClientTest SprintUSBModemNTPClientTest SprintUSBModemSMSTest ... more

Fork of SprintUSBModem_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Mon Dec 10 18:23:49 2012 +0000
Revision:
14:f6f17843e5ef
Parent:
4:23100b0757d6
Separate USB/Sprint dev flows, fix regression in mbed rev. 41+ lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8f57713b2147 1 /* PPPIPInterface.cpp */
donatien 0:8f57713b2147 2 /* Copyright (C) 2012 mbed.org, MIT License
donatien 0:8f57713b2147 3 *
donatien 0:8f57713b2147 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 0:8f57713b2147 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
donatien 0:8f57713b2147 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
donatien 0:8f57713b2147 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
donatien 0:8f57713b2147 8 * furnished to do so, subject to the following conditions:
donatien 0:8f57713b2147 9 *
donatien 0:8f57713b2147 10 * The above copyright notice and this permission notice shall be included in all copies or
donatien 0:8f57713b2147 11 * substantial portions of the Software.
donatien 0:8f57713b2147 12 *
donatien 0:8f57713b2147 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 0:8f57713b2147 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 0:8f57713b2147 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 0:8f57713b2147 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:8f57713b2147 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 0:8f57713b2147 18 */
donatien 0:8f57713b2147 19
donatien 4:23100b0757d6 20 #define __DEBUG__ 0
donatien 0:8f57713b2147 21 #ifndef __MODULE__
donatien 0:8f57713b2147 22 #define __MODULE__ "PPPIPInterface.cpp"
donatien 0:8f57713b2147 23 #endif
donatien 0:8f57713b2147 24
donatien 0:8f57713b2147 25 #include "core/fwk.h"
donatien 0:8f57713b2147 26 #include "rtos.h"
donatien 0:8f57713b2147 27
donatien 0:8f57713b2147 28 #include "PPPIPInterface.h"
donatien 0:8f57713b2147 29
donatien 0:8f57713b2147 30 #define MSISDN "#777"
donatien 0:8f57713b2147 31 //TODO Pass this as parameter (*99# is used by GSM systems, #777 by CDMA systems--well at least Sprint!)
donatien 0:8f57713b2147 32
donatien 0:8f57713b2147 33 #define CONNECT_CMD "ATD " MSISDN "\x0D"
donatien 0:8f57713b2147 34 #define EXPECTED_RESP CONNECT_CMD "\x0D" "\x0A" "CONNECT" "\x0D" "\x0A"
donatien 0:8f57713b2147 35 #define EXPECTED_RESP_DATARATE CONNECT_CMD "\x0D" "\x0A" "CONNECT %d" "\x0D" "\x0A"
donatien 0:8f57713b2147 36 #define EXPECTED_RESP_MIN_LEN 20
donatien 0:8f57713b2147 37 #define OK_RESP "\x0D" "\x0A" "OK" "\x0D" "\x0A"
donatien 0:8f57713b2147 38 #define ESCAPE_SEQ "+++"
donatien 0:8f57713b2147 39 #define HANGUP_CMD "ATH" "\x0D"
donatien 0:8f57713b2147 40 #define NO_CARRIER_RESP "\x0D" "\x0A" "NO CARRIER" "\x0D" "\x0A"
donatien 0:8f57713b2147 41 extern "C" {
donatien 0:8f57713b2147 42 #include "lwip/ip_addr.h"
donatien 0:8f57713b2147 43 #include "lwip/inet.h"
donatien 0:8f57713b2147 44 #include "netif/ppp/ppp.h"
donatien 0:8f57713b2147 45 }
donatien 0:8f57713b2147 46
donatien 0:8f57713b2147 47 PPPIPInterface::PPPIPInterface(IOStream* pStream) : LwIPInterface(), m_linkStatusSphre(1), m_pppErrCode(0), m_pStream(pStream), m_streamAvail(true), m_pppd(-1)
donatien 0:8f57713b2147 48 {
donatien 0:8f57713b2147 49 m_linkStatusSphre.wait();
donatien 0:8f57713b2147 50 }
donatien 0:8f57713b2147 51
donatien 0:8f57713b2147 52 /*virtual*/ PPPIPInterface::~PPPIPInterface()
donatien 0:8f57713b2147 53 {
donatien 0:8f57713b2147 54
donatien 0:8f57713b2147 55 }
donatien 0:8f57713b2147 56
donatien 0:8f57713b2147 57 /*virtual*/ int PPPIPInterface::init() //Init PPP-specific stuff, create the right bindings, etc
donatien 0:8f57713b2147 58 {
donatien 0:8f57713b2147 59 DBG("Initializing LwIP");
donatien 0:8f57713b2147 60 LwIPInterface::init(); //Init LwIP, NOT including PPP
donatien 0:8f57713b2147 61 DBG("Initializing PPP");
donatien 0:8f57713b2147 62 pppInit();
donatien 0:8f57713b2147 63 DBG("Done");
donatien 0:8f57713b2147 64 return OK;
donatien 0:8f57713b2147 65 }
donatien 0:8f57713b2147 66
donatien 0:8f57713b2147 67 int PPPIPInterface::setup(const char* user, const char* pw)
donatien 0:8f57713b2147 68 {
donatien 0:8f57713b2147 69 DBG("Configuring PPP authentication method");
donatien 0:8f57713b2147 70 pppSetAuth(PPPAUTHTYPE_ANY, user, pw);
donatien 0:8f57713b2147 71 DBG("Done");
donatien 0:8f57713b2147 72 return OK;
donatien 0:8f57713b2147 73 }
donatien 0:8f57713b2147 74
donatien 0:8f57713b2147 75 /*virtual*/ int PPPIPInterface::connect()
donatien 0:8f57713b2147 76 {
donatien 0:8f57713b2147 77 int ret;
donatien 0:8f57713b2147 78 char buf[32];
donatien 0:8f57713b2147 79 size_t len;
donatien 0:8f57713b2147 80 DBG("Trying to connect with PPP");
donatien 0:8f57713b2147 81
donatien 0:8f57713b2147 82 cleanupLink();
donatien 0:8f57713b2147 83
donatien 0:8f57713b2147 84 DBG("Sending %s", CONNECT_CMD);
donatien 0:8f57713b2147 85
donatien 0:8f57713b2147 86 ret = m_pStream->write((uint8_t*)CONNECT_CMD, strlen(CONNECT_CMD), osWaitForever);
donatien 0:8f57713b2147 87 if( ret != OK )
donatien 0:8f57713b2147 88 {
donatien 0:8f57713b2147 89 return NET_UNKNOWN;
donatien 0:8f57713b2147 90 }
donatien 0:8f57713b2147 91
donatien 0:8f57713b2147 92 DBG("Expect %s", EXPECTED_RESP);
donatien 0:8f57713b2147 93
donatien 0:8f57713b2147 94 len = 0;
donatien 0:8f57713b2147 95 size_t readLen;
donatien 0:8f57713b2147 96 ret = m_pStream->read((uint8_t*)buf + len, &readLen, EXPECTED_RESP_MIN_LEN, 10000);
donatien 0:8f57713b2147 97 if( ret != OK )
donatien 0:8f57713b2147 98 {
donatien 0:8f57713b2147 99 return NET_UNKNOWN;
donatien 0:8f57713b2147 100 }
donatien 0:8f57713b2147 101 len += readLen;
donatien 0:8f57713b2147 102 while( (len < EXPECTED_RESP_MIN_LEN) || (buf[len-1] != LF) )
donatien 0:8f57713b2147 103 {
donatien 0:8f57713b2147 104 ret = m_pStream->read((uint8_t*)buf + len, &readLen, 1, 10000);
donatien 0:8f57713b2147 105 if( ret != OK )
donatien 0:8f57713b2147 106 {
donatien 0:8f57713b2147 107 return NET_UNKNOWN;
donatien 0:8f57713b2147 108 }
donatien 0:8f57713b2147 109 len += readLen;
donatien 0:8f57713b2147 110 }
donatien 0:8f57713b2147 111
donatien 0:8f57713b2147 112 buf[len]=0;
donatien 0:8f57713b2147 113
donatien 0:8f57713b2147 114 DBG("Got %s[len %d]", buf, len);
donatien 0:8f57713b2147 115
donatien 0:8f57713b2147 116 int datarate = 0;
donatien 0:8f57713b2147 117 if( (sscanf( buf, EXPECTED_RESP_DATARATE, &datarate ) != 1) && (strcmp(EXPECTED_RESP, buf) != 0) )
donatien 0:8f57713b2147 118 {
donatien 0:8f57713b2147 119 //Discard buffer
donatien 0:8f57713b2147 120 do //Clear buf
donatien 0:8f57713b2147 121 {
donatien 0:8f57713b2147 122 ret = m_pStream->read((uint8_t*)buf, &len, 32, 0);
donatien 0:8f57713b2147 123 } while( (ret == OK) && (len > 0) );
donatien 0:8f57713b2147 124 return NET_CONN;
donatien 0:8f57713b2147 125 }
donatien 0:8f57713b2147 126
donatien 0:8f57713b2147 127 DBG("Transport link open");
donatien 0:8f57713b2147 128 if(datarate != 0)
donatien 0:8f57713b2147 129 {
donatien 0:8f57713b2147 130 DBG("Datarate: %d bps", datarate);
donatien 0:8f57713b2147 131 }
donatien 0:8f57713b2147 132 m_linkStatusSphre.wait(0);
donatien 0:8f57713b2147 133 if((m_pppd != -1) && (m_pppErrCode == 0)) //Already connected
donatien 0:8f57713b2147 134 {
donatien 0:8f57713b2147 135 return NET_INVALID;
donatien 0:8f57713b2147 136 }
donatien 0:8f57713b2147 137
donatien 0:8f57713b2147 138 ret = pppOverSerialOpen(this, PPPIPInterface::linkStatusCb, this);
donatien 0:8f57713b2147 139 if(ret < 0)
donatien 0:8f57713b2147 140 {
donatien 0:8f57713b2147 141 switch(ret)
donatien 0:8f57713b2147 142 {
donatien 0:8f57713b2147 143 case PPPERR_OPEN:
donatien 0:8f57713b2147 144 default:
donatien 0:8f57713b2147 145 return NET_FULL; //All available resources are already used
donatien 0:8f57713b2147 146 }
donatien 0:8f57713b2147 147 }
donatien 0:8f57713b2147 148 m_pppd = ret; //PPP descriptor
donatien 0:8f57713b2147 149 m_linkStatusSphre.wait(); //Block indefinitely; there should be a timeout there
donatien 0:8f57713b2147 150 if(m_pppErrCode != PPPERR_NONE)
donatien 0:8f57713b2147 151 {
donatien 0:8f57713b2147 152 m_pppd = -1;
donatien 0:8f57713b2147 153 }
donatien 0:8f57713b2147 154 switch(m_pppErrCode)
donatien 0:8f57713b2147 155 {
donatien 0:8f57713b2147 156 case PPPERR_NONE: //Connected OK
donatien 0:8f57713b2147 157 return OK;
donatien 0:8f57713b2147 158 case PPPERR_CONNECT: //Connection lost
donatien 0:8f57713b2147 159 return NET_INTERRUPTED;
donatien 0:8f57713b2147 160 case PPPERR_AUTHFAIL: //Authentication failed
donatien 0:8f57713b2147 161 return NET_AUTH;
donatien 0:8f57713b2147 162 case PPPERR_PROTOCOL: //Protocol error
donatien 0:8f57713b2147 163 return NET_PROTOCOL;
donatien 0:8f57713b2147 164 default:
donatien 0:8f57713b2147 165 return NET_UNKNOWN;
donatien 0:8f57713b2147 166 }
donatien 0:8f57713b2147 167 }
donatien 0:8f57713b2147 168
donatien 0:8f57713b2147 169 /*virtual*/ int PPPIPInterface::disconnect()
donatien 0:8f57713b2147 170 {
donatien 0:8f57713b2147 171 int ret = m_linkStatusSphre.wait(0);
donatien 0:8f57713b2147 172 if(ret > 0) //Already disconnected?
donatien 0:8f57713b2147 173 {
donatien 0:8f57713b2147 174 m_pppd = -1; //Discard PPP descriptor
donatien 0:8f57713b2147 175 switch(m_pppErrCode)
donatien 0:8f57713b2147 176 {
donatien 0:8f57713b2147 177 case PPPERR_CONNECT: //Connection terminated
donatien 0:8f57713b2147 178 case PPPERR_AUTHFAIL: //Authentication failed
donatien 0:8f57713b2147 179 case PPPERR_PROTOCOL: //Protocol error
donatien 0:8f57713b2147 180 case PPPERR_USER:
donatien 0:8f57713b2147 181 return OK;
donatien 0:8f57713b2147 182 default:
donatien 0:8f57713b2147 183 return NET_UNKNOWN;
donatien 0:8f57713b2147 184 }
donatien 0:8f57713b2147 185 }
donatien 0:8f57713b2147 186 else
donatien 0:8f57713b2147 187 {
donatien 0:8f57713b2147 188 if(m_pppd == -1)
donatien 0:8f57713b2147 189 {
donatien 0:8f57713b2147 190 return NET_INVALID;
donatien 0:8f57713b2147 191 }
donatien 0:8f57713b2147 192 pppClose(m_pppd);
donatien 0:8f57713b2147 193 do
donatien 0:8f57713b2147 194 {
donatien 0:8f57713b2147 195 m_linkStatusSphre.wait(); //Block indefinitely; there should be a timeout there
donatien 0:8f57713b2147 196 DBG("Received PPP err code %d", m_pppErrCode);
donatien 0:8f57713b2147 197 } while(m_pppErrCode != PPPERR_USER);
donatien 0:8f57713b2147 198 m_pppd = -1; //Discard PPP descriptor
donatien 0:8f57713b2147 199 }
donatien 0:8f57713b2147 200
donatien 4:23100b0757d6 201 Thread::wait(500);
donatien 4:23100b0757d6 202
donatien 0:8f57713b2147 203 DBG("Sending %s", ESCAPE_SEQ);
donatien 0:8f57713b2147 204
donatien 0:8f57713b2147 205 ret = m_pStream->write((uint8_t*)ESCAPE_SEQ, strlen(ESCAPE_SEQ), osWaitForever);
donatien 0:8f57713b2147 206 if( ret != OK )
donatien 0:8f57713b2147 207 {
donatien 0:8f57713b2147 208 return NET_UNKNOWN;
donatien 0:8f57713b2147 209 }
donatien 0:8f57713b2147 210
donatien 4:23100b0757d6 211 Thread::wait(500);
donatien 4:23100b0757d6 212
donatien 0:8f57713b2147 213 cleanupLink();
donatien 0:8f57713b2147 214
donatien 0:8f57713b2147 215 return OK;
donatien 0:8f57713b2147 216 }
donatien 0:8f57713b2147 217
donatien 0:8f57713b2147 218
donatien 0:8f57713b2147 219 int PPPIPInterface::cleanupLink()
donatien 0:8f57713b2147 220 {
donatien 0:8f57713b2147 221 int ret;
donatien 0:8f57713b2147 222 char buf[32];
donatien 0:8f57713b2147 223 size_t len;
donatien 0:8f57713b2147 224
donatien 0:8f57713b2147 225 do //Clear buf
donatien 0:8f57713b2147 226 {
donatien 0:8f57713b2147 227 ret = m_pStream->read((uint8_t*)buf, &len, 32, 100);
donatien 0:8f57713b2147 228 if(ret == OK)
donatien 0:8f57713b2147 229 {
donatien 0:8f57713b2147 230 buf[len] = '\0';
donatien 0:8f57713b2147 231 DBG("Got %s", buf);
donatien 0:8f57713b2147 232 }
donatien 0:8f57713b2147 233 } while( (ret == OK) && (len > 0) );
donatien 0:8f57713b2147 234
donatien 0:8f57713b2147 235 DBG("Sending %s", HANGUP_CMD);
donatien 0:8f57713b2147 236
donatien 0:8f57713b2147 237 ret = m_pStream->write((uint8_t*)HANGUP_CMD, strlen(HANGUP_CMD), osWaitForever);
donatien 0:8f57713b2147 238 if( ret != OK )
donatien 0:8f57713b2147 239 {
donatien 0:8f57713b2147 240 return NET_UNKNOWN;
donatien 0:8f57713b2147 241 }
donatien 0:8f57713b2147 242
donatien 0:8f57713b2147 243 size_t readLen;
donatien 0:8f57713b2147 244
donatien 0:8f57713b2147 245 //Hangup
donatien 0:8f57713b2147 246 DBG("Expect %s", HANGUP_CMD);
donatien 0:8f57713b2147 247
donatien 0:8f57713b2147 248 len = 0;
donatien 0:8f57713b2147 249 while( len < strlen(HANGUP_CMD) )
donatien 0:8f57713b2147 250 {
donatien 0:8f57713b2147 251 ret = m_pStream->read((uint8_t*)buf + len, &readLen, strlen(HANGUP_CMD) - len, 100);
donatien 0:8f57713b2147 252 if( ret != OK )
donatien 0:8f57713b2147 253 {
donatien 0:8f57713b2147 254 break;
donatien 0:8f57713b2147 255 }
donatien 0:8f57713b2147 256 len += readLen;
donatien 0:8f57713b2147 257 /////
donatien 0:8f57713b2147 258 buf[len]=0;
donatien 0:8f57713b2147 259 DBG("Got %s", buf);
donatien 0:8f57713b2147 260 }
donatien 0:8f57713b2147 261
donatien 0:8f57713b2147 262 buf[len]=0;
donatien 0:8f57713b2147 263
donatien 0:8f57713b2147 264 DBG("Got %s[len %d]", buf, len);
donatien 0:8f57713b2147 265
donatien 0:8f57713b2147 266 //OK response
donatien 0:8f57713b2147 267 DBG("Expect %s", OK_RESP);
donatien 0:8f57713b2147 268
donatien 0:8f57713b2147 269 len = 0;
donatien 0:8f57713b2147 270 while( len < strlen(OK_RESP) )
donatien 0:8f57713b2147 271 {
donatien 0:8f57713b2147 272 ret = m_pStream->read((uint8_t*)buf + len, &readLen, strlen(OK_RESP) - len, 100);
donatien 0:8f57713b2147 273 if( ret != OK )
donatien 0:8f57713b2147 274 {
donatien 0:8f57713b2147 275 break;
donatien 0:8f57713b2147 276 }
donatien 0:8f57713b2147 277 len += readLen;
donatien 0:8f57713b2147 278 /////
donatien 0:8f57713b2147 279 buf[len]=0;
donatien 0:8f57713b2147 280 DBG("Got %s", buf);
donatien 0:8f57713b2147 281 }
donatien 0:8f57713b2147 282
donatien 0:8f57713b2147 283 buf[len]=0;
donatien 0:8f57713b2147 284
donatien 0:8f57713b2147 285 DBG("Got %s[len %d]", buf, len);
donatien 0:8f57713b2147 286
donatien 0:8f57713b2147 287 //NO CARRIER event
donatien 0:8f57713b2147 288 DBG("Expect %s", NO_CARRIER_RESP);
donatien 0:8f57713b2147 289
donatien 0:8f57713b2147 290 len = 0;
donatien 0:8f57713b2147 291 while( len < strlen(NO_CARRIER_RESP) )
donatien 0:8f57713b2147 292 {
donatien 0:8f57713b2147 293 ret = m_pStream->read((uint8_t*)buf + len, &readLen, strlen(NO_CARRIER_RESP) - len, 100);
donatien 0:8f57713b2147 294 if( ret != OK )
donatien 0:8f57713b2147 295 {
donatien 0:8f57713b2147 296 break;
donatien 0:8f57713b2147 297 }
donatien 0:8f57713b2147 298 len += readLen;
donatien 0:8f57713b2147 299 /////
donatien 0:8f57713b2147 300 buf[len]=0;
donatien 0:8f57713b2147 301 DBG("Got %s", buf);
donatien 0:8f57713b2147 302 }
donatien 0:8f57713b2147 303
donatien 0:8f57713b2147 304 buf[len]=0;
donatien 0:8f57713b2147 305
donatien 0:8f57713b2147 306 DBG("Got %s[len %d]", buf, len);
donatien 0:8f57713b2147 307
donatien 0:8f57713b2147 308 do //Clear buf
donatien 0:8f57713b2147 309 {
donatien 0:8f57713b2147 310 ret = m_pStream->read((uint8_t*)buf, &len, 32, 100);
donatien 0:8f57713b2147 311 if(ret == OK)
donatien 0:8f57713b2147 312 {
donatien 0:8f57713b2147 313 buf[len] = '\0';
donatien 0:8f57713b2147 314 DBG("Got %s", buf);
donatien 0:8f57713b2147 315 }
donatien 0:8f57713b2147 316 } while( (ret == OK) && (len > 0) );
donatien 0:8f57713b2147 317
donatien 0:8f57713b2147 318
donatien 0:8f57713b2147 319 return OK;
donatien 0:8f57713b2147 320 }
donatien 0:8f57713b2147 321
donatien 0:8f57713b2147 322 /*static*/ void PPPIPInterface::linkStatusCb(void *ctx, int errCode, void *arg) //PPP link status
donatien 0:8f57713b2147 323 {
donatien 0:8f57713b2147 324 PPPIPInterface* pIf = (PPPIPInterface*)ctx;
donatien 0:8f57713b2147 325 struct ppp_addrs* addrs = (struct ppp_addrs*) arg;
donatien 0:8f57713b2147 326
donatien 0:8f57713b2147 327 switch(errCode)
donatien 0:8f57713b2147 328 {
donatien 0:8f57713b2147 329 case PPPERR_NONE:
donatien 0:8f57713b2147 330 WARN("Connected via PPP.");
donatien 0:8f57713b2147 331 DBG("Local IP address: %s", inet_ntoa(addrs->our_ipaddr));
donatien 0:8f57713b2147 332 DBG("Netmask: %s", inet_ntoa(addrs->netmask));
donatien 0:8f57713b2147 333 DBG("Remote IP address: %s", inet_ntoa(addrs->his_ipaddr));
donatien 0:8f57713b2147 334 DBG("Primary DNS: %s", inet_ntoa(addrs->dns1));
donatien 0:8f57713b2147 335 DBG("Secondary DNS: %s", inet_ntoa(addrs->dns2));
donatien 0:8f57713b2147 336 pIf->setConnected(true);
donatien 0:8f57713b2147 337 pIf->setIPAddress(inet_ntoa(addrs->our_ipaddr));
donatien 0:8f57713b2147 338 break;
donatien 0:8f57713b2147 339 case PPPERR_CONNECT: //Connection lost
donatien 0:8f57713b2147 340 WARN("Connection lost/terminated");
donatien 0:8f57713b2147 341 pIf->setConnected(false);
donatien 0:8f57713b2147 342 break;
donatien 0:8f57713b2147 343 case PPPERR_AUTHFAIL: //Authentication failed
donatien 0:8f57713b2147 344 WARN("Authentication failed");
donatien 0:8f57713b2147 345 pIf->setConnected(false);
donatien 0:8f57713b2147 346 break;
donatien 0:8f57713b2147 347 case PPPERR_PROTOCOL: //Protocol error
donatien 0:8f57713b2147 348 WARN("Protocol error");
donatien 0:8f57713b2147 349 pIf->setConnected(false);
donatien 0:8f57713b2147 350 break;
donatien 0:8f57713b2147 351 case PPPERR_USER:
donatien 0:8f57713b2147 352 WARN("Disconnected by user");
donatien 0:8f57713b2147 353 pIf->setConnected(false);
donatien 0:8f57713b2147 354 break;
donatien 0:8f57713b2147 355 default:
donatien 0:8f57713b2147 356 WARN("Unknown error (%d)", errCode);
donatien 0:8f57713b2147 357 pIf->setConnected(false);
donatien 0:8f57713b2147 358 break;
donatien 0:8f57713b2147 359 }
donatien 0:8f57713b2147 360
donatien 0:8f57713b2147 361 pIf->m_linkStatusSphre.wait(0); //If previous event has not been handled, "delete" it now
donatien 0:8f57713b2147 362 pIf->m_pppErrCode = errCode;
donatien 0:8f57713b2147 363 pIf->m_linkStatusSphre.release();
donatien 0:8f57713b2147 364 }
donatien 0:8f57713b2147 365
donatien 0:8f57713b2147 366 //LwIP PPP implementation
donatien 0:8f57713b2147 367 extern "C"
donatien 0:8f57713b2147 368 {
donatien 0:8f57713b2147 369
donatien 0:8f57713b2147 370 /**
donatien 0:8f57713b2147 371 * Writes to the serial device.
donatien 0:8f57713b2147 372 *
donatien 0:8f57713b2147 373 * @param fd serial device handle
donatien 0:8f57713b2147 374 * @param data pointer to data to send
donatien 0:8f57713b2147 375 * @param len length (in bytes) of data to send
donatien 0:8f57713b2147 376 * @return number of bytes actually sent
donatien 0:8f57713b2147 377 *
donatien 0:8f57713b2147 378 * @note This function will block until all data can be sent.
donatien 0:8f57713b2147 379 */
donatien 0:8f57713b2147 380 u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len)
donatien 0:8f57713b2147 381 {
donatien 0:8f57713b2147 382 DBG("sio_write");
donatien 0:8f57713b2147 383 PPPIPInterface* pIf = (PPPIPInterface*)fd;
donatien 0:8f57713b2147 384 int ret;
donatien 0:8f57713b2147 385 if(!pIf->m_streamAvail) //If stream is not available (it is a shared resource) don't go further
donatien 0:8f57713b2147 386 {
donatien 0:8f57713b2147 387 return 0;
donatien 0:8f57713b2147 388 }
donatien 0:8f57713b2147 389 ret = pIf->m_pStream->write(data, len, osWaitForever); //Blocks until all data is sent or an error happens
donatien 0:8f57713b2147 390 if(ret != OK)
donatien 0:8f57713b2147 391 {
donatien 0:8f57713b2147 392 return 0;
donatien 0:8f57713b2147 393 }
donatien 0:8f57713b2147 394 return len;
donatien 0:8f57713b2147 395 }
donatien 0:8f57713b2147 396
donatien 0:8f57713b2147 397 /**
donatien 0:8f57713b2147 398 * Reads from the serial device.
donatien 0:8f57713b2147 399 *
donatien 0:8f57713b2147 400 * @param fd serial device handle
donatien 0:8f57713b2147 401 * @param data pointer to data buffer for receiving
donatien 0:8f57713b2147 402 * @param len maximum length (in bytes) of data to receive
donatien 0:8f57713b2147 403 * @return number of bytes actually received - may be 0 if aborted by sio_read_abort
donatien 0:8f57713b2147 404 *
donatien 0:8f57713b2147 405 * @note This function will block until data can be received. The blocking
donatien 0:8f57713b2147 406 * can be cancelled by calling sio_read_abort().
donatien 0:8f57713b2147 407 */
donatien 0:8f57713b2147 408 u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len)
donatien 0:8f57713b2147 409 {
donatien 0:8f57713b2147 410 DBG("sio_read");
donatien 0:8f57713b2147 411 PPPIPInterface* pIf = (PPPIPInterface*)fd;
donatien 0:8f57713b2147 412 int ret;
donatien 0:8f57713b2147 413 size_t readLen;
donatien 0:8f57713b2147 414 if(!pIf->m_streamAvail) //If stream is not available (it is a shared resource) don't go further
donatien 0:8f57713b2147 415 {
donatien 0:8f57713b2147 416 WARN("EXIT NOT AVAIL");
donatien 0:8f57713b2147 417 return 0;
donatien 0:8f57713b2147 418 }
donatien 0:8f57713b2147 419 ret = pIf->m_pStream->read(data, &readLen, len, osWaitForever); //Blocks until some data is received or an error happens
donatien 0:8f57713b2147 420 if(ret != OK)
donatien 0:8f57713b2147 421 {
donatien 0:8f57713b2147 422 return 0;
donatien 0:8f57713b2147 423 }
donatien 0:8f57713b2147 424 DBG("ret");
donatien 0:8f57713b2147 425 return readLen;
donatien 0:8f57713b2147 426 }
donatien 0:8f57713b2147 427
donatien 0:8f57713b2147 428 /**
donatien 0:8f57713b2147 429 * Aborts a blocking sio_read() call.
donatien 0:8f57713b2147 430 *
donatien 0:8f57713b2147 431 * @param fd serial device handle
donatien 0:8f57713b2147 432 */
donatien 0:8f57713b2147 433 void sio_read_abort(sio_fd_t fd)
donatien 0:8f57713b2147 434 {
donatien 0:8f57713b2147 435 DBG("sio_read_abort");
donatien 0:8f57713b2147 436 PPPIPInterface* pIf = (PPPIPInterface*)fd;
donatien 0:8f57713b2147 437 if(!pIf->m_streamAvail) //If stream is not available (it is a shared resource) don't go further
donatien 0:8f57713b2147 438 {
donatien 0:8f57713b2147 439 return;
donatien 0:8f57713b2147 440 }
donatien 0:8f57713b2147 441 pIf->m_pStream->abortRead();
donatien 0:8f57713b2147 442 DBG("ret");
donatien 0:8f57713b2147 443 }
donatien 0:8f57713b2147 444
donatien 0:8f57713b2147 445 }
donatien 0:8f57713b2147 446