1 typedef struct Tcpc Tcpc; 2 typedef struct Pstate Pstate; 3 typedef struct Chap Chap; 4 typedef struct Qualstats Qualstats; 5 typedef struct Comptype Comptype; 6 typedef struct Uncomptype Uncomptype; 7 typedef struct PPP PPP; 8 typedef struct Lcpmsg Lcpmsg; 9 typedef struct Lcpopt Lcpopt; 10 typedef struct Qualpkt Qualpkt; 11 typedef struct Block Block; 12 13 typedef uchar Ipaddr[IPaddrlen]; 14 15 #pragma incomplete Tcpc 16 17 /* 18 * data blocks 19 */ 20 struct Block 21 { 22 Block *next; 23 Block *flist; 24 Block *list; /* chain of block lists */ 25 uchar *rptr; /* first unconsumed uchar */ 26 uchar *wptr; /* first empty uchar */ 27 uchar *lim; /* 1 past the end of the buffer */ 28 uchar *base; /* start of the buffer */ 29 uchar flags; 30 void *flow; 31 ulong pc; 32 ulong bsz; 33 }; 34 #define BLEN(b) ((b)->wptr-(b)->rptr) 35 36 enum 37 { 38 /* block flags */ 39 S_DELIM = (1<<0), 40 S_HANGUP = (1<<1), 41 S_RHANGUP = (1<<2), 42 43 /* queue states */ 44 QHUNGUP = (1<<0), 45 QFLOW = (1<<1), /* queue is flow controlled */ 46 }; 47 48 Block* allocb(int); 49 void freeb(Block*); 50 Block* concat(Block*); 51 int blen(Block*); 52 Block* pullup(Block*, int); 53 Block* padb(Block*, int); 54 Block* btrim(Block*, int, int); 55 Block* copyb(Block*, int); 56 int pullb(Block**, int); 57 58 enum { 59 HDLC_frame= 0x7e, 60 HDLC_esc= 0x7d, 61 62 /* PPP frame fields */ 63 PPP_addr= 0xff, 64 PPP_ctl= 0x3, 65 PPP_initfcs= 0xffff, 66 PPP_goodfcs= 0xf0b8, 67 68 /* PPP phases */ 69 Pdead= 0, 70 Plink, /* doing LCP */ 71 Pauth, /* doing chap */ 72 Pnet, /* doing IPCP, CCP */ 73 Pterm, /* closing down */ 74 75 /* PPP protocol types */ 76 Pip= 0x21, /* ip v4 */ 77 Pipv6= 0x57, /* ip v6 */ 78 Pvjctcp= 0x2d, /* compressing van jacobson tcp */ 79 Pvjutcp= 0x2f, /* uncompressing van jacobson tcp */ 80 Pcdata= 0xfd, /* compressed datagram */ 81 Pipcp= 0x8021, /* ip control */ 82 Pecp= 0x8053, /* encryption control */ 83 Pccp= 0x80fd, /* compressed datagram control */ 84 Plcp= 0xc021, /* link control */ 85 Ppasswd= 0xc023, /* passwd authentication */ 86 Plqm= 0xc025, /* link quality monitoring */ 87 Pchap= 0xc223, /* challenge/response */ 88 89 /* LCP codes */ 90 Lconfreq= 1, 91 Lconfack= 2, 92 Lconfnak= 3, 93 Lconfrej= 4, 94 Ltermreq= 5, 95 Ltermack= 6, 96 Lcoderej= 7, 97 Lprotorej= 8, 98 Lechoreq= 9, 99 Lechoack= 10, 100 Ldiscard= 11, 101 Lresetreq= 14, 102 Lresetack= 15, 103 104 /* Lcp configure options */ 105 Omtu= 1, 106 Octlmap= 2, 107 Oauth= 3, 108 Oquality= 4, 109 Omagic= 5, 110 Opc= 7, 111 Oac= 8, 112 113 /* authentication protocols */ 114 APmd5= 5, 115 APmschap= 128, 116 APpasswd= Ppasswd, /* use Pap, not Chap */ 117 118 /* lcp flags */ 119 Fmtu= 1<<Omtu, 120 Fctlmap= 1<<Octlmap, 121 Fauth= 1<<Oauth, 122 Fquality= 1<<Oquality, 123 Fmagic= 1<<Omagic, 124 Fpc= 1<<Opc, 125 Fac= 1<<Oac, 126 127 /* Chap codes */ 128 Cchallenge= 1, 129 Cresponse= 2, 130 Csuccess= 3, 131 Cfailure= 4, 132 133 /* Pap codes */ 134 Pauthreq= 1, 135 Pauthack= 2, 136 Pauthnak= 3, 137 138 /* Chap state */ 139 Cunauth= 0, 140 Cchalsent, 141 Cauthfail, 142 Cauthok, 143 144 /* link states */ 145 Sclosed= 0, 146 Sclosing, 147 Sreqsent, 148 Sackrcvd, 149 Sacksent, 150 Sopened, 151 152 /* ccp configure options */ 153 Ocoui= 0, /* proprietary compression */ 154 Ocstac= 17, /* stac electronics LZS */ 155 Ocmppc= 18, /* microsoft ppc */ 156 Octhwack= 31, /* thwack; unofficial */ 157 158 /* ccp flags */ 159 Fcoui= 1<<Ocoui, 160 Fcstac= 1<<Ocstac, 161 Fcmppc= 1<<Ocmppc, 162 Fcthwack= 1<<Octhwack, 163 164 /* ecp configure options */ 165 Oeoui= 0, /* proprietary compression */ 166 Oedese= 1, /* DES */ 167 168 /* ecp flags */ 169 Feoui= 1<<Oeoui, 170 Fedese= 1<<Oedese, 171 172 /* ipcp configure options */ 173 Oipaddrs= 1, 174 Oipcompress= 2, 175 Oipaddr= 3, 176 Oipdns= 129, 177 Oipwins= 130, 178 Oipdns2= 131, 179 Oipwins2= 132, 180 181 /* ipcp flags */ 182 Fipaddrs= 1<<Oipaddrs, 183 Fipcompress= 1<<Oipcompress, 184 Fipaddr= 1<<Oipaddr, 185 Fipdns= 1<<8, // Oipdns, 186 Fipwins= 1<<9, // Oipwins, 187 Fipdns2= 1<<10, // Oipdns2, 188 Fipwins2= 1<<11, // Oipwins2, 189 190 Period= 5*1000, /* period of retransmit process (in ms) */ 191 Timeout= 20, /* xmit timeout (in Periods) */ 192 Buflen= 4096, 193 194 MAX_STATES= 16, /* van jacobson compression states */ 195 Defmtu= 1450, /* default that we will ask for */ 196 Minmtu= 128, /* minimum that we will accept */ 197 Maxmtu= 2000, /* maximum that we will accept */ 198 }; 199 200 201 struct Pstate 202 { 203 int proto; /* protocol type */ 204 int timeout; /* for current state */ 205 int rxtimeout; /* for current retransmit */ 206 ulong flags; /* options received */ 207 uchar id; /* id of current message */ 208 uchar confid; /* id of current config message */ 209 uchar termid; /* id of current termination message */ 210 uchar rcvdconfid; /* id of last conf message received */ 211 uchar state; /* PPP link state */ 212 ulong optmask; /* which options to request */ 213 int echoack; /* recieved echo ack */ 214 int echotimeout; /* echo timeout */ 215 }; 216 217 /* server chap state */ 218 struct Chap 219 { 220 int proto; /* chap proto */ 221 int state; /* chap state */ 222 uchar id; /* id of current message */ 223 int timeout; /* for current state */ 224 Chalstate *cs; 225 }; 226 227 struct Qualstats 228 { 229 ulong reports; 230 ulong packets; 231 ulong uchars; 232 ulong discards; 233 ulong errors; 234 }; 235 236 struct Comptype 237 { 238 void* (*init)(PPP*); 239 Block* (*compress)(PPP*, ushort, Block*, int*); 240 Block* (*resetreq)(void*, Block*); 241 void (*fini)(void*); 242 }; 243 244 struct Uncomptype 245 { 246 void* (*init)(PPP*); 247 Block* (*uncompress)(PPP*, Block*, int*, Block**); 248 void (*resetack)(void*, Block*); 249 void (*fini)(void*); 250 }; 251 252 struct PPP 253 { 254 QLock; 255 256 int ipfd; /* fd to ip stack */ 257 int ipcfd; /* fd to control channel of ip stack */ 258 int mediain; /* fd to media */ 259 int mediaout; /* fd to media */ 260 char *net; /* ip stack to use */ 261 int framing; /* non-zero to use framing characters */ 262 Ipaddr local; 263 Ipaddr curlocal; 264 int localfrozen; 265 Ipaddr remote; 266 Ipaddr curremote; 267 int remotefrozen; 268 269 Ipaddr dns[2]; /* dns servers */ 270 Ipaddr wins[2]; /* wins servers */ 271 272 Block* inbuf; /* input buffer */ 273 Block* outbuf; /* output buffer */ 274 QLock outlock; /* and its lock */ 275 ulong magic; /* magic number to detect loop backs */ 276 ulong rctlmap; /* map of chars to ignore in rcvr */ 277 ulong xctlmap; /* map of chars to excape in xmit */ 278 int phase; /* PPP phase */ 279 Pstate* lcp; /* lcp state */ 280 Pstate* ccp; /* ccp state */ 281 Pstate* ipcp; /* ipcp state */ 282 Chap* chap; /* chap state */ 283 Tcpc* ctcp; /* tcp compression state */ 284 ulong mtu; /* maximum xmit size */ 285 ulong mru; /* maximum recv size */ 286 287 /* data compression */ 288 int ctries; /* number of negotiation tries */ 289 Comptype *ctype; /* compression virtual table */ 290 void *cstate; /* compression state */ 291 Uncomptype *unctype; /* uncompression virtual table */ 292 void *uncstate; /* uncompression state */ 293 294 /* encryption key */ 295 uchar key[16]; 296 int sendencrypted; 297 298 /* authentication */ 299 char secret[256]; /* md5 key */ 300 char chapname[256]; /* chap system name */ 301 302 /* link quality monitoring */ 303 int period; /* lqm period */ 304 int timeout; /* time to next lqm packet */ 305 Qualstats in; /* local */ 306 Qualstats out; 307 Qualstats pin; /* peer */ 308 Qualstats pout; 309 Qualstats sin; /* saved */ 310 311 struct { 312 ulong ipsend; 313 ulong iprecv; 314 ulong iprecvbadsrc; 315 ulong iprecvnotup; 316 ulong comp; 317 ulong compin; 318 ulong compout; 319 ulong compreset; 320 ulong uncomp; 321 ulong uncompin; 322 ulong uncompout; 323 ulong uncompreset; 324 ulong vjin; 325 ulong vjout; 326 ulong vjfail; 327 } stat; 328 }; 329 330 extern Block* pppread(PPP*); 331 extern int pppwrite(PPP*, Block*); 332 extern void pppopen(PPP*, int, int, char*, Ipaddr, Ipaddr, int, int); 333 334 struct Lcpmsg 335 { 336 uchar code; 337 uchar id; 338 uchar len[2]; 339 uchar data[1]; 340 }; 341 342 struct Lcpopt 343 { 344 uchar type; 345 uchar len; 346 uchar data[1]; 347 }; 348 349 struct Qualpkt 350 { 351 uchar magic[4]; 352 353 uchar lastoutreports[4]; 354 uchar lastoutpackets[4]; 355 uchar lastoutuchars[4]; 356 uchar peerinreports[4]; 357 uchar peerinpackets[4]; 358 uchar peerindiscards[4]; 359 uchar peerinerrors[4]; 360 uchar peerinuchars[4]; 361 uchar peeroutreports[4]; 362 uchar peeroutpackets[4]; 363 uchar peeroutuchars[4]; 364 }; 365 366 extern Block* compress(Tcpc*, Block*, int*); 367 extern void compress_error(Tcpc*); 368 extern Tcpc* compress_init(Tcpc*); 369 extern int compress_negotiate(Tcpc*, uchar*); 370 extern Block* tcpcompress(Tcpc*, Block*, int*); 371 extern Block* tcpuncompress(Tcpc*, Block*, int); 372 extern Block* alloclcp(int, int, int, Lcpmsg**); 373 extern ushort ptclcsum(Block*, int, int); 374 extern ushort ptclbsum(uchar*, int); 375 extern ushort ipcsum(uchar*); 376 377 extern Comptype cmppc; 378 extern Uncomptype uncmppc; 379 380 extern Comptype cthwack; 381 extern Uncomptype uncthwack; 382 383 extern void netlog(char*, ...); 384 #pragma varargck argpos netlog 1 385 386 extern char *LOG; 387