1 87a52e04 2005-12-26 devnull #include <u.h>
2 87a52e04 2005-12-26 devnull #include <libc.h>
3 87a52e04 2005-12-26 devnull #include <ip.h>
4 87a52e04 2005-12-26 devnull #include <libsec.h>
5 87a52e04 2005-12-26 devnull #include "dat.h"
6 87a52e04 2005-12-26 devnull #include "protos.h"
8 87a52e04 2005-12-26 devnull /* PPP stuff */
10 87a52e04 2005-12-26 devnull PPP_addr= 0xff,
11 87a52e04 2005-12-26 devnull PPP_ctl= 0x3,
12 87a52e04 2005-12-26 devnull PPP_period= 3*1000, /* period of retransmit process (in ms) */
15 87a52e04 2005-12-26 devnull /* PPP protocols */
17 87a52e04 2005-12-26 devnull PPP_ip= 0x21, /* internet */
18 87a52e04 2005-12-26 devnull PPP_vjctcp= 0x2d, /* compressing van jacobson tcp */
19 87a52e04 2005-12-26 devnull PPP_vjutcp= 0x2f, /* uncompressing van jacobson tcp */
20 87a52e04 2005-12-26 devnull PPP_ml= 0x3d, /* multi link */
21 87a52e04 2005-12-26 devnull PPP_comp= 0xfd, /* compressed packets */
22 87a52e04 2005-12-26 devnull PPP_ipcp= 0x8021, /* ip control */
23 87a52e04 2005-12-26 devnull PPP_ccp= 0x80fd, /* compression control */
24 87a52e04 2005-12-26 devnull PPP_passwd= 0xc023, /* passwd authentication */
25 87a52e04 2005-12-26 devnull PPP_lcp= 0xc021, /* link control */
26 87a52e04 2005-12-26 devnull PPP_lqm= 0xc025, /* link quality monitoring */
27 87a52e04 2005-12-26 devnull PPP_chap= 0xc223, /* challenge/response */
30 87a52e04 2005-12-26 devnull /* LCP protocol (and IPCP) */
33 87a52e04 2005-12-26 devnull typedef struct Lcppkt Lcppkt;
34 87a52e04 2005-12-26 devnull struct Lcppkt
36 87a52e04 2005-12-26 devnull uchar code;
37 87a52e04 2005-12-26 devnull uchar id;
38 87a52e04 2005-12-26 devnull uchar len[2];
39 87a52e04 2005-12-26 devnull uchar data[1];
42 87a52e04 2005-12-26 devnull typedef struct Lcpopt Lcpopt;
43 87a52e04 2005-12-26 devnull struct Lcpopt
45 87a52e04 2005-12-26 devnull uchar type;
46 87a52e04 2005-12-26 devnull uchar len;
47 87a52e04 2005-12-26 devnull uchar data[1];
52 87a52e04 2005-12-26 devnull /* LCP codes */
53 87a52e04 2005-12-26 devnull Lconfreq= 1,
54 87a52e04 2005-12-26 devnull Lconfack= 2,
55 87a52e04 2005-12-26 devnull Lconfnak= 3,
56 87a52e04 2005-12-26 devnull Lconfrej= 4,
57 87a52e04 2005-12-26 devnull Ltermreq= 5,
58 87a52e04 2005-12-26 devnull Ltermack= 6,
59 87a52e04 2005-12-26 devnull Lcoderej= 7,
60 87a52e04 2005-12-26 devnull Lprotorej= 8,
61 87a52e04 2005-12-26 devnull Lechoreq= 9,
62 87a52e04 2005-12-26 devnull Lechoack= 10,
63 87a52e04 2005-12-26 devnull Ldiscard= 11,
64 87a52e04 2005-12-26 devnull Lresetreq= 14, /* for ccp only */
65 87a52e04 2005-12-26 devnull Lresetack= 15, /* for ccp only */
67 87a52e04 2005-12-26 devnull /* Lcp configure options */
69 87a52e04 2005-12-26 devnull Octlmap= 2,
70 87a52e04 2005-12-26 devnull Oauth= 3,
71 87a52e04 2005-12-26 devnull Oquality= 4,
72 87a52e04 2005-12-26 devnull Omagic= 5,
76 87a52e04 2005-12-26 devnull /* authentication protocols */
77 87a52e04 2005-12-26 devnull APmd5= 5,
78 87a52e04 2005-12-26 devnull APmschap= 128,
80 87a52e04 2005-12-26 devnull /* Chap codes */
81 87a52e04 2005-12-26 devnull Cchallenge= 1,
82 87a52e04 2005-12-26 devnull Cresponse= 2,
83 87a52e04 2005-12-26 devnull Csuccess= 3,
84 87a52e04 2005-12-26 devnull Cfailure= 4,
86 87a52e04 2005-12-26 devnull /* ipcp configure options */
87 87a52e04 2005-12-26 devnull Oipaddrs= 1,
88 87a52e04 2005-12-26 devnull Oipcompress= 2,
89 87a52e04 2005-12-26 devnull Oipaddr= 3,
90 87a52e04 2005-12-26 devnull Oipdns= 129,
91 87a52e04 2005-12-26 devnull Oipwins= 130,
92 87a52e04 2005-12-26 devnull Oipdns2= 131,
93 87a52e04 2005-12-26 devnull Oipwins2= 132,
97 87a52e04 2005-12-26 devnull lcpcode[] = {
99 87a52e04 2005-12-26 devnull "confreq",
100 87a52e04 2005-12-26 devnull "confack",
101 87a52e04 2005-12-26 devnull "confnak",
102 87a52e04 2005-12-26 devnull "confrej",
103 87a52e04 2005-12-26 devnull "termreq",
104 87a52e04 2005-12-26 devnull "termack",
105 87a52e04 2005-12-26 devnull "coderej",
106 87a52e04 2005-12-26 devnull "protorej",
107 87a52e04 2005-12-26 devnull "echoreq",
108 87a52e04 2005-12-26 devnull "echoack",
109 87a52e04 2005-12-26 devnull "discard",
111 87a52e04 2005-12-26 devnull "timeremain",
112 87a52e04 2005-12-26 devnull "resetreq",
113 87a52e04 2005-12-26 devnull "resetack",
116 87a52e04 2005-12-26 devnull static Mux p_mux[] =
118 87a52e04 2005-12-26 devnull {"ip", PPP_ip, },
119 87a52e04 2005-12-26 devnull {"ppp_vjctcp", PPP_vjctcp, },
120 87a52e04 2005-12-26 devnull {"ppp_vjutcp", PPP_vjutcp, },
121 87a52e04 2005-12-26 devnull {"ppp_ml", PPP_ml, },
122 87a52e04 2005-12-26 devnull {"ppp_comp", PPP_comp, },
123 87a52e04 2005-12-26 devnull {"ppp_ipcp", PPP_ipcp, },
124 87a52e04 2005-12-26 devnull {"ppp_ccp", PPP_ccp, },
125 87a52e04 2005-12-26 devnull {"ppp_passwd", PPP_passwd, },
126 87a52e04 2005-12-26 devnull {"ppp_lcp", PPP_lcp, },
127 87a52e04 2005-12-26 devnull {"ppp_lqm", PPP_lqm, },
128 87a52e04 2005-12-26 devnull {"ppp_chap", PPP_chap, },
134 87a52e04 2005-12-26 devnull OOproto,
137 87a52e04 2005-12-26 devnull static void
138 87a52e04 2005-12-26 devnull p_compile(Filter *f)
142 87a52e04 2005-12-26 devnull for(m = p_mux; m->name != nil; m++)
143 87a52e04 2005-12-26 devnull if(strcmp(f->s, m->name) == 0){
144 87a52e04 2005-12-26 devnull f->pr = m->pr;
145 87a52e04 2005-12-26 devnull f->ulv = m->val;
146 87a52e04 2005-12-26 devnull f->subop = OOproto;
150 87a52e04 2005-12-26 devnull sysfatal("unknown ppp field or protocol: %s", f->s);
153 87a52e04 2005-12-26 devnull static int
154 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
156 87a52e04 2005-12-26 devnull int proto;
157 87a52e04 2005-12-26 devnull int len;
159 87a52e04 2005-12-26 devnull if(f->subop != OOproto)
160 87a52e04 2005-12-26 devnull return 0;
162 87a52e04 2005-12-26 devnull len = m->pe - m->ps;
163 87a52e04 2005-12-26 devnull if(len < 3)
164 87a52e04 2005-12-26 devnull return -1;
166 87a52e04 2005-12-26 devnull if(m->ps[0] == PPP_addr && m->ps[1] == PPP_ctl)
167 87a52e04 2005-12-26 devnull m->ps += 2;
169 87a52e04 2005-12-26 devnull proto = *m->ps++;
170 87a52e04 2005-12-26 devnull if((proto&1) == 0)
171 87a52e04 2005-12-26 devnull proto = (proto<<8) | *m->ps++;
173 87a52e04 2005-12-26 devnull if(proto == f->ulv)
174 87a52e04 2005-12-26 devnull return 1;
176 87a52e04 2005-12-26 devnull return 0;
179 87a52e04 2005-12-26 devnull static int
180 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
182 87a52e04 2005-12-26 devnull int proto;
183 87a52e04 2005-12-26 devnull int len;
185 87a52e04 2005-12-26 devnull len = m->pe - m->ps;
186 87a52e04 2005-12-26 devnull if(len < 3)
187 87a52e04 2005-12-26 devnull return -1;
189 87a52e04 2005-12-26 devnull if(m->ps[0] == PPP_addr && m->ps[1] == PPP_ctl)
190 87a52e04 2005-12-26 devnull m->ps += 2;
192 87a52e04 2005-12-26 devnull proto = *m->ps++;
193 87a52e04 2005-12-26 devnull if((proto&1) == 0)
194 87a52e04 2005-12-26 devnull proto = (proto<<8) | *m->ps++;
196 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "pr=%ud len=%d", proto, len);
197 87a52e04 2005-12-26 devnull demux(p_mux, proto, proto, m, &dump);
199 87a52e04 2005-12-26 devnull return 0;
202 87a52e04 2005-12-26 devnull static int
203 87a52e04 2005-12-26 devnull p_seprintchap(Msg *m)
205 87a52e04 2005-12-26 devnull Lcppkt *lcp;
206 87a52e04 2005-12-26 devnull char *p, *e;
207 87a52e04 2005-12-26 devnull int len;
209 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
210 87a52e04 2005-12-26 devnull return -1;
212 87a52e04 2005-12-26 devnull p = m->p;
213 87a52e04 2005-12-26 devnull e = m->e;
214 87a52e04 2005-12-26 devnull m->pr = nil;
216 87a52e04 2005-12-26 devnull /* resize packet */
217 87a52e04 2005-12-26 devnull lcp = (Lcppkt*)m->ps;
218 87a52e04 2005-12-26 devnull len = NetS(lcp->len);
219 87a52e04 2005-12-26 devnull if(m->ps+len < m->pe)
220 87a52e04 2005-12-26 devnull m->pe = m->ps+len;
221 87a52e04 2005-12-26 devnull else if(m->ps+len > m->pe)
222 87a52e04 2005-12-26 devnull return -1;
224 87a52e04 2005-12-26 devnull p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
225 87a52e04 2005-12-26 devnull switch(lcp->code) {
226 87a52e04 2005-12-26 devnull default:
227 87a52e04 2005-12-26 devnull p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
231 87a52e04 2005-12-26 devnull if(lcp->data[0] > len-4){
232 87a52e04 2005-12-26 devnull p = seprint(p, e, "%.*H", len-4, lcp->data);
233 87a52e04 2005-12-26 devnull } else {
234 87a52e04 2005-12-26 devnull p = seprint(p, e, " %s=", lcp->code==1?"challenge ":"response ");
235 87a52e04 2005-12-26 devnull p = seprint(p, e, "%.*H", lcp->data[0], lcp->data+1);
236 87a52e04 2005-12-26 devnull p = seprint(p, e, " name=");
237 87a52e04 2005-12-26 devnull p = seprint(p, e, "%.*H", len-4-lcp->data[0]-1, lcp->data+lcp->data[0]+1);
242 87a52e04 2005-12-26 devnull if(len > 64)
243 87a52e04 2005-12-26 devnull len = 64;
244 87a52e04 2005-12-26 devnull p = seprint(p, e, " %s=%.*H", lcp->code==3?"success ":"failure",
245 87a52e04 2005-12-26 devnull len>64?64:len, lcp->data);
248 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
249 87a52e04 2005-12-26 devnull return 0;
252 87a52e04 2005-12-26 devnull static char*
253 87a52e04 2005-12-26 devnull seprintlcpopt(char *p, char *e, void *a, int len)
255 87a52e04 2005-12-26 devnull Lcpopt *o;
256 87a52e04 2005-12-26 devnull int proto, x, period;
257 87a52e04 2005-12-26 devnull uchar *cp, *ecp;
260 87a52e04 2005-12-26 devnull ecp = cp+len;
262 87a52e04 2005-12-26 devnull for(; cp < ecp; cp += o->len){
263 87a52e04 2005-12-26 devnull o = (Lcpopt*)cp;
264 87a52e04 2005-12-26 devnull if(cp + o->len > ecp || o->len == 0){
265 87a52e04 2005-12-26 devnull p = seprint(p, e, " bad-opt-len=%d", o->len);
266 87a52e04 2005-12-26 devnull return p;
269 87a52e04 2005-12-26 devnull switch(o->type){
270 87a52e04 2005-12-26 devnull default:
271 87a52e04 2005-12-26 devnull p = seprint(p, e, " (type=%d len=%d)", o->type, o->len);
273 87a52e04 2005-12-26 devnull case Omtu:
274 87a52e04 2005-12-26 devnull p = seprint(p, e, " mtu=%d", NetS(o->data));
276 87a52e04 2005-12-26 devnull case Octlmap:
277 87a52e04 2005-12-26 devnull p = seprint(p, e, " ctlmap=%ux", NetL(o->data));
279 87a52e04 2005-12-26 devnull case Oauth:
280 87a52e04 2005-12-26 devnull proto = NetS(o->data);
281 87a52e04 2005-12-26 devnull switch(proto) {
282 87a52e04 2005-12-26 devnull default:
283 87a52e04 2005-12-26 devnull p = seprint(p, e, " auth=%d", proto);
285 87a52e04 2005-12-26 devnull case PPP_passwd:
286 87a52e04 2005-12-26 devnull p = seprint(p, e, " auth=passwd");
288 87a52e04 2005-12-26 devnull case PPP_chap:
289 87a52e04 2005-12-26 devnull p = seprint(p, e, " (auth=chap data=%2.2ux)", o->data[2]);
293 87a52e04 2005-12-26 devnull case Oquality:
294 87a52e04 2005-12-26 devnull proto = NetS(o->data);
295 87a52e04 2005-12-26 devnull switch(proto) {
296 87a52e04 2005-12-26 devnull default:
297 87a52e04 2005-12-26 devnull p = seprint(p, e, " qproto=%d", proto);
299 87a52e04 2005-12-26 devnull case PPP_lqm:
300 87a52e04 2005-12-26 devnull x = NetL(o->data+2)*10;
301 87a52e04 2005-12-26 devnull period = (x+(PPP_period-1))/PPP_period;
302 87a52e04 2005-12-26 devnull p = seprint(p, e, " (qproto=lqm period=%d)", period);
305 87a52e04 2005-12-26 devnull case Omagic:
306 87a52e04 2005-12-26 devnull p = seprint(p, e, " magic=%ux", NetL(o->data));
308 87a52e04 2005-12-26 devnull case Opc:
309 87a52e04 2005-12-26 devnull p = seprint(p, e, " protocol-compress");
311 87a52e04 2005-12-26 devnull case Oac:
312 87a52e04 2005-12-26 devnull p = seprint(p, e, " addr-compress");
316 87a52e04 2005-12-26 devnull return p;
320 87a52e04 2005-12-26 devnull static int
321 87a52e04 2005-12-26 devnull p_seprintlcp(Msg *m)
323 87a52e04 2005-12-26 devnull Lcppkt *lcp;
324 87a52e04 2005-12-26 devnull char *p, *e;
325 87a52e04 2005-12-26 devnull int len;
327 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
328 87a52e04 2005-12-26 devnull return -1;
330 87a52e04 2005-12-26 devnull p = m->p;
331 87a52e04 2005-12-26 devnull e = m->e;
332 87a52e04 2005-12-26 devnull m->pr = nil;
334 87a52e04 2005-12-26 devnull lcp = (Lcppkt*)m->ps;
335 87a52e04 2005-12-26 devnull len = NetS(lcp->len);
336 87a52e04 2005-12-26 devnull if(m->ps+len < m->pe)
337 87a52e04 2005-12-26 devnull m->pe = m->ps+len;
338 87a52e04 2005-12-26 devnull else if(m->ps+len > m->pe)
339 87a52e04 2005-12-26 devnull return -1;
341 87a52e04 2005-12-26 devnull p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
342 87a52e04 2005-12-26 devnull switch(lcp->code) {
343 87a52e04 2005-12-26 devnull default:
344 87a52e04 2005-12-26 devnull p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
346 87a52e04 2005-12-26 devnull case Lconfreq:
347 87a52e04 2005-12-26 devnull case Lconfack:
348 87a52e04 2005-12-26 devnull case Lconfnak:
349 87a52e04 2005-12-26 devnull case Lconfrej:
350 87a52e04 2005-12-26 devnull p = seprint(p, e, "=%s", lcpcode[lcp->code]);
351 87a52e04 2005-12-26 devnull p = seprintlcpopt(p, e, lcp->data, len-4);
353 87a52e04 2005-12-26 devnull case Ltermreq:
354 87a52e04 2005-12-26 devnull case Ltermack:
355 87a52e04 2005-12-26 devnull case Lcoderej:
356 87a52e04 2005-12-26 devnull case Lprotorej:
357 87a52e04 2005-12-26 devnull case Lechoreq:
358 87a52e04 2005-12-26 devnull case Lechoack:
359 87a52e04 2005-12-26 devnull case Ldiscard:
360 87a52e04 2005-12-26 devnull p = seprint(p, e, "=%s", lcpcode[lcp->code]);
363 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
364 87a52e04 2005-12-26 devnull return 0;
367 87a52e04 2005-12-26 devnull static char*
368 87a52e04 2005-12-26 devnull seprintipcpopt(char *p, char *e, void *a, int len)
370 87a52e04 2005-12-26 devnull Lcpopt *o;
371 87a52e04 2005-12-26 devnull uchar *cp, *ecp;
374 87a52e04 2005-12-26 devnull ecp = cp+len;
376 87a52e04 2005-12-26 devnull for(; cp < ecp; cp += o->len){
377 87a52e04 2005-12-26 devnull o = (Lcpopt*)cp;
378 87a52e04 2005-12-26 devnull if(cp + o->len > ecp){
379 87a52e04 2005-12-26 devnull p = seprint(p, e, " bad opt len %ux", o->type);
380 87a52e04 2005-12-26 devnull return p;
383 87a52e04 2005-12-26 devnull switch(o->type){
384 87a52e04 2005-12-26 devnull default:
385 87a52e04 2005-12-26 devnull p = seprint(p, e, " (type=%d len=%d)", o->type, o->len);
387 87a52e04 2005-12-26 devnull case Oipaddrs:
388 87a52e04 2005-12-26 devnull p = seprint(p, e, " ipaddrs(deprecated)");
390 87a52e04 2005-12-26 devnull case Oipcompress:
391 87a52e04 2005-12-26 devnull p = seprint(p, e, " ipcompress");
393 87a52e04 2005-12-26 devnull case Oipaddr:
394 87a52e04 2005-12-26 devnull p = seprint(p, e, " ipaddr=%V", o->data);
396 87a52e04 2005-12-26 devnull case Oipdns:
397 87a52e04 2005-12-26 devnull p = seprint(p, e, " dnsaddr=%V", o->data);
399 87a52e04 2005-12-26 devnull case Oipwins:
400 87a52e04 2005-12-26 devnull p = seprint(p, e, " winsaddr=%V", o->data);
402 87a52e04 2005-12-26 devnull case Oipdns2:
403 87a52e04 2005-12-26 devnull p = seprint(p, e, " dns2addr=%V", o->data);
405 87a52e04 2005-12-26 devnull case Oipwins2:
406 87a52e04 2005-12-26 devnull p = seprint(p, e, " wins2addr=%V", o->data);
410 87a52e04 2005-12-26 devnull return p;
413 87a52e04 2005-12-26 devnull static int
414 87a52e04 2005-12-26 devnull p_seprintipcp(Msg *m)
416 87a52e04 2005-12-26 devnull Lcppkt *lcp;
417 87a52e04 2005-12-26 devnull char *p, *e;
418 87a52e04 2005-12-26 devnull int len;
420 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
421 87a52e04 2005-12-26 devnull return -1;
423 87a52e04 2005-12-26 devnull p = m->p;
424 87a52e04 2005-12-26 devnull e = m->e;
425 87a52e04 2005-12-26 devnull m->pr = nil;
427 87a52e04 2005-12-26 devnull lcp = (Lcppkt*)m->ps;
428 87a52e04 2005-12-26 devnull len = NetS(lcp->len);
429 87a52e04 2005-12-26 devnull if(m->ps+len < m->pe)
430 87a52e04 2005-12-26 devnull m->pe = m->ps+len;
431 87a52e04 2005-12-26 devnull else if(m->ps+len > m->pe)
432 87a52e04 2005-12-26 devnull return -1;
434 87a52e04 2005-12-26 devnull p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
435 87a52e04 2005-12-26 devnull switch(lcp->code) {
436 87a52e04 2005-12-26 devnull default:
437 87a52e04 2005-12-26 devnull p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
439 87a52e04 2005-12-26 devnull case Lconfreq:
440 87a52e04 2005-12-26 devnull case Lconfack:
441 87a52e04 2005-12-26 devnull case Lconfnak:
442 87a52e04 2005-12-26 devnull case Lconfrej:
443 87a52e04 2005-12-26 devnull p = seprint(p, e, "=%s", lcpcode[lcp->code]);
444 87a52e04 2005-12-26 devnull p = seprintipcpopt(p, e, lcp->data, len-4);
446 87a52e04 2005-12-26 devnull case Ltermreq:
447 87a52e04 2005-12-26 devnull case Ltermack:
448 87a52e04 2005-12-26 devnull p = seprint(p, e, "=%s", lcpcode[lcp->code]);
451 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
452 87a52e04 2005-12-26 devnull return 0;
455 87a52e04 2005-12-26 devnull static char*
456 87a52e04 2005-12-26 devnull seprintccpopt(char *p, char *e, void *a, int len)
458 87a52e04 2005-12-26 devnull Lcpopt *o;
459 87a52e04 2005-12-26 devnull uchar *cp, *ecp;
462 87a52e04 2005-12-26 devnull ecp = cp+len;
464 87a52e04 2005-12-26 devnull for(; cp < ecp; cp += o->len){
465 87a52e04 2005-12-26 devnull o = (Lcpopt*)cp;
466 87a52e04 2005-12-26 devnull if(cp + o->len > ecp){
467 87a52e04 2005-12-26 devnull p = seprint(p, e, " bad opt len %ux", o->type);
468 87a52e04 2005-12-26 devnull return p;
471 87a52e04 2005-12-26 devnull switch(o->type){
472 87a52e04 2005-12-26 devnull default:
473 87a52e04 2005-12-26 devnull p = seprint(p, e, " type=%d ", o->type);
476 87a52e04 2005-12-26 devnull p = seprint(p, e, " OUI=(%d %.2ux%.2ux%.2ux) ", o->type,
477 87a52e04 2005-12-26 devnull o->data[0], o->data[1], o->data[2]);
479 87a52e04 2005-12-26 devnull case 17:
480 87a52e04 2005-12-26 devnull p = seprint(p, e, " Stac-LZS");
482 87a52e04 2005-12-26 devnull case 18:
483 87a52e04 2005-12-26 devnull p = seprint(p, e, " Microsoft-PPC=%ux", NetL(o->data));
487 87a52e04 2005-12-26 devnull return p;
490 87a52e04 2005-12-26 devnull static int
491 87a52e04 2005-12-26 devnull p_seprintccp(Msg *m)
493 87a52e04 2005-12-26 devnull Lcppkt *lcp;
494 87a52e04 2005-12-26 devnull char *p, *e;
495 87a52e04 2005-12-26 devnull int len;
497 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
498 87a52e04 2005-12-26 devnull return -1;
500 87a52e04 2005-12-26 devnull p = m->p;
501 87a52e04 2005-12-26 devnull e = m->e;
502 87a52e04 2005-12-26 devnull m->pr = nil;
504 87a52e04 2005-12-26 devnull lcp = (Lcppkt*)m->ps;
505 87a52e04 2005-12-26 devnull len = NetS(lcp->len);
506 87a52e04 2005-12-26 devnull if(m->ps+len < m->pe)
507 87a52e04 2005-12-26 devnull m->pe = m->ps+len;
508 87a52e04 2005-12-26 devnull else if(m->ps+len > m->pe)
509 87a52e04 2005-12-26 devnull return -1;
511 87a52e04 2005-12-26 devnull p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
512 87a52e04 2005-12-26 devnull switch(lcp->code) {
513 87a52e04 2005-12-26 devnull default:
514 87a52e04 2005-12-26 devnull p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
516 87a52e04 2005-12-26 devnull case Lconfreq:
517 87a52e04 2005-12-26 devnull case Lconfack:
518 87a52e04 2005-12-26 devnull case Lconfnak:
519 87a52e04 2005-12-26 devnull case Lconfrej:
520 87a52e04 2005-12-26 devnull p = seprint(p, e, "=%s", lcpcode[lcp->code]);
521 87a52e04 2005-12-26 devnull p = seprintccpopt(p, e, lcp->data, len-4);
523 87a52e04 2005-12-26 devnull case Ltermreq:
524 87a52e04 2005-12-26 devnull case Ltermack:
525 87a52e04 2005-12-26 devnull case Lresetreq:
526 87a52e04 2005-12-26 devnull case Lresetack:
527 87a52e04 2005-12-26 devnull p = seprint(p, e, "=%s", lcpcode[lcp->code]);
530 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
532 87a52e04 2005-12-26 devnull return 0;
535 87a52e04 2005-12-26 devnull static int
536 87a52e04 2005-12-26 devnull p_seprintcomp(Msg *m)
538 87a52e04 2005-12-26 devnull char compflag[5];
539 87a52e04 2005-12-26 devnull ushort x;
541 87a52e04 2005-12-26 devnull int len;
543 87a52e04 2005-12-26 devnull len = m->pe-m->ps;
544 87a52e04 2005-12-26 devnull if(len < 2)
545 87a52e04 2005-12-26 devnull return -1;
547 87a52e04 2005-12-26 devnull x = NetS(m->ps);
548 87a52e04 2005-12-26 devnull m->ps += 2;
550 87a52e04 2005-12-26 devnull if(x & (1<<15))
551 87a52e04 2005-12-26 devnull compflag[i++] = 'r';
552 87a52e04 2005-12-26 devnull if(x & (1<<14))
553 87a52e04 2005-12-26 devnull compflag[i++] = 'f';
554 87a52e04 2005-12-26 devnull if(x & (1<<13))
555 87a52e04 2005-12-26 devnull compflag[i++] = 'c';
556 87a52e04 2005-12-26 devnull if(x & (1<<12))
557 87a52e04 2005-12-26 devnull compflag[i++] = 'e';
558 87a52e04 2005-12-26 devnull compflag[i] = 0;
559 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, "flag=%s count=%.3ux", compflag, x&0xfff);
560 87a52e04 2005-12-26 devnull m->p = seprint(m->p, m->e, " data=%.*H", len>64?64:len, m->ps);
561 87a52e04 2005-12-26 devnull m->pr = nil;
562 87a52e04 2005-12-26 devnull return 0;
565 87a52e04 2005-12-26 devnull Proto ppp =
568 87a52e04 2005-12-26 devnull p_compile,
569 87a52e04 2005-12-26 devnull p_filter,
570 87a52e04 2005-12-26 devnull p_seprint,
572 a38a1836 2006-02-14 devnull "%#.4lux",
574 87a52e04 2005-12-26 devnull defaultframer,
577 87a52e04 2005-12-26 devnull Proto ppp_ipcp =
579 87a52e04 2005-12-26 devnull "ppp_ipcp",
580 87a52e04 2005-12-26 devnull p_compile,
581 87a52e04 2005-12-26 devnull p_filter,
582 87a52e04 2005-12-26 devnull p_seprintipcp,
586 87a52e04 2005-12-26 devnull defaultframer,
589 87a52e04 2005-12-26 devnull Proto ppp_lcp =
591 87a52e04 2005-12-26 devnull "ppp_lcp",
592 87a52e04 2005-12-26 devnull p_compile,
593 87a52e04 2005-12-26 devnull p_filter,
594 87a52e04 2005-12-26 devnull p_seprintlcp,
598 87a52e04 2005-12-26 devnull defaultframer,
601 87a52e04 2005-12-26 devnull Proto ppp_ccp =
603 87a52e04 2005-12-26 devnull "ppp_ccp",
604 87a52e04 2005-12-26 devnull p_compile,
605 87a52e04 2005-12-26 devnull p_filter,
606 87a52e04 2005-12-26 devnull p_seprintccp,
610 87a52e04 2005-12-26 devnull defaultframer,
613 87a52e04 2005-12-26 devnull Proto ppp_chap =
615 87a52e04 2005-12-26 devnull "ppp_chap",
616 87a52e04 2005-12-26 devnull p_compile,
617 87a52e04 2005-12-26 devnull p_filter,
618 87a52e04 2005-12-26 devnull p_seprintchap,
622 87a52e04 2005-12-26 devnull defaultframer,
625 87a52e04 2005-12-26 devnull Proto ppp_comp =
627 87a52e04 2005-12-26 devnull "ppp_comp",
628 87a52e04 2005-12-26 devnull p_compile,
629 87a52e04 2005-12-26 devnull p_filter,
630 87a52e04 2005-12-26 devnull p_seprintcomp,
634 87a52e04 2005-12-26 devnull defaultframer,