Donatien Garnier / LwIPNetworking

Dependencies:   DebugLib Socket lwip lwip-sys

Dependents:   EthernetInterface

Fork of NetworkingCoreLib by Donatien Garnier

Committer:
donatien
Date:
Thu May 24 14:49:40 2012 +0000
Revision:
0:013f5d54248c
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:013f5d54248c 1 /*****************************************************************************
donatien 0:013f5d54248c 2 * ppp.c - Network Point to Point Protocol program file.
donatien 0:013f5d54248c 3 *
donatien 0:013f5d54248c 4 * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
donatien 0:013f5d54248c 5 * portions Copyright (c) 1997 by Global Election Systems Inc.
donatien 0:013f5d54248c 6 *
donatien 0:013f5d54248c 7 * The authors hereby grant permission to use, copy, modify, distribute,
donatien 0:013f5d54248c 8 * and license this software and its documentation for any purpose, provided
donatien 0:013f5d54248c 9 * that existing copyright notices are retained in all copies and that this
donatien 0:013f5d54248c 10 * notice and the following disclaimer are included verbatim in any
donatien 0:013f5d54248c 11 * distributions. No written agreement, license, or royalty fee is required
donatien 0:013f5d54248c 12 * for any of the authorized uses.
donatien 0:013f5d54248c 13 *
donatien 0:013f5d54248c 14 * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
donatien 0:013f5d54248c 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
donatien 0:013f5d54248c 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
donatien 0:013f5d54248c 17 * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
donatien 0:013f5d54248c 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
donatien 0:013f5d54248c 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
donatien 0:013f5d54248c 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
donatien 0:013f5d54248c 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
donatien 0:013f5d54248c 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
donatien 0:013f5d54248c 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
donatien 0:013f5d54248c 24 *
donatien 0:013f5d54248c 25 ******************************************************************************
donatien 0:013f5d54248c 26 * REVISION HISTORY
donatien 0:013f5d54248c 27 *
donatien 0:013f5d54248c 28 * 03-01-01 Marc Boucher <marc@mbsi.ca>
donatien 0:013f5d54248c 29 * Ported to lwIP.
donatien 0:013f5d54248c 30 * 97-11-05 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
donatien 0:013f5d54248c 31 * Original.
donatien 0:013f5d54248c 32 *****************************************************************************/
donatien 0:013f5d54248c 33
donatien 0:013f5d54248c 34 /*
donatien 0:013f5d54248c 35 * ppp_defs.h - PPP definitions.
donatien 0:013f5d54248c 36 *
donatien 0:013f5d54248c 37 * if_pppvar.h - private structures and declarations for PPP.
donatien 0:013f5d54248c 38 *
donatien 0:013f5d54248c 39 * Copyright (c) 1994 The Australian National University.
donatien 0:013f5d54248c 40 * All rights reserved.
donatien 0:013f5d54248c 41 *
donatien 0:013f5d54248c 42 * Permission to use, copy, modify, and distribute this software and its
donatien 0:013f5d54248c 43 * documentation is hereby granted, provided that the above copyright
donatien 0:013f5d54248c 44 * notice appears in all copies. This software is provided without any
donatien 0:013f5d54248c 45 * warranty, express or implied. The Australian National University
donatien 0:013f5d54248c 46 * makes no representations about the suitability of this software for
donatien 0:013f5d54248c 47 * any purpose.
donatien 0:013f5d54248c 48 *
donatien 0:013f5d54248c 49 * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
donatien 0:013f5d54248c 50 * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
donatien 0:013f5d54248c 51 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
donatien 0:013f5d54248c 52 * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
donatien 0:013f5d54248c 53 * OF SUCH DAMAGE.
donatien 0:013f5d54248c 54 *
donatien 0:013f5d54248c 55 * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
donatien 0:013f5d54248c 56 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
donatien 0:013f5d54248c 57 * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
donatien 0:013f5d54248c 58 * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
donatien 0:013f5d54248c 59 * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
donatien 0:013f5d54248c 60 * OR MODIFICATIONS.
donatien 0:013f5d54248c 61 */
donatien 0:013f5d54248c 62
donatien 0:013f5d54248c 63 /*
donatien 0:013f5d54248c 64 * if_ppp.h - Point-to-Point Protocol definitions.
donatien 0:013f5d54248c 65 *
donatien 0:013f5d54248c 66 * Copyright (c) 1989 Carnegie Mellon University.
donatien 0:013f5d54248c 67 * All rights reserved.
donatien 0:013f5d54248c 68 *
donatien 0:013f5d54248c 69 * Redistribution and use in source and binary forms are permitted
donatien 0:013f5d54248c 70 * provided that the above copyright notice and this paragraph are
donatien 0:013f5d54248c 71 * duplicated in all such forms and that any documentation,
donatien 0:013f5d54248c 72 * advertising materials, and other materials related to such
donatien 0:013f5d54248c 73 * distribution and use acknowledge that the software was developed
donatien 0:013f5d54248c 74 * by Carnegie Mellon University. The name of the
donatien 0:013f5d54248c 75 * University may not be used to endorse or promote products derived
donatien 0:013f5d54248c 76 * from this software without specific prior written permission.
donatien 0:013f5d54248c 77 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
donatien 0:013f5d54248c 78 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
donatien 0:013f5d54248c 79 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
donatien 0:013f5d54248c 80 */
donatien 0:013f5d54248c 81
donatien 0:013f5d54248c 82 #define __LWIP_ORIG 0
donatien 0:013f5d54248c 83
donatien 0:013f5d54248c 84 #include "lwip/opt.h"
donatien 0:013f5d54248c 85
donatien 0:013f5d54248c 86 #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
donatien 0:013f5d54248c 87
donatien 0:013f5d54248c 88 #include "lwip/ip.h" /* for ip_input() */
donatien 0:013f5d54248c 89
donatien 0:013f5d54248c 90 #include "ppp.h"
donatien 0:013f5d54248c 91 #include "pppdebug.h"
donatien 0:013f5d54248c 92
donatien 0:013f5d54248c 93 #include "randm.h"
donatien 0:013f5d54248c 94 #include "fsm.h"
donatien 0:013f5d54248c 95 #if PAP_SUPPORT
donatien 0:013f5d54248c 96 #include "pap.h"
donatien 0:013f5d54248c 97 #endif /* PAP_SUPPORT */
donatien 0:013f5d54248c 98 #if CHAP_SUPPORT
donatien 0:013f5d54248c 99 #include "chap.h"
donatien 0:013f5d54248c 100 #endif /* CHAP_SUPPORT */
donatien 0:013f5d54248c 101 #include "ipcp.h"
donatien 0:013f5d54248c 102 #include "lcp.h"
donatien 0:013f5d54248c 103 #include "magic.h"
donatien 0:013f5d54248c 104 #include "auth.h"
donatien 0:013f5d54248c 105 #if VJ_SUPPORT
donatien 0:013f5d54248c 106 #include "vj.h"
donatien 0:013f5d54248c 107 #endif /* VJ_SUPPORT */
donatien 0:013f5d54248c 108 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 109 #include "netif/ppp_oe.h"
donatien 0:013f5d54248c 110 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 111
donatien 0:013f5d54248c 112 #include "lwip/tcpip.h"
donatien 0:013f5d54248c 113 #include "lwip/api.h"
donatien 0:013f5d54248c 114 #include "lwip/snmp.h"
donatien 0:013f5d54248c 115
donatien 0:013f5d54248c 116 #include <string.h>
donatien 0:013f5d54248c 117
donatien 0:013f5d54248c 118 /*************************/
donatien 0:013f5d54248c 119 /*** LOCAL DEFINITIONS ***/
donatien 0:013f5d54248c 120 /*************************/
donatien 0:013f5d54248c 121
donatien 0:013f5d54248c 122 /** PPP_INPROC_MULTITHREADED==1 call pppInput using tcpip_callback().
donatien 0:013f5d54248c 123 * Set this to 0 if pppInProc is called inside tcpip_thread or with NO_SYS==1.
donatien 0:013f5d54248c 124 * Default is 1 for NO_SYS==0 (multithreaded) and 0 for NO_SYS==1 (single-threaded).
donatien 0:013f5d54248c 125 */
donatien 0:013f5d54248c 126 #ifndef PPP_INPROC_MULTITHREADED
donatien 0:013f5d54248c 127 #define PPP_INPROC_MULTITHREADED (NO_SYS==0)
donatien 0:013f5d54248c 128 #endif
donatien 0:013f5d54248c 129
donatien 0:013f5d54248c 130 /** PPP_INPROC_OWNTHREAD==1: start a dedicated RX thread per PPP session.
donatien 0:013f5d54248c 131 * Default is 0: call pppos_input() for received raw characters, charcater
donatien 0:013f5d54248c 132 * reception is up to the port */
donatien 0:013f5d54248c 133 #ifndef PPP_INPROC_OWNTHREAD
donatien 0:013f5d54248c 134 #define PPP_INPROC_OWNTHREAD PPP_INPROC_MULTITHREADED
donatien 0:013f5d54248c 135 #endif
donatien 0:013f5d54248c 136
donatien 0:013f5d54248c 137 #if PPP_INPROC_OWNTHREAD && !PPP_INPROC_MULTITHREADED
donatien 0:013f5d54248c 138 #error "PPP_INPROC_OWNTHREAD needs PPP_INPROC_MULTITHREADED==1"
donatien 0:013f5d54248c 139 #endif
donatien 0:013f5d54248c 140
donatien 0:013f5d54248c 141 /*
donatien 0:013f5d54248c 142 * The basic PPP frame.
donatien 0:013f5d54248c 143 */
donatien 0:013f5d54248c 144 #define PPP_ADDRESS(p) (((u_char *)(p))[0])
donatien 0:013f5d54248c 145 #define PPP_CONTROL(p) (((u_char *)(p))[1])
donatien 0:013f5d54248c 146 #define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
donatien 0:013f5d54248c 147
donatien 0:013f5d54248c 148 /* PPP packet parser states. Current state indicates operation yet to be
donatien 0:013f5d54248c 149 * completed. */
donatien 0:013f5d54248c 150 typedef enum {
donatien 0:013f5d54248c 151 PDIDLE = 0, /* Idle state - waiting. */
donatien 0:013f5d54248c 152 PDSTART, /* Process start flag. */
donatien 0:013f5d54248c 153 PDADDRESS, /* Process address field. */
donatien 0:013f5d54248c 154 PDCONTROL, /* Process control field. */
donatien 0:013f5d54248c 155 PDPROTOCOL1, /* Process protocol field 1. */
donatien 0:013f5d54248c 156 PDPROTOCOL2, /* Process protocol field 2. */
donatien 0:013f5d54248c 157 PDDATA /* Process data byte. */
donatien 0:013f5d54248c 158 } PPPDevStates;
donatien 0:013f5d54248c 159
donatien 0:013f5d54248c 160 #define ESCAPE_P(accm, c) ((accm)[(c) >> 3] & pppACCMMask[c & 0x07])
donatien 0:013f5d54248c 161
donatien 0:013f5d54248c 162 /************************/
donatien 0:013f5d54248c 163 /*** LOCAL DATA TYPES ***/
donatien 0:013f5d54248c 164 /************************/
donatien 0:013f5d54248c 165
donatien 0:013f5d54248c 166 /** RX buffer size: this may be configured smaller! */
donatien 0:013f5d54248c 167 #ifndef PPPOS_RX_BUFSIZE
donatien 0:013f5d54248c 168 #define PPPOS_RX_BUFSIZE (PPP_MRU + PPP_HDRLEN)
donatien 0:013f5d54248c 169 #endif
donatien 0:013f5d54248c 170
donatien 0:013f5d54248c 171 typedef struct PPPControlRx_s {
donatien 0:013f5d54248c 172 /** unit number / ppp descriptor */
donatien 0:013f5d54248c 173 int pd;
donatien 0:013f5d54248c 174 /** the rx file descriptor */
donatien 0:013f5d54248c 175 sio_fd_t fd;
donatien 0:013f5d54248c 176 /** receive buffer - encoded data is stored here */
donatien 0:013f5d54248c 177 u_char rxbuf[PPPOS_RX_BUFSIZE];
donatien 0:013f5d54248c 178
donatien 0:013f5d54248c 179 /* The input packet. */
donatien 0:013f5d54248c 180 struct pbuf *inHead, *inTail;
donatien 0:013f5d54248c 181
donatien 0:013f5d54248c 182 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 183 u16_t inProtocol; /* The input protocol code. */
donatien 0:013f5d54248c 184 u16_t inFCS; /* Input Frame Check Sequence value. */
donatien 0:013f5d54248c 185 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 186 PPPDevStates inState; /* The input process state. */
donatien 0:013f5d54248c 187 char inEscaped; /* Escape next character. */
donatien 0:013f5d54248c 188 ext_accm inACCM; /* Async-Ctl-Char-Map for input. */
donatien 0:013f5d54248c 189 } PPPControlRx;
donatien 0:013f5d54248c 190
donatien 0:013f5d54248c 191 /*
donatien 0:013f5d54248c 192 * PPP interface control block.
donatien 0:013f5d54248c 193 */
donatien 0:013f5d54248c 194 typedef struct PPPControl_s {
donatien 0:013f5d54248c 195 PPPControlRx rx;
donatien 0:013f5d54248c 196 char openFlag; /* True when in use. */
donatien 0:013f5d54248c 197 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 198 struct netif *ethif;
donatien 0:013f5d54248c 199 struct pppoe_softc *pppoe_sc;
donatien 0:013f5d54248c 200 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 201 int if_up; /* True when the interface is up. */
donatien 0:013f5d54248c 202 int errCode; /* Code indicating why interface is down. */
donatien 0:013f5d54248c 203 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 204 sio_fd_t fd; /* File device ID of port. */
donatien 0:013f5d54248c 205 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 206 u16_t mtu; /* Peer's mru */
donatien 0:013f5d54248c 207 int pcomp; /* Does peer accept protocol compression? */
donatien 0:013f5d54248c 208 int accomp; /* Does peer accept addr/ctl compression? */
donatien 0:013f5d54248c 209 u_long lastXMit; /* Time of last transmission. */
donatien 0:013f5d54248c 210 ext_accm outACCM; /* Async-Ctl-Char-Map for output. */
donatien 0:013f5d54248c 211 #if PPPOS_SUPPORT && VJ_SUPPORT
donatien 0:013f5d54248c 212 int vjEnabled; /* Flag indicating VJ compression enabled. */
donatien 0:013f5d54248c 213 struct vjcompress vjComp; /* Van Jacobson compression header. */
donatien 0:013f5d54248c 214 #endif /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 215
donatien 0:013f5d54248c 216 struct netif netif;
donatien 0:013f5d54248c 217
donatien 0:013f5d54248c 218 struct ppp_addrs addrs;
donatien 0:013f5d54248c 219
donatien 0:013f5d54248c 220 void (*linkStatusCB)(void *ctx, int errCode, void *arg);
donatien 0:013f5d54248c 221 void *linkStatusCtx;
donatien 0:013f5d54248c 222
donatien 0:013f5d54248c 223 } PPPControl;
donatien 0:013f5d54248c 224
donatien 0:013f5d54248c 225
donatien 0:013f5d54248c 226 /*
donatien 0:013f5d54248c 227 * Ioctl definitions.
donatien 0:013f5d54248c 228 */
donatien 0:013f5d54248c 229
donatien 0:013f5d54248c 230 struct npioctl {
donatien 0:013f5d54248c 231 int protocol; /* PPP procotol, e.g. PPP_IP */
donatien 0:013f5d54248c 232 enum NPmode mode;
donatien 0:013f5d54248c 233 };
donatien 0:013f5d54248c 234
donatien 0:013f5d54248c 235
donatien 0:013f5d54248c 236
donatien 0:013f5d54248c 237 /***********************************/
donatien 0:013f5d54248c 238 /*** LOCAL FUNCTION DECLARATIONS ***/
donatien 0:013f5d54248c 239 /***********************************/
donatien 0:013f5d54248c 240 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 241 #if PPP_INPROC_OWNTHREAD
donatien 0:013f5d54248c 242 static void pppInputThread(void *arg);
donatien 0:013f5d54248c 243 #endif /* PPP_INPROC_OWNTHREAD */
donatien 0:013f5d54248c 244 static void pppDrop(PPPControlRx *pcrx);
donatien 0:013f5d54248c 245 static void pppInProc(PPPControlRx *pcrx, u_char *s, int l);
donatien 0:013f5d54248c 246 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 247
donatien 0:013f5d54248c 248
donatien 0:013f5d54248c 249 /******************************/
donatien 0:013f5d54248c 250 /*** PUBLIC DATA STRUCTURES ***/
donatien 0:013f5d54248c 251 /******************************/
donatien 0:013f5d54248c 252 u_long subnetMask;
donatien 0:013f5d54248c 253
donatien 0:013f5d54248c 254 static PPPControl pppControl[NUM_PPP] __attribute((section("AHBSRAM1"))); //Add DG; /* The PPP interface control blocks. */
donatien 0:013f5d54248c 255
donatien 0:013f5d54248c 256 #if !__LWIP_ORIG
donatien 0:013f5d54248c 257 sys_mbox_t pppMbox; //Used to signal PPP thread that a PPP session begins
donatien 0:013f5d54248c 258 #endif
donatien 0:013f5d54248c 259
donatien 0:013f5d54248c 260 /*
donatien 0:013f5d54248c 261 * PPP Data Link Layer "protocol" table.
donatien 0:013f5d54248c 262 * One entry per supported protocol.
donatien 0:013f5d54248c 263 * The last entry must be NULL.
donatien 0:013f5d54248c 264 */
donatien 0:013f5d54248c 265 struct protent *ppp_protocols[] = {
donatien 0:013f5d54248c 266 &lcp_protent,
donatien 0:013f5d54248c 267 #if PAP_SUPPORT
donatien 0:013f5d54248c 268 &pap_protent,
donatien 0:013f5d54248c 269 #endif /* PAP_SUPPORT */
donatien 0:013f5d54248c 270 #if CHAP_SUPPORT
donatien 0:013f5d54248c 271 &chap_protent,
donatien 0:013f5d54248c 272 #endif /* CHAP_SUPPORT */
donatien 0:013f5d54248c 273 #if CBCP_SUPPORT
donatien 0:013f5d54248c 274 &cbcp_protent,
donatien 0:013f5d54248c 275 #endif /* CBCP_SUPPORT */
donatien 0:013f5d54248c 276 &ipcp_protent,
donatien 0:013f5d54248c 277 #if CCP_SUPPORT
donatien 0:013f5d54248c 278 &ccp_protent,
donatien 0:013f5d54248c 279 #endif /* CCP_SUPPORT */
donatien 0:013f5d54248c 280 NULL
donatien 0:013f5d54248c 281 };
donatien 0:013f5d54248c 282
donatien 0:013f5d54248c 283
donatien 0:013f5d54248c 284 /*
donatien 0:013f5d54248c 285 * Buffers for outgoing packets. This must be accessed only from the appropriate
donatien 0:013f5d54248c 286 * PPP task so that it doesn't need to be protected to avoid collisions.
donatien 0:013f5d54248c 287 */
donatien 0:013f5d54248c 288 u_char outpacket_buf[NUM_PPP][PPP_MRU+PPP_HDRLEN] __attribute((section("AHBSRAM1")));
donatien 0:013f5d54248c 289
donatien 0:013f5d54248c 290
donatien 0:013f5d54248c 291 /*****************************/
donatien 0:013f5d54248c 292 /*** LOCAL DATA STRUCTURES ***/
donatien 0:013f5d54248c 293 /*****************************/
donatien 0:013f5d54248c 294
donatien 0:013f5d54248c 295 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 296 /*
donatien 0:013f5d54248c 297 * FCS lookup table as calculated by genfcstab.
donatien 0:013f5d54248c 298 * @todo: smaller, slower implementation for lower memory footprint?
donatien 0:013f5d54248c 299 */
donatien 0:013f5d54248c 300 static const u_short fcstab[256] = {
donatien 0:013f5d54248c 301 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
donatien 0:013f5d54248c 302 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
donatien 0:013f5d54248c 303 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
donatien 0:013f5d54248c 304 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
donatien 0:013f5d54248c 305 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
donatien 0:013f5d54248c 306 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
donatien 0:013f5d54248c 307 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
donatien 0:013f5d54248c 308 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
donatien 0:013f5d54248c 309 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
donatien 0:013f5d54248c 310 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
donatien 0:013f5d54248c 311 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
donatien 0:013f5d54248c 312 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
donatien 0:013f5d54248c 313 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
donatien 0:013f5d54248c 314 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
donatien 0:013f5d54248c 315 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
donatien 0:013f5d54248c 316 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
donatien 0:013f5d54248c 317 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
donatien 0:013f5d54248c 318 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
donatien 0:013f5d54248c 319 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
donatien 0:013f5d54248c 320 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
donatien 0:013f5d54248c 321 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
donatien 0:013f5d54248c 322 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
donatien 0:013f5d54248c 323 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
donatien 0:013f5d54248c 324 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
donatien 0:013f5d54248c 325 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
donatien 0:013f5d54248c 326 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
donatien 0:013f5d54248c 327 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
donatien 0:013f5d54248c 328 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
donatien 0:013f5d54248c 329 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
donatien 0:013f5d54248c 330 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
donatien 0:013f5d54248c 331 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
donatien 0:013f5d54248c 332 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
donatien 0:013f5d54248c 333 };
donatien 0:013f5d54248c 334
donatien 0:013f5d54248c 335 /* PPP's Asynchronous-Control-Character-Map. The mask array is used
donatien 0:013f5d54248c 336 * to select the specific bit for a character. */
donatien 0:013f5d54248c 337 static u_char pppACCMMask[] = {
donatien 0:013f5d54248c 338 0x01,
donatien 0:013f5d54248c 339 0x02,
donatien 0:013f5d54248c 340 0x04,
donatien 0:013f5d54248c 341 0x08,
donatien 0:013f5d54248c 342 0x10,
donatien 0:013f5d54248c 343 0x20,
donatien 0:013f5d54248c 344 0x40,
donatien 0:013f5d54248c 345 0x80
donatien 0:013f5d54248c 346 };
donatien 0:013f5d54248c 347
donatien 0:013f5d54248c 348 /** Wake up the task blocked in reading from serial line (if any) */
donatien 0:013f5d54248c 349 static void
donatien 0:013f5d54248c 350 pppRecvWakeup(int pd)
donatien 0:013f5d54248c 351 {
donatien 0:013f5d54248c 352 PPPDEBUG(LOG_DEBUG, ("pppRecvWakeup: unit %d\n", pd));
donatien 0:013f5d54248c 353 if (pppControl[pd].openFlag != 0) {
donatien 0:013f5d54248c 354 sio_read_abort(pppControl[pd].fd);
donatien 0:013f5d54248c 355 }
donatien 0:013f5d54248c 356 }
donatien 0:013f5d54248c 357 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 358
donatien 0:013f5d54248c 359 void
donatien 0:013f5d54248c 360 pppLinkTerminated(int pd)
donatien 0:013f5d54248c 361 {
donatien 0:013f5d54248c 362 PPPDEBUG(LOG_DEBUG, ("pppLinkTerminated: unit %d\n", pd));
donatien 0:013f5d54248c 363
donatien 0:013f5d54248c 364 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 365 if (pppControl[pd].ethif) {
donatien 0:013f5d54248c 366 pppoe_disconnect(pppControl[pd].pppoe_sc);
donatien 0:013f5d54248c 367 } else
donatien 0:013f5d54248c 368 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 369 {
donatien 0:013f5d54248c 370 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 371 PPPControl* pc;
donatien 0:013f5d54248c 372 pppRecvWakeup(pd);
donatien 0:013f5d54248c 373 pc = &pppControl[pd];
donatien 0:013f5d54248c 374
donatien 0:013f5d54248c 375 PPPDEBUG(LOG_DEBUG, ("pppLinkTerminated: unit %d: linkStatusCB=%p errCode=%d\n", pd, pc->linkStatusCB, pc->errCode));
donatien 0:013f5d54248c 376 if (pc->linkStatusCB) {
donatien 0:013f5d54248c 377 pc->linkStatusCB(pc->linkStatusCtx, pc->errCode ? pc->errCode : PPPERR_PROTOCOL, NULL);
donatien 0:013f5d54248c 378 }
donatien 0:013f5d54248c 379
donatien 0:013f5d54248c 380 pc->openFlag = 0;/**/
donatien 0:013f5d54248c 381 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 382 }
donatien 0:013f5d54248c 383 PPPDEBUG(LOG_DEBUG, ("pppLinkTerminated: finished.\n"));
donatien 0:013f5d54248c 384 }
donatien 0:013f5d54248c 385
donatien 0:013f5d54248c 386 void
donatien 0:013f5d54248c 387 pppLinkDown(int pd)
donatien 0:013f5d54248c 388 {
donatien 0:013f5d54248c 389 PPPDEBUG(LOG_DEBUG, ("pppLinkDown: unit %d\n", pd));
donatien 0:013f5d54248c 390
donatien 0:013f5d54248c 391 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 392 if (pppControl[pd].ethif) {
donatien 0:013f5d54248c 393 pppoe_disconnect(pppControl[pd].pppoe_sc);
donatien 0:013f5d54248c 394 } else
donatien 0:013f5d54248c 395 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 396 {
donatien 0:013f5d54248c 397 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 398 pppRecvWakeup(pd);
donatien 0:013f5d54248c 399 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 400 }
donatien 0:013f5d54248c 401 }
donatien 0:013f5d54248c 402
donatien 0:013f5d54248c 403 /** Initiate LCP open request */
donatien 0:013f5d54248c 404 static void
donatien 0:013f5d54248c 405 pppStart(int pd)
donatien 0:013f5d54248c 406 {
donatien 0:013f5d54248c 407 PPPDEBUG(LOG_DEBUG, ("pppStart: unit %d\n", pd));
donatien 0:013f5d54248c 408 lcp_lowerup(pd);
donatien 0:013f5d54248c 409 lcp_open(pd); /* Start protocol */
donatien 0:013f5d54248c 410 PPPDEBUG(LOG_DEBUG, ("pppStart: finished\n"));
donatien 0:013f5d54248c 411 }
donatien 0:013f5d54248c 412
donatien 0:013f5d54248c 413 /** LCP close request */
donatien 0:013f5d54248c 414 static void
donatien 0:013f5d54248c 415 pppStop(int pd)
donatien 0:013f5d54248c 416 {
donatien 0:013f5d54248c 417 PPPDEBUG(LOG_DEBUG, ("pppStop: unit %d\n", pd));
donatien 0:013f5d54248c 418 lcp_close(pd, "User request");
donatien 0:013f5d54248c 419 }
donatien 0:013f5d54248c 420
donatien 0:013f5d54248c 421 /** Called when carrier/link is lost */
donatien 0:013f5d54248c 422 static void
donatien 0:013f5d54248c 423 pppHup(int pd)
donatien 0:013f5d54248c 424 {
donatien 0:013f5d54248c 425 PPPDEBUG(LOG_DEBUG, ("pppHupCB: unit %d\n", pd));
donatien 0:013f5d54248c 426 lcp_lowerdown(pd);
donatien 0:013f5d54248c 427 link_terminated(pd);
donatien 0:013f5d54248c 428 }
donatien 0:013f5d54248c 429
donatien 0:013f5d54248c 430 /***********************************/
donatien 0:013f5d54248c 431 /*** PUBLIC FUNCTION DEFINITIONS ***/
donatien 0:013f5d54248c 432 /***********************************/
donatien 0:013f5d54248c 433 /* Initialize the PPP subsystem. */
donatien 0:013f5d54248c 434
donatien 0:013f5d54248c 435 struct ppp_settings ppp_settings;
donatien 0:013f5d54248c 436
donatien 0:013f5d54248c 437 void
donatien 0:013f5d54248c 438 pppInit(void)
donatien 0:013f5d54248c 439 {
donatien 0:013f5d54248c 440 struct protent *protp;
donatien 0:013f5d54248c 441 int i, j;
donatien 0:013f5d54248c 442
donatien 0:013f5d54248c 443 memset(&ppp_settings, 0, sizeof(ppp_settings));
donatien 0:013f5d54248c 444 ppp_settings.usepeerdns = 1;
donatien 0:013f5d54248c 445 pppSetAuth(PPPAUTHTYPE_NONE, NULL, NULL);
donatien 0:013f5d54248c 446
donatien 0:013f5d54248c 447 magicInit();
donatien 0:013f5d54248c 448
donatien 0:013f5d54248c 449 subnetMask = PP_HTONL(0xffffff00UL);
donatien 0:013f5d54248c 450
donatien 0:013f5d54248c 451 for (i = 0; i < NUM_PPP; i++) {
donatien 0:013f5d54248c 452 /* Initialize each protocol to the standard option set. */
donatien 0:013f5d54248c 453 for (j = 0; (protp = ppp_protocols[j]) != NULL; ++j) {
donatien 0:013f5d54248c 454 (*protp->init)(i);
donatien 0:013f5d54248c 455 }
donatien 0:013f5d54248c 456 }
donatien 0:013f5d54248c 457
donatien 0:013f5d54248c 458 #if !__LWIP_ORIG
donatien 0:013f5d54248c 459 sys_mbox_new(&pppMbox, 1);
donatien 0:013f5d54248c 460 sys_thread_new(PPP_THREAD_NAME, pppInputThread, (void*)NULL, PPP_THREAD_STACKSIZE, PPP_THREAD_PRIO); //Create PPP thread here
donatien 0:013f5d54248c 461 #endif
donatien 0:013f5d54248c 462 }
donatien 0:013f5d54248c 463
donatien 0:013f5d54248c 464 void
donatien 0:013f5d54248c 465 pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd)
donatien 0:013f5d54248c 466 {
donatien 0:013f5d54248c 467 switch(authType) {
donatien 0:013f5d54248c 468 case PPPAUTHTYPE_NONE:
donatien 0:013f5d54248c 469 default:
donatien 0:013f5d54248c 470 #ifdef LWIP_PPP_STRICT_PAP_REJECT
donatien 0:013f5d54248c 471 ppp_settings.refuse_pap = 1;
donatien 0:013f5d54248c 472 #else /* LWIP_PPP_STRICT_PAP_REJECT */
donatien 0:013f5d54248c 473 /* some providers request pap and accept an empty login/pw */
donatien 0:013f5d54248c 474 ppp_settings.refuse_pap = 0;
donatien 0:013f5d54248c 475 #endif /* LWIP_PPP_STRICT_PAP_REJECT */
donatien 0:013f5d54248c 476 ppp_settings.refuse_chap = 1;
donatien 0:013f5d54248c 477 break;
donatien 0:013f5d54248c 478
donatien 0:013f5d54248c 479 case PPPAUTHTYPE_ANY:
donatien 0:013f5d54248c 480 /* Warning: Using PPPAUTHTYPE_ANY might have security consequences.
donatien 0:013f5d54248c 481 * RFC 1994 says:
donatien 0:013f5d54248c 482 *
donatien 0:013f5d54248c 483 * In practice, within or associated with each PPP server, there is a
donatien 0:013f5d54248c 484 * database which associates "user" names with authentication
donatien 0:013f5d54248c 485 * information ("secrets"). It is not anticipated that a particular
donatien 0:013f5d54248c 486 * named user would be authenticated by multiple methods. This would
donatien 0:013f5d54248c 487 * make the user vulnerable to attacks which negotiate the least secure
donatien 0:013f5d54248c 488 * method from among a set (such as PAP rather than CHAP). If the same
donatien 0:013f5d54248c 489 * secret was used, PAP would reveal the secret to be used later with
donatien 0:013f5d54248c 490 * CHAP.
donatien 0:013f5d54248c 491 *
donatien 0:013f5d54248c 492 * Instead, for each user name there should be an indication of exactly
donatien 0:013f5d54248c 493 * one method used to authenticate that user name. If a user needs to
donatien 0:013f5d54248c 494 * make use of different authentication methods under different
donatien 0:013f5d54248c 495 * circumstances, then distinct user names SHOULD be employed, each of
donatien 0:013f5d54248c 496 * which identifies exactly one authentication method.
donatien 0:013f5d54248c 497 *
donatien 0:013f5d54248c 498 */
donatien 0:013f5d54248c 499 ppp_settings.refuse_pap = 0;
donatien 0:013f5d54248c 500 ppp_settings.refuse_chap = 0;
donatien 0:013f5d54248c 501 break;
donatien 0:013f5d54248c 502
donatien 0:013f5d54248c 503 case PPPAUTHTYPE_PAP:
donatien 0:013f5d54248c 504 ppp_settings.refuse_pap = 0;
donatien 0:013f5d54248c 505 ppp_settings.refuse_chap = 1;
donatien 0:013f5d54248c 506 break;
donatien 0:013f5d54248c 507
donatien 0:013f5d54248c 508 case PPPAUTHTYPE_CHAP:
donatien 0:013f5d54248c 509 ppp_settings.refuse_pap = 1;
donatien 0:013f5d54248c 510 ppp_settings.refuse_chap = 0;
donatien 0:013f5d54248c 511 break;
donatien 0:013f5d54248c 512 }
donatien 0:013f5d54248c 513
donatien 0:013f5d54248c 514 if(user) {
donatien 0:013f5d54248c 515 strncpy(ppp_settings.user, user, sizeof(ppp_settings.user)-1);
donatien 0:013f5d54248c 516 ppp_settings.user[sizeof(ppp_settings.user)-1] = '\0';
donatien 0:013f5d54248c 517 } else {
donatien 0:013f5d54248c 518 ppp_settings.user[0] = '\0';
donatien 0:013f5d54248c 519 }
donatien 0:013f5d54248c 520
donatien 0:013f5d54248c 521 if(passwd) {
donatien 0:013f5d54248c 522 strncpy(ppp_settings.passwd, passwd, sizeof(ppp_settings.passwd)-1);
donatien 0:013f5d54248c 523 ppp_settings.passwd[sizeof(ppp_settings.passwd)-1] = '\0';
donatien 0:013f5d54248c 524 } else {
donatien 0:013f5d54248c 525 ppp_settings.passwd[0] = '\0';
donatien 0:013f5d54248c 526 }
donatien 0:013f5d54248c 527 }
donatien 0:013f5d54248c 528
donatien 0:013f5d54248c 529 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 530 /** Open a new PPP connection using the given I/O device.
donatien 0:013f5d54248c 531 * This initializes the PPP control block but does not
donatien 0:013f5d54248c 532 * attempt to negotiate the LCP session. If this port
donatien 0:013f5d54248c 533 * connects to a modem, the modem connection must be
donatien 0:013f5d54248c 534 * established before calling this.
donatien 0:013f5d54248c 535 * Return a new PPP connection descriptor on success or
donatien 0:013f5d54248c 536 * an error code (negative) on failure.
donatien 0:013f5d54248c 537 *
donatien 0:013f5d54248c 538 * pppOpen() is directly defined to this function.
donatien 0:013f5d54248c 539 */
donatien 0:013f5d54248c 540 int
donatien 0:013f5d54248c 541 pppOverSerialOpen(sio_fd_t fd, void (*linkStatusCB)(void *ctx, int errCode, void *arg), void *linkStatusCtx)
donatien 0:013f5d54248c 542 {
donatien 0:013f5d54248c 543 PPPControl *pc;
donatien 0:013f5d54248c 544 int pd;
donatien 0:013f5d54248c 545
donatien 0:013f5d54248c 546 if (linkStatusCB == NULL) {
donatien 0:013f5d54248c 547 /* PPP is single-threaded: without a callback,
donatien 0:013f5d54248c 548 * there is no way to know when the link is up. */
donatien 0:013f5d54248c 549 return PPPERR_PARAM;
donatien 0:013f5d54248c 550 }
donatien 0:013f5d54248c 551
donatien 0:013f5d54248c 552 /* Find a free PPP session descriptor. */
donatien 0:013f5d54248c 553 for (pd = 0; pd < NUM_PPP && pppControl[pd].openFlag != 0; pd++);
donatien 0:013f5d54248c 554
donatien 0:013f5d54248c 555 if (pd >= NUM_PPP) {
donatien 0:013f5d54248c 556 pd = PPPERR_OPEN;
donatien 0:013f5d54248c 557 } else {
donatien 0:013f5d54248c 558 pc = &pppControl[pd];
donatien 0:013f5d54248c 559 /* @todo: is this correct or do I overwrite something? */
donatien 0:013f5d54248c 560 memset(pc, 0, sizeof(PPPControl));
donatien 0:013f5d54248c 561 pc->rx.pd = pd;
donatien 0:013f5d54248c 562 pc->rx.fd = fd;
donatien 0:013f5d54248c 563
donatien 0:013f5d54248c 564 pc->openFlag = 1;
donatien 0:013f5d54248c 565 pc->fd = fd;
donatien 0:013f5d54248c 566
donatien 0:013f5d54248c 567 #if VJ_SUPPORT
donatien 0:013f5d54248c 568 vj_compress_init(&pc->vjComp);
donatien 0:013f5d54248c 569 #endif /* VJ_SUPPORT */
donatien 0:013f5d54248c 570
donatien 0:013f5d54248c 571 /*
donatien 0:013f5d54248c 572 * Default the in and out accm so that escape and flag characters
donatien 0:013f5d54248c 573 * are always escaped.
donatien 0:013f5d54248c 574 */
donatien 0:013f5d54248c 575 pc->rx.inACCM[15] = 0x60; /* no need to protect since RX is not running */
donatien 0:013f5d54248c 576 pc->outACCM[15] = 0x60;
donatien 0:013f5d54248c 577
donatien 0:013f5d54248c 578 pc->linkStatusCB = linkStatusCB;
donatien 0:013f5d54248c 579 pc->linkStatusCtx = linkStatusCtx;
donatien 0:013f5d54248c 580
donatien 0:013f5d54248c 581 /*
donatien 0:013f5d54248c 582 * Start the connection and handle incoming events (packet or timeout).
donatien 0:013f5d54248c 583 */
donatien 0:013f5d54248c 584 PPPDEBUG(LOG_INFO, ("pppOverSerialOpen: unit %d: Connecting\n", pd));
donatien 0:013f5d54248c 585 pppStart(pd);
donatien 0:013f5d54248c 586 #if PPP_INPROC_OWNTHREAD
donatien 0:013f5d54248c 587 #if __LWIP_ORIG
donatien 0:013f5d54248c 588 sys_thread_new(PPP_THREAD_NAME, pppInputThread, (void*)&pc->rx, PPP_THREAD_STACKSIZE, PPP_THREAD_PRIO);
donatien 0:013f5d54248c 589 #else
donatien 0:013f5d54248c 590 sys_mbox_post(&pppMbox, (void*)&pc->rx);
donatien 0:013f5d54248c 591 #endif
donatien 0:013f5d54248c 592 #endif
donatien 0:013f5d54248c 593 }
donatien 0:013f5d54248c 594
donatien 0:013f5d54248c 595 return pd;
donatien 0:013f5d54248c 596 }
donatien 0:013f5d54248c 597 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 598
donatien 0:013f5d54248c 599 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 600 static void pppOverEthernetLinkStatusCB(int pd, int up);
donatien 0:013f5d54248c 601
donatien 0:013f5d54248c 602 void
donatien 0:013f5d54248c 603 pppOverEthernetClose(int pd)
donatien 0:013f5d54248c 604 {
donatien 0:013f5d54248c 605 PPPControl* pc = &pppControl[pd];
donatien 0:013f5d54248c 606
donatien 0:013f5d54248c 607 /* *TJL* There's no lcp_deinit */
donatien 0:013f5d54248c 608 lcp_close(pd, NULL);
donatien 0:013f5d54248c 609
donatien 0:013f5d54248c 610 pppoe_destroy(&pc->netif);
donatien 0:013f5d54248c 611 }
donatien 0:013f5d54248c 612
donatien 0:013f5d54248c 613 int pppOverEthernetOpen(struct netif *ethif, const char *service_name, const char *concentrator_name, void (*linkStatusCB)(void *ctx, int errCode, void *arg), void *linkStatusCtx)
donatien 0:013f5d54248c 614 {
donatien 0:013f5d54248c 615 PPPControl *pc;
donatien 0:013f5d54248c 616 int pd;
donatien 0:013f5d54248c 617
donatien 0:013f5d54248c 618 LWIP_UNUSED_ARG(service_name);
donatien 0:013f5d54248c 619 LWIP_UNUSED_ARG(concentrator_name);
donatien 0:013f5d54248c 620
donatien 0:013f5d54248c 621 if (linkStatusCB == NULL) {
donatien 0:013f5d54248c 622 /* PPP is single-threaded: without a callback,
donatien 0:013f5d54248c 623 * there is no way to know when the link is up. */
donatien 0:013f5d54248c 624 return PPPERR_PARAM;
donatien 0:013f5d54248c 625 }
donatien 0:013f5d54248c 626
donatien 0:013f5d54248c 627 /* Find a free PPP session descriptor. Critical region? */
donatien 0:013f5d54248c 628 for (pd = 0; pd < NUM_PPP && pppControl[pd].openFlag != 0; pd++);
donatien 0:013f5d54248c 629 if (pd >= NUM_PPP) {
donatien 0:013f5d54248c 630 pd = PPPERR_OPEN;
donatien 0:013f5d54248c 631 } else {
donatien 0:013f5d54248c 632 pc = &pppControl[pd];
donatien 0:013f5d54248c 633 memset(pc, 0, sizeof(PPPControl));
donatien 0:013f5d54248c 634 pc->openFlag = 1;
donatien 0:013f5d54248c 635 pc->ethif = ethif;
donatien 0:013f5d54248c 636
donatien 0:013f5d54248c 637 pc->linkStatusCB = linkStatusCB;
donatien 0:013f5d54248c 638 pc->linkStatusCtx = linkStatusCtx;
donatien 0:013f5d54248c 639
donatien 0:013f5d54248c 640 lcp_wantoptions[pd].mru = PPPOE_MAXMTU;
donatien 0:013f5d54248c 641 lcp_wantoptions[pd].neg_asyncmap = 0;
donatien 0:013f5d54248c 642 lcp_wantoptions[pd].neg_pcompression = 0;
donatien 0:013f5d54248c 643 lcp_wantoptions[pd].neg_accompression = 0;
donatien 0:013f5d54248c 644
donatien 0:013f5d54248c 645 lcp_allowoptions[pd].mru = PPPOE_MAXMTU;
donatien 0:013f5d54248c 646 lcp_allowoptions[pd].neg_asyncmap = 0;
donatien 0:013f5d54248c 647 lcp_allowoptions[pd].neg_pcompression = 0;
donatien 0:013f5d54248c 648 lcp_allowoptions[pd].neg_accompression = 0;
donatien 0:013f5d54248c 649
donatien 0:013f5d54248c 650 if(pppoe_create(ethif, pd, pppOverEthernetLinkStatusCB, &pc->pppoe_sc) != ERR_OK) {
donatien 0:013f5d54248c 651 pc->openFlag = 0;
donatien 0:013f5d54248c 652 return PPPERR_OPEN;
donatien 0:013f5d54248c 653 }
donatien 0:013f5d54248c 654
donatien 0:013f5d54248c 655 pppoe_connect(pc->pppoe_sc);
donatien 0:013f5d54248c 656 }
donatien 0:013f5d54248c 657
donatien 0:013f5d54248c 658 return pd;
donatien 0:013f5d54248c 659 }
donatien 0:013f5d54248c 660 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 661
donatien 0:013f5d54248c 662
donatien 0:013f5d54248c 663 /* Close a PPP connection and release the descriptor.
donatien 0:013f5d54248c 664 * Any outstanding packets in the queues are dropped.
donatien 0:013f5d54248c 665 * Return 0 on success, an error code on failure. */
donatien 0:013f5d54248c 666 int
donatien 0:013f5d54248c 667 pppClose(int pd)
donatien 0:013f5d54248c 668 {
donatien 0:013f5d54248c 669 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 670 int st = 0;
donatien 0:013f5d54248c 671
donatien 0:013f5d54248c 672 PPPDEBUG(LOG_DEBUG, ("pppClose() called\n"));
donatien 0:013f5d54248c 673
donatien 0:013f5d54248c 674 /* Disconnect */
donatien 0:013f5d54248c 675 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 676 if(pc->ethif) {
donatien 0:013f5d54248c 677 PPPDEBUG(LOG_DEBUG, ("pppClose: unit %d kill_link -> pppStop\n", pd));
donatien 0:013f5d54248c 678 pc->errCode = PPPERR_USER;
donatien 0:013f5d54248c 679 /* This will leave us at PHASE_DEAD. */
donatien 0:013f5d54248c 680 pppStop(pd);
donatien 0:013f5d54248c 681 } else
donatien 0:013f5d54248c 682 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 683 {
donatien 0:013f5d54248c 684 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 685 PPPDEBUG(LOG_DEBUG, ("pppClose: unit %d kill_link -> pppStop\n", pd));
donatien 0:013f5d54248c 686 pc->errCode = PPPERR_USER;
donatien 0:013f5d54248c 687 /* This will leave us at PHASE_DEAD. */
donatien 0:013f5d54248c 688 pppStop(pd);
donatien 0:013f5d54248c 689 pppRecvWakeup(pd);
donatien 0:013f5d54248c 690 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 691 }
donatien 0:013f5d54248c 692
donatien 0:013f5d54248c 693 return st;
donatien 0:013f5d54248c 694 }
donatien 0:013f5d54248c 695
donatien 0:013f5d54248c 696 /* This function is called when carrier is lost on the PPP channel. */
donatien 0:013f5d54248c 697 void
donatien 0:013f5d54248c 698 pppSigHUP(int pd)
donatien 0:013f5d54248c 699 {
donatien 0:013f5d54248c 700 PPPDEBUG(LOG_DEBUG, ("pppSigHUP: unit %d sig_hup -> pppHupCB\n", pd));
donatien 0:013f5d54248c 701 pppHup(pd);
donatien 0:013f5d54248c 702 }
donatien 0:013f5d54248c 703
donatien 0:013f5d54248c 704 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 705 static void
donatien 0:013f5d54248c 706 nPut(PPPControl *pc, struct pbuf *nb)
donatien 0:013f5d54248c 707 {
donatien 0:013f5d54248c 708 struct pbuf *b;
donatien 0:013f5d54248c 709 int c;
donatien 0:013f5d54248c 710
donatien 0:013f5d54248c 711 for(b = nb; b != NULL; b = b->next) {
donatien 0:013f5d54248c 712 if((c = sio_write(pc->fd, b->payload, b->len)) != b->len) {
donatien 0:013f5d54248c 713 PPPDEBUG(LOG_WARNING,
donatien 0:013f5d54248c 714 ("PPP nPut: incomplete sio_write(fd:%"SZT_F", len:%d, c: 0x%"X8_F") c = %d\n", (size_t)pc->fd, b->len, c, c));
donatien 0:013f5d54248c 715 LINK_STATS_INC(link.err);
donatien 0:013f5d54248c 716 pc->lastXMit = 0; /* prepend PPP_FLAG to next packet */
donatien 0:013f5d54248c 717 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 718 pbuf_free(nb);
donatien 0:013f5d54248c 719 return;
donatien 0:013f5d54248c 720 }
donatien 0:013f5d54248c 721 }
donatien 0:013f5d54248c 722
donatien 0:013f5d54248c 723 snmp_add_ifoutoctets(&pc->netif, nb->tot_len);
donatien 0:013f5d54248c 724 snmp_inc_ifoutucastpkts(&pc->netif);
donatien 0:013f5d54248c 725 pbuf_free(nb);
donatien 0:013f5d54248c 726 LINK_STATS_INC(link.xmit);
donatien 0:013f5d54248c 727 }
donatien 0:013f5d54248c 728
donatien 0:013f5d54248c 729 /*
donatien 0:013f5d54248c 730 * pppAppend - append given character to end of given pbuf. If outACCM
donatien 0:013f5d54248c 731 * is not NULL and the character needs to be escaped, do so.
donatien 0:013f5d54248c 732 * If pbuf is full, append another.
donatien 0:013f5d54248c 733 * Return the current pbuf.
donatien 0:013f5d54248c 734 */
donatien 0:013f5d54248c 735 static struct pbuf *
donatien 0:013f5d54248c 736 pppAppend(u_char c, struct pbuf *nb, ext_accm *outACCM)
donatien 0:013f5d54248c 737 {
donatien 0:013f5d54248c 738 struct pbuf *tb = nb;
donatien 0:013f5d54248c 739
donatien 0:013f5d54248c 740 /* Make sure there is room for the character and an escape code.
donatien 0:013f5d54248c 741 * Sure we don't quite fill the buffer if the character doesn't
donatien 0:013f5d54248c 742 * get escaped but is one character worth complicating this? */
donatien 0:013f5d54248c 743 /* Note: We assume no packet header. */
donatien 0:013f5d54248c 744 if (nb && (PBUF_POOL_BUFSIZE - nb->len) < 2) {
donatien 0:013f5d54248c 745 tb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
donatien 0:013f5d54248c 746 if (tb) {
donatien 0:013f5d54248c 747 nb->next = tb;
donatien 0:013f5d54248c 748 } else {
donatien 0:013f5d54248c 749 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 750 }
donatien 0:013f5d54248c 751 nb = tb;
donatien 0:013f5d54248c 752 }
donatien 0:013f5d54248c 753
donatien 0:013f5d54248c 754 if (nb) {
donatien 0:013f5d54248c 755 if (outACCM && ESCAPE_P(*outACCM, c)) {
donatien 0:013f5d54248c 756 *((u_char*)nb->payload + nb->len++) = PPP_ESCAPE;
donatien 0:013f5d54248c 757 *((u_char*)nb->payload + nb->len++) = c ^ PPP_TRANS;
donatien 0:013f5d54248c 758 } else {
donatien 0:013f5d54248c 759 *((u_char*)nb->payload + nb->len++) = c;
donatien 0:013f5d54248c 760 }
donatien 0:013f5d54248c 761 }
donatien 0:013f5d54248c 762
donatien 0:013f5d54248c 763 return tb;
donatien 0:013f5d54248c 764 }
donatien 0:013f5d54248c 765 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 766
donatien 0:013f5d54248c 767 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 768 static err_t
donatien 0:013f5d54248c 769 pppifOutputOverEthernet(int pd, struct pbuf *p)
donatien 0:013f5d54248c 770 {
donatien 0:013f5d54248c 771 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 772 struct pbuf *pb;
donatien 0:013f5d54248c 773 u_short protocol = PPP_IP;
donatien 0:013f5d54248c 774 int i=0;
donatien 0:013f5d54248c 775 u16_t tot_len;
donatien 0:013f5d54248c 776
donatien 0:013f5d54248c 777 /* @todo: try to use pbuf_header() here! */
donatien 0:013f5d54248c 778 pb = pbuf_alloc(PBUF_LINK, PPPOE_HDRLEN + sizeof(protocol), PBUF_RAM);
donatien 0:013f5d54248c 779 if(!pb) {
donatien 0:013f5d54248c 780 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 781 LINK_STATS_INC(link.proterr);
donatien 0:013f5d54248c 782 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 783 return ERR_MEM;
donatien 0:013f5d54248c 784 }
donatien 0:013f5d54248c 785
donatien 0:013f5d54248c 786 pbuf_header(pb, -(s16_t)PPPOE_HDRLEN);
donatien 0:013f5d54248c 787
donatien 0:013f5d54248c 788 pc->lastXMit = sys_jiffies();
donatien 0:013f5d54248c 789
donatien 0:013f5d54248c 790 if (!pc->pcomp || protocol > 0xFF) {
donatien 0:013f5d54248c 791 *((u_char*)pb->payload + i++) = (protocol >> 8) & 0xFF;
donatien 0:013f5d54248c 792 }
donatien 0:013f5d54248c 793 *((u_char*)pb->payload + i) = protocol & 0xFF;
donatien 0:013f5d54248c 794
donatien 0:013f5d54248c 795 pbuf_chain(pb, p);
donatien 0:013f5d54248c 796 tot_len = pb->tot_len;
donatien 0:013f5d54248c 797
donatien 0:013f5d54248c 798 if(pppoe_xmit(pc->pppoe_sc, pb) != ERR_OK) {
donatien 0:013f5d54248c 799 LINK_STATS_INC(link.err);
donatien 0:013f5d54248c 800 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 801 return PPPERR_DEVICE;
donatien 0:013f5d54248c 802 }
donatien 0:013f5d54248c 803
donatien 0:013f5d54248c 804 snmp_add_ifoutoctets(&pc->netif, tot_len);
donatien 0:013f5d54248c 805 snmp_inc_ifoutucastpkts(&pc->netif);
donatien 0:013f5d54248c 806 LINK_STATS_INC(link.xmit);
donatien 0:013f5d54248c 807 return ERR_OK;
donatien 0:013f5d54248c 808 }
donatien 0:013f5d54248c 809 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 810
donatien 0:013f5d54248c 811 /* Send a packet on the given connection. */
donatien 0:013f5d54248c 812 static err_t
donatien 0:013f5d54248c 813 pppifOutput(struct netif *netif, struct pbuf *pb, ip_addr_t *ipaddr)
donatien 0:013f5d54248c 814 {
donatien 0:013f5d54248c 815 int pd = (int)(size_t)netif->state;
donatien 0:013f5d54248c 816 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 817 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 818 u_short protocol = PPP_IP;
donatien 0:013f5d54248c 819 u_int fcsOut = PPP_INITFCS;
donatien 0:013f5d54248c 820 struct pbuf *headMB = NULL, *tailMB = NULL, *p;
donatien 0:013f5d54248c 821 u_char c;
donatien 0:013f5d54248c 822 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 823
donatien 0:013f5d54248c 824 LWIP_UNUSED_ARG(ipaddr);
donatien 0:013f5d54248c 825
donatien 0:013f5d54248c 826 /* Validate parameters. */
donatien 0:013f5d54248c 827 /* We let any protocol value go through - it can't hurt us
donatien 0:013f5d54248c 828 * and the peer will just drop it if it's not accepting it. */
donatien 0:013f5d54248c 829 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag || !pb) {
donatien 0:013f5d54248c 830 PPPDEBUG(LOG_WARNING, ("pppifOutput[%d]: bad parms prot=%d pb=%p\n",
donatien 0:013f5d54248c 831 pd, PPP_IP, pb));
donatien 0:013f5d54248c 832 LINK_STATS_INC(link.opterr);
donatien 0:013f5d54248c 833 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 834 snmp_inc_ifoutdiscards(netif);
donatien 0:013f5d54248c 835 return ERR_ARG;
donatien 0:013f5d54248c 836 }
donatien 0:013f5d54248c 837
donatien 0:013f5d54248c 838 /* Check that the link is up. */
donatien 0:013f5d54248c 839 if (lcp_phase[pd] == PHASE_DEAD) {
donatien 0:013f5d54248c 840 PPPDEBUG(LOG_ERR, ("pppifOutput[%d]: link not up\n", pd));
donatien 0:013f5d54248c 841 LINK_STATS_INC(link.rterr);
donatien 0:013f5d54248c 842 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 843 snmp_inc_ifoutdiscards(netif);
donatien 0:013f5d54248c 844 return ERR_RTE;
donatien 0:013f5d54248c 845 }
donatien 0:013f5d54248c 846
donatien 0:013f5d54248c 847 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 848 if(pc->ethif) {
donatien 0:013f5d54248c 849 return pppifOutputOverEthernet(pd, pb);
donatien 0:013f5d54248c 850 }
donatien 0:013f5d54248c 851 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 852
donatien 0:013f5d54248c 853 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 854 /* Grab an output buffer. */
donatien 0:013f5d54248c 855 headMB = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
donatien 0:013f5d54248c 856 if (headMB == NULL) {
donatien 0:013f5d54248c 857 PPPDEBUG(LOG_WARNING, ("pppifOutput[%d]: first alloc fail\n", pd));
donatien 0:013f5d54248c 858 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 859 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 860 snmp_inc_ifoutdiscards(netif);
donatien 0:013f5d54248c 861 return ERR_MEM;
donatien 0:013f5d54248c 862 }
donatien 0:013f5d54248c 863
donatien 0:013f5d54248c 864 #if VJ_SUPPORT
donatien 0:013f5d54248c 865 /*
donatien 0:013f5d54248c 866 * Attempt Van Jacobson header compression if VJ is configured and
donatien 0:013f5d54248c 867 * this is an IP packet.
donatien 0:013f5d54248c 868 */
donatien 0:013f5d54248c 869 if (protocol == PPP_IP && pc->vjEnabled) {
donatien 0:013f5d54248c 870 switch (vj_compress_tcp(&pc->vjComp, pb)) {
donatien 0:013f5d54248c 871 case TYPE_IP:
donatien 0:013f5d54248c 872 /* No change...
donatien 0:013f5d54248c 873 protocol = PPP_IP_PROTOCOL; */
donatien 0:013f5d54248c 874 break;
donatien 0:013f5d54248c 875 case TYPE_COMPRESSED_TCP:
donatien 0:013f5d54248c 876 protocol = PPP_VJC_COMP;
donatien 0:013f5d54248c 877 break;
donatien 0:013f5d54248c 878 case TYPE_UNCOMPRESSED_TCP:
donatien 0:013f5d54248c 879 protocol = PPP_VJC_UNCOMP;
donatien 0:013f5d54248c 880 break;
donatien 0:013f5d54248c 881 default:
donatien 0:013f5d54248c 882 PPPDEBUG(LOG_WARNING, ("pppifOutput[%d]: bad IP packet\n", pd));
donatien 0:013f5d54248c 883 LINK_STATS_INC(link.proterr);
donatien 0:013f5d54248c 884 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 885 snmp_inc_ifoutdiscards(netif);
donatien 0:013f5d54248c 886 pbuf_free(headMB);
donatien 0:013f5d54248c 887 return ERR_VAL;
donatien 0:013f5d54248c 888 }
donatien 0:013f5d54248c 889 }
donatien 0:013f5d54248c 890 #endif /* VJ_SUPPORT */
donatien 0:013f5d54248c 891
donatien 0:013f5d54248c 892 tailMB = headMB;
donatien 0:013f5d54248c 893
donatien 0:013f5d54248c 894 /* Build the PPP header. */
donatien 0:013f5d54248c 895 if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG) {
donatien 0:013f5d54248c 896 tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
donatien 0:013f5d54248c 897 }
donatien 0:013f5d54248c 898
donatien 0:013f5d54248c 899 pc->lastXMit = sys_jiffies();
donatien 0:013f5d54248c 900 if (!pc->accomp) {
donatien 0:013f5d54248c 901 fcsOut = PPP_FCS(fcsOut, PPP_ALLSTATIONS);
donatien 0:013f5d54248c 902 tailMB = pppAppend(PPP_ALLSTATIONS, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 903 fcsOut = PPP_FCS(fcsOut, PPP_UI);
donatien 0:013f5d54248c 904 tailMB = pppAppend(PPP_UI, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 905 }
donatien 0:013f5d54248c 906 if (!pc->pcomp || protocol > 0xFF) {
donatien 0:013f5d54248c 907 c = (protocol >> 8) & 0xFF;
donatien 0:013f5d54248c 908 fcsOut = PPP_FCS(fcsOut, c);
donatien 0:013f5d54248c 909 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 910 }
donatien 0:013f5d54248c 911 c = protocol & 0xFF;
donatien 0:013f5d54248c 912 fcsOut = PPP_FCS(fcsOut, c);
donatien 0:013f5d54248c 913 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 914
donatien 0:013f5d54248c 915 /* Load packet. */
donatien 0:013f5d54248c 916 for(p = pb; p; p = p->next) {
donatien 0:013f5d54248c 917 int n;
donatien 0:013f5d54248c 918 u_char *sPtr;
donatien 0:013f5d54248c 919
donatien 0:013f5d54248c 920 sPtr = (u_char*)p->payload;
donatien 0:013f5d54248c 921 n = p->len;
donatien 0:013f5d54248c 922 while (n-- > 0) {
donatien 0:013f5d54248c 923 c = *sPtr++;
donatien 0:013f5d54248c 924
donatien 0:013f5d54248c 925 /* Update FCS before checking for special characters. */
donatien 0:013f5d54248c 926 fcsOut = PPP_FCS(fcsOut, c);
donatien 0:013f5d54248c 927
donatien 0:013f5d54248c 928 /* Copy to output buffer escaping special characters. */
donatien 0:013f5d54248c 929 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 930 }
donatien 0:013f5d54248c 931 }
donatien 0:013f5d54248c 932
donatien 0:013f5d54248c 933 /* Add FCS and trailing flag. */
donatien 0:013f5d54248c 934 c = ~fcsOut & 0xFF;
donatien 0:013f5d54248c 935 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 936 c = (~fcsOut >> 8) & 0xFF;
donatien 0:013f5d54248c 937 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 938 tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
donatien 0:013f5d54248c 939
donatien 0:013f5d54248c 940 /* If we failed to complete the packet, throw it away. */
donatien 0:013f5d54248c 941 if (!tailMB) {
donatien 0:013f5d54248c 942 PPPDEBUG(LOG_WARNING,
donatien 0:013f5d54248c 943 ("pppifOutput[%d]: Alloc err - dropping proto=%d\n",
donatien 0:013f5d54248c 944 pd, protocol));
donatien 0:013f5d54248c 945 pbuf_free(headMB);
donatien 0:013f5d54248c 946 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 947 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 948 snmp_inc_ifoutdiscards(netif);
donatien 0:013f5d54248c 949 return ERR_MEM;
donatien 0:013f5d54248c 950 }
donatien 0:013f5d54248c 951
donatien 0:013f5d54248c 952 /* Send it. */
donatien 0:013f5d54248c 953 PPPDEBUG(LOG_INFO, ("pppifOutput[%d]: proto=0x%"X16_F"\n", pd, protocol));
donatien 0:013f5d54248c 954
donatien 0:013f5d54248c 955 nPut(pc, headMB);
donatien 0:013f5d54248c 956 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 957
donatien 0:013f5d54248c 958 return ERR_OK;
donatien 0:013f5d54248c 959 }
donatien 0:013f5d54248c 960
donatien 0:013f5d54248c 961 /* Get and set parameters for the given connection.
donatien 0:013f5d54248c 962 * Return 0 on success, an error code on failure. */
donatien 0:013f5d54248c 963 int
donatien 0:013f5d54248c 964 pppIOCtl(int pd, int cmd, void *arg)
donatien 0:013f5d54248c 965 {
donatien 0:013f5d54248c 966 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 967 int st = 0;
donatien 0:013f5d54248c 968
donatien 0:013f5d54248c 969 if (pd < 0 || pd >= NUM_PPP) {
donatien 0:013f5d54248c 970 st = PPPERR_PARAM;
donatien 0:013f5d54248c 971 } else {
donatien 0:013f5d54248c 972 switch(cmd) {
donatien 0:013f5d54248c 973 case PPPCTLG_UPSTATUS: /* Get the PPP up status. */
donatien 0:013f5d54248c 974 if (arg) {
donatien 0:013f5d54248c 975 *(int *)arg = (int)(pc->if_up);
donatien 0:013f5d54248c 976 } else {
donatien 0:013f5d54248c 977 st = PPPERR_PARAM;
donatien 0:013f5d54248c 978 }
donatien 0:013f5d54248c 979 break;
donatien 0:013f5d54248c 980 case PPPCTLS_ERRCODE: /* Set the PPP error code. */
donatien 0:013f5d54248c 981 if (arg) {
donatien 0:013f5d54248c 982 pc->errCode = *(int *)arg;
donatien 0:013f5d54248c 983 } else {
donatien 0:013f5d54248c 984 st = PPPERR_PARAM;
donatien 0:013f5d54248c 985 }
donatien 0:013f5d54248c 986 break;
donatien 0:013f5d54248c 987 case PPPCTLG_ERRCODE: /* Get the PPP error code. */
donatien 0:013f5d54248c 988 if (arg) {
donatien 0:013f5d54248c 989 *(int *)arg = (int)(pc->errCode);
donatien 0:013f5d54248c 990 } else {
donatien 0:013f5d54248c 991 st = PPPERR_PARAM;
donatien 0:013f5d54248c 992 }
donatien 0:013f5d54248c 993 break;
donatien 0:013f5d54248c 994 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 995 case PPPCTLG_FD: /* Get the fd associated with the ppp */
donatien 0:013f5d54248c 996 if (arg) {
donatien 0:013f5d54248c 997 *(sio_fd_t *)arg = pc->fd;
donatien 0:013f5d54248c 998 } else {
donatien 0:013f5d54248c 999 st = PPPERR_PARAM;
donatien 0:013f5d54248c 1000 }
donatien 0:013f5d54248c 1001 break;
donatien 0:013f5d54248c 1002 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 1003 default:
donatien 0:013f5d54248c 1004 st = PPPERR_PARAM;
donatien 0:013f5d54248c 1005 break;
donatien 0:013f5d54248c 1006 }
donatien 0:013f5d54248c 1007 }
donatien 0:013f5d54248c 1008
donatien 0:013f5d54248c 1009 return st;
donatien 0:013f5d54248c 1010 }
donatien 0:013f5d54248c 1011
donatien 0:013f5d54248c 1012 /*
donatien 0:013f5d54248c 1013 * Return the Maximum Transmission Unit for the given PPP connection.
donatien 0:013f5d54248c 1014 */
donatien 0:013f5d54248c 1015 u_short
donatien 0:013f5d54248c 1016 pppMTU(int pd)
donatien 0:013f5d54248c 1017 {
donatien 0:013f5d54248c 1018 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1019 u_short st;
donatien 0:013f5d54248c 1020
donatien 0:013f5d54248c 1021 /* Validate parameters. */
donatien 0:013f5d54248c 1022 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1023 st = 0;
donatien 0:013f5d54248c 1024 } else {
donatien 0:013f5d54248c 1025 st = pc->mtu;
donatien 0:013f5d54248c 1026 }
donatien 0:013f5d54248c 1027
donatien 0:013f5d54248c 1028 return st;
donatien 0:013f5d54248c 1029 }
donatien 0:013f5d54248c 1030
donatien 0:013f5d54248c 1031 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 1032 int
donatien 0:013f5d54248c 1033 pppWriteOverEthernet(int pd, const u_char *s, int n)
donatien 0:013f5d54248c 1034 {
donatien 0:013f5d54248c 1035 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1036 struct pbuf *pb;
donatien 0:013f5d54248c 1037
donatien 0:013f5d54248c 1038 /* skip address & flags */
donatien 0:013f5d54248c 1039 s += 2;
donatien 0:013f5d54248c 1040 n -= 2;
donatien 0:013f5d54248c 1041
donatien 0:013f5d54248c 1042 LWIP_ASSERT("PPPOE_HDRLEN + n <= 0xffff", PPPOE_HDRLEN + n <= 0xffff);
donatien 0:013f5d54248c 1043 pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HDRLEN + n), PBUF_RAM);
donatien 0:013f5d54248c 1044 if(!pb) {
donatien 0:013f5d54248c 1045 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 1046 LINK_STATS_INC(link.proterr);
donatien 0:013f5d54248c 1047 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 1048 return PPPERR_ALLOC;
donatien 0:013f5d54248c 1049 }
donatien 0:013f5d54248c 1050
donatien 0:013f5d54248c 1051 pbuf_header(pb, -(s16_t)PPPOE_HDRLEN);
donatien 0:013f5d54248c 1052
donatien 0:013f5d54248c 1053 pc->lastXMit = sys_jiffies();
donatien 0:013f5d54248c 1054
donatien 0:013f5d54248c 1055 MEMCPY(pb->payload, s, n);
donatien 0:013f5d54248c 1056
donatien 0:013f5d54248c 1057 if(pppoe_xmit(pc->pppoe_sc, pb) != ERR_OK) {
donatien 0:013f5d54248c 1058 LINK_STATS_INC(link.err);
donatien 0:013f5d54248c 1059 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 1060 return PPPERR_DEVICE;
donatien 0:013f5d54248c 1061 }
donatien 0:013f5d54248c 1062
donatien 0:013f5d54248c 1063 snmp_add_ifoutoctets(&pc->netif, (u16_t)n);
donatien 0:013f5d54248c 1064 snmp_inc_ifoutucastpkts(&pc->netif);
donatien 0:013f5d54248c 1065 LINK_STATS_INC(link.xmit);
donatien 0:013f5d54248c 1066 return PPPERR_NONE;
donatien 0:013f5d54248c 1067 }
donatien 0:013f5d54248c 1068 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 1069
donatien 0:013f5d54248c 1070 /*
donatien 0:013f5d54248c 1071 * Write n characters to a ppp link.
donatien 0:013f5d54248c 1072 * RETURN: >= 0 Number of characters written
donatien 0:013f5d54248c 1073 * -1 Failed to write to device
donatien 0:013f5d54248c 1074 */
donatien 0:013f5d54248c 1075 int
donatien 0:013f5d54248c 1076 pppWrite(int pd, const u_char *s, int n)
donatien 0:013f5d54248c 1077 {
donatien 0:013f5d54248c 1078 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1079 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 1080 u_char c;
donatien 0:013f5d54248c 1081 u_int fcsOut;
donatien 0:013f5d54248c 1082 struct pbuf *headMB, *tailMB;
donatien 0:013f5d54248c 1083 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 1084
donatien 0:013f5d54248c 1085 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 1086 if(pc->ethif) {
donatien 0:013f5d54248c 1087 return pppWriteOverEthernet(pd, s, n);
donatien 0:013f5d54248c 1088 }
donatien 0:013f5d54248c 1089 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 1090
donatien 0:013f5d54248c 1091 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 1092 headMB = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
donatien 0:013f5d54248c 1093 if (headMB == NULL) {
donatien 0:013f5d54248c 1094 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 1095 LINK_STATS_INC(link.proterr);
donatien 0:013f5d54248c 1096 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 1097 return PPPERR_ALLOC;
donatien 0:013f5d54248c 1098 }
donatien 0:013f5d54248c 1099
donatien 0:013f5d54248c 1100 tailMB = headMB;
donatien 0:013f5d54248c 1101
donatien 0:013f5d54248c 1102 /* If the link has been idle, we'll send a fresh flag character to
donatien 0:013f5d54248c 1103 * flush any noise. */
donatien 0:013f5d54248c 1104 if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG) {
donatien 0:013f5d54248c 1105 tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
donatien 0:013f5d54248c 1106 }
donatien 0:013f5d54248c 1107 pc->lastXMit = sys_jiffies();
donatien 0:013f5d54248c 1108
donatien 0:013f5d54248c 1109 fcsOut = PPP_INITFCS;
donatien 0:013f5d54248c 1110 /* Load output buffer. */
donatien 0:013f5d54248c 1111 while (n-- > 0) {
donatien 0:013f5d54248c 1112 c = *s++;
donatien 0:013f5d54248c 1113
donatien 0:013f5d54248c 1114 /* Update FCS before checking for special characters. */
donatien 0:013f5d54248c 1115 fcsOut = PPP_FCS(fcsOut, c);
donatien 0:013f5d54248c 1116
donatien 0:013f5d54248c 1117 /* Copy to output buffer escaping special characters. */
donatien 0:013f5d54248c 1118 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 1119 }
donatien 0:013f5d54248c 1120
donatien 0:013f5d54248c 1121 /* Add FCS and trailing flag. */
donatien 0:013f5d54248c 1122 c = ~fcsOut & 0xFF;
donatien 0:013f5d54248c 1123 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 1124 c = (~fcsOut >> 8) & 0xFF;
donatien 0:013f5d54248c 1125 tailMB = pppAppend(c, tailMB, &pc->outACCM);
donatien 0:013f5d54248c 1126 tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
donatien 0:013f5d54248c 1127
donatien 0:013f5d54248c 1128 /* If we failed to complete the packet, throw it away.
donatien 0:013f5d54248c 1129 * Otherwise send it. */
donatien 0:013f5d54248c 1130 if (!tailMB) {
donatien 0:013f5d54248c 1131 PPPDEBUG(LOG_WARNING,
donatien 0:013f5d54248c 1132 ("pppWrite[%d]: Alloc err - dropping pbuf len=%d\n", pd, headMB->len));
donatien 0:013f5d54248c 1133 /*"pppWrite[%d]: Alloc err - dropping %d:%.*H", pd, headMB->len, LWIP_MIN(headMB->len * 2, 40), headMB->payload)); */
donatien 0:013f5d54248c 1134 pbuf_free(headMB);
donatien 0:013f5d54248c 1135 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 1136 LINK_STATS_INC(link.proterr);
donatien 0:013f5d54248c 1137 snmp_inc_ifoutdiscards(&pc->netif);
donatien 0:013f5d54248c 1138 return PPPERR_ALLOC;
donatien 0:013f5d54248c 1139 }
donatien 0:013f5d54248c 1140
donatien 0:013f5d54248c 1141 PPPDEBUG(LOG_INFO, ("pppWrite[%d]: len=%d\n", pd, headMB->len));
donatien 0:013f5d54248c 1142 /* "pppWrite[%d]: %d:%.*H", pd, headMB->len, LWIP_MIN(headMB->len * 2, 40), headMB->payload)); */
donatien 0:013f5d54248c 1143 nPut(pc, headMB);
donatien 0:013f5d54248c 1144 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 1145
donatien 0:013f5d54248c 1146 return PPPERR_NONE;
donatien 0:013f5d54248c 1147 }
donatien 0:013f5d54248c 1148
donatien 0:013f5d54248c 1149 /*
donatien 0:013f5d54248c 1150 * ppp_send_config - configure the transmit characteristics of
donatien 0:013f5d54248c 1151 * the ppp interface.
donatien 0:013f5d54248c 1152 */
donatien 0:013f5d54248c 1153 void
donatien 0:013f5d54248c 1154 ppp_send_config( int unit, u16_t mtu, u32_t asyncmap, int pcomp, int accomp)
donatien 0:013f5d54248c 1155 {
donatien 0:013f5d54248c 1156 PPPControl *pc = &pppControl[unit];
donatien 0:013f5d54248c 1157 int i;
donatien 0:013f5d54248c 1158
donatien 0:013f5d54248c 1159 pc->mtu = mtu;
donatien 0:013f5d54248c 1160 pc->pcomp = pcomp;
donatien 0:013f5d54248c 1161 pc->accomp = accomp;
donatien 0:013f5d54248c 1162
donatien 0:013f5d54248c 1163 /* Load the ACCM bits for the 32 control codes. */
donatien 0:013f5d54248c 1164 for (i = 0; i < 32/8; i++) {
donatien 0:013f5d54248c 1165 pc->outACCM[i] = (u_char)((asyncmap >> (8 * i)) & 0xFF);
donatien 0:013f5d54248c 1166 }
donatien 0:013f5d54248c 1167 PPPDEBUG(LOG_INFO, ("ppp_send_config[%d]: outACCM=%X %X %X %X\n",
donatien 0:013f5d54248c 1168 unit,
donatien 0:013f5d54248c 1169 pc->outACCM[0], pc->outACCM[1], pc->outACCM[2], pc->outACCM[3]));
donatien 0:013f5d54248c 1170 }
donatien 0:013f5d54248c 1171
donatien 0:013f5d54248c 1172
donatien 0:013f5d54248c 1173 /*
donatien 0:013f5d54248c 1174 * ppp_set_xaccm - set the extended transmit ACCM for the interface.
donatien 0:013f5d54248c 1175 */
donatien 0:013f5d54248c 1176 void
donatien 0:013f5d54248c 1177 ppp_set_xaccm(int unit, ext_accm *accm)
donatien 0:013f5d54248c 1178 {
donatien 0:013f5d54248c 1179 SMEMCPY(pppControl[unit].outACCM, accm, sizeof(ext_accm));
donatien 0:013f5d54248c 1180 PPPDEBUG(LOG_INFO, ("ppp_set_xaccm[%d]: outACCM=%X %X %X %X\n",
donatien 0:013f5d54248c 1181 unit,
donatien 0:013f5d54248c 1182 pppControl[unit].outACCM[0],
donatien 0:013f5d54248c 1183 pppControl[unit].outACCM[1],
donatien 0:013f5d54248c 1184 pppControl[unit].outACCM[2],
donatien 0:013f5d54248c 1185 pppControl[unit].outACCM[3]));
donatien 0:013f5d54248c 1186 }
donatien 0:013f5d54248c 1187
donatien 0:013f5d54248c 1188
donatien 0:013f5d54248c 1189 /*
donatien 0:013f5d54248c 1190 * ppp_recv_config - configure the receive-side characteristics of
donatien 0:013f5d54248c 1191 * the ppp interface.
donatien 0:013f5d54248c 1192 */
donatien 0:013f5d54248c 1193 void
donatien 0:013f5d54248c 1194 ppp_recv_config( int unit, int mru, u32_t asyncmap, int pcomp, int accomp)
donatien 0:013f5d54248c 1195 {
donatien 0:013f5d54248c 1196 PPPControl *pc = &pppControl[unit];
donatien 0:013f5d54248c 1197 int i;
donatien 0:013f5d54248c 1198 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:013f5d54248c 1199
donatien 0:013f5d54248c 1200 LWIP_UNUSED_ARG(accomp);
donatien 0:013f5d54248c 1201 LWIP_UNUSED_ARG(pcomp);
donatien 0:013f5d54248c 1202 LWIP_UNUSED_ARG(mru);
donatien 0:013f5d54248c 1203
donatien 0:013f5d54248c 1204 /* Load the ACCM bits for the 32 control codes. */
donatien 0:013f5d54248c 1205 SYS_ARCH_PROTECT(lev);
donatien 0:013f5d54248c 1206 for (i = 0; i < 32 / 8; i++) {
donatien 0:013f5d54248c 1207 /* @todo: does this work? ext_accm has been modified from pppd! */
donatien 0:013f5d54248c 1208 pc->rx.inACCM[i] = (u_char)(asyncmap >> (i * 8));
donatien 0:013f5d54248c 1209 }
donatien 0:013f5d54248c 1210 SYS_ARCH_UNPROTECT(lev);
donatien 0:013f5d54248c 1211 PPPDEBUG(LOG_INFO, ("ppp_recv_config[%d]: inACCM=%X %X %X %X\n",
donatien 0:013f5d54248c 1212 unit,
donatien 0:013f5d54248c 1213 pc->rx.inACCM[0], pc->rx.inACCM[1], pc->rx.inACCM[2], pc->rx.inACCM[3]));
donatien 0:013f5d54248c 1214 }
donatien 0:013f5d54248c 1215
donatien 0:013f5d54248c 1216 #if 0
donatien 0:013f5d54248c 1217 /*
donatien 0:013f5d54248c 1218 * ccp_test - ask kernel whether a given compression method
donatien 0:013f5d54248c 1219 * is acceptable for use. Returns 1 if the method and parameters
donatien 0:013f5d54248c 1220 * are OK, 0 if the method is known but the parameters are not OK
donatien 0:013f5d54248c 1221 * (e.g. code size should be reduced), or -1 if the method is unknown.
donatien 0:013f5d54248c 1222 */
donatien 0:013f5d54248c 1223 int
donatien 0:013f5d54248c 1224 ccp_test( int unit, int opt_len, int for_transmit, u_char *opt_ptr)
donatien 0:013f5d54248c 1225 {
donatien 0:013f5d54248c 1226 return 0; /* XXX Currently no compression. */
donatien 0:013f5d54248c 1227 }
donatien 0:013f5d54248c 1228
donatien 0:013f5d54248c 1229 /*
donatien 0:013f5d54248c 1230 * ccp_flags_set - inform kernel about the current state of CCP.
donatien 0:013f5d54248c 1231 */
donatien 0:013f5d54248c 1232 void
donatien 0:013f5d54248c 1233 ccp_flags_set(int unit, int isopen, int isup)
donatien 0:013f5d54248c 1234 {
donatien 0:013f5d54248c 1235 /* XXX */
donatien 0:013f5d54248c 1236 }
donatien 0:013f5d54248c 1237
donatien 0:013f5d54248c 1238 /*
donatien 0:013f5d54248c 1239 * ccp_fatal_error - returns 1 if decompression was disabled as a
donatien 0:013f5d54248c 1240 * result of an error detected after decompression of a packet,
donatien 0:013f5d54248c 1241 * 0 otherwise. This is necessary because of patent nonsense.
donatien 0:013f5d54248c 1242 */
donatien 0:013f5d54248c 1243 int
donatien 0:013f5d54248c 1244 ccp_fatal_error(int unit)
donatien 0:013f5d54248c 1245 {
donatien 0:013f5d54248c 1246 /* XXX */
donatien 0:013f5d54248c 1247 return 0;
donatien 0:013f5d54248c 1248 }
donatien 0:013f5d54248c 1249 #endif
donatien 0:013f5d54248c 1250
donatien 0:013f5d54248c 1251 /*
donatien 0:013f5d54248c 1252 * get_idle_time - return how long the link has been idle.
donatien 0:013f5d54248c 1253 */
donatien 0:013f5d54248c 1254 int
donatien 0:013f5d54248c 1255 get_idle_time(int u, struct ppp_idle *ip)
donatien 0:013f5d54248c 1256 {
donatien 0:013f5d54248c 1257 /* XXX */
donatien 0:013f5d54248c 1258 LWIP_UNUSED_ARG(u);
donatien 0:013f5d54248c 1259 LWIP_UNUSED_ARG(ip);
donatien 0:013f5d54248c 1260
donatien 0:013f5d54248c 1261 return 0;
donatien 0:013f5d54248c 1262 }
donatien 0:013f5d54248c 1263
donatien 0:013f5d54248c 1264
donatien 0:013f5d54248c 1265 /*
donatien 0:013f5d54248c 1266 * Return user specified netmask, modified by any mask we might determine
donatien 0:013f5d54248c 1267 * for address `addr' (in network byte order).
donatien 0:013f5d54248c 1268 * Here we scan through the system's list of interfaces, looking for
donatien 0:013f5d54248c 1269 * any non-point-to-point interfaces which might appear to be on the same
donatien 0:013f5d54248c 1270 * network as `addr'. If we find any, we OR in their netmask to the
donatien 0:013f5d54248c 1271 * user-specified netmask.
donatien 0:013f5d54248c 1272 */
donatien 0:013f5d54248c 1273 u32_t
donatien 0:013f5d54248c 1274 GetMask(u32_t addr)
donatien 0:013f5d54248c 1275 {
donatien 0:013f5d54248c 1276 u32_t mask, nmask;
donatien 0:013f5d54248c 1277
donatien 0:013f5d54248c 1278 htonl(addr);
donatien 0:013f5d54248c 1279 if (IP_CLASSA(addr)) { /* determine network mask for address class */
donatien 0:013f5d54248c 1280 nmask = IP_CLASSA_NET;
donatien 0:013f5d54248c 1281 } else if (IP_CLASSB(addr)) {
donatien 0:013f5d54248c 1282 nmask = IP_CLASSB_NET;
donatien 0:013f5d54248c 1283 } else {
donatien 0:013f5d54248c 1284 nmask = IP_CLASSC_NET;
donatien 0:013f5d54248c 1285 }
donatien 0:013f5d54248c 1286
donatien 0:013f5d54248c 1287 /* class D nets are disallowed by bad_ip_adrs */
donatien 0:013f5d54248c 1288 mask = subnetMask | htonl(nmask);
donatien 0:013f5d54248c 1289
donatien 0:013f5d54248c 1290 /* XXX
donatien 0:013f5d54248c 1291 * Scan through the system's network interfaces.
donatien 0:013f5d54248c 1292 * Get each netmask and OR them into our mask.
donatien 0:013f5d54248c 1293 */
donatien 0:013f5d54248c 1294
donatien 0:013f5d54248c 1295 return mask;
donatien 0:013f5d54248c 1296 }
donatien 0:013f5d54248c 1297
donatien 0:013f5d54248c 1298 /*
donatien 0:013f5d54248c 1299 * sifvjcomp - config tcp header compression
donatien 0:013f5d54248c 1300 */
donatien 0:013f5d54248c 1301 int
donatien 0:013f5d54248c 1302 sifvjcomp(int pd, int vjcomp, u8_t cidcomp, u8_t maxcid)
donatien 0:013f5d54248c 1303 {
donatien 0:013f5d54248c 1304 #if PPPOS_SUPPORT && VJ_SUPPORT
donatien 0:013f5d54248c 1305 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1306
donatien 0:013f5d54248c 1307 pc->vjEnabled = vjcomp;
donatien 0:013f5d54248c 1308 pc->vjComp.compressSlot = cidcomp;
donatien 0:013f5d54248c 1309 pc->vjComp.maxSlotIndex = maxcid;
donatien 0:013f5d54248c 1310 PPPDEBUG(LOG_INFO, ("sifvjcomp: VJ compress enable=%d slot=%d max slot=%d\n",
donatien 0:013f5d54248c 1311 vjcomp, cidcomp, maxcid));
donatien 0:013f5d54248c 1312 #else /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 1313 LWIP_UNUSED_ARG(pd);
donatien 0:013f5d54248c 1314 LWIP_UNUSED_ARG(vjcomp);
donatien 0:013f5d54248c 1315 LWIP_UNUSED_ARG(cidcomp);
donatien 0:013f5d54248c 1316 LWIP_UNUSED_ARG(maxcid);
donatien 0:013f5d54248c 1317 #endif /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 1318
donatien 0:013f5d54248c 1319 return 0;
donatien 0:013f5d54248c 1320 }
donatien 0:013f5d54248c 1321
donatien 0:013f5d54248c 1322 /*
donatien 0:013f5d54248c 1323 * pppifNetifInit - netif init callback
donatien 0:013f5d54248c 1324 */
donatien 0:013f5d54248c 1325 static err_t
donatien 0:013f5d54248c 1326 pppifNetifInit(struct netif *netif)
donatien 0:013f5d54248c 1327 {
donatien 0:013f5d54248c 1328 netif->name[0] = 'p';
donatien 0:013f5d54248c 1329 netif->name[1] = 'p';
donatien 0:013f5d54248c 1330 netif->output = pppifOutput;
donatien 0:013f5d54248c 1331 netif->mtu = pppMTU((int)(size_t)netif->state);
donatien 0:013f5d54248c 1332 netif->flags = NETIF_FLAG_POINTTOPOINT | NETIF_FLAG_LINK_UP;
donatien 0:013f5d54248c 1333 #if LWIP_NETIF_HOSTNAME
donatien 0:013f5d54248c 1334 /* @todo: Initialize interface hostname */
donatien 0:013f5d54248c 1335 /* netif_set_hostname(netif, "lwip"); */
donatien 0:013f5d54248c 1336 #endif /* LWIP_NETIF_HOSTNAME */
donatien 0:013f5d54248c 1337 return ERR_OK;
donatien 0:013f5d54248c 1338 }
donatien 0:013f5d54248c 1339
donatien 0:013f5d54248c 1340
donatien 0:013f5d54248c 1341 /*
donatien 0:013f5d54248c 1342 * sifup - Config the interface up and enable IP packets to pass.
donatien 0:013f5d54248c 1343 */
donatien 0:013f5d54248c 1344 int
donatien 0:013f5d54248c 1345 sifup(int pd)
donatien 0:013f5d54248c 1346 {
donatien 0:013f5d54248c 1347 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1348 int st = 1;
donatien 0:013f5d54248c 1349
donatien 0:013f5d54248c 1350 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1351 st = 0;
donatien 0:013f5d54248c 1352 PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd));
donatien 0:013f5d54248c 1353 } else {
donatien 0:013f5d54248c 1354 netif_remove(&pc->netif);
donatien 0:013f5d54248c 1355 if (netif_add(&pc->netif, &pc->addrs.our_ipaddr, &pc->addrs.netmask,
donatien 0:013f5d54248c 1356 &pc->addrs.his_ipaddr, (void *)(size_t)pd, pppifNetifInit, ip_input)) {
donatien 0:013f5d54248c 1357 netif_set_up(&pc->netif);
donatien 0:013f5d54248c 1358 pc->if_up = 1;
donatien 0:013f5d54248c 1359 pc->errCode = PPPERR_NONE;
donatien 0:013f5d54248c 1360
donatien 0:013f5d54248c 1361 PPPDEBUG(LOG_DEBUG, ("sifup: unit %d: linkStatusCB=%p errCode=%d\n", pd, pc->linkStatusCB, pc->errCode));
donatien 0:013f5d54248c 1362 if (pc->linkStatusCB) {
donatien 0:013f5d54248c 1363 pc->linkStatusCB(pc->linkStatusCtx, pc->errCode, &pc->addrs);
donatien 0:013f5d54248c 1364 }
donatien 0:013f5d54248c 1365 } else {
donatien 0:013f5d54248c 1366 st = 0;
donatien 0:013f5d54248c 1367 PPPDEBUG(LOG_ERR, ("sifup[%d]: netif_add failed\n", pd));
donatien 0:013f5d54248c 1368 }
donatien 0:013f5d54248c 1369 }
donatien 0:013f5d54248c 1370
donatien 0:013f5d54248c 1371 return st;
donatien 0:013f5d54248c 1372 }
donatien 0:013f5d54248c 1373
donatien 0:013f5d54248c 1374 /*
donatien 0:013f5d54248c 1375 * sifnpmode - Set the mode for handling packets for a given NP.
donatien 0:013f5d54248c 1376 */
donatien 0:013f5d54248c 1377 int
donatien 0:013f5d54248c 1378 sifnpmode(int u, int proto, enum NPmode mode)
donatien 0:013f5d54248c 1379 {
donatien 0:013f5d54248c 1380 LWIP_UNUSED_ARG(u);
donatien 0:013f5d54248c 1381 LWIP_UNUSED_ARG(proto);
donatien 0:013f5d54248c 1382 LWIP_UNUSED_ARG(mode);
donatien 0:013f5d54248c 1383 return 0;
donatien 0:013f5d54248c 1384 }
donatien 0:013f5d54248c 1385
donatien 0:013f5d54248c 1386 /*
donatien 0:013f5d54248c 1387 * sifdown - Config the interface down and disable IP.
donatien 0:013f5d54248c 1388 */
donatien 0:013f5d54248c 1389 int
donatien 0:013f5d54248c 1390 sifdown(int pd)
donatien 0:013f5d54248c 1391 {
donatien 0:013f5d54248c 1392 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1393 int st = 1;
donatien 0:013f5d54248c 1394
donatien 0:013f5d54248c 1395 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1396 st = 0;
donatien 0:013f5d54248c 1397 PPPDEBUG(LOG_WARNING, ("sifdown[%d]: bad parms\n", pd));
donatien 0:013f5d54248c 1398 } else {
donatien 0:013f5d54248c 1399 pc->if_up = 0;
donatien 0:013f5d54248c 1400 /* make sure the netif status callback is called */
donatien 0:013f5d54248c 1401 netif_set_down(&pc->netif);
donatien 0:013f5d54248c 1402 netif_remove(&pc->netif);
donatien 0:013f5d54248c 1403 PPPDEBUG(LOG_DEBUG, ("sifdown: unit %d: linkStatusCB=%p errCode=%d\n", pd, pc->linkStatusCB, pc->errCode));
donatien 0:013f5d54248c 1404 if (pc->linkStatusCB) {
donatien 0:013f5d54248c 1405 pc->linkStatusCB(pc->linkStatusCtx, PPPERR_CONNECT, NULL);
donatien 0:013f5d54248c 1406 }
donatien 0:013f5d54248c 1407 }
donatien 0:013f5d54248c 1408 return st;
donatien 0:013f5d54248c 1409 }
donatien 0:013f5d54248c 1410
donatien 0:013f5d54248c 1411 /**
donatien 0:013f5d54248c 1412 * sifaddr - Config the interface IP addresses and netmask.
donatien 0:013f5d54248c 1413 * @param pd Interface unit ???
donatien 0:013f5d54248c 1414 * @param o Our IP address ???
donatien 0:013f5d54248c 1415 * @param h His IP address ???
donatien 0:013f5d54248c 1416 * @param m IP subnet mask ???
donatien 0:013f5d54248c 1417 * @param ns1 Primary DNS
donatien 0:013f5d54248c 1418 * @param ns2 Secondary DNS
donatien 0:013f5d54248c 1419 */
donatien 0:013f5d54248c 1420 int
donatien 0:013f5d54248c 1421 sifaddr( int pd, u32_t o, u32_t h, u32_t m, u32_t ns1, u32_t ns2)
donatien 0:013f5d54248c 1422 {
donatien 0:013f5d54248c 1423 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1424 int st = 1;
donatien 0:013f5d54248c 1425
donatien 0:013f5d54248c 1426 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1427 st = 0;
donatien 0:013f5d54248c 1428 PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd));
donatien 0:013f5d54248c 1429 } else {
donatien 0:013f5d54248c 1430 SMEMCPY(&pc->addrs.our_ipaddr, &o, sizeof(o));
donatien 0:013f5d54248c 1431 SMEMCPY(&pc->addrs.his_ipaddr, &h, sizeof(h));
donatien 0:013f5d54248c 1432 SMEMCPY(&pc->addrs.netmask, &m, sizeof(m));
donatien 0:013f5d54248c 1433 SMEMCPY(&pc->addrs.dns1, &ns1, sizeof(ns1));
donatien 0:013f5d54248c 1434 SMEMCPY(&pc->addrs.dns2, &ns2, sizeof(ns2));
donatien 0:013f5d54248c 1435 }
donatien 0:013f5d54248c 1436 return st;
donatien 0:013f5d54248c 1437 }
donatien 0:013f5d54248c 1438
donatien 0:013f5d54248c 1439 /**
donatien 0:013f5d54248c 1440 * cifaddr - Clear the interface IP addresses, and delete routes
donatien 0:013f5d54248c 1441 * through the interface if possible.
donatien 0:013f5d54248c 1442 * @param pd Interface unit ???
donatien 0:013f5d54248c 1443 * @param o Our IP address ???
donatien 0:013f5d54248c 1444 * @param h IP broadcast address ???
donatien 0:013f5d54248c 1445 */
donatien 0:013f5d54248c 1446 int
donatien 0:013f5d54248c 1447 cifaddr( int pd, u32_t o, u32_t h)
donatien 0:013f5d54248c 1448 {
donatien 0:013f5d54248c 1449 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1450 int st = 1;
donatien 0:013f5d54248c 1451
donatien 0:013f5d54248c 1452 LWIP_UNUSED_ARG(o);
donatien 0:013f5d54248c 1453 LWIP_UNUSED_ARG(h);
donatien 0:013f5d54248c 1454 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1455 st = 0;
donatien 0:013f5d54248c 1456 PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd));
donatien 0:013f5d54248c 1457 } else {
donatien 0:013f5d54248c 1458 IP4_ADDR(&pc->addrs.our_ipaddr, 0,0,0,0);
donatien 0:013f5d54248c 1459 IP4_ADDR(&pc->addrs.his_ipaddr, 0,0,0,0);
donatien 0:013f5d54248c 1460 IP4_ADDR(&pc->addrs.netmask, 255,255,255,0);
donatien 0:013f5d54248c 1461 IP4_ADDR(&pc->addrs.dns1, 0,0,0,0);
donatien 0:013f5d54248c 1462 IP4_ADDR(&pc->addrs.dns2, 0,0,0,0);
donatien 0:013f5d54248c 1463 }
donatien 0:013f5d54248c 1464 return st;
donatien 0:013f5d54248c 1465 }
donatien 0:013f5d54248c 1466
donatien 0:013f5d54248c 1467 /*
donatien 0:013f5d54248c 1468 * sifdefaultroute - assign a default route through the address given.
donatien 0:013f5d54248c 1469 */
donatien 0:013f5d54248c 1470 int
donatien 0:013f5d54248c 1471 sifdefaultroute(int pd, u32_t l, u32_t g)
donatien 0:013f5d54248c 1472 {
donatien 0:013f5d54248c 1473 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1474 int st = 1;
donatien 0:013f5d54248c 1475
donatien 0:013f5d54248c 1476 LWIP_UNUSED_ARG(l);
donatien 0:013f5d54248c 1477 LWIP_UNUSED_ARG(g);
donatien 0:013f5d54248c 1478
donatien 0:013f5d54248c 1479 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1480 st = 0;
donatien 0:013f5d54248c 1481 PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd));
donatien 0:013f5d54248c 1482 } else {
donatien 0:013f5d54248c 1483 netif_set_default(&pc->netif);
donatien 0:013f5d54248c 1484 }
donatien 0:013f5d54248c 1485
donatien 0:013f5d54248c 1486 /* TODO: check how PPP handled the netMask, previously not set by ipSetDefault */
donatien 0:013f5d54248c 1487
donatien 0:013f5d54248c 1488 return st;
donatien 0:013f5d54248c 1489 }
donatien 0:013f5d54248c 1490
donatien 0:013f5d54248c 1491 /*
donatien 0:013f5d54248c 1492 * cifdefaultroute - delete a default route through the address given.
donatien 0:013f5d54248c 1493 */
donatien 0:013f5d54248c 1494 int
donatien 0:013f5d54248c 1495 cifdefaultroute(int pd, u32_t l, u32_t g)
donatien 0:013f5d54248c 1496 {
donatien 0:013f5d54248c 1497 PPPControl *pc = &pppControl[pd];
donatien 0:013f5d54248c 1498 int st = 1;
donatien 0:013f5d54248c 1499
donatien 0:013f5d54248c 1500 LWIP_UNUSED_ARG(l);
donatien 0:013f5d54248c 1501 LWIP_UNUSED_ARG(g);
donatien 0:013f5d54248c 1502
donatien 0:013f5d54248c 1503 if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
donatien 0:013f5d54248c 1504 st = 0;
donatien 0:013f5d54248c 1505 PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd));
donatien 0:013f5d54248c 1506 } else {
donatien 0:013f5d54248c 1507 netif_set_default(NULL);
donatien 0:013f5d54248c 1508 }
donatien 0:013f5d54248c 1509
donatien 0:013f5d54248c 1510 return st;
donatien 0:013f5d54248c 1511 }
donatien 0:013f5d54248c 1512
donatien 0:013f5d54248c 1513 /**********************************/
donatien 0:013f5d54248c 1514 /*** LOCAL FUNCTION DEFINITIONS ***/
donatien 0:013f5d54248c 1515 /**********************************/
donatien 0:013f5d54248c 1516
donatien 0:013f5d54248c 1517 #if PPPOS_SUPPORT && PPP_INPROC_OWNTHREAD
donatien 0:013f5d54248c 1518 /* The main PPP process function. This implements the state machine according
donatien 0:013f5d54248c 1519 * to section 4 of RFC 1661: The Point-To-Point Protocol. */
donatien 0:013f5d54248c 1520 static void
donatien 0:013f5d54248c 1521 pppInputThread(void *arg)
donatien 0:013f5d54248c 1522 {
donatien 0:013f5d54248c 1523 int count;
donatien 0:013f5d54248c 1524 PPPControlRx *pcrx = arg;
donatien 0:013f5d54248c 1525
donatien 0:013f5d54248c 1526 #if !__LWIP_ORIG
donatien 0:013f5d54248c 1527 do
donatien 0:013f5d54248c 1528 {
donatien 0:013f5d54248c 1529 sys_arch_mbox_fetch(&pppMbox, (void**)&pcrx, 0); //Wait indefinitely
donatien 0:013f5d54248c 1530 #endif
donatien 0:013f5d54248c 1531
donatien 0:013f5d54248c 1532 while (lcp_phase[pcrx->pd] != PHASE_DEAD) {
donatien 0:013f5d54248c 1533 count = sio_read(pcrx->fd, pcrx->rxbuf, PPPOS_RX_BUFSIZE);
donatien 0:013f5d54248c 1534 if(count > 0) {
donatien 0:013f5d54248c 1535 pppInProc(pcrx, pcrx->rxbuf, count);
donatien 0:013f5d54248c 1536 } else {
donatien 0:013f5d54248c 1537 /* nothing received, give other tasks a chance to run */
donatien 0:013f5d54248c 1538 sys_msleep(1);
donatien 0:013f5d54248c 1539 }
donatien 0:013f5d54248c 1540 }
donatien 0:013f5d54248c 1541 #if !__LWIP_ORIG
donatien 0:013f5d54248c 1542 } while(1); //Never terminates
donatien 0:013f5d54248c 1543 #endif
donatien 0:013f5d54248c 1544 }
donatien 0:013f5d54248c 1545 #endif /* PPPOS_SUPPORT && PPP_INPROC_OWNTHREAD */
donatien 0:013f5d54248c 1546
donatien 0:013f5d54248c 1547 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 1548
donatien 0:013f5d54248c 1549 void
donatien 0:013f5d54248c 1550 pppOverEthernetInitFailed(int pd)
donatien 0:013f5d54248c 1551 {
donatien 0:013f5d54248c 1552 PPPControl* pc;
donatien 0:013f5d54248c 1553
donatien 0:013f5d54248c 1554 pppHup(pd);
donatien 0:013f5d54248c 1555 pppStop(pd);
donatien 0:013f5d54248c 1556
donatien 0:013f5d54248c 1557 pc = &pppControl[pd];
donatien 0:013f5d54248c 1558 pppoe_destroy(&pc->netif);
donatien 0:013f5d54248c 1559 pc->openFlag = 0;
donatien 0:013f5d54248c 1560
donatien 0:013f5d54248c 1561 if(pc->linkStatusCB) {
donatien 0:013f5d54248c 1562 pc->linkStatusCB(pc->linkStatusCtx, pc->errCode ? pc->errCode : PPPERR_PROTOCOL, NULL);
donatien 0:013f5d54248c 1563 }
donatien 0:013f5d54248c 1564 }
donatien 0:013f5d54248c 1565
donatien 0:013f5d54248c 1566 static void
donatien 0:013f5d54248c 1567 pppOverEthernetLinkStatusCB(int pd, int up)
donatien 0:013f5d54248c 1568 {
donatien 0:013f5d54248c 1569 if(up) {
donatien 0:013f5d54248c 1570 PPPDEBUG(LOG_INFO, ("pppOverEthernetLinkStatusCB: unit %d: Connecting\n", pd));
donatien 0:013f5d54248c 1571 pppStart(pd);
donatien 0:013f5d54248c 1572 } else {
donatien 0:013f5d54248c 1573 pppOverEthernetInitFailed(pd);
donatien 0:013f5d54248c 1574 }
donatien 0:013f5d54248c 1575 }
donatien 0:013f5d54248c 1576 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 1577
donatien 0:013f5d54248c 1578 struct pbuf *
donatien 0:013f5d54248c 1579 pppSingleBuf(struct pbuf *p)
donatien 0:013f5d54248c 1580 {
donatien 0:013f5d54248c 1581 struct pbuf *q, *b;
donatien 0:013f5d54248c 1582 u_char *pl;
donatien 0:013f5d54248c 1583
donatien 0:013f5d54248c 1584 if(p->tot_len == p->len) {
donatien 0:013f5d54248c 1585 return p;
donatien 0:013f5d54248c 1586 }
donatien 0:013f5d54248c 1587
donatien 0:013f5d54248c 1588 q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
donatien 0:013f5d54248c 1589 if(!q) {
donatien 0:013f5d54248c 1590 PPPDEBUG(LOG_ERR,
donatien 0:013f5d54248c 1591 ("pppSingleBuf: unable to alloc new buf (%d)\n", p->tot_len));
donatien 0:013f5d54248c 1592 return p; /* live dangerously */
donatien 0:013f5d54248c 1593 }
donatien 0:013f5d54248c 1594
donatien 0:013f5d54248c 1595 for(b = p, pl = q->payload; b != NULL; b = b->next) {
donatien 0:013f5d54248c 1596 MEMCPY(pl, b->payload, b->len);
donatien 0:013f5d54248c 1597 pl += b->len;
donatien 0:013f5d54248c 1598 }
donatien 0:013f5d54248c 1599
donatien 0:013f5d54248c 1600 pbuf_free(p);
donatien 0:013f5d54248c 1601
donatien 0:013f5d54248c 1602 return q;
donatien 0:013f5d54248c 1603 }
donatien 0:013f5d54248c 1604
donatien 0:013f5d54248c 1605 struct pppInputHeader {
donatien 0:013f5d54248c 1606 int unit;
donatien 0:013f5d54248c 1607 u16_t proto;
donatien 0:013f5d54248c 1608 };
donatien 0:013f5d54248c 1609
donatien 0:013f5d54248c 1610 /*
donatien 0:013f5d54248c 1611 * Pass the processed input packet to the appropriate handler.
donatien 0:013f5d54248c 1612 * This function and all handlers run in the context of the tcpip_thread
donatien 0:013f5d54248c 1613 */
donatien 0:013f5d54248c 1614 static void
donatien 0:013f5d54248c 1615 pppInput(void *arg)
donatien 0:013f5d54248c 1616 {
donatien 0:013f5d54248c 1617 struct pbuf *nb = (struct pbuf *)arg;
donatien 0:013f5d54248c 1618 u16_t protocol;
donatien 0:013f5d54248c 1619 int pd;
donatien 0:013f5d54248c 1620
donatien 0:013f5d54248c 1621 pd = ((struct pppInputHeader *)nb->payload)->unit;
donatien 0:013f5d54248c 1622 protocol = ((struct pppInputHeader *)nb->payload)->proto;
donatien 0:013f5d54248c 1623
donatien 0:013f5d54248c 1624 if(pbuf_header(nb, -(int)sizeof(struct pppInputHeader))) {
donatien 0:013f5d54248c 1625 LWIP_ASSERT("pbuf_header failed\n", 0);
donatien 0:013f5d54248c 1626 goto drop;
donatien 0:013f5d54248c 1627 }
donatien 0:013f5d54248c 1628
donatien 0:013f5d54248c 1629 LINK_STATS_INC(link.recv);
donatien 0:013f5d54248c 1630 snmp_inc_ifinucastpkts(&pppControl[pd].netif);
donatien 0:013f5d54248c 1631 snmp_add_ifinoctets(&pppControl[pd].netif, nb->tot_len);
donatien 0:013f5d54248c 1632
donatien 0:013f5d54248c 1633 /*
donatien 0:013f5d54248c 1634 * Toss all non-LCP packets unless LCP is OPEN.
donatien 0:013f5d54248c 1635 * Until we get past the authentication phase, toss all packets
donatien 0:013f5d54248c 1636 * except LCP, LQR and authentication packets.
donatien 0:013f5d54248c 1637 */
donatien 0:013f5d54248c 1638 if((lcp_phase[pd] <= PHASE_AUTHENTICATE) && (protocol != PPP_LCP)) {
donatien 0:013f5d54248c 1639 if(!((protocol == PPP_LQR) || (protocol == PPP_PAP) || (protocol == PPP_CHAP)) ||
donatien 0:013f5d54248c 1640 (lcp_phase[pd] != PHASE_AUTHENTICATE)) {
donatien 0:013f5d54248c 1641 PPPDEBUG(LOG_INFO, ("pppInput: discarding proto 0x%"X16_F" in phase %d\n", protocol, lcp_phase[pd]));
donatien 0:013f5d54248c 1642 goto drop;
donatien 0:013f5d54248c 1643 }
donatien 0:013f5d54248c 1644 }
donatien 0:013f5d54248c 1645
donatien 0:013f5d54248c 1646 switch(protocol) {
donatien 0:013f5d54248c 1647 case PPP_VJC_COMP: /* VJ compressed TCP */
donatien 0:013f5d54248c 1648 #if PPPOS_SUPPORT && VJ_SUPPORT
donatien 0:013f5d54248c 1649 PPPDEBUG(LOG_INFO, ("pppInput[%d]: vj_comp in pbuf len=%d\n", pd, nb->len));
donatien 0:013f5d54248c 1650 /*
donatien 0:013f5d54248c 1651 * Clip off the VJ header and prepend the rebuilt TCP/IP header and
donatien 0:013f5d54248c 1652 * pass the result to IP.
donatien 0:013f5d54248c 1653 */
donatien 0:013f5d54248c 1654 if ((vj_uncompress_tcp(&nb, &pppControl[pd].vjComp) >= 0) && (pppControl[pd].netif.input)) {
donatien 0:013f5d54248c 1655 pppControl[pd].netif.input(nb, &pppControl[pd].netif);
donatien 0:013f5d54248c 1656 return;
donatien 0:013f5d54248c 1657 }
donatien 0:013f5d54248c 1658 /* Something's wrong so drop it. */
donatien 0:013f5d54248c 1659 PPPDEBUG(LOG_WARNING, ("pppInput[%d]: Dropping VJ compressed\n", pd));
donatien 0:013f5d54248c 1660 #else /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 1661 /* No handler for this protocol so drop the packet. */
donatien 0:013f5d54248c 1662 PPPDEBUG(LOG_INFO, ("pppInput[%d]: drop VJ Comp in %d:%s\n", pd, nb->len, nb->payload));
donatien 0:013f5d54248c 1663 #endif /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 1664 break;
donatien 0:013f5d54248c 1665
donatien 0:013f5d54248c 1666 case PPP_VJC_UNCOMP: /* VJ uncompressed TCP */
donatien 0:013f5d54248c 1667 #if PPPOS_SUPPORT && VJ_SUPPORT
donatien 0:013f5d54248c 1668 PPPDEBUG(LOG_INFO, ("pppInput[%d]: vj_un in pbuf len=%d\n", pd, nb->len));
donatien 0:013f5d54248c 1669 /*
donatien 0:013f5d54248c 1670 * Process the TCP/IP header for VJ header compression and then pass
donatien 0:013f5d54248c 1671 * the packet to IP.
donatien 0:013f5d54248c 1672 */
donatien 0:013f5d54248c 1673 if ((vj_uncompress_uncomp(nb, &pppControl[pd].vjComp) >= 0) && pppControl[pd].netif.input) {
donatien 0:013f5d54248c 1674 pppControl[pd].netif.input(nb, &pppControl[pd].netif);
donatien 0:013f5d54248c 1675 return;
donatien 0:013f5d54248c 1676 }
donatien 0:013f5d54248c 1677 /* Something's wrong so drop it. */
donatien 0:013f5d54248c 1678 PPPDEBUG(LOG_WARNING, ("pppInput[%d]: Dropping VJ uncompressed\n", pd));
donatien 0:013f5d54248c 1679 #else /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 1680 /* No handler for this protocol so drop the packet. */
donatien 0:013f5d54248c 1681 PPPDEBUG(LOG_INFO,
donatien 0:013f5d54248c 1682 ("pppInput[%d]: drop VJ UnComp in %d:.*H\n",
donatien 0:013f5d54248c 1683 pd, nb->len, LWIP_MIN(nb->len * 2, 40), nb->payload));
donatien 0:013f5d54248c 1684 #endif /* PPPOS_SUPPORT && VJ_SUPPORT */
donatien 0:013f5d54248c 1685 break;
donatien 0:013f5d54248c 1686
donatien 0:013f5d54248c 1687 case PPP_IP: /* Internet Protocol */
donatien 0:013f5d54248c 1688 PPPDEBUG(LOG_INFO, ("pppInput[%d]: ip in pbuf len=%d\n", pd, nb->len));
donatien 0:013f5d54248c 1689 if (pppControl[pd].netif.input) {
donatien 0:013f5d54248c 1690 pppControl[pd].netif.input(nb, &pppControl[pd].netif);
donatien 0:013f5d54248c 1691 return;
donatien 0:013f5d54248c 1692 }
donatien 0:013f5d54248c 1693 break;
donatien 0:013f5d54248c 1694
donatien 0:013f5d54248c 1695 default: {
donatien 0:013f5d54248c 1696 struct protent *protp;
donatien 0:013f5d54248c 1697 int i;
donatien 0:013f5d54248c 1698
donatien 0:013f5d54248c 1699 /*
donatien 0:013f5d54248c 1700 * Upcall the proper protocol input routine.
donatien 0:013f5d54248c 1701 */
donatien 0:013f5d54248c 1702 for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) {
donatien 0:013f5d54248c 1703 if (protp->protocol == protocol && protp->enabled_flag) {
donatien 0:013f5d54248c 1704 PPPDEBUG(LOG_INFO, ("pppInput[%d]: %s len=%d\n", pd, protp->name, nb->len));
donatien 0:013f5d54248c 1705 nb = pppSingleBuf(nb);
donatien 0:013f5d54248c 1706 (*protp->input)(pd, nb->payload, nb->len);
donatien 0:013f5d54248c 1707 PPPDEBUG(LOG_DETAIL, ("pppInput[%d]: packet processed\n", pd));
donatien 0:013f5d54248c 1708 goto out;
donatien 0:013f5d54248c 1709 }
donatien 0:013f5d54248c 1710 }
donatien 0:013f5d54248c 1711
donatien 0:013f5d54248c 1712 /* No handler for this protocol so reject the packet. */
donatien 0:013f5d54248c 1713 PPPDEBUG(LOG_INFO, ("pppInput[%d]: rejecting unsupported proto 0x%"X16_F" len=%d\n", pd, protocol, nb->len));
donatien 0:013f5d54248c 1714 if (pbuf_header(nb, sizeof(protocol))) {
donatien 0:013f5d54248c 1715 LWIP_ASSERT("pbuf_header failed\n", 0);
donatien 0:013f5d54248c 1716 goto drop;
donatien 0:013f5d54248c 1717 }
donatien 0:013f5d54248c 1718 #if BYTE_ORDER == LITTLE_ENDIAN
donatien 0:013f5d54248c 1719 protocol = htons(protocol);
donatien 0:013f5d54248c 1720 #endif /* BYTE_ORDER == LITTLE_ENDIAN */
donatien 0:013f5d54248c 1721 SMEMCPY(nb->payload, &protocol, sizeof(protocol));
donatien 0:013f5d54248c 1722 lcp_sprotrej(pd, nb->payload, nb->len);
donatien 0:013f5d54248c 1723 }
donatien 0:013f5d54248c 1724 break;
donatien 0:013f5d54248c 1725 }
donatien 0:013f5d54248c 1726
donatien 0:013f5d54248c 1727 drop:
donatien 0:013f5d54248c 1728 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 1729 snmp_inc_ifindiscards(&pppControl[pd].netif);
donatien 0:013f5d54248c 1730
donatien 0:013f5d54248c 1731 out:
donatien 0:013f5d54248c 1732 pbuf_free(nb);
donatien 0:013f5d54248c 1733 return;
donatien 0:013f5d54248c 1734 }
donatien 0:013f5d54248c 1735
donatien 0:013f5d54248c 1736 #if PPPOS_SUPPORT
donatien 0:013f5d54248c 1737 /*
donatien 0:013f5d54248c 1738 * Drop the input packet.
donatien 0:013f5d54248c 1739 */
donatien 0:013f5d54248c 1740 static void
donatien 0:013f5d54248c 1741 pppDrop(PPPControlRx *pcrx)
donatien 0:013f5d54248c 1742 {
donatien 0:013f5d54248c 1743 if (pcrx->inHead != NULL) {
donatien 0:013f5d54248c 1744 #if 0
donatien 0:013f5d54248c 1745 PPPDEBUG(LOG_INFO, ("pppDrop: %d:%.*H\n", pcrx->inHead->len, min(60, pcrx->inHead->len * 2), pcrx->inHead->payload));
donatien 0:013f5d54248c 1746 #endif
donatien 0:013f5d54248c 1747 PPPDEBUG(LOG_INFO, ("pppDrop: pbuf len=%d, addr %p\n", pcrx->inHead->len, (void*)pcrx->inHead));
donatien 0:013f5d54248c 1748 if (pcrx->inTail && (pcrx->inTail != pcrx->inHead)) {
donatien 0:013f5d54248c 1749 pbuf_free(pcrx->inTail);
donatien 0:013f5d54248c 1750 }
donatien 0:013f5d54248c 1751 pbuf_free(pcrx->inHead);
donatien 0:013f5d54248c 1752 pcrx->inHead = NULL;
donatien 0:013f5d54248c 1753 pcrx->inTail = NULL;
donatien 0:013f5d54248c 1754 }
donatien 0:013f5d54248c 1755 #if VJ_SUPPORT
donatien 0:013f5d54248c 1756 vj_uncompress_err(&pppControl[pcrx->pd].vjComp);
donatien 0:013f5d54248c 1757 #endif /* VJ_SUPPORT */
donatien 0:013f5d54248c 1758
donatien 0:013f5d54248c 1759 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 1760 snmp_inc_ifindiscards(&pppControl[pcrx->pd].netif);
donatien 0:013f5d54248c 1761 }
donatien 0:013f5d54248c 1762
donatien 0:013f5d54248c 1763 /** Pass received raw characters to PPPoS to be decoded. This function is
donatien 0:013f5d54248c 1764 * thread-safe and can be called from a dedicated RX-thread or from a main-loop.
donatien 0:013f5d54248c 1765 *
donatien 0:013f5d54248c 1766 * @param pd PPP descriptor index, returned by pppOpen()
donatien 0:013f5d54248c 1767 * @param data received data
donatien 0:013f5d54248c 1768 * @param len length of received data
donatien 0:013f5d54248c 1769 */
donatien 0:013f5d54248c 1770 void
donatien 0:013f5d54248c 1771 pppos_input(int pd, u_char* data, int len)
donatien 0:013f5d54248c 1772 {
donatien 0:013f5d54248c 1773 pppInProc(&pppControl[pd].rx, data, len);
donatien 0:013f5d54248c 1774 }
donatien 0:013f5d54248c 1775
donatien 0:013f5d54248c 1776 /**
donatien 0:013f5d54248c 1777 * Process a received octet string.
donatien 0:013f5d54248c 1778 */
donatien 0:013f5d54248c 1779 static void
donatien 0:013f5d54248c 1780 pppInProc(PPPControlRx *pcrx, u_char *s, int l)
donatien 0:013f5d54248c 1781 {
donatien 0:013f5d54248c 1782 struct pbuf *nextNBuf;
donatien 0:013f5d54248c 1783 u_char curChar;
donatien 0:013f5d54248c 1784 u_char escaped;
donatien 0:013f5d54248c 1785 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:013f5d54248c 1786
donatien 0:013f5d54248c 1787 PPPDEBUG(LOG_DEBUG, ("pppInProc[%d]: got %d bytes\n", pcrx->pd, l));
donatien 0:013f5d54248c 1788 while (l-- > 0) {
donatien 0:013f5d54248c 1789 curChar = *s++;
donatien 0:013f5d54248c 1790
donatien 0:013f5d54248c 1791 SYS_ARCH_PROTECT(lev);
donatien 0:013f5d54248c 1792 escaped = ESCAPE_P(pcrx->inACCM, curChar);
donatien 0:013f5d54248c 1793 SYS_ARCH_UNPROTECT(lev);
donatien 0:013f5d54248c 1794 /* Handle special characters. */
donatien 0:013f5d54248c 1795 if (escaped) {
donatien 0:013f5d54248c 1796 /* Check for escape sequences. */
donatien 0:013f5d54248c 1797 /* XXX Note that this does not handle an escaped 0x5d character which
donatien 0:013f5d54248c 1798 * would appear as an escape character. Since this is an ASCII ']'
donatien 0:013f5d54248c 1799 * and there is no reason that I know of to escape it, I won't complicate
donatien 0:013f5d54248c 1800 * the code to handle this case. GLL */
donatien 0:013f5d54248c 1801 if (curChar == PPP_ESCAPE) {
donatien 0:013f5d54248c 1802 pcrx->inEscaped = 1;
donatien 0:013f5d54248c 1803 /* Check for the flag character. */
donatien 0:013f5d54248c 1804 } else if (curChar == PPP_FLAG) {
donatien 0:013f5d54248c 1805 /* If this is just an extra flag character, ignore it. */
donatien 0:013f5d54248c 1806 if (pcrx->inState <= PDADDRESS) {
donatien 0:013f5d54248c 1807 /* ignore it */;
donatien 0:013f5d54248c 1808 /* If we haven't received the packet header, drop what has come in. */
donatien 0:013f5d54248c 1809 } else if (pcrx->inState < PDDATA) {
donatien 0:013f5d54248c 1810 PPPDEBUG(LOG_WARNING,
donatien 0:013f5d54248c 1811 ("pppInProc[%d]: Dropping incomplete packet %d\n",
donatien 0:013f5d54248c 1812 pcrx->pd, pcrx->inState));
donatien 0:013f5d54248c 1813 LINK_STATS_INC(link.lenerr);
donatien 0:013f5d54248c 1814 pppDrop(pcrx);
donatien 0:013f5d54248c 1815 /* If the fcs is invalid, drop the packet. */
donatien 0:013f5d54248c 1816 } else if (pcrx->inFCS != PPP_GOODFCS) {
donatien 0:013f5d54248c 1817 PPPDEBUG(LOG_INFO,
donatien 0:013f5d54248c 1818 ("pppInProc[%d]: Dropping bad fcs 0x%"X16_F" proto=0x%"X16_F"\n",
donatien 0:013f5d54248c 1819 pcrx->pd, pcrx->inFCS, pcrx->inProtocol));
donatien 0:013f5d54248c 1820 /* Note: If you get lots of these, check for UART frame errors or try different baud rate */
donatien 0:013f5d54248c 1821 LINK_STATS_INC(link.chkerr);
donatien 0:013f5d54248c 1822 pppDrop(pcrx);
donatien 0:013f5d54248c 1823 /* Otherwise it's a good packet so pass it on. */
donatien 0:013f5d54248c 1824 } else {
donatien 0:013f5d54248c 1825 struct pbuf *inp;
donatien 0:013f5d54248c 1826 /* Trim off the checksum. */
donatien 0:013f5d54248c 1827 if(pcrx->inTail->len >= 2) {
donatien 0:013f5d54248c 1828 pcrx->inTail->len -= 2;
donatien 0:013f5d54248c 1829
donatien 0:013f5d54248c 1830 pcrx->inTail->tot_len = pcrx->inTail->len;
donatien 0:013f5d54248c 1831 if (pcrx->inTail != pcrx->inHead) {
donatien 0:013f5d54248c 1832 pbuf_cat(pcrx->inHead, pcrx->inTail);
donatien 0:013f5d54248c 1833 }
donatien 0:013f5d54248c 1834 } else {
donatien 0:013f5d54248c 1835 pcrx->inTail->tot_len = pcrx->inTail->len;
donatien 0:013f5d54248c 1836 if (pcrx->inTail != pcrx->inHead) {
donatien 0:013f5d54248c 1837 pbuf_cat(pcrx->inHead, pcrx->inTail);
donatien 0:013f5d54248c 1838 }
donatien 0:013f5d54248c 1839
donatien 0:013f5d54248c 1840 pbuf_realloc(pcrx->inHead, pcrx->inHead->tot_len - 2);
donatien 0:013f5d54248c 1841 }
donatien 0:013f5d54248c 1842
donatien 0:013f5d54248c 1843 /* Dispatch the packet thereby consuming it. */
donatien 0:013f5d54248c 1844 inp = pcrx->inHead;
donatien 0:013f5d54248c 1845 /* Packet consumed, release our references. */
donatien 0:013f5d54248c 1846 pcrx->inHead = NULL;
donatien 0:013f5d54248c 1847 pcrx->inTail = NULL;
donatien 0:013f5d54248c 1848 #if PPP_INPROC_MULTITHREADED
donatien 0:013f5d54248c 1849 if(tcpip_callback_with_block(pppInput, inp, 0) != ERR_OK) {
donatien 0:013f5d54248c 1850 PPPDEBUG(LOG_ERR, ("pppInProc[%d]: tcpip_callback() failed, dropping packet\n", pcrx->pd));
donatien 0:013f5d54248c 1851 pbuf_free(inp);
donatien 0:013f5d54248c 1852 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 1853 snmp_inc_ifindiscards(&pppControl[pcrx->pd].netif);
donatien 0:013f5d54248c 1854 }
donatien 0:013f5d54248c 1855 #else /* PPP_INPROC_MULTITHREADED */
donatien 0:013f5d54248c 1856 pppInput(inp);
donatien 0:013f5d54248c 1857 #endif /* PPP_INPROC_MULTITHREADED */
donatien 0:013f5d54248c 1858 }
donatien 0:013f5d54248c 1859
donatien 0:013f5d54248c 1860 /* Prepare for a new packet. */
donatien 0:013f5d54248c 1861 pcrx->inFCS = PPP_INITFCS;
donatien 0:013f5d54248c 1862 pcrx->inState = PDADDRESS;
donatien 0:013f5d54248c 1863 pcrx->inEscaped = 0;
donatien 0:013f5d54248c 1864 /* Other characters are usually control characters that may have
donatien 0:013f5d54248c 1865 * been inserted by the physical layer so here we just drop them. */
donatien 0:013f5d54248c 1866 } else {
donatien 0:013f5d54248c 1867 PPPDEBUG(LOG_WARNING,
donatien 0:013f5d54248c 1868 ("pppInProc[%d]: Dropping ACCM char <%d>\n", pcrx->pd, curChar));
donatien 0:013f5d54248c 1869 }
donatien 0:013f5d54248c 1870 /* Process other characters. */
donatien 0:013f5d54248c 1871 } else {
donatien 0:013f5d54248c 1872 /* Unencode escaped characters. */
donatien 0:013f5d54248c 1873 if (pcrx->inEscaped) {
donatien 0:013f5d54248c 1874 pcrx->inEscaped = 0;
donatien 0:013f5d54248c 1875 curChar ^= PPP_TRANS;
donatien 0:013f5d54248c 1876 }
donatien 0:013f5d54248c 1877
donatien 0:013f5d54248c 1878 /* Process character relative to current state. */
donatien 0:013f5d54248c 1879 switch(pcrx->inState) {
donatien 0:013f5d54248c 1880 case PDIDLE: /* Idle state - waiting. */
donatien 0:013f5d54248c 1881 /* Drop the character if it's not 0xff
donatien 0:013f5d54248c 1882 * we would have processed a flag character above. */
donatien 0:013f5d54248c 1883 if (curChar != PPP_ALLSTATIONS) {
donatien 0:013f5d54248c 1884 break;
donatien 0:013f5d54248c 1885 }
donatien 0:013f5d54248c 1886
donatien 0:013f5d54248c 1887 /* Fall through */
donatien 0:013f5d54248c 1888 case PDSTART: /* Process start flag. */
donatien 0:013f5d54248c 1889 /* Prepare for a new packet. */
donatien 0:013f5d54248c 1890 pcrx->inFCS = PPP_INITFCS;
donatien 0:013f5d54248c 1891
donatien 0:013f5d54248c 1892 /* Fall through */
donatien 0:013f5d54248c 1893 case PDADDRESS: /* Process address field. */
donatien 0:013f5d54248c 1894 if (curChar == PPP_ALLSTATIONS) {
donatien 0:013f5d54248c 1895 pcrx->inState = PDCONTROL;
donatien 0:013f5d54248c 1896 break;
donatien 0:013f5d54248c 1897 }
donatien 0:013f5d54248c 1898 /* Else assume compressed address and control fields so
donatien 0:013f5d54248c 1899 * fall through to get the protocol... */
donatien 0:013f5d54248c 1900 case PDCONTROL: /* Process control field. */
donatien 0:013f5d54248c 1901 /* If we don't get a valid control code, restart. */
donatien 0:013f5d54248c 1902 if (curChar == PPP_UI) {
donatien 0:013f5d54248c 1903 pcrx->inState = PDPROTOCOL1;
donatien 0:013f5d54248c 1904 break;
donatien 0:013f5d54248c 1905 }
donatien 0:013f5d54248c 1906 #if 0
donatien 0:013f5d54248c 1907 else {
donatien 0:013f5d54248c 1908 PPPDEBUG(LOG_WARNING,
donatien 0:013f5d54248c 1909 ("pppInProc[%d]: Invalid control <%d>\n", pcrx->pd, curChar));
donatien 0:013f5d54248c 1910 pcrx->inState = PDSTART;
donatien 0:013f5d54248c 1911 }
donatien 0:013f5d54248c 1912 #endif
donatien 0:013f5d54248c 1913 case PDPROTOCOL1: /* Process protocol field 1. */
donatien 0:013f5d54248c 1914 /* If the lower bit is set, this is the end of the protocol
donatien 0:013f5d54248c 1915 * field. */
donatien 0:013f5d54248c 1916 if (curChar & 1) {
donatien 0:013f5d54248c 1917 pcrx->inProtocol = curChar;
donatien 0:013f5d54248c 1918 pcrx->inState = PDDATA;
donatien 0:013f5d54248c 1919 } else {
donatien 0:013f5d54248c 1920 pcrx->inProtocol = (u_int)curChar << 8;
donatien 0:013f5d54248c 1921 pcrx->inState = PDPROTOCOL2;
donatien 0:013f5d54248c 1922 }
donatien 0:013f5d54248c 1923 break;
donatien 0:013f5d54248c 1924 case PDPROTOCOL2: /* Process protocol field 2. */
donatien 0:013f5d54248c 1925 pcrx->inProtocol |= curChar;
donatien 0:013f5d54248c 1926 pcrx->inState = PDDATA;
donatien 0:013f5d54248c 1927 break;
donatien 0:013f5d54248c 1928 case PDDATA: /* Process data byte. */
donatien 0:013f5d54248c 1929 /* Make space to receive processed data. */
donatien 0:013f5d54248c 1930 if (pcrx->inTail == NULL || pcrx->inTail->len == PBUF_POOL_BUFSIZE) {
donatien 0:013f5d54248c 1931 if (pcrx->inTail != NULL) {
donatien 0:013f5d54248c 1932 pcrx->inTail->tot_len = pcrx->inTail->len;
donatien 0:013f5d54248c 1933 if (pcrx->inTail != pcrx->inHead) {
donatien 0:013f5d54248c 1934 pbuf_cat(pcrx->inHead, pcrx->inTail);
donatien 0:013f5d54248c 1935 /* give up the inTail reference now */
donatien 0:013f5d54248c 1936 pcrx->inTail = NULL;
donatien 0:013f5d54248c 1937 }
donatien 0:013f5d54248c 1938 }
donatien 0:013f5d54248c 1939 /* If we haven't started a packet, we need a packet header. */
donatien 0:013f5d54248c 1940 nextNBuf = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
donatien 0:013f5d54248c 1941 if (nextNBuf == NULL) {
donatien 0:013f5d54248c 1942 /* No free buffers. Drop the input packet and let the
donatien 0:013f5d54248c 1943 * higher layers deal with it. Continue processing
donatien 0:013f5d54248c 1944 * the received pbuf chain in case a new packet starts. */
donatien 0:013f5d54248c 1945 PPPDEBUG(LOG_ERR, ("pppInProc[%d]: NO FREE MBUFS!\n", pcrx->pd));
donatien 0:013f5d54248c 1946 LINK_STATS_INC(link.memerr);
donatien 0:013f5d54248c 1947 pppDrop(pcrx);
donatien 0:013f5d54248c 1948 pcrx->inState = PDSTART; /* Wait for flag sequence. */
donatien 0:013f5d54248c 1949 break;
donatien 0:013f5d54248c 1950 }
donatien 0:013f5d54248c 1951 if (pcrx->inHead == NULL) {
donatien 0:013f5d54248c 1952 struct pppInputHeader *pih = nextNBuf->payload;
donatien 0:013f5d54248c 1953
donatien 0:013f5d54248c 1954 pih->unit = pcrx->pd;
donatien 0:013f5d54248c 1955 pih->proto = pcrx->inProtocol;
donatien 0:013f5d54248c 1956
donatien 0:013f5d54248c 1957 nextNBuf->len += sizeof(*pih);
donatien 0:013f5d54248c 1958
donatien 0:013f5d54248c 1959 pcrx->inHead = nextNBuf;
donatien 0:013f5d54248c 1960 }
donatien 0:013f5d54248c 1961 pcrx->inTail = nextNBuf;
donatien 0:013f5d54248c 1962 }
donatien 0:013f5d54248c 1963 /* Load character into buffer. */
donatien 0:013f5d54248c 1964 ((u_char*)pcrx->inTail->payload)[pcrx->inTail->len++] = curChar;
donatien 0:013f5d54248c 1965 break;
donatien 0:013f5d54248c 1966 }
donatien 0:013f5d54248c 1967
donatien 0:013f5d54248c 1968 /* update the frame check sequence number. */
donatien 0:013f5d54248c 1969 pcrx->inFCS = PPP_FCS(pcrx->inFCS, curChar);
donatien 0:013f5d54248c 1970 }
donatien 0:013f5d54248c 1971 } /* while (l-- > 0), all bytes processed */
donatien 0:013f5d54248c 1972
donatien 0:013f5d54248c 1973 avRandomize();
donatien 0:013f5d54248c 1974 }
donatien 0:013f5d54248c 1975 #endif /* PPPOS_SUPPORT */
donatien 0:013f5d54248c 1976
donatien 0:013f5d54248c 1977 #if PPPOE_SUPPORT
donatien 0:013f5d54248c 1978 void
donatien 0:013f5d54248c 1979 pppInProcOverEthernet(int pd, struct pbuf *pb)
donatien 0:013f5d54248c 1980 {
donatien 0:013f5d54248c 1981 struct pppInputHeader *pih;
donatien 0:013f5d54248c 1982 u16_t inProtocol;
donatien 0:013f5d54248c 1983
donatien 0:013f5d54248c 1984 if(pb->len < sizeof(inProtocol)) {
donatien 0:013f5d54248c 1985 PPPDEBUG(LOG_ERR, ("pppInProcOverEthernet: too small for protocol field\n"));
donatien 0:013f5d54248c 1986 goto drop;
donatien 0:013f5d54248c 1987 }
donatien 0:013f5d54248c 1988
donatien 0:013f5d54248c 1989 inProtocol = (((u8_t *)pb->payload)[0] << 8) | ((u8_t*)pb->payload)[1];
donatien 0:013f5d54248c 1990
donatien 0:013f5d54248c 1991 /* make room for pppInputHeader - should not fail */
donatien 0:013f5d54248c 1992 if (pbuf_header(pb, sizeof(*pih) - sizeof(inProtocol)) != 0) {
donatien 0:013f5d54248c 1993 PPPDEBUG(LOG_ERR, ("pppInProcOverEthernet: could not allocate room for header\n"));
donatien 0:013f5d54248c 1994 goto drop;
donatien 0:013f5d54248c 1995 }
donatien 0:013f5d54248c 1996
donatien 0:013f5d54248c 1997 pih = pb->payload;
donatien 0:013f5d54248c 1998
donatien 0:013f5d54248c 1999 pih->unit = pd;
donatien 0:013f5d54248c 2000 pih->proto = inProtocol;
donatien 0:013f5d54248c 2001
donatien 0:013f5d54248c 2002 /* Dispatch the packet thereby consuming it. */
donatien 0:013f5d54248c 2003 pppInput(pb);
donatien 0:013f5d54248c 2004 return;
donatien 0:013f5d54248c 2005
donatien 0:013f5d54248c 2006 drop:
donatien 0:013f5d54248c 2007 LINK_STATS_INC(link.drop);
donatien 0:013f5d54248c 2008 snmp_inc_ifindiscards(&pppControl[pd].netif);
donatien 0:013f5d54248c 2009 pbuf_free(pb);
donatien 0:013f5d54248c 2010 return;
donatien 0:013f5d54248c 2011 }
donatien 0:013f5d54248c 2012 #endif /* PPPOE_SUPPORT */
donatien 0:013f5d54248c 2013
donatien 0:013f5d54248c 2014 #if LWIP_NETIF_STATUS_CALLBACK
donatien 0:013f5d54248c 2015 /** Set the status callback of a PPP's netif
donatien 0:013f5d54248c 2016 *
donatien 0:013f5d54248c 2017 * @param pd The PPP descriptor returned by pppOpen()
donatien 0:013f5d54248c 2018 * @param status_callback pointer to the status callback function
donatien 0:013f5d54248c 2019 *
donatien 0:013f5d54248c 2020 * @see netif_set_status_callback
donatien 0:013f5d54248c 2021 */
donatien 0:013f5d54248c 2022 void
donatien 0:013f5d54248c 2023 ppp_set_netif_statuscallback(int pd, netif_status_callback_fn status_callback)
donatien 0:013f5d54248c 2024 {
donatien 0:013f5d54248c 2025 netif_set_status_callback(&pppControl[pd].netif, status_callback);
donatien 0:013f5d54248c 2026 }
donatien 0:013f5d54248c 2027 #endif /* LWIP_NETIF_STATUS_CALLBACK */
donatien 0:013f5d54248c 2028
donatien 0:013f5d54248c 2029 #if LWIP_NETIF_LINK_CALLBACK
donatien 0:013f5d54248c 2030 /** Set the link callback of a PPP's netif
donatien 0:013f5d54248c 2031 *
donatien 0:013f5d54248c 2032 * @param pd The PPP descriptor returned by pppOpen()
donatien 0:013f5d54248c 2033 * @param link_callback pointer to the link callback function
donatien 0:013f5d54248c 2034 *
donatien 0:013f5d54248c 2035 * @see netif_set_link_callback
donatien 0:013f5d54248c 2036 */
donatien 0:013f5d54248c 2037 void
donatien 0:013f5d54248c 2038 ppp_set_netif_linkcallback(int pd, netif_status_callback_fn link_callback)
donatien 0:013f5d54248c 2039 {
donatien 0:013f5d54248c 2040 netif_set_link_callback(&pppControl[pd].netif, link_callback);
donatien 0:013f5d54248c 2041 }
donatien 0:013f5d54248c 2042 #endif /* LWIP_NETIF_LINK_CALLBACK */
donatien 0:013f5d54248c 2043
donatien 0:013f5d54248c 2044 #endif /* PPP_SUPPORT */