qwerty

Dependencies:   mbed

Committer:
Hello1024
Date:
Mon Nov 21 18:25:34 2011 +0000
Revision:
0:1619a6b826d7

        

Who changed what in which revision?

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