diff options
Diffstat (limited to 'os/ip/ppp.h')
| -rw-r--r-- | os/ip/ppp.h | 258 |
1 files changed, 258 insertions, 0 deletions
diff --git a/os/ip/ppp.h b/os/ip/ppp.h new file mode 100644 index 00000000..4f1e00de --- /dev/null +++ b/os/ip/ppp.h @@ -0,0 +1,258 @@ +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*); |
