p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
switch(lcp->code) {
default:
p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
break;
case 1:
case 2:
if(lcp->data[0] > len-4){
p = seprint(p, e, "%.*H", len-4, lcp->data);
} else {
p = seprint(p, e, " %s=", lcp->code==1?"challenge ":"response ");
p = seprint(p, e, "%.*H", lcp->data[0], lcp->data+1);
p = seprint(p, e, " name=");
p = seprint(p, e, "%.*H", len-4-lcp->data[0]-1, lcp->data+lcp->data[0]+1);
}
break;
case 3:
case 4:
if(len > 64)
len = 64;
p = seprint(p, e, " %s=%.*H", lcp->code==3?"success ":"failure",
len>64?64:len, lcp->data);
break;
}
m->p = seprint(p, e, " len=%d", len);
return 0;
}
static char*
seprintlcpopt(char *p, char *e, void *a, int len)
{
Lcpopt *o;
int proto, x, period;
uchar *cp, *ecp;
cp = a;
ecp = cp+len;
for(; cp < ecp; cp += o->len){
o = (Lcpopt*)cp;
if(cp + o->len > ecp || o->len == 0){
p = seprint(p, e, " bad-opt-len=%d", o->len);
return p;
}
switch(o->type){
default:
p = seprint(p, e, " (type=%d len=%d)", o->type, o->len);
break;
case Omtu:
p = seprint(p, e, " mtu=%d", NetS(o->data));
break;
case Octlmap:
p = seprint(p, e, " ctlmap=%ux", NetL(o->data));
break;
case Oauth:
proto = NetS(o->data);
switch(proto) {
default:
p = seprint(p, e, " auth=%d", proto);
break;
case PPP_passwd:
p = seprint(p, e, " auth=passwd");
break;
case PPP_chap:
p = seprint(p, e, " (auth=chap data=%2.2ux)", o->data[2]);
break;
}
break;
case Oquality:
proto = NetS(o->data);
switch(proto) {
default:
p = seprint(p, e, " qproto=%d", proto);
break;
case PPP_lqm:
x = NetL(o->data+2)*10;
period = (x+(PPP_period-1))/PPP_period;
p = seprint(p, e, " (qproto=lqm period=%d)", period);
break;
}
case Omagic:
p = seprint(p, e, " magic=%ux", NetL(o->data));
break;
case Opc:
p = seprint(p, e, " protocol-compress");
break;
case Oac:
p = seprint(p, e, " addr-compress");
break;
}
}
return p;
}
static int
p_seprintlcp(Msg *m)
{
Lcppkt *lcp;
char *p, *e;
int len;
p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
switch(lcp->code) {
default:
p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
break;
case Lconfreq:
case Lconfack:
case Lconfnak:
case Lconfrej:
p = seprint(p, e, "=%s", lcpcode[lcp->code]);
p = seprintlcpopt(p, e, lcp->data, len-4);
break;
case Ltermreq:
case Ltermack:
case Lcoderej:
case Lprotorej:
case Lechoreq:
case Lechoack:
case Ldiscard:
p = seprint(p, e, "=%s", lcpcode[lcp->code]);
break;
}
m->p = seprint(p, e, " len=%d", len);
return 0;
}
for(; cp < ecp; cp += o->len){
o = (Lcpopt*)cp;
if(cp + o->len > ecp){
p = seprint(p, e, " bad opt len %ux", o->type);
return p;
}
switch(o->type){
default:
p = seprint(p, e, " (type=%d len=%d)", o->type, o->len);
break;
case Oipaddrs:
p = seprint(p, e, " ipaddrs(deprecated)");
break;
case Oipcompress:
p = seprint(p, e, " ipcompress");
break;
case Oipaddr:
p = seprint(p, e, " ipaddr=%V", o->data);
break;
case Oipdns:
p = seprint(p, e, " dnsaddr=%V", o->data);
break;
case Oipwins:
p = seprint(p, e, " winsaddr=%V", o->data);
break;
case Oipdns2:
p = seprint(p, e, " dns2addr=%V", o->data);
break;
case Oipwins2:
p = seprint(p, e, " wins2addr=%V", o->data);
break;
}
}
return p;
}
static int
p_seprintipcp(Msg *m)
{
Lcppkt *lcp;
char *p, *e;
int len;
p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
switch(lcp->code) {
default:
p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
break;
case Lconfreq:
case Lconfack:
case Lconfnak:
case Lconfrej:
p = seprint(p, e, "=%s", lcpcode[lcp->code]);
p = seprintipcpopt(p, e, lcp->data, len-4);
break;
case Ltermreq:
case Ltermack:
p = seprint(p, e, "=%s", lcpcode[lcp->code]);
break;
}
m->p = seprint(p, e, " len=%d", len);
return 0;
}
for(; cp < ecp; cp += o->len){
o = (Lcpopt*)cp;
if(cp + o->len > ecp){
p = seprint(p, e, " bad opt len %ux", o->type);
return p;
}
switch(o->type){
default:
p = seprint(p, e, " type=%d ", o->type);
break;
case 0:
p = seprint(p, e, " OUI=(%d %.2ux%.2ux%.2ux) ", o->type,
o->data[0], o->data[1], o->data[2]);
break;
case 17:
p = seprint(p, e, " Stac-LZS");
break;
case 18:
p = seprint(p, e, " Microsoft-PPC=%ux", NetL(o->data));
break;
}
}
return p;
}
static int
p_seprintccp(Msg *m)
{
Lcppkt *lcp;
char *p, *e;
int len;
p = seprint(p, e, "id=%d code=%d", lcp->id, lcp->code);
switch(lcp->code) {
default:
p = seprint(p, e, " data=%.*H", len>64?64:len, lcp->data);
break;
case Lconfreq:
case Lconfack:
case Lconfnak:
case Lconfrej:
p = seprint(p, e, "=%s", lcpcode[lcp->code]);
p = seprintccpopt(p, e, lcp->data, len-4);
break;
case Ltermreq:
case Ltermack:
case Lresetreq:
case Lresetack:
p = seprint(p, e, "=%s", lcpcode[lcp->code]);
break;
}
m->p = seprint(p, e, " len=%d", len);
return 0;
}
static int
p_seprintcomp(Msg *m)
{
char compflag[5];
ushort x;
int i;
int len;