37#ifndef LWIP_HDR_PPP_IMPL_H
38#define LWIP_HDR_PPP_IMPL_H
44#ifdef PPP_INCLUDE_SETTINGS_HEADER
45#include "ppp_settings.h"
70#define PPP_CTRL_PBUF_UNKNOWN_SIZE 512
75#define PPP_ADDRESS(p) (((u_char *)(p))[0])
76#define PPP_CONTROL(p) (((u_char *)(p))[1])
77#define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
82#define PPP_ALLSTATIONS 0xff
85#define PPP_ESCAPE 0x7d
92#define PPP_DEFMRU 1500
105#define PPP_VJC_COMP 0x2d
106#define PPP_VJC_UNCOMP 0x2f
114#define PPP_IPCP 0x8021
116#define PPP_ATCP 0x8029
117#define PPP_IPXCP 0x802b
120#define PPP_IPV6CP 0x8057
123#define PPP_CCP 0x80fd
126#define PPP_ECP 0x8053
128#define PPP_LCP 0xc021
130#define PPP_PAP 0xc023
133#define PPP_LQR 0xc025
136#define PPP_CHAP 0xc223
139#define PPP_CBCP 0xc029
142#define PPP_EAP 0xc227
149struct link_callbacks {
151 void (*connect) (ppp_pcb *pcb,
void *ctx);
154 void (*listen) (ppp_pcb *pcb,
void *ctx);
157 void (*disconnect) (ppp_pcb *pcb,
void *ctx);
159 err_t (*free) (ppp_pcb *pcb,
void *ctx);
161 err_t (*write)(ppp_pcb *pcb,
void *ctx,
struct pbuf *p);
163 err_t (*netif_output)(ppp_pcb *pcb,
void *ctx,
struct pbuf *p, u_short protocol);
165 void (*send_config)(ppp_pcb *pcb,
void *ctx, u32_t accm,
int pcomp,
int accomp);
167 void (*recv_config)(ppp_pcb *pcb,
void *ctx, u32_t accm,
int pcomp,
int accomp);
185 unsigned int ppp_ibytes;
186 unsigned int ppp_ipackets;
187 unsigned int ppp_ierrors;
188 unsigned int ppp_obytes;
189 unsigned int ppp_opackets;
190 unsigned int ppp_oerrors;
195 unsigned int vjs_packets;
196 unsigned int vjs_compressed;
197 unsigned int vjs_searches;
198 unsigned int vjs_misses;
199 unsigned int vjs_uncompressedin;
200 unsigned int vjs_compressedin;
201 unsigned int vjs_errorin;
202 unsigned int vjs_tossed;
215 unsigned int unc_bytes;
216 unsigned int unc_packets;
217 unsigned int comp_bytes;
218 unsigned int comp_packets;
219 unsigned int inc_bytes;
220 unsigned int inc_packets;
224struct ppp_comp_stats {
249#define EPD_PHONENUM 5
255extern u8_t multilink;
256extern u8_t doing_multilink;
257extern u8_t multilink_master;
258extern u8_t bundle_eof;
259extern u8_t bundle_terminating;
263extern unsigned int maxoctets;
264extern int maxoctets_dir;
269extern int maxoctets_timeout;
270#define PPP_OCTETS_DIRECTION_SUM 0
271#define PPP_OCTETS_DIRECTION_IN 1
272#define PPP_OCTETS_DIRECTION_OUT 2
273#define PPP_OCTETS_DIRECTION_MAXOVERAL 3
275#define PPP_OCTETS_DIRECTION_MAXSESSION 4
281#define PPP_DATAINPUT 0
290 void (*init) (ppp_pcb *pcb);
292 void (*input) (ppp_pcb *pcb, u_char *pkt,
int len);
294 void (*protrej) (ppp_pcb *pcb);
296 void (*lowerup) (ppp_pcb *pcb);
298 void (*lowerdown) (ppp_pcb *pcb);
300 void (*open) (ppp_pcb *pcb);
302 void (*close) (ppp_pcb *pcb,
const char *reason);
305 int (*printpkt) (
const u_char *pkt,
int len,
306 void (*printer) (
void *,
const char *, ...),
311 void (*datainput) (ppp_pcb *pcb, u_char *pkt,
int len);
315 const char *data_name;
320 void (*check_options) (void);
324 int (*demand_conf) (
int unit);
326 int (*active_pkt) (u_char *pkt,
int len);
331extern const struct protent*
const protocols[];
336#define PAP_WITHPEER 0x1
340#define CHAP_WITHPEER 0x4
344#define EAP_WITHPEER 0x10
350#define CHAP_MD5_WITHPEER 0x40
351#define CHAP_MD5_PEER 0x80
353#define CHAP_MS_SHIFT 8
354#define CHAP_MS_WITHPEER 0x100
355#define CHAP_MS_PEER 0x200
356#define CHAP_MS2_WITHPEER 0x400
357#define CHAP_MS2_PEER 0x800
365#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT | MDTYPE_MD5)
367#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MD5)
371#define CHAP_MDTYPE_SUPPORTED (MDTYPE_NONE)
379 unsigned int bytes_in;
380 unsigned int bytes_out;
381 unsigned int pkts_in;
382 unsigned int pkts_out;
404ppp_pcb *ppp_new(
struct netif *pppif,
const struct link_callbacks *callbacks,
void *link_ctx_cb,
405 ppp_link_status_cb_fn link_status_cb,
void *ctx_cb);
408void ppp_start(ppp_pcb *pcb);
411void ppp_link_failed(ppp_pcb *pcb);
414void ppp_link_end(ppp_pcb *pcb);
417void ppp_input(ppp_pcb *pcb,
struct pbuf *pb);
425err_t ppp_write(ppp_pcb *pcb,
struct pbuf *p);
428void ppp_link_terminated(ppp_pcb *pcb);
430void new_phase(ppp_pcb *pcb,
int p);
432int ppp_send_config(ppp_pcb *pcb,
int mtu, u32_t accm,
int pcomp,
int accomp);
433int ppp_recv_config(ppp_pcb *pcb,
int mru, u32_t accm,
int pcomp,
int accomp);
436int sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask);
437int cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr);
439int sifproxyarp(ppp_pcb *pcb, u32_t his_adr);
440int cifproxyarp(ppp_pcb *pcb, u32_t his_adr);
443int sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2);
444int cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2);
447int sifvjcomp(ppp_pcb *pcb,
int vjcomp,
int cidcomp,
int maxcid);
449int sifup(ppp_pcb *pcb);
450int sifdown (ppp_pcb *pcb);
451u32_t get_mask(u32_t addr);
455int sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64);
456int cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64);
457int sif6up(ppp_pcb *pcb);
458int sif6down (ppp_pcb *pcb);
462int sifnpmode(ppp_pcb *pcb,
int proto,
enum NPmode mode);
465void ppp_netif_set_mtu(ppp_pcb *pcb,
int mtu);
466int ppp_netif_get_mtu(ppp_pcb *pcb);
470int ccp_test(ppp_pcb *pcb, u_char *opt_ptr,
int opt_len,
int for_transmit);
472void ccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method);
473void ccp_reset_comp(ppp_pcb *pcb);
474void ccp_reset_decomp(ppp_pcb *pcb);
476int ccp_fatal_error(ppp_pcb *pcb);
481int get_idle_time(ppp_pcb *pcb,
struct ppp_idle *ip);
485int get_loop_output(
void);
490const char * protocol_name(
int proto);
495void print_link_stats(
void);
496void reset_link_stats(
int u);
497void update_link_stats(
int u);
508#define GETCHAR(c, cp) { \
511#define PUTCHAR(c, cp) { \
512 *(cp)++ = (u_char) (c); \
514#define GETSHORT(s, cp) { \
515 (s) = *(cp)++ << 8; \
518#define PUTSHORT(s, cp) { \
519 *(cp)++ = (u_char) ((s) >> 8); \
520 *(cp)++ = (u_char) (s); \
522#define GETLONG(l, cp) { \
523 (l) = *(cp)++ << 8; \
524 (l) |= *(cp)++; (l) <<= 8; \
525 (l) |= *(cp)++; (l) <<= 8; \
528#define PUTLONG(l, cp) { \
529 *(cp)++ = (u_char) ((l) >> 24); \
530 *(cp)++ = (u_char) ((l) >> 16); \
531 *(cp)++ = (u_char) ((l) >> 8); \
532 *(cp)++ = (u_char) (l); \
535#define INCPTR(n, cp) ((cp) += (n))
536#define DECPTR(n, cp) ((cp) -= (n))
541#define TIMEOUT(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t)*1000, (f), (a)); } while(0)
542#define TIMEOUTMS(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0)
543#define UNTIMEOUT(f, a) sys_untimeout((f), (a))
545#define BZERO(s, n) memset(s, 0, n)
546#define BCMP(s1, s2, l) memcmp(s1, s2, l)
548#define PRINTMSG(m, l) { ppp_info(("Remote message: %0.*v", l, m)); }
553#define MAKEHEADER(p, t) { \
554 PUTCHAR(PPP_ALLSTATIONS, p); \
555 PUTCHAR(PPP_UI, p); \
559void link_required(ppp_pcb *pcb);
560void link_terminated(ppp_pcb *pcb);
561void link_down(ppp_pcb *pcb);
562void upper_layers_down(ppp_pcb *pcb);
563void link_established(ppp_pcb *pcb);
564void start_networks(ppp_pcb *pcb);
565void continue_networks(ppp_pcb *pcb);
568int auth_check_passwd(ppp_pcb *pcb,
char *auser,
unsigned int userlen,
char *apasswd,
unsigned int passwdlen,
const char **msg,
int *msglen);
570void auth_peer_fail(ppp_pcb *pcb,
int protocol);
572void auth_peer_success(ppp_pcb *pcb,
int protocol,
int prot_flavor,
const char *name,
int namelen);
575void auth_withpeer_fail(ppp_pcb *pcb,
int protocol);
577void auth_withpeer_success(ppp_pcb *pcb,
int protocol,
int prot_flavor);
580void np_up(ppp_pcb *pcb,
int proto);
581void np_down(ppp_pcb *pcb,
int proto);
582void np_finished(ppp_pcb *pcb,
int proto);
584int get_secret(ppp_pcb *pcb,
const char *client,
const char *server,
char *secret,
int *secret_len,
int am_server);
593void demand_conf (
void);
594void demand_block (
void);
595void demand_unblock (
void);
596void demand_discard (
void);
597void demand_rexmit (
int, u32_t);
598int loop_chars (
unsigned char *,
int);
599int loop_frame (
unsigned char *,
int);
604void mp_check_options (
void);
605int mp_join_bundle (
void);
606void mp_exit_bundle (
void);
607void mp_bundle_terminated (
void);
608char *epdisc_to_str (
struct epdisc *);
609int str_to_epdisc (
struct epdisc *,
char *);
611#define mp_bundle_terminated()
612#define mp_exit_bundle()
613#define doing_multilink 0
614#define multilink_master 0
618void ppp_print_string(
const u_char *p,
int len,
void (*printer) (
void *,
const char *, ...),
void *arg);
619int ppp_slprintf(
char *buf,
int buflen,
const char *fmt, ...);
620int ppp_vslprintf(
char *buf,
int buflen,
const char *fmt, va_list args);
621size_t ppp_strlcpy(
char *dest,
const char *src,
size_t len);
622size_t ppp_strlcat(
char *dest,
const char *src,
size_t len);
623void ppp_dbglog_impl(
const char *fmt, ...);
624void ppp_info_impl(
const char *fmt, ...);
625void ppp_notice_impl(
const char *fmt, ...);
626void ppp_warn_impl(
const char *fmt, ...);
627void ppp_error_impl(
const char *fmt, ...);
628void ppp_fatal_impl(
const char *fmt, ...);
630#define ppp_dbglog(x) do { if (LWIP_DEBUG_ENABLED(LOG_DEBUG)) { ppp_dbglog_impl x; }} while(0)
631#define ppp_info(x) do { if (LWIP_DEBUG_ENABLED(LOG_INFO)) { ppp_info_impl x; }} while(0)
632#define ppp_notice(x) do { if (LWIP_DEBUG_ENABLED(LOG_NOTICE)) { ppp_notice_impl x; }} while(0)
633#define ppp_warn(x) do { if (LWIP_DEBUG_ENABLED(LOG_WARNING)) { ppp_warn_impl x; }} while(0)
634#define ppp_error(x) do { if (LWIP_DEBUG_ENABLED(LOG_ERR)) { ppp_error_impl x; }} while(0)
635#define ppp_fatal(x) do { if (LWIP_DEBUG_ENABLED(LOG_CRITICAL)) { ppp_fatal_impl x; }} while(0)
637void ppp_dump_packet(ppp_pcb *pcb,
const char *tag,
unsigned char *p,
int len);