Vodafone K3770/K3772-Z modems driver & networking library

Dependencies:   Socket USBHostWANDongle lwip-sys lwip

Dependents:   VodafoneUSBModemHTTPClientTest VodafoneUSBModemNTPClientTest VodafoneUSBModemSMSTest VodafoneUSBModemUSSDTest ... more

Fork of VodafoneUSBModem_bleedingedge by Donatien Garnier

This is the driver for the Vodafone K3700 & K3772-Z Dongles:

K3770

More details and instructions can be found here.

Committer:
donatien
Date:
Wed Sep 19 15:33:13 2012 +0000
Revision:
38:d19354028042
Parent:
27:37d3ac289e86
Child:
79:a6ac8206a58d
Use DNS servers provided by the network

Who changed what in which revision?

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