This library is stripped down version of NetServices library. HTTP server and client function is NOT supported.

Dependents:   imu-daq-eth

Committer:
idinor
Date:
Wed Jul 20 11:45:39 2011 +0000
Revision:
0:dcf3c92487ca

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
idinor 0:dcf3c92487ca 1
idinor 0:dcf3c92487ca 2 /*
idinor 0:dcf3c92487ca 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
idinor 0:dcf3c92487ca 4
idinor 0:dcf3c92487ca 5 Permission is hereby granted, free of charge, to any person obtaining a copy
idinor 0:dcf3c92487ca 6 of this software and associated documentation files (the "Software"), to deal
idinor 0:dcf3c92487ca 7 in the Software without restriction, including without limitation the rights
idinor 0:dcf3c92487ca 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
idinor 0:dcf3c92487ca 9 copies of the Software, and to permit persons to whom the Software is
idinor 0:dcf3c92487ca 10 furnished to do so, subject to the following conditions:
idinor 0:dcf3c92487ca 11
idinor 0:dcf3c92487ca 12 The above copyright notice and this permission notice shall be included in
idinor 0:dcf3c92487ca 13 all copies or substantial portions of the Software.
idinor 0:dcf3c92487ca 14
idinor 0:dcf3c92487ca 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
idinor 0:dcf3c92487ca 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
idinor 0:dcf3c92487ca 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
idinor 0:dcf3c92487ca 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
idinor 0:dcf3c92487ca 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
idinor 0:dcf3c92487ca 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
idinor 0:dcf3c92487ca 21 THE SOFTWARE.
idinor 0:dcf3c92487ca 22 */
idinor 0:dcf3c92487ca 23
idinor 0:dcf3c92487ca 24 #include "PPPNetIf.h"
idinor 0:dcf3c92487ca 25 #include "mbed.h"
idinor 0:dcf3c92487ca 26 #include "ppp/ppp.h"
idinor 0:dcf3c92487ca 27 #include "lwip/init.h"
idinor 0:dcf3c92487ca 28 #include "lwip/sio.h"
idinor 0:dcf3c92487ca 29
idinor 0:dcf3c92487ca 30 #define __DEBUG
idinor 0:dcf3c92487ca 31 #include "dbg/dbg.h"
idinor 0:dcf3c92487ca 32
idinor 0:dcf3c92487ca 33 #include "netCfg.h"
idinor 0:dcf3c92487ca 34 #if NET_PPP
idinor 0:dcf3c92487ca 35
idinor 0:dcf3c92487ca 36 #define PPP_TIMEOUT 60000
idinor 0:dcf3c92487ca 37
idinor 0:dcf3c92487ca 38 #define BUF_SIZE 256
idinor 0:dcf3c92487ca 39
idinor 0:dcf3c92487ca 40 PPPNetIf::PPPNetIf(GPRSModem* pIf) : LwipNetIf(), m_pIf(pIf),/* m_open(false),*/ m_connected(false), m_status(PPP_DISCONNECTED), m_fd(0) //, m_id(0)
idinor 0:dcf3c92487ca 41 {
idinor 0:dcf3c92487ca 42 //FIXME: Check static refcount
idinor 0:dcf3c92487ca 43 m_buf = new uint8_t[BUF_SIZE];
idinor 0:dcf3c92487ca 44 }
idinor 0:dcf3c92487ca 45
idinor 0:dcf3c92487ca 46 PPPNetIf::~PPPNetIf()
idinor 0:dcf3c92487ca 47 {
idinor 0:dcf3c92487ca 48 delete[] m_buf;
idinor 0:dcf3c92487ca 49 }
idinor 0:dcf3c92487ca 50
idinor 0:dcf3c92487ca 51 #if 0
idinor 0:dcf3c92487ca 52 PPPErr PPPNetIf::open(Serial* pSerial)
idinor 0:dcf3c92487ca 53 {
idinor 0:dcf3c92487ca 54 GPRSErr err = m_pIf->open(pSerial);
idinor 0:dcf3c92487ca 55 if(err)
idinor 0:dcf3c92487ca 56 return PPP_MODEM;
idinor 0:dcf3c92487ca 57 m_open = true;
idinor 0:dcf3c92487ca 58 #if 0
idinor 0:dcf3c92487ca 59 m_id = sioMgr::registerSerialIf(this);
idinor 0:dcf3c92487ca 60 if(!m_id)
idinor 0:dcf3c92487ca 61 {
idinor 0:dcf3c92487ca 62 close();
idinor 0:dcf3c92487ca 63 return PPP_CLOSED;
idinor 0:dcf3c92487ca 64 }
idinor 0:dcf3c92487ca 65 #endif
idinor 0:dcf3c92487ca 66 return PPP_OK;
idinor 0:dcf3c92487ca 67 }
idinor 0:dcf3c92487ca 68 #endif
idinor 0:dcf3c92487ca 69
idinor 0:dcf3c92487ca 70
idinor 0:dcf3c92487ca 71 PPPErr PPPNetIf::GPRSConnect(const char* apn, const char* userId, const char* password) //Connect using GPRS
idinor 0:dcf3c92487ca 72 {
idinor 0:dcf3c92487ca 73 LwipNetIf::init();
idinor 0:dcf3c92487ca 74 pppInit();
idinor 0:dcf3c92487ca 75 //TODO: Tell ATIf that we get ownership of the serial port
idinor 0:dcf3c92487ca 76
idinor 0:dcf3c92487ca 77 GPRSErr gprsErr;
idinor 0:dcf3c92487ca 78 gprsErr = m_pIf->connect(apn);
idinor 0:dcf3c92487ca 79 if(gprsErr)
idinor 0:dcf3c92487ca 80 return PPP_NETWORK;
idinor 0:dcf3c92487ca 81
idinor 0:dcf3c92487ca 82 DBG("PPPNetIf: If Connected.\n");
idinor 0:dcf3c92487ca 83
idinor 0:dcf3c92487ca 84 if( userId == NULL )
idinor 0:dcf3c92487ca 85 pppSetAuth(PPPAUTHTYPE_NONE, NULL, NULL);
idinor 0:dcf3c92487ca 86 else
idinor 0:dcf3c92487ca 87 pppSetAuth(PPPAUTHTYPE_PAP, userId, password); //TODO: Allow CHAP as well
idinor 0:dcf3c92487ca 88
idinor 0:dcf3c92487ca 89 DBG("PPPNetIf: Set Auth.\n");
idinor 0:dcf3c92487ca 90
idinor 0:dcf3c92487ca 91 //wait(1.);
idinor 0:dcf3c92487ca 92
idinor 0:dcf3c92487ca 93 //m_pIf->flushBuffer(); //Flush buffer before passing serial port to PPP
idinor 0:dcf3c92487ca 94
idinor 0:dcf3c92487ca 95 m_status = PPP_CONNECTING;
idinor 0:dcf3c92487ca 96 DBG("m_pIf = %p\n", m_pIf);
idinor 0:dcf3c92487ca 97 int res = pppOverSerialOpen((void*)m_pIf, sPppCallback, (void*)this);
idinor 0:dcf3c92487ca 98 DBG("PPP connected\n");
idinor 0:dcf3c92487ca 99 if(res<0)
idinor 0:dcf3c92487ca 100 {
idinor 0:dcf3c92487ca 101 disconnect();
idinor 0:dcf3c92487ca 102 return PPP_PROTOCOL;
idinor 0:dcf3c92487ca 103 }
idinor 0:dcf3c92487ca 104
idinor 0:dcf3c92487ca 105 DBG("PPPNetIf: PPP Started with res = %d.\n", res);
idinor 0:dcf3c92487ca 106
idinor 0:dcf3c92487ca 107 m_fd = res;
idinor 0:dcf3c92487ca 108 m_connected = true;
idinor 0:dcf3c92487ca 109 Timer t;
idinor 0:dcf3c92487ca 110 t.start();
idinor 0:dcf3c92487ca 111 while( m_status == PPP_CONNECTING ) //Wait for callback
idinor 0:dcf3c92487ca 112 {
idinor 0:dcf3c92487ca 113 poll();
idinor 0:dcf3c92487ca 114 if(t.read_ms()>PPP_TIMEOUT)
idinor 0:dcf3c92487ca 115 {
idinor 0:dcf3c92487ca 116 DBG("PPPNetIf: Timeout.\n");
idinor 0:dcf3c92487ca 117 disconnect();
idinor 0:dcf3c92487ca 118 return PPP_PROTOCOL;
idinor 0:dcf3c92487ca 119 }
idinor 0:dcf3c92487ca 120 }
idinor 0:dcf3c92487ca 121
idinor 0:dcf3c92487ca 122 DBG("PPPNetIf: Callback returned.\n");
idinor 0:dcf3c92487ca 123
idinor 0:dcf3c92487ca 124 if( m_status == PPP_DISCONNECTED )
idinor 0:dcf3c92487ca 125 {
idinor 0:dcf3c92487ca 126 disconnect();
idinor 0:dcf3c92487ca 127 return PPP_PROTOCOL;
idinor 0:dcf3c92487ca 128 }
idinor 0:dcf3c92487ca 129
idinor 0:dcf3c92487ca 130 return PPP_OK;
idinor 0:dcf3c92487ca 131
idinor 0:dcf3c92487ca 132 }
idinor 0:dcf3c92487ca 133
idinor 0:dcf3c92487ca 134 PPPErr PPPNetIf::ATConnect(const char* number) //Connect using a "classic" voice modem or GSM
idinor 0:dcf3c92487ca 135 {
idinor 0:dcf3c92487ca 136 //TODO: IMPL
idinor 0:dcf3c92487ca 137 return PPP_MODEM;
idinor 0:dcf3c92487ca 138 }
idinor 0:dcf3c92487ca 139
idinor 0:dcf3c92487ca 140 PPPErr PPPNetIf::disconnect()
idinor 0:dcf3c92487ca 141 {
idinor 0:dcf3c92487ca 142 if(m_fd)
idinor 0:dcf3c92487ca 143 pppClose(m_fd); //0 if ok, else should gen a WARN
idinor 0:dcf3c92487ca 144 m_connected = false;
idinor 0:dcf3c92487ca 145
idinor 0:dcf3c92487ca 146 m_pIf->flushBuffer();
idinor 0:dcf3c92487ca 147 m_pIf->printf("+++\r\n");
idinor 0:dcf3c92487ca 148 wait(.5);
idinor 0:dcf3c92487ca 149 m_pIf->flushBuffer();
idinor 0:dcf3c92487ca 150
idinor 0:dcf3c92487ca 151 GPRSErr gprsErr;
idinor 0:dcf3c92487ca 152 gprsErr = m_pIf->disconnect();
idinor 0:dcf3c92487ca 153 if(gprsErr)
idinor 0:dcf3c92487ca 154 return PPP_NETWORK;
idinor 0:dcf3c92487ca 155
idinor 0:dcf3c92487ca 156 return PPP_OK;
idinor 0:dcf3c92487ca 157 }
idinor 0:dcf3c92487ca 158
idinor 0:dcf3c92487ca 159 #if 0
idinor 0:dcf3c92487ca 160 PPPErr PPPNetIf::close()
idinor 0:dcf3c92487ca 161 {
idinor 0:dcf3c92487ca 162 GPRSErr err = m_pIf->close();
idinor 0:dcf3c92487ca 163 if(err)
idinor 0:dcf3c92487ca 164 return PPP_MODEM;
idinor 0:dcf3c92487ca 165 m_open = false;
idinor 0:dcf3c92487ca 166 return PPP_OK;
idinor 0:dcf3c92487ca 167 }
idinor 0:dcf3c92487ca 168 #endif
idinor 0:dcf3c92487ca 169
idinor 0:dcf3c92487ca 170
idinor 0:dcf3c92487ca 171 #if 0
idinor 0:dcf3c92487ca 172 //We have to use :
idinor 0:dcf3c92487ca 173
idinor 0:dcf3c92487ca 174 /** Pass received raw characters to PPPoS to be decoded. This function is
idinor 0:dcf3c92487ca 175 * thread-safe and can be called from a dedicated RX-thread or from a main-loop.
idinor 0:dcf3c92487ca 176 *
idinor 0:dcf3c92487ca 177 * @param pd PPP descriptor index, returned by pppOpen()
idinor 0:dcf3c92487ca 178 * @param data received data
idinor 0:dcf3c92487ca 179 * @param len length of received data
idinor 0:dcf3c92487ca 180 */
idinor 0:dcf3c92487ca 181 void
idinor 0:dcf3c92487ca 182 pppos_input(int pd, u_char* data, int len)
idinor 0:dcf3c92487ca 183 {
idinor 0:dcf3c92487ca 184 pppInProc(&pppControl[pd].rx, data, len);
idinor 0:dcf3c92487ca 185 }
idinor 0:dcf3c92487ca 186 #endif
idinor 0:dcf3c92487ca 187
idinor 0:dcf3c92487ca 188 void PPPNetIf::poll()
idinor 0:dcf3c92487ca 189 {
idinor 0:dcf3c92487ca 190 if(!m_connected)
idinor 0:dcf3c92487ca 191 return;
idinor 0:dcf3c92487ca 192 LwipNetIf::poll();
idinor 0:dcf3c92487ca 193 //static u8_t buf[128];
idinor 0:dcf3c92487ca 194 int len;
idinor 0:dcf3c92487ca 195 do
idinor 0:dcf3c92487ca 196 {
idinor 0:dcf3c92487ca 197 len = sio_tryread((sio_fd_t) m_pIf, m_buf, BUF_SIZE);
idinor 0:dcf3c92487ca 198 if(len > 0)
idinor 0:dcf3c92487ca 199 pppos_input(m_fd, m_buf, len);
idinor 0:dcf3c92487ca 200 } while(len>0);
idinor 0:dcf3c92487ca 201 }
idinor 0:dcf3c92487ca 202
idinor 0:dcf3c92487ca 203 //Link Callback
idinor 0:dcf3c92487ca 204 void PPPNetIf::pppCallback(int errCode, void *arg)
idinor 0:dcf3c92487ca 205 {
idinor 0:dcf3c92487ca 206 switch ( errCode )
idinor 0:dcf3c92487ca 207 {
idinor 0:dcf3c92487ca 208 //No error
idinor 0:dcf3c92487ca 209 case PPPERR_NONE:
idinor 0:dcf3c92487ca 210 {
idinor 0:dcf3c92487ca 211 struct ppp_addrs* addrs = (struct ppp_addrs*) arg;
idinor 0:dcf3c92487ca 212 m_ip = IpAddr(&(addrs->our_ipaddr)); //Set IP
idinor 0:dcf3c92487ca 213 }
idinor 0:dcf3c92487ca 214 m_status = PPP_CONNECTED;
idinor 0:dcf3c92487ca 215 break;
idinor 0:dcf3c92487ca 216 default:
idinor 0:dcf3c92487ca 217 //Disconnected
idinor 0:dcf3c92487ca 218 DBG("PPPNetIf: Callback errCode = %d.\n", errCode);
idinor 0:dcf3c92487ca 219 m_status = PPP_DISCONNECTED;
idinor 0:dcf3c92487ca 220 break;
idinor 0:dcf3c92487ca 221 }
idinor 0:dcf3c92487ca 222 }
idinor 0:dcf3c92487ca 223
idinor 0:dcf3c92487ca 224 #endif