1*10465441SEvalZero /***************************************************************************** 2*10465441SEvalZero * ppp.h - Network Point to Point Protocol header file. 3*10465441SEvalZero * 4*10465441SEvalZero * Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. 5*10465441SEvalZero * portions Copyright (c) 1997 Global Election Systems Inc. 6*10465441SEvalZero * 7*10465441SEvalZero * The authors hereby grant permission to use, copy, modify, distribute, 8*10465441SEvalZero * and license this software and its documentation for any purpose, provided 9*10465441SEvalZero * that existing copyright notices are retained in all copies and that this 10*10465441SEvalZero * notice and the following disclaimer are included verbatim in any 11*10465441SEvalZero * distributions. No written agreement, license, or royalty fee is required 12*10465441SEvalZero * for any of the authorized uses. 13*10465441SEvalZero * 14*10465441SEvalZero * THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR 15*10465441SEvalZero * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16*10465441SEvalZero * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17*10465441SEvalZero * IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 18*10465441SEvalZero * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19*10465441SEvalZero * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20*10465441SEvalZero * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21*10465441SEvalZero * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22*10465441SEvalZero * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23*10465441SEvalZero * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24*10465441SEvalZero * 25*10465441SEvalZero ****************************************************************************** 26*10465441SEvalZero * REVISION HISTORY 27*10465441SEvalZero * 28*10465441SEvalZero * 03-01-01 Marc Boucher <[email protected]> 29*10465441SEvalZero * Ported to lwIP. 30*10465441SEvalZero * 97-11-05 Guy Lancaster <[email protected]>, Global Election Systems Inc. 31*10465441SEvalZero * Original derived from BSD codes. 32*10465441SEvalZero *****************************************************************************/ 33*10465441SEvalZero 34*10465441SEvalZero #include "netif/ppp/ppp_opts.h" 35*10465441SEvalZero #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ 36*10465441SEvalZero 37*10465441SEvalZero #ifndef PPP_H 38*10465441SEvalZero #define PPP_H 39*10465441SEvalZero 40*10465441SEvalZero #include "lwip/def.h" 41*10465441SEvalZero #include "lwip/stats.h" 42*10465441SEvalZero #include "lwip/mem.h" 43*10465441SEvalZero #include "lwip/netif.h" 44*10465441SEvalZero #include "lwip/sys.h" 45*10465441SEvalZero #include "lwip/timeouts.h" 46*10465441SEvalZero #if PPP_IPV6_SUPPORT 47*10465441SEvalZero #include "lwip/ip6_addr.h" 48*10465441SEvalZero #endif /* PPP_IPV6_SUPPORT */ 49*10465441SEvalZero 50*10465441SEvalZero /* Disable non-working or rarely used PPP feature, so rarely that we don't want to bloat ppp_opts.h with them */ 51*10465441SEvalZero #ifndef PPP_OPTIONS 52*10465441SEvalZero #define PPP_OPTIONS 0 53*10465441SEvalZero #endif 54*10465441SEvalZero 55*10465441SEvalZero #ifndef PPP_NOTIFY 56*10465441SEvalZero #define PPP_NOTIFY 0 57*10465441SEvalZero #endif 58*10465441SEvalZero 59*10465441SEvalZero #ifndef PPP_REMOTENAME 60*10465441SEvalZero #define PPP_REMOTENAME 0 61*10465441SEvalZero #endif 62*10465441SEvalZero 63*10465441SEvalZero #ifndef PPP_IDLETIMELIMIT 64*10465441SEvalZero #define PPP_IDLETIMELIMIT 0 65*10465441SEvalZero #endif 66*10465441SEvalZero 67*10465441SEvalZero #ifndef PPP_LCP_ADAPTIVE 68*10465441SEvalZero #define PPP_LCP_ADAPTIVE 0 69*10465441SEvalZero #endif 70*10465441SEvalZero 71*10465441SEvalZero #ifndef PPP_MAXCONNECT 72*10465441SEvalZero #define PPP_MAXCONNECT 0 73*10465441SEvalZero #endif 74*10465441SEvalZero 75*10465441SEvalZero #ifndef PPP_ALLOWED_ADDRS 76*10465441SEvalZero #define PPP_ALLOWED_ADDRS 0 77*10465441SEvalZero #endif 78*10465441SEvalZero 79*10465441SEvalZero #ifndef PPP_PROTOCOLNAME 80*10465441SEvalZero #define PPP_PROTOCOLNAME 0 81*10465441SEvalZero #endif 82*10465441SEvalZero 83*10465441SEvalZero #ifndef PPP_STATS_SUPPORT 84*10465441SEvalZero #define PPP_STATS_SUPPORT 0 85*10465441SEvalZero #endif 86*10465441SEvalZero 87*10465441SEvalZero #ifndef DEFLATE_SUPPORT 88*10465441SEvalZero #define DEFLATE_SUPPORT 0 89*10465441SEvalZero #endif 90*10465441SEvalZero 91*10465441SEvalZero #ifndef BSDCOMPRESS_SUPPORT 92*10465441SEvalZero #define BSDCOMPRESS_SUPPORT 0 93*10465441SEvalZero #endif 94*10465441SEvalZero 95*10465441SEvalZero #ifndef PREDICTOR_SUPPORT 96*10465441SEvalZero #define PREDICTOR_SUPPORT 0 97*10465441SEvalZero #endif 98*10465441SEvalZero 99*10465441SEvalZero /************************* 100*10465441SEvalZero *** PUBLIC DEFINITIONS *** 101*10465441SEvalZero *************************/ 102*10465441SEvalZero 103*10465441SEvalZero /* 104*10465441SEvalZero * The basic PPP frame. 105*10465441SEvalZero */ 106*10465441SEvalZero #define PPP_HDRLEN 4 /* octets for standard ppp header */ 107*10465441SEvalZero #define PPP_FCSLEN 2 /* octets for FCS */ 108*10465441SEvalZero 109*10465441SEvalZero /* 110*10465441SEvalZero * Values for phase. 111*10465441SEvalZero */ 112*10465441SEvalZero #define PPP_PHASE_DEAD 0 113*10465441SEvalZero #define PPP_PHASE_MASTER 1 114*10465441SEvalZero #define PPP_PHASE_HOLDOFF 2 115*10465441SEvalZero #define PPP_PHASE_INITIALIZE 3 116*10465441SEvalZero #define PPP_PHASE_SERIALCONN 4 117*10465441SEvalZero #define PPP_PHASE_DORMANT 5 118*10465441SEvalZero #define PPP_PHASE_ESTABLISH 6 119*10465441SEvalZero #define PPP_PHASE_AUTHENTICATE 7 120*10465441SEvalZero #define PPP_PHASE_CALLBACK 8 121*10465441SEvalZero #define PPP_PHASE_NETWORK 9 122*10465441SEvalZero #define PPP_PHASE_RUNNING 10 123*10465441SEvalZero #define PPP_PHASE_TERMINATE 11 124*10465441SEvalZero #define PPP_PHASE_DISCONNECT 12 125*10465441SEvalZero 126*10465441SEvalZero /* Error codes. */ 127*10465441SEvalZero #define PPPERR_NONE 0 /* No error. */ 128*10465441SEvalZero #define PPPERR_PARAM 1 /* Invalid parameter. */ 129*10465441SEvalZero #define PPPERR_OPEN 2 /* Unable to open PPP session. */ 130*10465441SEvalZero #define PPPERR_DEVICE 3 /* Invalid I/O device for PPP. */ 131*10465441SEvalZero #define PPPERR_ALLOC 4 /* Unable to allocate resources. */ 132*10465441SEvalZero #define PPPERR_USER 5 /* User interrupt. */ 133*10465441SEvalZero #define PPPERR_CONNECT 6 /* Connection lost. */ 134*10465441SEvalZero #define PPPERR_AUTHFAIL 7 /* Failed authentication challenge. */ 135*10465441SEvalZero #define PPPERR_PROTOCOL 8 /* Failed to meet protocol. */ 136*10465441SEvalZero #define PPPERR_PEERDEAD 9 /* Connection timeout */ 137*10465441SEvalZero #define PPPERR_IDLETIMEOUT 10 /* Idle Timeout */ 138*10465441SEvalZero #define PPPERR_CONNECTTIME 11 /* Max connect time reached */ 139*10465441SEvalZero #define PPPERR_LOOPBACK 12 /* Loopback detected */ 140*10465441SEvalZero 141*10465441SEvalZero /* Whether auth support is enabled at all */ 142*10465441SEvalZero #define PPP_AUTH_SUPPORT (PAP_SUPPORT || CHAP_SUPPORT || EAP_SUPPORT) 143*10465441SEvalZero 144*10465441SEvalZero /************************ 145*10465441SEvalZero *** PUBLIC DATA TYPES *** 146*10465441SEvalZero ************************/ 147*10465441SEvalZero 148*10465441SEvalZero /* 149*10465441SEvalZero * Other headers require ppp_pcb definition for prototypes, but ppp_pcb 150*10465441SEvalZero * require some structure definition from other headers as well, we are 151*10465441SEvalZero * fixing the dependency loop here by declaring the ppp_pcb type then 152*10465441SEvalZero * by including headers containing necessary struct definition for ppp_pcb 153*10465441SEvalZero */ 154*10465441SEvalZero typedef struct ppp_pcb_s ppp_pcb; 155*10465441SEvalZero 156*10465441SEvalZero /* Type definitions for BSD code. */ 157*10465441SEvalZero #ifndef __u_char_defined 158*10465441SEvalZero typedef unsigned long u_long; 159*10465441SEvalZero typedef unsigned int u_int; 160*10465441SEvalZero typedef unsigned short u_short; 161*10465441SEvalZero typedef unsigned char u_char; 162*10465441SEvalZero #endif 163*10465441SEvalZero 164*10465441SEvalZero #include "fsm.h" 165*10465441SEvalZero #include "lcp.h" 166*10465441SEvalZero #if CCP_SUPPORT 167*10465441SEvalZero #include "ccp.h" 168*10465441SEvalZero #endif /* CCP_SUPPORT */ 169*10465441SEvalZero #if MPPE_SUPPORT 170*10465441SEvalZero #include "mppe.h" 171*10465441SEvalZero #endif /* MPPE_SUPPORT */ 172*10465441SEvalZero #if PPP_IPV4_SUPPORT 173*10465441SEvalZero #include "ipcp.h" 174*10465441SEvalZero #endif /* PPP_IPV4_SUPPORT */ 175*10465441SEvalZero #if PPP_IPV6_SUPPORT 176*10465441SEvalZero #include "ipv6cp.h" 177*10465441SEvalZero #endif /* PPP_IPV6_SUPPORT */ 178*10465441SEvalZero #if PAP_SUPPORT 179*10465441SEvalZero #include "upap.h" 180*10465441SEvalZero #endif /* PAP_SUPPORT */ 181*10465441SEvalZero #if CHAP_SUPPORT 182*10465441SEvalZero #include "chap-new.h" 183*10465441SEvalZero #endif /* CHAP_SUPPORT */ 184*10465441SEvalZero #if EAP_SUPPORT 185*10465441SEvalZero #include "eap.h" 186*10465441SEvalZero #endif /* EAP_SUPPORT */ 187*10465441SEvalZero #if VJ_SUPPORT 188*10465441SEvalZero #include "vj.h" 189*10465441SEvalZero #endif /* VJ_SUPPORT */ 190*10465441SEvalZero 191*10465441SEvalZero /* Link status callback function prototype */ 192*10465441SEvalZero typedef void (*ppp_link_status_cb_fn)(ppp_pcb *pcb, int err_code, void *ctx); 193*10465441SEvalZero 194*10465441SEvalZero /* 195*10465441SEvalZero * PPP configuration. 196*10465441SEvalZero */ 197*10465441SEvalZero typedef struct ppp_settings_s { 198*10465441SEvalZero 199*10465441SEvalZero #if PPP_SERVER && PPP_AUTH_SUPPORT 200*10465441SEvalZero unsigned int auth_required :1; /* Peer is required to authenticate */ 201*10465441SEvalZero unsigned int null_login :1; /* Username of "" and a password of "" are acceptable */ 202*10465441SEvalZero #endif /* PPP_SERVER && PPP_AUTH_SUPPORT */ 203*10465441SEvalZero #if PPP_REMOTENAME 204*10465441SEvalZero unsigned int explicit_remote :1; /* remote_name specified with remotename opt */ 205*10465441SEvalZero #endif /* PPP_REMOTENAME */ 206*10465441SEvalZero #if PAP_SUPPORT 207*10465441SEvalZero unsigned int refuse_pap :1; /* Don't proceed auth. with PAP */ 208*10465441SEvalZero #endif /* PAP_SUPPORT */ 209*10465441SEvalZero #if CHAP_SUPPORT 210*10465441SEvalZero unsigned int refuse_chap :1; /* Don't proceed auth. with CHAP */ 211*10465441SEvalZero #endif /* CHAP_SUPPORT */ 212*10465441SEvalZero #if MSCHAP_SUPPORT 213*10465441SEvalZero unsigned int refuse_mschap :1; /* Don't proceed auth. with MS-CHAP */ 214*10465441SEvalZero unsigned int refuse_mschap_v2 :1; /* Don't proceed auth. with MS-CHAPv2 */ 215*10465441SEvalZero #endif /* MSCHAP_SUPPORT */ 216*10465441SEvalZero #if EAP_SUPPORT 217*10465441SEvalZero unsigned int refuse_eap :1; /* Don't proceed auth. with EAP */ 218*10465441SEvalZero #endif /* EAP_SUPPORT */ 219*10465441SEvalZero #if LWIP_DNS 220*10465441SEvalZero unsigned int usepeerdns :1; /* Ask peer for DNS adds */ 221*10465441SEvalZero #endif /* LWIP_DNS */ 222*10465441SEvalZero unsigned int persist :1; /* Persist mode, always try to open the connection */ 223*10465441SEvalZero #if PRINTPKT_SUPPORT 224*10465441SEvalZero unsigned int hide_password :1; /* Hide password in dumped packets */ 225*10465441SEvalZero #endif /* PRINTPKT_SUPPORT */ 226*10465441SEvalZero unsigned int noremoteip :1; /* Let him have no IP address */ 227*10465441SEvalZero unsigned int lax_recv :1; /* accept control chars in asyncmap */ 228*10465441SEvalZero unsigned int noendpoint :1; /* don't send/accept endpoint discriminator */ 229*10465441SEvalZero #if PPP_LCP_ADAPTIVE 230*10465441SEvalZero unsigned int lcp_echo_adaptive :1; /* request echo only if the link was idle */ 231*10465441SEvalZero #endif /* PPP_LCP_ADAPTIVE */ 232*10465441SEvalZero #if MPPE_SUPPORT 233*10465441SEvalZero unsigned int require_mppe :1; /* Require MPPE (Microsoft Point to Point Encryption) */ 234*10465441SEvalZero unsigned int refuse_mppe_40 :1; /* Allow MPPE 40-bit mode? */ 235*10465441SEvalZero unsigned int refuse_mppe_128 :1; /* Allow MPPE 128-bit mode? */ 236*10465441SEvalZero unsigned int refuse_mppe_stateful :1; /* Allow MPPE stateful mode? */ 237*10465441SEvalZero #endif /* MPPE_SUPPORT */ 238*10465441SEvalZero 239*10465441SEvalZero u16_t listen_time; /* time to listen first (ms), waiting for peer to send LCP packet */ 240*10465441SEvalZero 241*10465441SEvalZero #if PPP_IDLETIMELIMIT 242*10465441SEvalZero u16_t idle_time_limit; /* Disconnect if idle for this many seconds */ 243*10465441SEvalZero #endif /* PPP_IDLETIMELIMIT */ 244*10465441SEvalZero #if PPP_MAXCONNECT 245*10465441SEvalZero u32_t maxconnect; /* Maximum connect time (seconds) */ 246*10465441SEvalZero #endif /* PPP_MAXCONNECT */ 247*10465441SEvalZero 248*10465441SEvalZero #if PPP_AUTH_SUPPORT 249*10465441SEvalZero /* auth data */ 250*10465441SEvalZero const char *user; /* Username for PAP */ 251*10465441SEvalZero const char *passwd; /* Password for PAP, secret for CHAP */ 252*10465441SEvalZero #if PPP_REMOTENAME 253*10465441SEvalZero char remote_name[MAXNAMELEN + 1]; /* Peer's name for authentication */ 254*10465441SEvalZero #endif /* PPP_REMOTENAME */ 255*10465441SEvalZero 256*10465441SEvalZero #if PAP_SUPPORT 257*10465441SEvalZero u8_t pap_timeout_time; /* Timeout (seconds) for auth-req retrans. */ 258*10465441SEvalZero u8_t pap_max_transmits; /* Number of auth-reqs sent */ 259*10465441SEvalZero #if PPP_SERVER 260*10465441SEvalZero u8_t pap_req_timeout; /* Time to wait for auth-req from peer */ 261*10465441SEvalZero #endif /* PPP_SERVER */ 262*10465441SEvalZero #endif /* PAP_SUPPPORT */ 263*10465441SEvalZero 264*10465441SEvalZero #if CHAP_SUPPORT 265*10465441SEvalZero u8_t chap_timeout_time; /* Timeout (seconds) for retransmitting req */ 266*10465441SEvalZero u8_t chap_max_transmits; /* max # times to send challenge */ 267*10465441SEvalZero #if PPP_SERVER 268*10465441SEvalZero u8_t chap_rechallenge_time; /* Time to wait for auth-req from peer */ 269*10465441SEvalZero #endif /* PPP_SERVER */ 270*10465441SEvalZero #endif /* CHAP_SUPPPORT */ 271*10465441SEvalZero 272*10465441SEvalZero #if EAP_SUPPORT 273*10465441SEvalZero u8_t eap_req_time; /* Time to wait (for retransmit/fail) */ 274*10465441SEvalZero u8_t eap_allow_req; /* Max Requests allowed */ 275*10465441SEvalZero #if PPP_SERVER 276*10465441SEvalZero u8_t eap_timeout_time; /* Time to wait (for retransmit/fail) */ 277*10465441SEvalZero u8_t eap_max_transmits; /* Max Requests allowed */ 278*10465441SEvalZero #endif /* PPP_SERVER */ 279*10465441SEvalZero #endif /* EAP_SUPPORT */ 280*10465441SEvalZero 281*10465441SEvalZero #endif /* PPP_AUTH_SUPPORT */ 282*10465441SEvalZero 283*10465441SEvalZero u8_t fsm_timeout_time; /* Timeout time in seconds */ 284*10465441SEvalZero u8_t fsm_max_conf_req_transmits; /* Maximum Configure-Request transmissions */ 285*10465441SEvalZero u8_t fsm_max_term_transmits; /* Maximum Terminate-Request transmissions */ 286*10465441SEvalZero u8_t fsm_max_nak_loops; /* Maximum number of nak loops tolerated */ 287*10465441SEvalZero 288*10465441SEvalZero u8_t lcp_loopbackfail; /* Number of times we receive our magic number from the peer 289*10465441SEvalZero before deciding the link is looped-back. */ 290*10465441SEvalZero u8_t lcp_echo_interval; /* Interval between LCP echo-requests */ 291*10465441SEvalZero u8_t lcp_echo_fails; /* Tolerance to unanswered echo-requests */ 292*10465441SEvalZero 293*10465441SEvalZero } ppp_settings; 294*10465441SEvalZero 295*10465441SEvalZero #if PPP_SERVER 296*10465441SEvalZero struct ppp_addrs { 297*10465441SEvalZero #if PPP_IPV4_SUPPORT 298*10465441SEvalZero ip4_addr_t our_ipaddr, his_ipaddr, netmask; 299*10465441SEvalZero #if LWIP_DNS 300*10465441SEvalZero ip4_addr_t dns1, dns2; 301*10465441SEvalZero #endif /* LWIP_DNS */ 302*10465441SEvalZero #endif /* PPP_IPV4_SUPPORT */ 303*10465441SEvalZero #if PPP_IPV6_SUPPORT 304*10465441SEvalZero ip6_addr_t our6_ipaddr, his6_ipaddr; 305*10465441SEvalZero #endif /* PPP_IPV6_SUPPORT */ 306*10465441SEvalZero }; 307*10465441SEvalZero #endif /* PPP_SERVER */ 308*10465441SEvalZero 309*10465441SEvalZero /* 310*10465441SEvalZero * PPP interface control block. 311*10465441SEvalZero */ 312*10465441SEvalZero struct ppp_pcb_s { 313*10465441SEvalZero ppp_settings settings; 314*10465441SEvalZero const struct link_callbacks *link_cb; 315*10465441SEvalZero void *link_ctx_cb; 316*10465441SEvalZero void (*link_status_cb)(ppp_pcb *pcb, int err_code, void *ctx); /* Status change callback */ 317*10465441SEvalZero #if PPP_NOTIFY_PHASE 318*10465441SEvalZero void (*notify_phase_cb)(ppp_pcb *pcb, u8_t phase, void *ctx); /* Notify phase callback */ 319*10465441SEvalZero #endif /* PPP_NOTIFY_PHASE */ 320*10465441SEvalZero void *ctx_cb; /* Callbacks optional pointer */ 321*10465441SEvalZero struct netif *netif; /* PPP interface */ 322*10465441SEvalZero u8_t phase; /* where the link is at */ 323*10465441SEvalZero u8_t err_code; /* Code indicating why interface is down. */ 324*10465441SEvalZero 325*10465441SEvalZero /* flags */ 326*10465441SEvalZero #if PPP_IPV4_SUPPORT 327*10465441SEvalZero unsigned int ask_for_local :1; /* request our address from peer */ 328*10465441SEvalZero unsigned int ipcp_is_open :1; /* haven't called np_finished() */ 329*10465441SEvalZero unsigned int ipcp_is_up :1; /* have called ipcp_up() */ 330*10465441SEvalZero unsigned int if4_up :1; /* True when the IPv4 interface is up. */ 331*10465441SEvalZero #if 0 /* UNUSED - PROXY ARP */ 332*10465441SEvalZero unsigned int proxy_arp_set :1; /* Have created proxy arp entry */ 333*10465441SEvalZero #endif /* UNUSED - PROXY ARP */ 334*10465441SEvalZero #endif /* PPP_IPV4_SUPPORT */ 335*10465441SEvalZero #if PPP_IPV6_SUPPORT 336*10465441SEvalZero unsigned int ipv6cp_is_up :1; /* have called ip6cp_up() */ 337*10465441SEvalZero unsigned int if6_up :1; /* True when the IPv6 interface is up. */ 338*10465441SEvalZero #endif /* PPP_IPV6_SUPPORT */ 339*10465441SEvalZero unsigned int lcp_echo_timer_running :1; /* set if a timer is running */ 340*10465441SEvalZero #if VJ_SUPPORT 341*10465441SEvalZero unsigned int vj_enabled :1; /* Flag indicating VJ compression enabled. */ 342*10465441SEvalZero #endif /* VJ_SUPPORT */ 343*10465441SEvalZero #if CCP_SUPPORT 344*10465441SEvalZero unsigned int ccp_all_rejected :1; /* we rejected all peer's options */ 345*10465441SEvalZero #endif /* CCP_SUPPORT */ 346*10465441SEvalZero #if MPPE_SUPPORT 347*10465441SEvalZero unsigned int mppe_keys_set :1; /* Have the MPPE keys been set? */ 348*10465441SEvalZero #endif /* MPPE_SUPPORT */ 349*10465441SEvalZero 350*10465441SEvalZero #if PPP_AUTH_SUPPORT 351*10465441SEvalZero /* auth data */ 352*10465441SEvalZero #if PPP_SERVER && defined(HAVE_MULTILINK) 353*10465441SEvalZero char peer_authname[MAXNAMELEN + 1]; /* The name by which the peer authenticated itself to us. */ 354*10465441SEvalZero #endif /* PPP_SERVER && defined(HAVE_MULTILINK) */ 355*10465441SEvalZero u16_t auth_pending; /* Records which authentication operations haven't completed yet. */ 356*10465441SEvalZero u16_t auth_done; /* Records which authentication operations have been completed. */ 357*10465441SEvalZero 358*10465441SEvalZero #if PAP_SUPPORT 359*10465441SEvalZero upap_state upap; /* PAP data */ 360*10465441SEvalZero #endif /* PAP_SUPPORT */ 361*10465441SEvalZero 362*10465441SEvalZero #if CHAP_SUPPORT 363*10465441SEvalZero chap_client_state chap_client; /* CHAP client data */ 364*10465441SEvalZero #if PPP_SERVER 365*10465441SEvalZero chap_server_state chap_server; /* CHAP server data */ 366*10465441SEvalZero #endif /* PPP_SERVER */ 367*10465441SEvalZero #endif /* CHAP_SUPPORT */ 368*10465441SEvalZero 369*10465441SEvalZero #if EAP_SUPPORT 370*10465441SEvalZero eap_state eap; /* EAP data */ 371*10465441SEvalZero #endif /* EAP_SUPPORT */ 372*10465441SEvalZero #endif /* PPP_AUTH_SUPPORT */ 373*10465441SEvalZero 374*10465441SEvalZero fsm lcp_fsm; /* LCP fsm structure */ 375*10465441SEvalZero lcp_options lcp_wantoptions; /* Options that we want to request */ 376*10465441SEvalZero lcp_options lcp_gotoptions; /* Options that peer ack'd */ 377*10465441SEvalZero lcp_options lcp_allowoptions; /* Options we allow peer to request */ 378*10465441SEvalZero lcp_options lcp_hisoptions; /* Options that we ack'd */ 379*10465441SEvalZero u16_t peer_mru; /* currently negotiated peer MRU */ 380*10465441SEvalZero u8_t lcp_echos_pending; /* Number of outstanding echo msgs */ 381*10465441SEvalZero u8_t lcp_echo_number; /* ID number of next echo frame */ 382*10465441SEvalZero 383*10465441SEvalZero u8_t num_np_open; /* Number of network protocols which we have opened. */ 384*10465441SEvalZero u8_t num_np_up; /* Number of network protocols which have come up. */ 385*10465441SEvalZero 386*10465441SEvalZero #if VJ_SUPPORT 387*10465441SEvalZero struct vjcompress vj_comp; /* Van Jacobson compression header. */ 388*10465441SEvalZero #endif /* VJ_SUPPORT */ 389*10465441SEvalZero 390*10465441SEvalZero #if CCP_SUPPORT 391*10465441SEvalZero fsm ccp_fsm; /* CCP fsm structure */ 392*10465441SEvalZero ccp_options ccp_wantoptions; /* what to request the peer to use */ 393*10465441SEvalZero ccp_options ccp_gotoptions; /* what the peer agreed to do */ 394*10465441SEvalZero ccp_options ccp_allowoptions; /* what we'll agree to do */ 395*10465441SEvalZero ccp_options ccp_hisoptions; /* what we agreed to do */ 396*10465441SEvalZero u8_t ccp_localstate; /* Local state (mainly for handling reset-reqs and reset-acks). */ 397*10465441SEvalZero u8_t ccp_receive_method; /* Method chosen on receive path */ 398*10465441SEvalZero u8_t ccp_transmit_method; /* Method chosen on transmit path */ 399*10465441SEvalZero #if MPPE_SUPPORT 400*10465441SEvalZero ppp_mppe_state mppe_comp; /* MPPE "compressor" structure */ 401*10465441SEvalZero ppp_mppe_state mppe_decomp; /* MPPE "decompressor" structure */ 402*10465441SEvalZero #endif /* MPPE_SUPPORT */ 403*10465441SEvalZero #endif /* CCP_SUPPORT */ 404*10465441SEvalZero 405*10465441SEvalZero #if PPP_IPV4_SUPPORT 406*10465441SEvalZero fsm ipcp_fsm; /* IPCP fsm structure */ 407*10465441SEvalZero ipcp_options ipcp_wantoptions; /* Options that we want to request */ 408*10465441SEvalZero ipcp_options ipcp_gotoptions; /* Options that peer ack'd */ 409*10465441SEvalZero ipcp_options ipcp_allowoptions; /* Options we allow peer to request */ 410*10465441SEvalZero ipcp_options ipcp_hisoptions; /* Options that we ack'd */ 411*10465441SEvalZero #endif /* PPP_IPV4_SUPPORT */ 412*10465441SEvalZero 413*10465441SEvalZero #if PPP_IPV6_SUPPORT 414*10465441SEvalZero fsm ipv6cp_fsm; /* IPV6CP fsm structure */ 415*10465441SEvalZero ipv6cp_options ipv6cp_wantoptions; /* Options that we want to request */ 416*10465441SEvalZero ipv6cp_options ipv6cp_gotoptions; /* Options that peer ack'd */ 417*10465441SEvalZero ipv6cp_options ipv6cp_allowoptions; /* Options we allow peer to request */ 418*10465441SEvalZero ipv6cp_options ipv6cp_hisoptions; /* Options that we ack'd */ 419*10465441SEvalZero #endif /* PPP_IPV6_SUPPORT */ 420*10465441SEvalZero }; 421*10465441SEvalZero 422*10465441SEvalZero /************************ 423*10465441SEvalZero *** PUBLIC FUNCTIONS *** 424*10465441SEvalZero ************************/ 425*10465441SEvalZero 426*10465441SEvalZero /* 427*10465441SEvalZero * WARNING: For multi-threads environment, all ppp_set_* functions most 428*10465441SEvalZero * only be called while the PPP is in the dead phase (i.e. disconnected). 429*10465441SEvalZero */ 430*10465441SEvalZero 431*10465441SEvalZero #if PPP_AUTH_SUPPORT 432*10465441SEvalZero /* 433*10465441SEvalZero * Set PPP authentication. 434*10465441SEvalZero * 435*10465441SEvalZero * Warning: Using PPPAUTHTYPE_ANY might have security consequences. 436*10465441SEvalZero * RFC 1994 says: 437*10465441SEvalZero * 438*10465441SEvalZero * In practice, within or associated with each PPP server, there is a 439*10465441SEvalZero * database which associates "user" names with authentication 440*10465441SEvalZero * information ("secrets"). It is not anticipated that a particular 441*10465441SEvalZero * named user would be authenticated by multiple methods. This would 442*10465441SEvalZero * make the user vulnerable to attacks which negotiate the least secure 443*10465441SEvalZero * method from among a set (such as PAP rather than CHAP). If the same 444*10465441SEvalZero * secret was used, PAP would reveal the secret to be used later with 445*10465441SEvalZero * CHAP. 446*10465441SEvalZero * 447*10465441SEvalZero * Instead, for each user name there should be an indication of exactly 448*10465441SEvalZero * one method used to authenticate that user name. If a user needs to 449*10465441SEvalZero * make use of different authentication methods under different 450*10465441SEvalZero * circumstances, then distinct user names SHOULD be employed, each of 451*10465441SEvalZero * which identifies exactly one authentication method. 452*10465441SEvalZero * 453*10465441SEvalZero * Default is none auth type, unset (NULL) user and passwd. 454*10465441SEvalZero */ 455*10465441SEvalZero #define PPPAUTHTYPE_NONE 0x00 456*10465441SEvalZero #define PPPAUTHTYPE_PAP 0x01 457*10465441SEvalZero #define PPPAUTHTYPE_CHAP 0x02 458*10465441SEvalZero #define PPPAUTHTYPE_MSCHAP 0x04 459*10465441SEvalZero #define PPPAUTHTYPE_MSCHAP_V2 0x08 460*10465441SEvalZero #define PPPAUTHTYPE_EAP 0x10 461*10465441SEvalZero #define PPPAUTHTYPE_ANY 0xff 462*10465441SEvalZero void ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd); 463*10465441SEvalZero 464*10465441SEvalZero /* 465*10465441SEvalZero * If set, peer is required to authenticate. This is mostly necessary for PPP server support. 466*10465441SEvalZero * 467*10465441SEvalZero * Default is false. 468*10465441SEvalZero */ 469*10465441SEvalZero #define ppp_set_auth_required(ppp, boolval) (ppp->settings.auth_required = boolval) 470*10465441SEvalZero #endif /* PPP_AUTH_SUPPORT */ 471*10465441SEvalZero 472*10465441SEvalZero #if PPP_IPV4_SUPPORT 473*10465441SEvalZero /* 474*10465441SEvalZero * Set PPP interface "our" and "his" IPv4 addresses. This is mostly necessary for PPP server 475*10465441SEvalZero * support but it can also be used on a PPP link where each side choose its own IP address. 476*10465441SEvalZero * 477*10465441SEvalZero * Default is unset (0.0.0.0). 478*10465441SEvalZero */ 479*10465441SEvalZero #define ppp_set_ipcp_ouraddr(ppp, addr) do { ppp->ipcp_wantoptions.ouraddr = ip4_addr_get_u32(addr); \ 480*10465441SEvalZero ppp->ask_for_local = ppp->ipcp_wantoptions.ouraddr != 0; } while(0) 481*10465441SEvalZero #define ppp_set_ipcp_hisaddr(ppp, addr) (ppp->ipcp_wantoptions.hisaddr = ip4_addr_get_u32(addr)) 482*10465441SEvalZero #if LWIP_DNS 483*10465441SEvalZero /* 484*10465441SEvalZero * Set DNS server addresses that are sent if the peer asks for them. This is mostly necessary 485*10465441SEvalZero * for PPP server support. 486*10465441SEvalZero * 487*10465441SEvalZero * Default is unset (0.0.0.0). 488*10465441SEvalZero */ 489*10465441SEvalZero #define ppp_set_ipcp_dnsaddr(ppp, index, addr) (ppp->ipcp_allowoptions.dnsaddr[index] = ip4_addr_get_u32(addr)) 490*10465441SEvalZero 491*10465441SEvalZero /* 492*10465441SEvalZero * If set, we ask the peer for up to 2 DNS server addresses. Received DNS server addresses are 493*10465441SEvalZero * registered using the dns_setserver() function. 494*10465441SEvalZero * 495*10465441SEvalZero * Default is false. 496*10465441SEvalZero */ 497*10465441SEvalZero #define ppp_set_usepeerdns(ppp, boolval) (ppp->settings.usepeerdns = boolval) 498*10465441SEvalZero #endif /* LWIP_DNS */ 499*10465441SEvalZero #endif /* PPP_IPV4_SUPPORT */ 500*10465441SEvalZero 501*10465441SEvalZero #if MPPE_SUPPORT 502*10465441SEvalZero /* Disable MPPE (Microsoft Point to Point Encryption). This parameter is exclusive. */ 503*10465441SEvalZero #define PPP_MPPE_DISABLE 0x00 504*10465441SEvalZero /* Require the use of MPPE (Microsoft Point to Point Encryption). */ 505*10465441SEvalZero #define PPP_MPPE_ENABLE 0x01 506*10465441SEvalZero /* Allow MPPE to use stateful mode. Stateless mode is still attempted first. */ 507*10465441SEvalZero #define PPP_MPPE_ALLOW_STATEFUL 0x02 508*10465441SEvalZero /* Refuse the use of MPPE with 40-bit encryption. Conflict with PPP_MPPE_REFUSE_128. */ 509*10465441SEvalZero #define PPP_MPPE_REFUSE_40 0x04 510*10465441SEvalZero /* Refuse the use of MPPE with 128-bit encryption. Conflict with PPP_MPPE_REFUSE_40. */ 511*10465441SEvalZero #define PPP_MPPE_REFUSE_128 0x08 512*10465441SEvalZero /* 513*10465441SEvalZero * Set MPPE configuration 514*10465441SEvalZero * 515*10465441SEvalZero * Default is disabled. 516*10465441SEvalZero */ 517*10465441SEvalZero void ppp_set_mppe(ppp_pcb *pcb, u8_t flags); 518*10465441SEvalZero #endif /* MPPE_SUPPORT */ 519*10465441SEvalZero 520*10465441SEvalZero /* 521*10465441SEvalZero * Wait for up to intval milliseconds for a valid PPP packet from the peer. 522*10465441SEvalZero * At the end of this time, or when a valid PPP packet is received from the 523*10465441SEvalZero * peer, we commence negotiation by sending our first LCP packet. 524*10465441SEvalZero * 525*10465441SEvalZero * Default is 0. 526*10465441SEvalZero */ 527*10465441SEvalZero #define ppp_set_listen_time(ppp, intval) (ppp->settings.listen_time = intval) 528*10465441SEvalZero 529*10465441SEvalZero /* 530*10465441SEvalZero * If set, we will attempt to initiate a connection but if no reply is received from 531*10465441SEvalZero * the peer, we will then just wait passively for a valid LCP packet from the peer. 532*10465441SEvalZero * 533*10465441SEvalZero * Default is false. 534*10465441SEvalZero */ 535*10465441SEvalZero #define ppp_set_passive(ppp, boolval) (ppp->lcp_wantoptions.passive = boolval) 536*10465441SEvalZero 537*10465441SEvalZero /* 538*10465441SEvalZero * If set, we will not transmit LCP packets to initiate a connection until a valid 539*10465441SEvalZero * LCP packet is received from the peer. This is what we usually call the server mode. 540*10465441SEvalZero * 541*10465441SEvalZero * Default is false. 542*10465441SEvalZero */ 543*10465441SEvalZero #define ppp_set_silent(ppp, boolval) (ppp->lcp_wantoptions.silent = boolval) 544*10465441SEvalZero 545*10465441SEvalZero /* 546*10465441SEvalZero * If set, enable protocol field compression negotiation in both the receive and 547*10465441SEvalZero * the transmit direction. 548*10465441SEvalZero * 549*10465441SEvalZero * Default is true. 550*10465441SEvalZero */ 551*10465441SEvalZero #define ppp_set_neg_pcomp(ppp, boolval) (ppp->lcp_wantoptions.neg_pcompression = \ 552*10465441SEvalZero ppp->lcp_allowoptions.neg_pcompression = boolval) 553*10465441SEvalZero 554*10465441SEvalZero /* 555*10465441SEvalZero * If set, enable Address/Control compression in both the receive and the transmit 556*10465441SEvalZero * direction. 557*10465441SEvalZero * 558*10465441SEvalZero * Default is true. 559*10465441SEvalZero */ 560*10465441SEvalZero #define ppp_set_neg_accomp(ppp, boolval) (ppp->lcp_wantoptions.neg_accompression = \ 561*10465441SEvalZero ppp->lcp_allowoptions.neg_accompression = boolval) 562*10465441SEvalZero 563*10465441SEvalZero /* 564*10465441SEvalZero * If set, enable asyncmap negotiation. Otherwise forcing all control characters to 565*10465441SEvalZero * be escaped for both the transmit and the receive direction. 566*10465441SEvalZero * 567*10465441SEvalZero * Default is true. 568*10465441SEvalZero */ 569*10465441SEvalZero #define ppp_set_neg_asyncmap(ppp, boolval) (ppp->lcp_wantoptions.neg_asyncmap = \ 570*10465441SEvalZero ppp->lcp_allowoptions.neg_asyncmap = boolval) 571*10465441SEvalZero 572*10465441SEvalZero /* 573*10465441SEvalZero * This option sets the Async-Control-Character-Map (ACCM) for this end of the link. 574*10465441SEvalZero * The ACCM is a set of 32 bits, one for each of the ASCII control characters with 575*10465441SEvalZero * values from 0 to 31, where a 1 bit indicates that the corresponding control 576*10465441SEvalZero * character should not be used in PPP packets sent to this system. The map is 577*10465441SEvalZero * an unsigned 32 bits integer where the least significant bit (00000001) represents 578*10465441SEvalZero * character 0 and the most significant bit (80000000) represents character 31. 579*10465441SEvalZero * We will then ask the peer to send these characters as a 2-byte escape sequence. 580*10465441SEvalZero * 581*10465441SEvalZero * Default is 0. 582*10465441SEvalZero */ 583*10465441SEvalZero #define ppp_set_asyncmap(ppp, intval) (ppp->lcp_wantoptions.asyncmap = intval) 584*10465441SEvalZero 585*10465441SEvalZero /* 586*10465441SEvalZero * Set a PPP interface as the default network interface 587*10465441SEvalZero * (used to output all packets for which no specific route is found). 588*10465441SEvalZero */ 589*10465441SEvalZero #define ppp_set_default(ppp) netif_set_default(ppp->netif) 590*10465441SEvalZero 591*10465441SEvalZero #if PPP_NOTIFY_PHASE 592*10465441SEvalZero /* 593*10465441SEvalZero * Set a PPP notify phase callback. 594*10465441SEvalZero * 595*10465441SEvalZero * This can be used for example to set a LED pattern depending on the 596*10465441SEvalZero * current phase of the PPP session. 597*10465441SEvalZero */ 598*10465441SEvalZero typedef void (*ppp_notify_phase_cb_fn)(ppp_pcb *pcb, u8_t phase, void *ctx); 599*10465441SEvalZero void ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb); 600*10465441SEvalZero #endif /* PPP_NOTIFY_PHASE */ 601*10465441SEvalZero 602*10465441SEvalZero /* 603*10465441SEvalZero * Initiate a PPP connection. 604*10465441SEvalZero * 605*10465441SEvalZero * This can only be called if PPP is in the dead phase. 606*10465441SEvalZero * 607*10465441SEvalZero * Holdoff is the time to wait (in seconds) before initiating 608*10465441SEvalZero * the connection. 609*10465441SEvalZero * 610*10465441SEvalZero * If this port connects to a modem, the modem connection must be 611*10465441SEvalZero * established before calling this. 612*10465441SEvalZero */ 613*10465441SEvalZero err_t ppp_connect(ppp_pcb *pcb, u16_t holdoff); 614*10465441SEvalZero 615*10465441SEvalZero #if PPP_SERVER 616*10465441SEvalZero /* 617*10465441SEvalZero * Listen for an incoming PPP connection. 618*10465441SEvalZero * 619*10465441SEvalZero * This can only be called if PPP is in the dead phase. 620*10465441SEvalZero * 621*10465441SEvalZero * If this port connects to a modem, the modem connection must be 622*10465441SEvalZero * established before calling this. 623*10465441SEvalZero */ 624*10465441SEvalZero err_t ppp_listen(ppp_pcb *pcb); 625*10465441SEvalZero #endif /* PPP_SERVER */ 626*10465441SEvalZero 627*10465441SEvalZero /* 628*10465441SEvalZero * Initiate the end of a PPP connection. 629*10465441SEvalZero * Any outstanding packets in the queues are dropped. 630*10465441SEvalZero * 631*10465441SEvalZero * Setting nocarrier to 1 close the PPP connection without initiating the 632*10465441SEvalZero * shutdown procedure. Always using nocarrier = 0 is still recommended, 633*10465441SEvalZero * this is going to take a little longer time if your link is down, but 634*10465441SEvalZero * is a safer choice for the PPP state machine. 635*10465441SEvalZero * 636*10465441SEvalZero * Return 0 on success, an error code on failure. 637*10465441SEvalZero */ 638*10465441SEvalZero err_t ppp_close(ppp_pcb *pcb, u8_t nocarrier); 639*10465441SEvalZero 640*10465441SEvalZero /* 641*10465441SEvalZero * Release the control block. 642*10465441SEvalZero * 643*10465441SEvalZero * This can only be called if PPP is in the dead phase. 644*10465441SEvalZero * 645*10465441SEvalZero * You must use ppp_close() before if you wish to terminate 646*10465441SEvalZero * an established PPP session. 647*10465441SEvalZero * 648*10465441SEvalZero * Return 0 on success, an error code on failure. 649*10465441SEvalZero */ 650*10465441SEvalZero err_t ppp_free(ppp_pcb *pcb); 651*10465441SEvalZero 652*10465441SEvalZero /* 653*10465441SEvalZero * PPP IOCTL commands. 654*10465441SEvalZero * 655*10465441SEvalZero * Get the up status - 0 for down, non-zero for up. The argument must 656*10465441SEvalZero * point to an int. 657*10465441SEvalZero */ 658*10465441SEvalZero #define PPPCTLG_UPSTATUS 0 659*10465441SEvalZero 660*10465441SEvalZero /* 661*10465441SEvalZero * Get the PPP error code. The argument must point to an int. 662*10465441SEvalZero * Returns a PPPERR_* value. 663*10465441SEvalZero */ 664*10465441SEvalZero #define PPPCTLG_ERRCODE 1 665*10465441SEvalZero 666*10465441SEvalZero /* 667*10465441SEvalZero * Get the fd associated with a PPP over serial 668*10465441SEvalZero */ 669*10465441SEvalZero #define PPPCTLG_FD 2 670*10465441SEvalZero 671*10465441SEvalZero /* 672*10465441SEvalZero * Get and set parameters for the given connection. 673*10465441SEvalZero * Return 0 on success, an error code on failure. 674*10465441SEvalZero */ 675*10465441SEvalZero err_t ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg); 676*10465441SEvalZero 677*10465441SEvalZero /* Get the PPP netif interface */ 678*10465441SEvalZero #define ppp_netif(ppp) (ppp->netif) 679*10465441SEvalZero 680*10465441SEvalZero /* Set an lwIP-style status-callback for the selected PPP device */ 681*10465441SEvalZero #define ppp_set_netif_statuscallback(ppp, status_cb) \ 682*10465441SEvalZero netif_set_status_callback(ppp->netif, status_cb); 683*10465441SEvalZero 684*10465441SEvalZero /* Set an lwIP-style link-callback for the selected PPP device */ 685*10465441SEvalZero #define ppp_set_netif_linkcallback(ppp, link_cb) \ 686*10465441SEvalZero netif_set_link_callback(ppp->netif, link_cb); 687*10465441SEvalZero 688*10465441SEvalZero #endif /* PPP_H */ 689*10465441SEvalZero 690*10465441SEvalZero #endif /* PPP_SUPPORT */ 691