12 PPP_period= 3*1000, /* period of retransmit process (in ms) */
17 PPP_ip= 0x21, /* internet */
18 PPP_vjctcp= 0x2d, /* compressing van jacobson tcp */
19 PPP_vjutcp= 0x2f, /* uncompressing van jacobson tcp */
20 PPP_ml= 0x3d, /* multi link */
21 PPP_comp= 0xfd, /* compressed packets */
22 PPP_ipcp= 0x8021, /* ip control */
23 PPP_ccp= 0x80fd, /* compression control */
24 PPP_passwd= 0xc023, /* passwd authentication */
25 PPP_lcp= 0xc021, /* link control */
26 PPP_lqm= 0xc025, /* link quality monitoring */
27 PPP_chap= 0xc223, /* challenge/response */
30 /* LCP protocol (and IPCP) */
33 typedef struct Lcppkt Lcppkt;
42 typedef struct Lcpopt Lcpopt;
64 Lresetreq= 14, /* for ccp only */
65 Lresetack= 15, /* for ccp only */
67 /* Lcp configure options */
76 /* authentication protocols */
86 /* ipcp configure options */
119 {"ppp_vjctcp", PPP_vjctcp, },
120 {"ppp_vjutcp", PPP_vjutcp, },
121 {"ppp_ml", PPP_ml, },
122 {"ppp_comp", PPP_comp, },
123 {"ppp_ipcp", PPP_ipcp, },
124 {"ppp_ccp", PPP_ccp, },
125 {"ppp_passwd", PPP_passwd, },
126 {"ppp_lcp", PPP_lcp, },
127 {"ppp_lqm", PPP_lqm, },
128 {"ppp_chap", PPP_chap, },
142 for(m = p_mux; m->name != nil; m++)
143 if(strcmp(f->s, m->name) == 0){
150 sysfatal("unknown ppp field or protocol: %s", f->s);
154 p_filter(Filter *f, Msg *m)
159 if(f->subop != OOproto)
166 if(m->ps[0] == PPP_addr && m->ps[1] == PPP_ctl)
171 proto = (proto<<8) | *m->ps++;
189 if(m->ps[0] == PPP_addr && m->ps[1] == PPP_ctl)
194 proto = (proto<<8) | *m->ps++;
196 m->p = seprint(m->p, m->e, "pr=%ud len=%d", proto, len);
197 demux(p_mux, proto, proto, m, &dump);
203 p_seprintchap(Msg *m)
217 lcp = (Lcppkt*)m->ps;
218 len = NetS(lcp->len);
219 if(m->ps+len < m->pe)
221 else if(m->ps+len > m->pe)
224 p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
227 p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
231 if(lcp->data[0] > len-4){
232 p = seprint(p, e, "%.*H", len-4, lcp->data);
234 p = seprint(p, e, " %s=", lcp->code==1?"challenge ":"response ");
235 p = seprint(p, e, "%.*H", lcp->data[0], lcp->data+1);
236 p = seprint(p, e, " name=");
237 p = seprint(p, e, "%.*H", len-4-lcp->data[0]-1, lcp->data+lcp->data[0]+1);
244 p = seprint(p, e, " %s=%.*H", lcp->code==3?"success ":"failure",
245 len>64?64:len, lcp->data);
248 m->p = seprint(p, e, " len=%d", len);
253 seprintlcpopt(char *p, char *e, void *a, int len)
256 int proto, x, period;
262 for(; cp < ecp; cp += o->len){
264 if(cp + o->len > ecp || o->len == 0){
265 p = seprint(p, e, " bad-opt-len=%d", o->len);
271 p = seprint(p, e, " (type=%d len=%d)", o->type, o->len);
274 p = seprint(p, e, " mtu=%d", NetS(o->data));
277 p = seprint(p, e, " ctlmap=%ux", NetL(o->data));
280 proto = NetS(o->data);
283 p = seprint(p, e, " auth=%d", proto);
286 p = seprint(p, e, " auth=passwd");
289 p = seprint(p, e, " (auth=chap data=%2.2ux)", o->data[2]);
294 proto = NetS(o->data);
297 p = seprint(p, e, " qproto=%d", proto);
300 x = NetL(o->data+2)*10;
301 period = (x+(PPP_period-1))/PPP_period;
302 p = seprint(p, e, " (qproto=lqm period=%d)", period);
306 p = seprint(p, e, " magic=%ux", NetL(o->data));
309 p = seprint(p, e, " protocol-compress");
312 p = seprint(p, e, " addr-compress");
334 lcp = (Lcppkt*)m->ps;
335 len = NetS(lcp->len);
336 if(m->ps+len < m->pe)
338 else if(m->ps+len > m->pe)
341 p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
344 p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
350 p = seprint(p, e, "=%s", lcpcode[lcp->code]);
351 p = seprintlcpopt(p, e, lcp->data, len-4);
360 p = seprint(p, e, "=%s", lcpcode[lcp->code]);
363 m->p = seprint(p, e, " len=%d", len);
368 seprintipcpopt(char *p, char *e, void *a, int len)
376 for(; cp < ecp; cp += o->len){
378 if(cp + o->len > ecp){
379 p = seprint(p, e, " bad opt len %ux", o->type);
385 p = seprint(p, e, " (type=%d len=%d)", o->type, o->len);
388 p = seprint(p, e, " ipaddrs(deprecated)");
391 p = seprint(p, e, " ipcompress");
394 p = seprint(p, e, " ipaddr=%V", o->data);
397 p = seprint(p, e, " dnsaddr=%V", o->data);
400 p = seprint(p, e, " winsaddr=%V", o->data);
403 p = seprint(p, e, " dns2addr=%V", o->data);
406 p = seprint(p, e, " wins2addr=%V", o->data);
414 p_seprintipcp(Msg *m)
427 lcp = (Lcppkt*)m->ps;
428 len = NetS(lcp->len);
429 if(m->ps+len < m->pe)
431 else if(m->ps+len > m->pe)
434 p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
437 p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
443 p = seprint(p, e, "=%s", lcpcode[lcp->code]);
444 p = seprintipcpopt(p, e, lcp->data, len-4);
448 p = seprint(p, e, "=%s", lcpcode[lcp->code]);
451 m->p = seprint(p, e, " len=%d", len);
456 seprintccpopt(char *p, char *e, void *a, int len)
464 for(; cp < ecp; cp += o->len){
466 if(cp + o->len > ecp){
467 p = seprint(p, e, " bad opt len %ux", o->type);
473 p = seprint(p, e, " type=%d ", o->type);
476 p = seprint(p, e, " OUI=(%d %.2ux%.2ux%.2ux) ", o->type,
477 o->data[0], o->data[1], o->data[2]);
480 p = seprint(p, e, " Stac-LZS");
483 p = seprint(p, e, " Microsoft-PPC=%ux", NetL(o->data));
504 lcp = (Lcppkt*)m->ps;
505 len = NetS(lcp->len);
506 if(m->ps+len < m->pe)
508 else if(m->ps+len > m->pe)
511 p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
514 p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
520 p = seprint(p, e, "=%s", lcpcode[lcp->code]);
521 p = seprintccpopt(p, e, lcp->data, len-4);
527 p = seprint(p, e, "=%s", lcpcode[lcp->code]);
530 m->p = seprint(p, e, " len=%d", len);
536 p_seprintcomp(Msg *m)
559 m->p = seprint(m->p, m->e, "flag=%s count=%.3ux", compflag, x&0xfff);
560 m->p = seprint(m->p, m->e, " data=%.*H", len>64?64:len, m->ps);