1*5d5fbe79SDavid van Moolenbroek /***************************************************************************** 2*5d5fbe79SDavid van Moolenbroek * ppp.h - Network Point to Point Protocol header file. 3*5d5fbe79SDavid van Moolenbroek * 4*5d5fbe79SDavid van Moolenbroek * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. 5*5d5fbe79SDavid van Moolenbroek * portions Copyright (c) 1997 Global Election Systems Inc. 6*5d5fbe79SDavid van Moolenbroek * 7*5d5fbe79SDavid van Moolenbroek * The authors hereby grant permission to use, copy, modify, distribute, 8*5d5fbe79SDavid van Moolenbroek * and license this software and its documentation for any purpose, provided 9*5d5fbe79SDavid van Moolenbroek * that existing copyright notices are retained in all copies and that this 10*5d5fbe79SDavid van Moolenbroek * notice and the following disclaimer are included verbatim in any 11*5d5fbe79SDavid van Moolenbroek * distributions. No written agreement, license, or royalty fee is required 12*5d5fbe79SDavid van Moolenbroek * for any of the authorized uses. 13*5d5fbe79SDavid van Moolenbroek * 14*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR 15*5d5fbe79SDavid van Moolenbroek * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16*5d5fbe79SDavid van Moolenbroek * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17*5d5fbe79SDavid van Moolenbroek * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 18*5d5fbe79SDavid van Moolenbroek * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*5d5fbe79SDavid van Moolenbroek * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20*5d5fbe79SDavid van Moolenbroek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21*5d5fbe79SDavid van Moolenbroek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*5d5fbe79SDavid van Moolenbroek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*5d5fbe79SDavid van Moolenbroek * 25*5d5fbe79SDavid van Moolenbroek ****************************************************************************** 26*5d5fbe79SDavid van Moolenbroek * REVISION HISTORY 27*5d5fbe79SDavid van Moolenbroek * 28*5d5fbe79SDavid van Moolenbroek * 03-01-01 Marc Boucher <marc@mbsi.ca> 29*5d5fbe79SDavid van Moolenbroek * Ported to lwIP. 30*5d5fbe79SDavid van Moolenbroek * 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc. 31*5d5fbe79SDavid van Moolenbroek * Original derived from BSD codes. 32*5d5fbe79SDavid van Moolenbroek *****************************************************************************/ 33*5d5fbe79SDavid van Moolenbroek #ifndef LWIP_HDR_PPP_IMPL_H 34*5d5fbe79SDavid van Moolenbroek #define LWIP_HDR_PPP_IMPL_H 35*5d5fbe79SDavid van Moolenbroek 36*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/ppp_opts.h" 37*5d5fbe79SDavid van Moolenbroek 38*5d5fbe79SDavid van Moolenbroek #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ 39*5d5fbe79SDavid van Moolenbroek 40*5d5fbe79SDavid van Moolenbroek #ifdef PPP_INCLUDE_SETTINGS_HEADER 41*5d5fbe79SDavid van Moolenbroek #include "ppp_settings.h" 42*5d5fbe79SDavid van Moolenbroek #endif 43*5d5fbe79SDavid van Moolenbroek 44*5d5fbe79SDavid van Moolenbroek #include <stdio.h> /* formats */ 45*5d5fbe79SDavid van Moolenbroek #include <stdarg.h> 46*5d5fbe79SDavid van Moolenbroek #include <string.h> 47*5d5fbe79SDavid van Moolenbroek #include <stdlib.h> /* strtol() */ 48*5d5fbe79SDavid van Moolenbroek 49*5d5fbe79SDavid van Moolenbroek #include "lwip/netif.h" 50*5d5fbe79SDavid van Moolenbroek #include "lwip/def.h" 51*5d5fbe79SDavid van Moolenbroek #include "lwip/timeouts.h" 52*5d5fbe79SDavid van Moolenbroek 53*5d5fbe79SDavid van Moolenbroek #include "ppp.h" 54*5d5fbe79SDavid van Moolenbroek #include "pppdebug.h" 55*5d5fbe79SDavid van Moolenbroek 56*5d5fbe79SDavid van Moolenbroek /* 57*5d5fbe79SDavid van Moolenbroek * Memory used for control packets. 58*5d5fbe79SDavid van Moolenbroek * 59*5d5fbe79SDavid van Moolenbroek * PPP_CTRL_PBUF_MAX_SIZE is the amount of memory we allocate when we 60*5d5fbe79SDavid van Moolenbroek * cannot figure out how much we are going to use before filling the buffer. 61*5d5fbe79SDavid van Moolenbroek */ 62*5d5fbe79SDavid van Moolenbroek #if PPP_USE_PBUF_RAM 63*5d5fbe79SDavid van Moolenbroek #define PPP_CTRL_PBUF_TYPE PBUF_RAM 64*5d5fbe79SDavid van Moolenbroek #define PPP_CTRL_PBUF_MAX_SIZE 512 65*5d5fbe79SDavid van Moolenbroek #else /* PPP_USE_PBUF_RAM */ 66*5d5fbe79SDavid van Moolenbroek #define PPP_CTRL_PBUF_TYPE PBUF_POOL 67*5d5fbe79SDavid van Moolenbroek #define PPP_CTRL_PBUF_MAX_SIZE PBUF_POOL_BUFSIZE 68*5d5fbe79SDavid van Moolenbroek #endif /* PPP_USE_PBUF_RAM */ 69*5d5fbe79SDavid van Moolenbroek 70*5d5fbe79SDavid van Moolenbroek /* 71*5d5fbe79SDavid van Moolenbroek * The basic PPP frame. 72*5d5fbe79SDavid van Moolenbroek */ 73*5d5fbe79SDavid van Moolenbroek #define PPP_ADDRESS(p) (((u_char *)(p))[0]) 74*5d5fbe79SDavid van Moolenbroek #define PPP_CONTROL(p) (((u_char *)(p))[1]) 75*5d5fbe79SDavid van Moolenbroek #define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3]) 76*5d5fbe79SDavid van Moolenbroek 77*5d5fbe79SDavid van Moolenbroek /* 78*5d5fbe79SDavid van Moolenbroek * Significant octet values. 79*5d5fbe79SDavid van Moolenbroek */ 80*5d5fbe79SDavid van Moolenbroek #define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */ 81*5d5fbe79SDavid van Moolenbroek #define PPP_UI 0x03 /* Unnumbered Information */ 82*5d5fbe79SDavid van Moolenbroek #define PPP_FLAG 0x7e /* Flag Sequence */ 83*5d5fbe79SDavid van Moolenbroek #define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */ 84*5d5fbe79SDavid van Moolenbroek #define PPP_TRANS 0x20 /* Asynchronous transparency modifier */ 85*5d5fbe79SDavid van Moolenbroek 86*5d5fbe79SDavid van Moolenbroek /* 87*5d5fbe79SDavid van Moolenbroek * Protocol field values. 88*5d5fbe79SDavid van Moolenbroek */ 89*5d5fbe79SDavid van Moolenbroek #define PPP_IP 0x21 /* Internet Protocol */ 90*5d5fbe79SDavid van Moolenbroek #if 0 /* UNUSED */ 91*5d5fbe79SDavid van Moolenbroek #define PPP_AT 0x29 /* AppleTalk Protocol */ 92*5d5fbe79SDavid van Moolenbroek #define PPP_IPX 0x2b /* IPX protocol */ 93*5d5fbe79SDavid van Moolenbroek #endif /* UNUSED */ 94*5d5fbe79SDavid van Moolenbroek #if VJ_SUPPORT 95*5d5fbe79SDavid van Moolenbroek #define PPP_VJC_COMP 0x2d /* VJ compressed TCP */ 96*5d5fbe79SDavid van Moolenbroek #define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */ 97*5d5fbe79SDavid van Moolenbroek #endif /* VJ_SUPPORT */ 98*5d5fbe79SDavid van Moolenbroek #if PPP_IPV6_SUPPORT 99*5d5fbe79SDavid van Moolenbroek #define PPP_IPV6 0x57 /* Internet Protocol Version 6 */ 100*5d5fbe79SDavid van Moolenbroek #endif /* PPP_IPV6_SUPPORT */ 101*5d5fbe79SDavid van Moolenbroek #if CCP_SUPPORT 102*5d5fbe79SDavid van Moolenbroek #define PPP_COMP 0xfd /* compressed packet */ 103*5d5fbe79SDavid van Moolenbroek #endif /* CCP_SUPPORT */ 104*5d5fbe79SDavid van Moolenbroek #define PPP_IPCP 0x8021 /* IP Control Protocol */ 105*5d5fbe79SDavid van Moolenbroek #if 0 /* UNUSED */ 106*5d5fbe79SDavid van Moolenbroek #define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */ 107*5d5fbe79SDavid van Moolenbroek #define PPP_IPXCP 0x802b /* IPX Control Protocol */ 108*5d5fbe79SDavid van Moolenbroek #endif /* UNUSED */ 109*5d5fbe79SDavid van Moolenbroek #if PPP_IPV6_SUPPORT 110*5d5fbe79SDavid van Moolenbroek #define PPP_IPV6CP 0x8057 /* IPv6 Control Protocol */ 111*5d5fbe79SDavid van Moolenbroek #endif /* PPP_IPV6_SUPPORT */ 112*5d5fbe79SDavid van Moolenbroek #if CCP_SUPPORT 113*5d5fbe79SDavid van Moolenbroek #define PPP_CCP 0x80fd /* Compression Control Protocol */ 114*5d5fbe79SDavid van Moolenbroek #endif /* CCP_SUPPORT */ 115*5d5fbe79SDavid van Moolenbroek #if ECP_SUPPORT 116*5d5fbe79SDavid van Moolenbroek #define PPP_ECP 0x8053 /* Encryption Control Protocol */ 117*5d5fbe79SDavid van Moolenbroek #endif /* ECP_SUPPORT */ 118*5d5fbe79SDavid van Moolenbroek #define PPP_LCP 0xc021 /* Link Control Protocol */ 119*5d5fbe79SDavid van Moolenbroek #if PAP_SUPPORT 120*5d5fbe79SDavid van Moolenbroek #define PPP_PAP 0xc023 /* Password Authentication Protocol */ 121*5d5fbe79SDavid van Moolenbroek #endif /* PAP_SUPPORT */ 122*5d5fbe79SDavid van Moolenbroek #if LQR_SUPPORT 123*5d5fbe79SDavid van Moolenbroek #define PPP_LQR 0xc025 /* Link Quality Report protocol */ 124*5d5fbe79SDavid van Moolenbroek #endif /* LQR_SUPPORT */ 125*5d5fbe79SDavid van Moolenbroek #if CHAP_SUPPORT 126*5d5fbe79SDavid van Moolenbroek #define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */ 127*5d5fbe79SDavid van Moolenbroek #endif /* CHAP_SUPPORT */ 128*5d5fbe79SDavid van Moolenbroek #if CBCP_SUPPORT 129*5d5fbe79SDavid van Moolenbroek #define PPP_CBCP 0xc029 /* Callback Control Protocol */ 130*5d5fbe79SDavid van Moolenbroek #endif /* CBCP_SUPPORT */ 131*5d5fbe79SDavid van Moolenbroek #if EAP_SUPPORT 132*5d5fbe79SDavid van Moolenbroek #define PPP_EAP 0xc227 /* Extensible Authentication Protocol */ 133*5d5fbe79SDavid van Moolenbroek #endif /* EAP_SUPPORT */ 134*5d5fbe79SDavid van Moolenbroek 135*5d5fbe79SDavid van Moolenbroek /* 136*5d5fbe79SDavid van Moolenbroek * The following struct gives the addresses of procedures to call 137*5d5fbe79SDavid van Moolenbroek * for a particular lower link level protocol. 138*5d5fbe79SDavid van Moolenbroek */ 139*5d5fbe79SDavid van Moolenbroek struct link_callbacks { 140*5d5fbe79SDavid van Moolenbroek /* Start a connection (e.g. Initiate discovery phase) */ 141*5d5fbe79SDavid van Moolenbroek void (*connect) (ppp_pcb *pcb, void *ctx); 142*5d5fbe79SDavid van Moolenbroek #if PPP_SERVER 143*5d5fbe79SDavid van Moolenbroek /* Listen for an incoming connection (Passive mode) */ 144*5d5fbe79SDavid van Moolenbroek void (*listen) (ppp_pcb *pcb, void *ctx); 145*5d5fbe79SDavid van Moolenbroek #endif /* PPP_SERVER */ 146*5d5fbe79SDavid van Moolenbroek /* End a connection (i.e. initiate disconnect phase) */ 147*5d5fbe79SDavid van Moolenbroek void (*disconnect) (ppp_pcb *pcb, void *ctx); 148*5d5fbe79SDavid van Moolenbroek /* Free lower protocol control block */ 149*5d5fbe79SDavid van Moolenbroek err_t (*free) (ppp_pcb *pcb, void *ctx); 150*5d5fbe79SDavid van Moolenbroek /* Write a pbuf to a ppp link, only used from PPP functions to send PPP packets. */ 151*5d5fbe79SDavid van Moolenbroek err_t (*write)(ppp_pcb *pcb, void *ctx, struct pbuf *p); 152*5d5fbe79SDavid van Moolenbroek /* Send a packet from lwIP core (IPv4 or IPv6) */ 153*5d5fbe79SDavid van Moolenbroek err_t (*netif_output)(ppp_pcb *pcb, void *ctx, struct pbuf *p, u_short protocol); 154*5d5fbe79SDavid van Moolenbroek /* configure the transmit-side characteristics of the PPP interface */ 155*5d5fbe79SDavid van Moolenbroek void (*send_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp); 156*5d5fbe79SDavid van Moolenbroek /* confire the receive-side characteristics of the PPP interface */ 157*5d5fbe79SDavid van Moolenbroek void (*recv_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp); 158*5d5fbe79SDavid van Moolenbroek }; 159*5d5fbe79SDavid van Moolenbroek 160*5d5fbe79SDavid van Moolenbroek /* 161*5d5fbe79SDavid van Moolenbroek * What to do with network protocol (NP) packets. 162*5d5fbe79SDavid van Moolenbroek */ 163*5d5fbe79SDavid van Moolenbroek enum NPmode { 164*5d5fbe79SDavid van Moolenbroek NPMODE_PASS, /* pass the packet through */ 165*5d5fbe79SDavid van Moolenbroek NPMODE_DROP, /* silently drop the packet */ 166*5d5fbe79SDavid van Moolenbroek NPMODE_ERROR, /* return an error */ 167*5d5fbe79SDavid van Moolenbroek NPMODE_QUEUE /* save it up for later. */ 168*5d5fbe79SDavid van Moolenbroek }; 169*5d5fbe79SDavid van Moolenbroek 170*5d5fbe79SDavid van Moolenbroek /* 171*5d5fbe79SDavid van Moolenbroek * Statistics. 172*5d5fbe79SDavid van Moolenbroek */ 173*5d5fbe79SDavid van Moolenbroek #if PPP_STATS_SUPPORT 174*5d5fbe79SDavid van Moolenbroek struct pppstat { 175*5d5fbe79SDavid van Moolenbroek unsigned int ppp_ibytes; /* bytes received */ 176*5d5fbe79SDavid van Moolenbroek unsigned int ppp_ipackets; /* packets received */ 177*5d5fbe79SDavid van Moolenbroek unsigned int ppp_ierrors; /* receive errors */ 178*5d5fbe79SDavid van Moolenbroek unsigned int ppp_obytes; /* bytes sent */ 179*5d5fbe79SDavid van Moolenbroek unsigned int ppp_opackets; /* packets sent */ 180*5d5fbe79SDavid van Moolenbroek unsigned int ppp_oerrors; /* transmit errors */ 181*5d5fbe79SDavid van Moolenbroek }; 182*5d5fbe79SDavid van Moolenbroek 183*5d5fbe79SDavid van Moolenbroek #if VJ_SUPPORT 184*5d5fbe79SDavid van Moolenbroek struct vjstat { 185*5d5fbe79SDavid van Moolenbroek unsigned int vjs_packets; /* outbound packets */ 186*5d5fbe79SDavid van Moolenbroek unsigned int vjs_compressed; /* outbound compressed packets */ 187*5d5fbe79SDavid van Moolenbroek unsigned int vjs_searches; /* searches for connection state */ 188*5d5fbe79SDavid van Moolenbroek unsigned int vjs_misses; /* times couldn't find conn. state */ 189*5d5fbe79SDavid van Moolenbroek unsigned int vjs_uncompressedin; /* inbound uncompressed packets */ 190*5d5fbe79SDavid van Moolenbroek unsigned int vjs_compressedin; /* inbound compressed packets */ 191*5d5fbe79SDavid van Moolenbroek unsigned int vjs_errorin; /* inbound unknown type packets */ 192*5d5fbe79SDavid van Moolenbroek unsigned int vjs_tossed; /* inbound packets tossed because of error */ 193*5d5fbe79SDavid van Moolenbroek }; 194*5d5fbe79SDavid van Moolenbroek #endif /* VJ_SUPPORT */ 195*5d5fbe79SDavid van Moolenbroek 196*5d5fbe79SDavid van Moolenbroek struct ppp_stats { 197*5d5fbe79SDavid van Moolenbroek struct pppstat p; /* basic PPP statistics */ 198*5d5fbe79SDavid van Moolenbroek #if VJ_SUPPORT 199*5d5fbe79SDavid van Moolenbroek struct vjstat vj; /* VJ header compression statistics */ 200*5d5fbe79SDavid van Moolenbroek #endif /* VJ_SUPPORT */ 201*5d5fbe79SDavid van Moolenbroek }; 202*5d5fbe79SDavid van Moolenbroek 203*5d5fbe79SDavid van Moolenbroek #if CCP_SUPPORT 204*5d5fbe79SDavid van Moolenbroek struct compstat { 205*5d5fbe79SDavid van Moolenbroek unsigned int unc_bytes; /* total uncompressed bytes */ 206*5d5fbe79SDavid van Moolenbroek unsigned int unc_packets; /* total uncompressed packets */ 207*5d5fbe79SDavid van Moolenbroek unsigned int comp_bytes; /* compressed bytes */ 208*5d5fbe79SDavid van Moolenbroek unsigned int comp_packets; /* compressed packets */ 209*5d5fbe79SDavid van Moolenbroek unsigned int inc_bytes; /* incompressible bytes */ 210*5d5fbe79SDavid van Moolenbroek unsigned int inc_packets; /* incompressible packets */ 211*5d5fbe79SDavid van Moolenbroek unsigned int ratio; /* recent compression ratio << 8 */ 212*5d5fbe79SDavid van Moolenbroek }; 213*5d5fbe79SDavid van Moolenbroek 214*5d5fbe79SDavid van Moolenbroek struct ppp_comp_stats { 215*5d5fbe79SDavid van Moolenbroek struct compstat c; /* packet compression statistics */ 216*5d5fbe79SDavid van Moolenbroek struct compstat d; /* packet decompression statistics */ 217*5d5fbe79SDavid van Moolenbroek }; 218*5d5fbe79SDavid van Moolenbroek #endif /* CCP_SUPPORT */ 219*5d5fbe79SDavid van Moolenbroek 220*5d5fbe79SDavid van Moolenbroek #endif /* PPP_STATS_SUPPORT */ 221*5d5fbe79SDavid van Moolenbroek 222*5d5fbe79SDavid van Moolenbroek #if PPP_IDLETIMELIMIT 223*5d5fbe79SDavid van Moolenbroek /* 224*5d5fbe79SDavid van Moolenbroek * The following structure records the time in seconds since 225*5d5fbe79SDavid van Moolenbroek * the last NP packet was sent or received. 226*5d5fbe79SDavid van Moolenbroek */ 227*5d5fbe79SDavid van Moolenbroek struct ppp_idle { 228*5d5fbe79SDavid van Moolenbroek time_t xmit_idle; /* time since last NP packet sent */ 229*5d5fbe79SDavid van Moolenbroek time_t recv_idle; /* time since last NP packet received */ 230*5d5fbe79SDavid van Moolenbroek }; 231*5d5fbe79SDavid van Moolenbroek #endif /* PPP_IDLETIMELIMIT */ 232*5d5fbe79SDavid van Moolenbroek 233*5d5fbe79SDavid van Moolenbroek /* values for epdisc.class */ 234*5d5fbe79SDavid van Moolenbroek #define EPD_NULL 0 /* null discriminator, no data */ 235*5d5fbe79SDavid van Moolenbroek #define EPD_LOCAL 1 236*5d5fbe79SDavid van Moolenbroek #define EPD_IP 2 237*5d5fbe79SDavid van Moolenbroek #define EPD_MAC 3 238*5d5fbe79SDavid van Moolenbroek #define EPD_MAGIC 4 239*5d5fbe79SDavid van Moolenbroek #define EPD_PHONENUM 5 240*5d5fbe79SDavid van Moolenbroek 241*5d5fbe79SDavid van Moolenbroek /* 242*5d5fbe79SDavid van Moolenbroek * Global variables. 243*5d5fbe79SDavid van Moolenbroek */ 244*5d5fbe79SDavid van Moolenbroek #ifdef HAVE_MULTILINK 245*5d5fbe79SDavid van Moolenbroek extern u8_t multilink; /* enable multilink operation */ 246*5d5fbe79SDavid van Moolenbroek extern u8_t doing_multilink; 247*5d5fbe79SDavid van Moolenbroek extern u8_t multilink_master; 248*5d5fbe79SDavid van Moolenbroek extern u8_t bundle_eof; 249*5d5fbe79SDavid van Moolenbroek extern u8_t bundle_terminating; 250*5d5fbe79SDavid van Moolenbroek #endif 251*5d5fbe79SDavid van Moolenbroek 252*5d5fbe79SDavid van Moolenbroek #ifdef MAXOCTETS 253*5d5fbe79SDavid van Moolenbroek extern unsigned int maxoctets; /* Maximum octetes per session (in bytes) */ 254*5d5fbe79SDavid van Moolenbroek extern int maxoctets_dir; /* Direction : 255*5d5fbe79SDavid van Moolenbroek 0 - in+out (default) 256*5d5fbe79SDavid van Moolenbroek 1 - in 257*5d5fbe79SDavid van Moolenbroek 2 - out 258*5d5fbe79SDavid van Moolenbroek 3 - max(in,out) */ 259*5d5fbe79SDavid van Moolenbroek extern int maxoctets_timeout; /* Timeout for check of octets limit */ 260*5d5fbe79SDavid van Moolenbroek #define PPP_OCTETS_DIRECTION_SUM 0 261*5d5fbe79SDavid van Moolenbroek #define PPP_OCTETS_DIRECTION_IN 1 262*5d5fbe79SDavid van Moolenbroek #define PPP_OCTETS_DIRECTION_OUT 2 263*5d5fbe79SDavid van Moolenbroek #define PPP_OCTETS_DIRECTION_MAXOVERAL 3 264*5d5fbe79SDavid van Moolenbroek /* same as previos, but little different on RADIUS side */ 265*5d5fbe79SDavid van Moolenbroek #define PPP_OCTETS_DIRECTION_MAXSESSION 4 266*5d5fbe79SDavid van Moolenbroek #endif 267*5d5fbe79SDavid van Moolenbroek 268*5d5fbe79SDavid van Moolenbroek /* Data input may be used by CCP and ECP, remove this entry 269*5d5fbe79SDavid van Moolenbroek * from struct protent to save some flash 270*5d5fbe79SDavid van Moolenbroek */ 271*5d5fbe79SDavid van Moolenbroek #define PPP_DATAINPUT 0 272*5d5fbe79SDavid van Moolenbroek 273*5d5fbe79SDavid van Moolenbroek /* 274*5d5fbe79SDavid van Moolenbroek * The following struct gives the addresses of procedures to call 275*5d5fbe79SDavid van Moolenbroek * for a particular protocol. 276*5d5fbe79SDavid van Moolenbroek */ 277*5d5fbe79SDavid van Moolenbroek struct protent { 278*5d5fbe79SDavid van Moolenbroek u_short protocol; /* PPP protocol number */ 279*5d5fbe79SDavid van Moolenbroek /* Initialization procedure */ 280*5d5fbe79SDavid van Moolenbroek void (*init) (ppp_pcb *pcb); 281*5d5fbe79SDavid van Moolenbroek /* Process a received packet */ 282*5d5fbe79SDavid van Moolenbroek void (*input) (ppp_pcb *pcb, u_char *pkt, int len); 283*5d5fbe79SDavid van Moolenbroek /* Process a received protocol-reject */ 284*5d5fbe79SDavid van Moolenbroek void (*protrej) (ppp_pcb *pcb); 285*5d5fbe79SDavid van Moolenbroek /* Lower layer has come up */ 286*5d5fbe79SDavid van Moolenbroek void (*lowerup) (ppp_pcb *pcb); 287*5d5fbe79SDavid van Moolenbroek /* Lower layer has gone down */ 288*5d5fbe79SDavid van Moolenbroek void (*lowerdown) (ppp_pcb *pcb); 289*5d5fbe79SDavid van Moolenbroek /* Open the protocol */ 290*5d5fbe79SDavid van Moolenbroek void (*open) (ppp_pcb *pcb); 291*5d5fbe79SDavid van Moolenbroek /* Close the protocol */ 292*5d5fbe79SDavid van Moolenbroek void (*close) (ppp_pcb *pcb, const char *reason); 293*5d5fbe79SDavid van Moolenbroek #if PRINTPKT_SUPPORT 294*5d5fbe79SDavid van Moolenbroek /* Print a packet in readable form */ 295*5d5fbe79SDavid van Moolenbroek int (*printpkt) (const u_char *pkt, int len, 296*5d5fbe79SDavid van Moolenbroek void (*printer) (void *, const char *, ...), 297*5d5fbe79SDavid van Moolenbroek void *arg); 298*5d5fbe79SDavid van Moolenbroek #endif /* PRINTPKT_SUPPORT */ 299*5d5fbe79SDavid van Moolenbroek #if PPP_DATAINPUT 300*5d5fbe79SDavid van Moolenbroek /* Process a received data packet */ 301*5d5fbe79SDavid van Moolenbroek void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len); 302*5d5fbe79SDavid van Moolenbroek #endif /* PPP_DATAINPUT */ 303*5d5fbe79SDavid van Moolenbroek #if PRINTPKT_SUPPORT 304*5d5fbe79SDavid van Moolenbroek const char *name; /* Text name of protocol */ 305*5d5fbe79SDavid van Moolenbroek const char *data_name; /* Text name of corresponding data protocol */ 306*5d5fbe79SDavid van Moolenbroek #endif /* PRINTPKT_SUPPORT */ 307*5d5fbe79SDavid van Moolenbroek #if PPP_OPTIONS 308*5d5fbe79SDavid van Moolenbroek option_t *options; /* List of command-line options */ 309*5d5fbe79SDavid van Moolenbroek /* Check requested options, assign defaults */ 310*5d5fbe79SDavid van Moolenbroek void (*check_options) (void); 311*5d5fbe79SDavid van Moolenbroek #endif /* PPP_OPTIONS */ 312*5d5fbe79SDavid van Moolenbroek #if DEMAND_SUPPORT 313*5d5fbe79SDavid van Moolenbroek /* Configure interface for demand-dial */ 314*5d5fbe79SDavid van Moolenbroek int (*demand_conf) (int unit); 315*5d5fbe79SDavid van Moolenbroek /* Say whether to bring up link for this pkt */ 316*5d5fbe79SDavid van Moolenbroek int (*active_pkt) (u_char *pkt, int len); 317*5d5fbe79SDavid van Moolenbroek #endif /* DEMAND_SUPPORT */ 318*5d5fbe79SDavid van Moolenbroek }; 319*5d5fbe79SDavid van Moolenbroek 320*5d5fbe79SDavid van Moolenbroek /* Table of pointers to supported protocols */ 321*5d5fbe79SDavid van Moolenbroek extern const struct protent* const protocols[]; 322*5d5fbe79SDavid van Moolenbroek 323*5d5fbe79SDavid van Moolenbroek 324*5d5fbe79SDavid van Moolenbroek /* Values for auth_pending, auth_done */ 325*5d5fbe79SDavid van Moolenbroek #if PAP_SUPPORT 326*5d5fbe79SDavid van Moolenbroek #define PAP_WITHPEER 0x1 327*5d5fbe79SDavid van Moolenbroek #define PAP_PEER 0x2 328*5d5fbe79SDavid van Moolenbroek #endif /* PAP_SUPPORT */ 329*5d5fbe79SDavid van Moolenbroek #if CHAP_SUPPORT 330*5d5fbe79SDavid van Moolenbroek #define CHAP_WITHPEER 0x4 331*5d5fbe79SDavid van Moolenbroek #define CHAP_PEER 0x8 332*5d5fbe79SDavid van Moolenbroek #endif /* CHAP_SUPPORT */ 333*5d5fbe79SDavid van Moolenbroek #if EAP_SUPPORT 334*5d5fbe79SDavid van Moolenbroek #define EAP_WITHPEER 0x10 335*5d5fbe79SDavid van Moolenbroek #define EAP_PEER 0x20 336*5d5fbe79SDavid van Moolenbroek #endif /* EAP_SUPPORT */ 337*5d5fbe79SDavid van Moolenbroek 338*5d5fbe79SDavid van Moolenbroek /* Values for auth_done only */ 339*5d5fbe79SDavid van Moolenbroek #if CHAP_SUPPORT 340*5d5fbe79SDavid van Moolenbroek #define CHAP_MD5_WITHPEER 0x40 341*5d5fbe79SDavid van Moolenbroek #define CHAP_MD5_PEER 0x80 342*5d5fbe79SDavid van Moolenbroek #if MSCHAP_SUPPORT 343*5d5fbe79SDavid van Moolenbroek #define CHAP_MS_SHIFT 8 /* LSB position for MS auths */ 344*5d5fbe79SDavid van Moolenbroek #define CHAP_MS_WITHPEER 0x100 345*5d5fbe79SDavid van Moolenbroek #define CHAP_MS_PEER 0x200 346*5d5fbe79SDavid van Moolenbroek #define CHAP_MS2_WITHPEER 0x400 347*5d5fbe79SDavid van Moolenbroek #define CHAP_MS2_PEER 0x800 348*5d5fbe79SDavid van Moolenbroek #endif /* MSCHAP_SUPPORT */ 349*5d5fbe79SDavid van Moolenbroek #endif /* CHAP_SUPPORT */ 350*5d5fbe79SDavid van Moolenbroek 351*5d5fbe79SDavid van Moolenbroek /* Supported CHAP protocols */ 352*5d5fbe79SDavid van Moolenbroek #if CHAP_SUPPORT 353*5d5fbe79SDavid van Moolenbroek 354*5d5fbe79SDavid van Moolenbroek #if MSCHAP_SUPPORT 355*5d5fbe79SDavid van Moolenbroek #define CHAP_MDTYPE_SUPPORTED (MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT | MDTYPE_MD5) 356*5d5fbe79SDavid van Moolenbroek #else /* MSCHAP_SUPPORT */ 357*5d5fbe79SDavid van Moolenbroek #define CHAP_MDTYPE_SUPPORTED (MDTYPE_MD5) 358*5d5fbe79SDavid van Moolenbroek #endif /* MSCHAP_SUPPORT */ 359*5d5fbe79SDavid van Moolenbroek 360*5d5fbe79SDavid van Moolenbroek #else /* CHAP_SUPPORT */ 361*5d5fbe79SDavid van Moolenbroek #define CHAP_MDTYPE_SUPPORTED (MDTYPE_NONE) 362*5d5fbe79SDavid van Moolenbroek #endif /* CHAP_SUPPORT */ 363*5d5fbe79SDavid van Moolenbroek 364*5d5fbe79SDavid van Moolenbroek #if PPP_STATS_SUPPORT 365*5d5fbe79SDavid van Moolenbroek /* 366*5d5fbe79SDavid van Moolenbroek * PPP statistics structure 367*5d5fbe79SDavid van Moolenbroek */ 368*5d5fbe79SDavid van Moolenbroek struct pppd_stats { 369*5d5fbe79SDavid van Moolenbroek unsigned int bytes_in; 370*5d5fbe79SDavid van Moolenbroek unsigned int bytes_out; 371*5d5fbe79SDavid van Moolenbroek unsigned int pkts_in; 372*5d5fbe79SDavid van Moolenbroek unsigned int pkts_out; 373*5d5fbe79SDavid van Moolenbroek }; 374*5d5fbe79SDavid van Moolenbroek #endif /* PPP_STATS_SUPPORT */ 375*5d5fbe79SDavid van Moolenbroek 376*5d5fbe79SDavid van Moolenbroek 377*5d5fbe79SDavid van Moolenbroek /* 378*5d5fbe79SDavid van Moolenbroek * PPP private functions 379*5d5fbe79SDavid van Moolenbroek */ 380*5d5fbe79SDavid van Moolenbroek 381*5d5fbe79SDavid van Moolenbroek 382*5d5fbe79SDavid van Moolenbroek /* 383*5d5fbe79SDavid van Moolenbroek * Functions called from lwIP core. 384*5d5fbe79SDavid van Moolenbroek */ 385*5d5fbe79SDavid van Moolenbroek 386*5d5fbe79SDavid van Moolenbroek /* initialize the PPP subsystem */ 387*5d5fbe79SDavid van Moolenbroek int ppp_init(void); 388*5d5fbe79SDavid van Moolenbroek 389*5d5fbe79SDavid van Moolenbroek /* 390*5d5fbe79SDavid van Moolenbroek * Functions called from PPP link protocols. 391*5d5fbe79SDavid van Moolenbroek */ 392*5d5fbe79SDavid van Moolenbroek 393*5d5fbe79SDavid van Moolenbroek /* Create a new PPP control block */ 394*5d5fbe79SDavid van Moolenbroek ppp_pcb *ppp_new(struct netif *pppif, const struct link_callbacks *callbacks, void *link_ctx_cb, 395*5d5fbe79SDavid van Moolenbroek ppp_link_status_cb_fn link_status_cb, void *ctx_cb); 396*5d5fbe79SDavid van Moolenbroek 397*5d5fbe79SDavid van Moolenbroek /* Initiate LCP open request */ 398*5d5fbe79SDavid van Moolenbroek void ppp_start(ppp_pcb *pcb); 399*5d5fbe79SDavid van Moolenbroek 400*5d5fbe79SDavid van Moolenbroek /* Called when link failed to setup */ 401*5d5fbe79SDavid van Moolenbroek void ppp_link_failed(ppp_pcb *pcb); 402*5d5fbe79SDavid van Moolenbroek 403*5d5fbe79SDavid van Moolenbroek /* Called when link is normally down (i.e. it was asked to end) */ 404*5d5fbe79SDavid van Moolenbroek void ppp_link_end(ppp_pcb *pcb); 405*5d5fbe79SDavid van Moolenbroek 406*5d5fbe79SDavid van Moolenbroek /* function called to process input packet */ 407*5d5fbe79SDavid van Moolenbroek void ppp_input(ppp_pcb *pcb, struct pbuf *pb); 408*5d5fbe79SDavid van Moolenbroek 409*5d5fbe79SDavid van Moolenbroek /* helper function, merge a pbuf chain into one pbuf */ 410*5d5fbe79SDavid van Moolenbroek struct pbuf *ppp_singlebuf(struct pbuf *p); 411*5d5fbe79SDavid van Moolenbroek 412*5d5fbe79SDavid van Moolenbroek 413*5d5fbe79SDavid van Moolenbroek /* 414*5d5fbe79SDavid van Moolenbroek * Functions called by PPP protocols. 415*5d5fbe79SDavid van Moolenbroek */ 416*5d5fbe79SDavid van Moolenbroek 417*5d5fbe79SDavid van Moolenbroek /* function called by all PPP subsystems to send packets */ 418*5d5fbe79SDavid van Moolenbroek err_t ppp_write(ppp_pcb *pcb, struct pbuf *p); 419*5d5fbe79SDavid van Moolenbroek 420*5d5fbe79SDavid van Moolenbroek /* functions called by auth.c link_terminated() */ 421*5d5fbe79SDavid van Moolenbroek void ppp_link_terminated(ppp_pcb *pcb); 422*5d5fbe79SDavid van Moolenbroek 423*5d5fbe79SDavid van Moolenbroek void new_phase(ppp_pcb *pcb, int p); 424*5d5fbe79SDavid van Moolenbroek 425*5d5fbe79SDavid van Moolenbroek int ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp); 426*5d5fbe79SDavid van Moolenbroek int ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp); 427*5d5fbe79SDavid van Moolenbroek 428*5d5fbe79SDavid van Moolenbroek #if PPP_IPV4_SUPPORT 429*5d5fbe79SDavid van Moolenbroek int sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask); 430*5d5fbe79SDavid van Moolenbroek int cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr); 431*5d5fbe79SDavid van Moolenbroek #if 0 /* UNUSED - PROXY ARP */ 432*5d5fbe79SDavid van Moolenbroek int sifproxyarp(ppp_pcb *pcb, u32_t his_adr); 433*5d5fbe79SDavid van Moolenbroek int cifproxyarp(ppp_pcb *pcb, u32_t his_adr); 434*5d5fbe79SDavid van Moolenbroek #endif /* UNUSED - PROXY ARP */ 435*5d5fbe79SDavid van Moolenbroek #if LWIP_DNS 436*5d5fbe79SDavid van Moolenbroek int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2); 437*5d5fbe79SDavid van Moolenbroek int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2); 438*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_DNS */ 439*5d5fbe79SDavid van Moolenbroek #if VJ_SUPPORT 440*5d5fbe79SDavid van Moolenbroek int sifvjcomp(ppp_pcb *pcb, int vjcomp, int cidcomp, int maxcid); 441*5d5fbe79SDavid van Moolenbroek #endif /* VJ_SUPPORT */ 442*5d5fbe79SDavid van Moolenbroek int sifup(ppp_pcb *pcb); 443*5d5fbe79SDavid van Moolenbroek int sifdown (ppp_pcb *pcb); 444*5d5fbe79SDavid van Moolenbroek u32_t get_mask(u32_t addr); 445*5d5fbe79SDavid van Moolenbroek #endif /* PPP_IPV4_SUPPORT */ 446*5d5fbe79SDavid van Moolenbroek 447*5d5fbe79SDavid van Moolenbroek #if PPP_IPV6_SUPPORT 448*5d5fbe79SDavid van Moolenbroek int sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64); 449*5d5fbe79SDavid van Moolenbroek int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64); 450*5d5fbe79SDavid van Moolenbroek int sif6up(ppp_pcb *pcb); 451*5d5fbe79SDavid van Moolenbroek int sif6down (ppp_pcb *pcb); 452*5d5fbe79SDavid van Moolenbroek #endif /* PPP_IPV6_SUPPORT */ 453*5d5fbe79SDavid van Moolenbroek 454*5d5fbe79SDavid van Moolenbroek #if DEMAND_SUPPORT 455*5d5fbe79SDavid van Moolenbroek int sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode); 456*5d5fbe79SDavid van Moolenbroek #endif /* DEMAND_SUPPORt */ 457*5d5fbe79SDavid van Moolenbroek 458*5d5fbe79SDavid van Moolenbroek void netif_set_mtu(ppp_pcb *pcb, int mtu); 459*5d5fbe79SDavid van Moolenbroek int netif_get_mtu(ppp_pcb *pcb); 460*5d5fbe79SDavid van Moolenbroek 461*5d5fbe79SDavid van Moolenbroek #if CCP_SUPPORT 462*5d5fbe79SDavid van Moolenbroek #if 0 /* unused */ 463*5d5fbe79SDavid van Moolenbroek int ccp_test(ppp_pcb *pcb, u_char *opt_ptr, int opt_len, int for_transmit); 464*5d5fbe79SDavid van Moolenbroek #endif /* unused */ 465*5d5fbe79SDavid van Moolenbroek void ccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method); 466*5d5fbe79SDavid van Moolenbroek void ccp_reset_comp(ppp_pcb *pcb); 467*5d5fbe79SDavid van Moolenbroek void ccp_reset_decomp(ppp_pcb *pcb); 468*5d5fbe79SDavid van Moolenbroek #if 0 /* unused */ 469*5d5fbe79SDavid van Moolenbroek int ccp_fatal_error(ppp_pcb *pcb); 470*5d5fbe79SDavid van Moolenbroek #endif /* unused */ 471*5d5fbe79SDavid van Moolenbroek #endif /* CCP_SUPPORT */ 472*5d5fbe79SDavid van Moolenbroek 473*5d5fbe79SDavid van Moolenbroek #if PPP_IDLETIMELIMIT 474*5d5fbe79SDavid van Moolenbroek int get_idle_time(ppp_pcb *pcb, struct ppp_idle *ip); 475*5d5fbe79SDavid van Moolenbroek #endif /* PPP_IDLETIMELIMIT */ 476*5d5fbe79SDavid van Moolenbroek 477*5d5fbe79SDavid van Moolenbroek #if DEMAND_SUPPORT 478*5d5fbe79SDavid van Moolenbroek int get_loop_output(void); 479*5d5fbe79SDavid van Moolenbroek #endif /* DEMAND_SUPPORT */ 480*5d5fbe79SDavid van Moolenbroek 481*5d5fbe79SDavid van Moolenbroek /* Optional protocol names list, to make our messages a little more informative. */ 482*5d5fbe79SDavid van Moolenbroek #if PPP_PROTOCOLNAME 483*5d5fbe79SDavid van Moolenbroek const char * protocol_name(int proto); 484*5d5fbe79SDavid van Moolenbroek #endif /* PPP_PROTOCOLNAME */ 485*5d5fbe79SDavid van Moolenbroek 486*5d5fbe79SDavid van Moolenbroek /* Optional stats support, to get some statistics on the PPP interface */ 487*5d5fbe79SDavid van Moolenbroek #if PPP_STATS_SUPPORT 488*5d5fbe79SDavid van Moolenbroek void print_link_stats(void); /* Print stats, if available */ 489*5d5fbe79SDavid van Moolenbroek void reset_link_stats(int u); /* Reset (init) stats when link goes up */ 490*5d5fbe79SDavid van Moolenbroek void update_link_stats(int u); /* Get stats at link termination */ 491*5d5fbe79SDavid van Moolenbroek #endif /* PPP_STATS_SUPPORT */ 492*5d5fbe79SDavid van Moolenbroek 493*5d5fbe79SDavid van Moolenbroek 494*5d5fbe79SDavid van Moolenbroek 495*5d5fbe79SDavid van Moolenbroek /* 496*5d5fbe79SDavid van Moolenbroek * Inline versions of get/put char/short/long. 497*5d5fbe79SDavid van Moolenbroek * Pointer is advanced; we assume that both arguments 498*5d5fbe79SDavid van Moolenbroek * are lvalues and will already be in registers. 499*5d5fbe79SDavid van Moolenbroek * cp MUST be u_char *. 500*5d5fbe79SDavid van Moolenbroek */ 501*5d5fbe79SDavid van Moolenbroek #define GETCHAR(c, cp) { \ 502*5d5fbe79SDavid van Moolenbroek (c) = *(cp)++; \ 503*5d5fbe79SDavid van Moolenbroek } 504*5d5fbe79SDavid van Moolenbroek #define PUTCHAR(c, cp) { \ 505*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) (c); \ 506*5d5fbe79SDavid van Moolenbroek } 507*5d5fbe79SDavid van Moolenbroek #define GETSHORT(s, cp) { \ 508*5d5fbe79SDavid van Moolenbroek (s) = *(cp)++ << 8; \ 509*5d5fbe79SDavid van Moolenbroek (s) |= *(cp)++; \ 510*5d5fbe79SDavid van Moolenbroek } 511*5d5fbe79SDavid van Moolenbroek #define PUTSHORT(s, cp) { \ 512*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) ((s) >> 8); \ 513*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) (s); \ 514*5d5fbe79SDavid van Moolenbroek } 515*5d5fbe79SDavid van Moolenbroek #define GETLONG(l, cp) { \ 516*5d5fbe79SDavid van Moolenbroek (l) = *(cp)++ << 8; \ 517*5d5fbe79SDavid van Moolenbroek (l) |= *(cp)++; (l) <<= 8; \ 518*5d5fbe79SDavid van Moolenbroek (l) |= *(cp)++; (l) <<= 8; \ 519*5d5fbe79SDavid van Moolenbroek (l) |= *(cp)++; \ 520*5d5fbe79SDavid van Moolenbroek } 521*5d5fbe79SDavid van Moolenbroek #define PUTLONG(l, cp) { \ 522*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) ((l) >> 24); \ 523*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) ((l) >> 16); \ 524*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) ((l) >> 8); \ 525*5d5fbe79SDavid van Moolenbroek *(cp)++ = (u_char) (l); \ 526*5d5fbe79SDavid van Moolenbroek } 527*5d5fbe79SDavid van Moolenbroek 528*5d5fbe79SDavid van Moolenbroek #define INCPTR(n, cp) ((cp) += (n)) 529*5d5fbe79SDavid van Moolenbroek #define DECPTR(n, cp) ((cp) -= (n)) 530*5d5fbe79SDavid van Moolenbroek 531*5d5fbe79SDavid van Moolenbroek /* 532*5d5fbe79SDavid van Moolenbroek * System dependent definitions for user-level 4.3BSD UNIX implementation. 533*5d5fbe79SDavid van Moolenbroek */ 534*5d5fbe79SDavid van Moolenbroek #define TIMEOUT(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t)*1000, (f), (a)); } while(0) 535*5d5fbe79SDavid van Moolenbroek #define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0) 536*5d5fbe79SDavid van Moolenbroek #define UNTIMEOUT(f, a) sys_untimeout((f), (a)) 537*5d5fbe79SDavid van Moolenbroek 538*5d5fbe79SDavid van Moolenbroek #define BZERO(s, n) memset(s, 0, n) 539*5d5fbe79SDavid van Moolenbroek #define BCMP(s1, s2, l) memcmp(s1, s2, l) 540*5d5fbe79SDavid van Moolenbroek 541*5d5fbe79SDavid van Moolenbroek #define PRINTMSG(m, l) { ppp_info("Remote message: %0.*v", l, m); } 542*5d5fbe79SDavid van Moolenbroek 543*5d5fbe79SDavid van Moolenbroek /* 544*5d5fbe79SDavid van Moolenbroek * MAKEHEADER - Add Header fields to a packet. 545*5d5fbe79SDavid van Moolenbroek */ 546*5d5fbe79SDavid van Moolenbroek #define MAKEHEADER(p, t) { \ 547*5d5fbe79SDavid van Moolenbroek PUTCHAR(PPP_ALLSTATIONS, p); \ 548*5d5fbe79SDavid van Moolenbroek PUTCHAR(PPP_UI, p); \ 549*5d5fbe79SDavid van Moolenbroek PUTSHORT(t, p); } 550*5d5fbe79SDavid van Moolenbroek 551*5d5fbe79SDavid van Moolenbroek /* Procedures exported from auth.c */ 552*5d5fbe79SDavid van Moolenbroek void link_required(ppp_pcb *pcb); /* we are starting to use the link */ 553*5d5fbe79SDavid van Moolenbroek void link_terminated(ppp_pcb *pcb); /* we are finished with the link */ 554*5d5fbe79SDavid van Moolenbroek void link_down(ppp_pcb *pcb); /* the LCP layer has left the Opened state */ 555*5d5fbe79SDavid van Moolenbroek void upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */ 556*5d5fbe79SDavid van Moolenbroek void link_established(ppp_pcb *pcb); /* the link is up; authenticate now */ 557*5d5fbe79SDavid van Moolenbroek void start_networks(ppp_pcb *pcb); /* start all the network control protos */ 558*5d5fbe79SDavid van Moolenbroek void continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos */ 559*5d5fbe79SDavid van Moolenbroek #if PPP_AUTH_SUPPORT 560*5d5fbe79SDavid van Moolenbroek #if PPP_SERVER 561*5d5fbe79SDavid van Moolenbroek int auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen); 562*5d5fbe79SDavid van Moolenbroek /* check the user name and passwd against configuration */ 563*5d5fbe79SDavid van Moolenbroek void auth_peer_fail(ppp_pcb *pcb, int protocol); 564*5d5fbe79SDavid van Moolenbroek /* peer failed to authenticate itself */ 565*5d5fbe79SDavid van Moolenbroek void auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen); 566*5d5fbe79SDavid van Moolenbroek /* peer successfully authenticated itself */ 567*5d5fbe79SDavid van Moolenbroek #endif /* PPP_SERVER */ 568*5d5fbe79SDavid van Moolenbroek void auth_withpeer_fail(ppp_pcb *pcb, int protocol); 569*5d5fbe79SDavid van Moolenbroek /* we failed to authenticate ourselves */ 570*5d5fbe79SDavid van Moolenbroek void auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor); 571*5d5fbe79SDavid van Moolenbroek /* we successfully authenticated ourselves */ 572*5d5fbe79SDavid van Moolenbroek #endif /* PPP_AUTH_SUPPORT */ 573*5d5fbe79SDavid van Moolenbroek void np_up(ppp_pcb *pcb, int proto); /* a network protocol has come up */ 574*5d5fbe79SDavid van Moolenbroek void np_down(ppp_pcb *pcb, int proto); /* a network protocol has gone down */ 575*5d5fbe79SDavid van Moolenbroek void np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */ 576*5d5fbe79SDavid van Moolenbroek #if PPP_AUTH_SUPPORT 577*5d5fbe79SDavid van Moolenbroek int get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server); 578*5d5fbe79SDavid van Moolenbroek /* get "secret" for chap */ 579*5d5fbe79SDavid van Moolenbroek #endif /* PPP_AUTH_SUPPORT */ 580*5d5fbe79SDavid van Moolenbroek 581*5d5fbe79SDavid van Moolenbroek /* Procedures exported from ipcp.c */ 582*5d5fbe79SDavid van Moolenbroek /* int parse_dotted_ip (char *, u32_t *); */ 583*5d5fbe79SDavid van Moolenbroek 584*5d5fbe79SDavid van Moolenbroek /* Procedures exported from demand.c */ 585*5d5fbe79SDavid van Moolenbroek #if DEMAND_SUPPORT 586*5d5fbe79SDavid van Moolenbroek void demand_conf (void); /* config interface(s) for demand-dial */ 587*5d5fbe79SDavid van Moolenbroek void demand_block (void); /* set all NPs to queue up packets */ 588*5d5fbe79SDavid van Moolenbroek void demand_unblock (void); /* set all NPs to pass packets */ 589*5d5fbe79SDavid van Moolenbroek void demand_discard (void); /* set all NPs to discard packets */ 590*5d5fbe79SDavid van Moolenbroek void demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/ 591*5d5fbe79SDavid van Moolenbroek int loop_chars (unsigned char *, int); /* process chars from loopback */ 592*5d5fbe79SDavid van Moolenbroek int loop_frame (unsigned char *, int); /* should we bring link up? */ 593*5d5fbe79SDavid van Moolenbroek #endif /* DEMAND_SUPPORT */ 594*5d5fbe79SDavid van Moolenbroek 595*5d5fbe79SDavid van Moolenbroek /* Procedures exported from multilink.c */ 596*5d5fbe79SDavid van Moolenbroek #ifdef HAVE_MULTILINK 597*5d5fbe79SDavid van Moolenbroek void mp_check_options (void); /* Check multilink-related options */ 598*5d5fbe79SDavid van Moolenbroek int mp_join_bundle (void); /* join our link to an appropriate bundle */ 599*5d5fbe79SDavid van Moolenbroek void mp_exit_bundle (void); /* have disconnected our link from bundle */ 600*5d5fbe79SDavid van Moolenbroek void mp_bundle_terminated (void); 601*5d5fbe79SDavid van Moolenbroek char *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */ 602*5d5fbe79SDavid van Moolenbroek int str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */ 603*5d5fbe79SDavid van Moolenbroek #else 604*5d5fbe79SDavid van Moolenbroek #define mp_bundle_terminated() /* nothing */ 605*5d5fbe79SDavid van Moolenbroek #define mp_exit_bundle() /* nothing */ 606*5d5fbe79SDavid van Moolenbroek #define doing_multilink 0 607*5d5fbe79SDavid van Moolenbroek #define multilink_master 0 608*5d5fbe79SDavid van Moolenbroek #endif 609*5d5fbe79SDavid van Moolenbroek 610*5d5fbe79SDavid van Moolenbroek /* Procedures exported from utils.c. */ 611*5d5fbe79SDavid van Moolenbroek void ppp_print_string(const u_char *p, int len, void (*printer) (void *, const char *, ...), void *arg); /* Format a string for output */ 612*5d5fbe79SDavid van Moolenbroek int ppp_slprintf(char *buf, int buflen, const char *fmt, ...); /* sprintf++ */ 613*5d5fbe79SDavid van Moolenbroek int ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args); /* vsprintf++ */ 614*5d5fbe79SDavid van Moolenbroek size_t ppp_strlcpy(char *dest, const char *src, size_t len); /* safe strcpy */ 615*5d5fbe79SDavid van Moolenbroek size_t ppp_strlcat(char *dest, const char *src, size_t len); /* safe strncpy */ 616*5d5fbe79SDavid van Moolenbroek void ppp_dbglog(const char *fmt, ...); /* log a debug message */ 617*5d5fbe79SDavid van Moolenbroek void ppp_info(const char *fmt, ...); /* log an informational message */ 618*5d5fbe79SDavid van Moolenbroek void ppp_notice(const char *fmt, ...); /* log a notice-level message */ 619*5d5fbe79SDavid van Moolenbroek void ppp_warn(const char *fmt, ...); /* log a warning message */ 620*5d5fbe79SDavid van Moolenbroek void ppp_error(const char *fmt, ...); /* log an error message */ 621*5d5fbe79SDavid van Moolenbroek void ppp_fatal(const char *fmt, ...); /* log an error message and die(1) */ 622*5d5fbe79SDavid van Moolenbroek #if PRINTPKT_SUPPORT 623*5d5fbe79SDavid van Moolenbroek void ppp_dump_packet(ppp_pcb *pcb, const char *tag, unsigned char *p, int len); 624*5d5fbe79SDavid van Moolenbroek /* dump packet to debug log if interesting */ 625*5d5fbe79SDavid van Moolenbroek #endif /* PRINTPKT_SUPPORT */ 626*5d5fbe79SDavid van Moolenbroek 627*5d5fbe79SDavid van Moolenbroek 628*5d5fbe79SDavid van Moolenbroek #endif /* PPP_SUPPORT */ 629*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_HDR_PPP_IMPL_H */ 630