ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
dir: /os/ip/ppp.h/
typedef struct PPP PPP;
typedef struct Pstate Pstate;
typedef struct Lcpmsg Lcpmsg;
typedef struct Lcpopt Lcpopt;
typedef struct Qualpkt Qualpkt;
typedef struct Qualstats Qualstats;
typedef struct Tcpc Tcpc;
typedef uchar Ipaddr[IPaddrlen];
enum
{
HDLC_frame= 0x7e,
HDLC_esc= 0x7d,
/* PPP frame fields */
PPP_addr= 0xff,
PPP_ctl= 0x3,
PPP_initfcs= 0xffff,
PPP_goodfcs= 0xf0b8,
/* PPP phases */
Pdead= 0,
Plink, /* doing LCP */
Pauth, /* doing chap */
Pnet, /* doing IPCP, CCP */
Pterm, /* closing down */
/* PPP protocol types */
Pip= 0x21, /* internet */
Pvjctcp= 0x2d, /* compressing van jacobson tcp */
Pvjutcp= 0x2f, /* uncompressing van jacobson tcp */
Pcdata= 0xfd, /* compressed datagram */
Pipcp= 0x8021, /* ip control */
Pecp= 0x8053, /* encryption control */
Pccp= 0x80fd, /* compressed datagram control */
Plcp= 0xc021, /* link control */
Ppap= 0xc023, /* password auth. protocol */
Plqm= 0xc025, /* link quality monitoring */
Pchap= 0xc223, /* challenge/response */
/* LCP codes */
Lconfreq= 1,
Lconfack= 2,
Lconfnak= 3,
Lconfrej= 4,
Ltermreq= 5,
Ltermack= 6,
Lcoderej= 7,
Lprotorej= 8,
Lechoreq= 9,
Lechoack= 10,
Ldiscard= 11,
/* Lcp configure options */
Omtu= 1,
Octlmap= 2,
Oauth= 3,
Oquality= 4,
Omagic= 5,
Opc= 7,
Oac= 8,
Obad= 12, /* for testing */
/* authentication protocols */
APmd5= 5,
/* lcp flags */
Fmtu= 1<<Omtu,
Fctlmap= 1<<Octlmap,
Fauth= 1<<Oauth,
Fquality= 1<<Oquality,
Fmagic= 1<<Omagic,
Fpc= 1<<Opc,
Fac= 1<<Oac,
Fbad= 1<<Obad,
/* Chap codes */
Cchallenge= 1,
Cresponse= 2,
Csuccess= 3,
Cfailure= 4,
/* Pap codes */
Cpapreq= 1,
Cpapack= 2,
Cpapnak= 3,
/* link states */
Sclosed= 0,
Sclosing,
Sreqsent,
Sackrcvd,
Sacksent,
Sopened,
/* ccp configure options */
Ocoui= 0, /* proprietary compression */
Ocstac= 17, /* stac electronics LZS */
Ocmppc= 18, /* microsoft ppc */
/* ccp flags */
Fcoui= 1<<Ocoui,
Fcstac= 1<<Ocstac,
Fcmppc= 1<<Ocmppc,
/* ecp configure options */
Oeoui= 0, /* proprietary compression */
Oedese= 1, /* DES */
/* ecp flags */
Feoui= 1<<Oeoui,
Fedese= 1<<Oedese,
/* ipcp configure options */
Oipaddrs= 1,
Oipcompress= 2,
Oipaddr= 3,
Oipdns= 129,
Oipwins= 130,
Oipdns2= 131,
Oipwins2= 132,
/* ipcp flags */
Fipaddrs= 1<<Oipaddrs,
Fipcompress= 1<<Oipcompress,
Fipaddr= 1<<Oipaddr,
Period= 3*1000, /* period of retransmit process (in ms) */
Timeout= 10, /* xmit timeout (in Periods) */
MAX_STATES = 16, /* van jacobson compression states */
Defmtu= 1450, /* default that we will ask for */
Minmtu= 128, /* minimum that we will accept */
Maxmtu= 2000, /* maximum that we will accept */
};
struct Pstate
{
int proto; /* protocol type */
int timeout; /* for current state */
int rxtimeout; /* for current retransmit */
ulong flags; /* options received */
uchar id; /* id of current message */
uchar confid; /* id of current config message */
uchar termid; /* id of current termination message */
uchar rcvdconfid; /* id of last conf message received */
uchar state; /* PPP link state */
ulong optmask; /* which options to request */
int echoack; /* recieved echo ack */
int echotimeout; /* echo timeout */
};
struct Qualstats
{
ulong reports;
ulong packets;
ulong bytes;
ulong discards;
ulong errors;
};
struct PPP
{
QLock;
Chan* dchan; /* serial line */
Chan* cchan; /* serial line control */
int framing; /* non-zero to use framing characters */
Ipaddr local;
int localfrozen;
Ipaddr remote;
int remotefrozen;
int pppup;
Fs *f; /* file system we belong to */
Ipifc* ifc;
Proc* readp; /* reading process */
Proc* timep; /* timer process */
Block* inbuf; /* input buffer */
Block* outbuf; /* output buffer */
QLock outlock; /* and its lock */
ulong magic; /* magic number to detect loop backs */
ulong rctlmap; /* map of chars to ignore in rcvr */
ulong xctlmap; /* map of chars to excape in xmit */
int phase; /* PPP phase */
Pstate* lcp; /* lcp state */
Pstate* ipcp; /* ipcp state */
char secret[256]; /* md5 key */
char chapname[256]; /* chap system name */
Tcpc* ctcp;
ulong mtu; /* maximum xmit size */
ulong mru; /* maximum recv size */
int baud;
int usepap; /* authentication is PAP in every sense, not CHAP */
int papid;
int usechap;
/* rfc */
int usedns;
Ipaddr dns1;
Ipaddr dns2;
/* link quality monitoring */
int period; /* lqm period */
int timeout; /* time to next lqm packet */
Qualstats in; /* local */
Qualstats out;
Qualstats pin; /* peer */
Qualstats pout;
Qualstats sin; /* saved */
};
PPP* pppopen(PPP*, char*, Ipaddr, Ipaddr, int, int, char*, char*);
Block* pppread(PPP*);
int pppwrite(PPP*, Block*);
void pppclose(PPP*);
struct Lcpmsg
{
uchar code;
uchar id;
uchar len[2];
uchar data[1];
};
struct Lcpopt
{
uchar type;
uchar len;
uchar data[1];
};
struct Qualpkt
{
uchar magic[4];
uchar lastoutreports[4];
uchar lastoutpackets[4];
uchar lastoutbytes[4];
uchar peerinreports[4];
uchar peerinpackets[4];
uchar peerindiscards[4];
uchar peerinerrors[4];
uchar peerinbytes[4];
uchar peeroutreports[4];
uchar peeroutpackets[4];
uchar peeroutbytes[4];
};
ushort compress(Tcpc*, Block*, Fs*);
Tcpc* compress_init(Tcpc*);
int compress_negotiate(Tcpc*, uchar*);
ushort tcpcompress(Tcpc*, Block*, Fs*);
Block* tcpuncompress(Tcpc*, Block*, ushort, Fs*);