source: azure_iot_hub_f767zi/trunk/asp_baseplatform/lwip/lwip-2.1.2/src/include/netif/ppp/ppp_impl.h@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

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