Refactored icmpkick6
[akaros.git] / kern / src / net / ppp.h
1 typedef struct PPP PPP;
2 typedef struct Pstate Pstate;
3 typedef struct Lcpmsg Lcpmsg;
4 typedef struct Lcpopt Lcpopt;
5 typedef struct Qualpkt Qualpkt;
6 typedef struct Qualstats Qualstats;
7 typedef struct Tcpc Tcpc;
8
9 typedef uchar Ipaddr[IPaddrlen];
10
11 enum {
12         HDLC_frame = 0x7e,
13         HDLC_esc = 0x7d,
14
15         /* PPP frame fields */
16         PPP_addr = 0xff,
17         PPP_ctl = 0x3,
18         PPP_initfcs = 0xffff,
19         PPP_goodfcs = 0xf0b8,
20
21         /* PPP phases */
22         Pdead = 0,
23         Plink,  /* doing LCP */
24         Pauth,  /* doing chap */
25         Pnet,   /* doing IPCP, CCP */
26         Pterm,  /* closing down */
27
28         /* PPP protocol types */
29         Pip = 0x21,     /* internet */
30         Pvjctcp = 0x2d, /* compressing van jacobson tcp */
31         Pvjutcp = 0x2f, /* uncompressing van jacobson tcp */
32         Pcdata = 0xfd,  /* compressed datagram */
33         Pipcp = 0x8021, /* ip control */
34         Pecp = 0x8053,  /* encryption control */
35         Pccp = 0x80fd,  /* compressed datagram control */
36         Plcp = 0xc021,  /* link control */
37         Ppap = 0xc023,  /* password auth. protocol */
38         Plqm = 0xc025,  /* link quality monitoring */
39         Pchap = 0xc223, /* challenge/response */
40
41         /* LCP codes */
42         Lconfreq = 1,
43         Lconfack = 2,
44         Lconfnak = 3,
45         Lconfrej = 4,
46         Ltermreq = 5,
47         Ltermack = 6,
48         Lcoderej = 7,
49         Lprotorej = 8,
50         Lechoreq = 9,
51         Lechoack = 10,
52         Ldiscard = 11,
53
54         /* Lcp configure options */
55         Omtu = 1,
56         Octlmap = 2,
57         Oauth = 3,
58         Oquality = 4,
59         Omagic = 5,
60         Opc = 7,
61         Oac = 8,
62         Obad = 12,      /* for testing */
63
64         /* authentication protocols */
65         APmd5 = 5,
66
67         /* lcp flags */
68         Fmtu = 1 << Omtu,
69         Fctlmap = 1 << Octlmap,
70         Fauth = 1 << Oauth,
71         Fquality = 1 << Oquality,
72         Fmagic = 1 << Omagic,
73         Fpc = 1 << Opc,
74         Fac = 1 << Oac,
75         Fbad = 1 << Obad,
76
77         /* Chap codes */
78         Cchallenge = 1,
79         Cresponse = 2,
80         Csuccess = 3,
81         Cfailure = 4,
82
83         /* Pap codes */
84         Cpapreq = 1,
85         Cpapack = 2,
86         Cpapnak = 3,
87
88         /* link states */
89         Sclosed = 0,
90         Sclosing,
91         Sreqsent,
92         Sackrcvd,
93         Sacksent,
94         Sopened,
95
96         /* ccp configure options */
97         Ocoui = 0,      /* proprietary compression */
98         Ocstac = 17,    /* stac electronics LZS */
99         Ocmppc = 18,    /* microsoft ppc */
100
101         /* ccp flags */
102         Fcoui = 1 << Ocoui,
103         Fcstac = 1 << Ocstac,
104         Fcmppc = 1 << Ocmppc,
105
106         /* ecp configure options */
107         Oeoui = 0,      /* proprietary compression */
108         Oedese = 1,     /* DES */
109
110         /* ecp flags */
111         Feoui = 1 << Oeoui,
112         Fedese = 1 << Oedese,
113
114         /* ipcp configure options */
115         Oipaddrs = 1,
116         Oipcompress = 2,
117         Oipaddr = 3,
118         Oipdns = 129,
119         Oipwins = 130,
120         Oipdns2 = 131,
121         Oipwins2 = 132,
122
123         /* ipcp flags */
124         Fipaddrs = 1 << Oipaddrs,
125         Fipcompress = 1 << Oipcompress,
126         Fipaddr = 1 << Oipaddr,
127
128         Period = 3 * 1000,      /* period of retransmit process (in ms) */
129         Timeout = 10,   /* xmit timeout (in Periods) */
130
131         MAX_STATES = 16,        /* van jacobson compression states */
132         Defmtu = 1450,  /* default that we will ask for */
133         Minmtu = 128,   /* minimum that we will accept */
134         Maxmtu = 2000,  /* maximum that we will accept */
135 };
136
137 struct Pstate {
138         int proto;                                      /* protocol type */
139         int timeout;                            /* for current state */
140         int rxtimeout;                          /* for current retransmit */
141         ulong flags;                            /* options received */
142         uchar id;                                       /* id of current message */
143         uchar confid;                           /* id of current config message */
144         uchar termid;                           /* id of current termination message */
145         uchar rcvdconfid;                       /* id of last conf message received */
146         uchar state;                            /* PPP link state */
147         ulong optmask;                          /* which options to request */
148         int echoack;                            /* recieved echo ack */
149         int echotimeout;                        /* echo timeout */
150 };
151
152 struct Qualstats {
153         ulong reports;
154         ulong packets;
155         ulong bytes;
156         ulong discards;
157         ulong errors;
158 };
159
160 struct PPP {
161         QLock;
162
163         Chan *dchan;                            /* serial line */
164         Chan *cchan;                            /* serial line control */
165         int framing;                            /* non-zero to use framing characters */
166         Ipaddr local;
167         int localfrozen;
168         Ipaddr remote;
169         int remotefrozen;
170
171         int pppup;
172         Fs *f;                                          /* file system we belong to */
173         Ipifc *ifc;
174         Proc *readp;                            /* reading process */
175         Proc *timep;                            /* timer process */
176         Block *inbuf;                           /* input buffer */
177         Block *outbuf;                          /* output buffer */
178         QLock outlock;                          /*  and its lock */
179
180         ulong magic;                            /* magic number to detect loop backs */
181         ulong rctlmap;                          /* map of chars to ignore in rcvr */
182         ulong xctlmap;                          /* map of chars to excape in xmit */
183         int phase;                                      /* PPP phase */
184         Pstate *lcp;                            /* lcp state */
185         Pstate *ipcp;                           /* ipcp state */
186         char secret[256];                       /* md5 key */
187         char chapname[256];                     /* chap system name */
188         Tcpc *ctcp;
189         ulong mtu;                                      /* maximum xmit size */
190         ulong mru;                                      /* maximum recv size */
191
192         int baud;
193         int usepap;                                     /* authentication is PAP in every sense, not CHAP */
194         int papid;
195         int usechap;
196
197         /* rfc */
198         int usedns;
199         Ipaddr dns1;
200         Ipaddr dns2;
201
202         /* link quality monitoring */
203         int period;                                     /* lqm period */
204         int timeout;                            /* time to next lqm packet */
205         Qualstats in;                           /* local */
206         Qualstats out;
207         Qualstats pin;                          /* peer */
208         Qualstats pout;
209         Qualstats sin;                          /* saved */
210 };
211
212 PPP *pppopen(PPP *, char *, Ipaddr, Ipaddr, int, int, char *, char *);
213 Block *pppread(PPP *);
214 int pppwrite(PPP *, Block *);
215 void pppclose(PPP *);
216
217 struct Lcpmsg {
218         uchar code;
219         uchar id;
220         uchar len[2];
221         uchar data[1];
222 };
223
224 struct Lcpopt {
225         uchar type;
226         uchar len;
227         uchar data[1];
228 };
229
230 struct Qualpkt {
231         uchar magic[4];
232
233         uchar lastoutreports[4];
234         uchar lastoutpackets[4];
235         uchar lastoutbytes[4];
236         uchar peerinreports[4];
237         uchar peerinpackets[4];
238         uchar peerindiscards[4];
239         uchar peerinerrors[4];
240         uchar peerinbytes[4];
241         uchar peeroutreports[4];
242         uchar peeroutpackets[4];
243         uchar peeroutbytes[4];
244 };
245
246 ushort compress(Tcpc *, Block *, Fs *);
247 Tcpc *compress_init(Tcpc *);
248 int compress_negotiate(Tcpc *, uchar *);
249 ushort tcpcompress(Tcpc *, Block *, Fs *);
250 Block *tcpuncompress(Tcpc *, Block *, ushort, Fs *);