Blame


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"
7 87a52e04 2005-12-26 devnull
8 87a52e04 2005-12-26 devnull /* PPP stuff */
9 87a52e04 2005-12-26 devnull enum {
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) */
13 87a52e04 2005-12-26 devnull };
14 87a52e04 2005-12-26 devnull
15 87a52e04 2005-12-26 devnull /* PPP protocols */
16 87a52e04 2005-12-26 devnull enum {
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 */
28 87a52e04 2005-12-26 devnull };
29 87a52e04 2005-12-26 devnull
30 87a52e04 2005-12-26 devnull /* LCP protocol (and IPCP) */
31 87a52e04 2005-12-26 devnull
32 87a52e04 2005-12-26 devnull
33 87a52e04 2005-12-26 devnull typedef struct Lcppkt Lcppkt;
34 87a52e04 2005-12-26 devnull struct Lcppkt
35 87a52e04 2005-12-26 devnull {
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];
40 87a52e04 2005-12-26 devnull };
41 87a52e04 2005-12-26 devnull
42 87a52e04 2005-12-26 devnull typedef struct Lcpopt Lcpopt;
43 87a52e04 2005-12-26 devnull struct Lcpopt
44 87a52e04 2005-12-26 devnull {
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];
48 87a52e04 2005-12-26 devnull };
49 87a52e04 2005-12-26 devnull
50 87a52e04 2005-12-26 devnull enum
51 87a52e04 2005-12-26 devnull {
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 */
66 87a52e04 2005-12-26 devnull
67 87a52e04 2005-12-26 devnull /* Lcp configure options */
68 87a52e04 2005-12-26 devnull Omtu= 1,
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,
73 87a52e04 2005-12-26 devnull Opc= 7,
74 87a52e04 2005-12-26 devnull Oac= 8,
75 87a52e04 2005-12-26 devnull
76 87a52e04 2005-12-26 devnull /* authentication protocols */
77 87a52e04 2005-12-26 devnull APmd5= 5,
78 87a52e04 2005-12-26 devnull APmschap= 128,
79 87a52e04 2005-12-26 devnull
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,
85 87a52e04 2005-12-26 devnull
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,
94 87a52e04 2005-12-26 devnull };
95 87a52e04 2005-12-26 devnull
96 87a52e04 2005-12-26 devnull char *
97 87a52e04 2005-12-26 devnull lcpcode[] = {
98 87a52e04 2005-12-26 devnull 0,
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",
110 87a52e04 2005-12-26 devnull "id",
111 87a52e04 2005-12-26 devnull "timeremain",
112 87a52e04 2005-12-26 devnull "resetreq",
113 87a52e04 2005-12-26 devnull "resetack",
114 87a52e04 2005-12-26 devnull };
115 87a52e04 2005-12-26 devnull
116 87a52e04 2005-12-26 devnull static Mux p_mux[] =
117 87a52e04 2005-12-26 devnull {
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, },
129 87a52e04 2005-12-26 devnull {0},
130 87a52e04 2005-12-26 devnull };
131 87a52e04 2005-12-26 devnull
132 87a52e04 2005-12-26 devnull enum
133 87a52e04 2005-12-26 devnull {
134 87a52e04 2005-12-26 devnull OOproto,
135 87a52e04 2005-12-26 devnull };
136 87a52e04 2005-12-26 devnull
137 87a52e04 2005-12-26 devnull static void
138 87a52e04 2005-12-26 devnull p_compile(Filter *f)
139 87a52e04 2005-12-26 devnull {
140 87a52e04 2005-12-26 devnull Mux *m;
141 87a52e04 2005-12-26 devnull
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;
147 87a52e04 2005-12-26 devnull return;
148 87a52e04 2005-12-26 devnull }
149 87a52e04 2005-12-26 devnull
150 87a52e04 2005-12-26 devnull sysfatal("unknown ppp field or protocol: %s", f->s);
151 87a52e04 2005-12-26 devnull }
152 87a52e04 2005-12-26 devnull
153 87a52e04 2005-12-26 devnull static int
154 87a52e04 2005-12-26 devnull p_filter(Filter *f, Msg *m)
155 87a52e04 2005-12-26 devnull {
156 87a52e04 2005-12-26 devnull int proto;
157 87a52e04 2005-12-26 devnull int len;
158 87a52e04 2005-12-26 devnull
159 87a52e04 2005-12-26 devnull if(f->subop != OOproto)
160 87a52e04 2005-12-26 devnull return 0;
161 87a52e04 2005-12-26 devnull
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;
165 87a52e04 2005-12-26 devnull
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;
168 87a52e04 2005-12-26 devnull
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++;
172 87a52e04 2005-12-26 devnull
173 87a52e04 2005-12-26 devnull if(proto == f->ulv)
174 87a52e04 2005-12-26 devnull return 1;
175 87a52e04 2005-12-26 devnull
176 87a52e04 2005-12-26 devnull return 0;
177 87a52e04 2005-12-26 devnull }
178 87a52e04 2005-12-26 devnull
179 87a52e04 2005-12-26 devnull static int
180 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
181 87a52e04 2005-12-26 devnull {
182 87a52e04 2005-12-26 devnull int proto;
183 87a52e04 2005-12-26 devnull int len;
184 87a52e04 2005-12-26 devnull
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;
188 87a52e04 2005-12-26 devnull
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;
191 87a52e04 2005-12-26 devnull
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++;
195 87a52e04 2005-12-26 devnull
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);
198 87a52e04 2005-12-26 devnull
199 87a52e04 2005-12-26 devnull return 0;
200 87a52e04 2005-12-26 devnull }
201 87a52e04 2005-12-26 devnull
202 87a52e04 2005-12-26 devnull static int
203 87a52e04 2005-12-26 devnull p_seprintchap(Msg *m)
204 87a52e04 2005-12-26 devnull {
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;
208 87a52e04 2005-12-26 devnull
209 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
210 87a52e04 2005-12-26 devnull return -1;
211 87a52e04 2005-12-26 devnull
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;
215 87a52e04 2005-12-26 devnull
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;
223 87a52e04 2005-12-26 devnull
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);
228 87a52e04 2005-12-26 devnull break;
229 87a52e04 2005-12-26 devnull case 1:
230 87a52e04 2005-12-26 devnull case 2:
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);
238 87a52e04 2005-12-26 devnull }
239 87a52e04 2005-12-26 devnull break;
240 87a52e04 2005-12-26 devnull case 3:
241 87a52e04 2005-12-26 devnull case 4:
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);
246 87a52e04 2005-12-26 devnull break;
247 87a52e04 2005-12-26 devnull }
248 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
249 87a52e04 2005-12-26 devnull return 0;
250 87a52e04 2005-12-26 devnull }
251 87a52e04 2005-12-26 devnull
252 87a52e04 2005-12-26 devnull static char*
253 87a52e04 2005-12-26 devnull seprintlcpopt(char *p, char *e, void *a, int len)
254 87a52e04 2005-12-26 devnull {
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;
258 87a52e04 2005-12-26 devnull
259 87a52e04 2005-12-26 devnull cp = a;
260 87a52e04 2005-12-26 devnull ecp = cp+len;
261 87a52e04 2005-12-26 devnull
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;
267 87a52e04 2005-12-26 devnull }
268 87a52e04 2005-12-26 devnull
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);
272 87a52e04 2005-12-26 devnull break;
273 87a52e04 2005-12-26 devnull case Omtu:
274 87a52e04 2005-12-26 devnull p = seprint(p, e, " mtu=%d", NetS(o->data));
275 87a52e04 2005-12-26 devnull break;
276 87a52e04 2005-12-26 devnull case Octlmap:
277 87a52e04 2005-12-26 devnull p = seprint(p, e, " ctlmap=%ux", NetL(o->data));
278 87a52e04 2005-12-26 devnull break;
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);
284 87a52e04 2005-12-26 devnull break;
285 87a52e04 2005-12-26 devnull case PPP_passwd:
286 87a52e04 2005-12-26 devnull p = seprint(p, e, " auth=passwd");
287 87a52e04 2005-12-26 devnull break;
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]);
290 87a52e04 2005-12-26 devnull break;
291 87a52e04 2005-12-26 devnull }
292 87a52e04 2005-12-26 devnull break;
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);
298 87a52e04 2005-12-26 devnull break;
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);
303 87a52e04 2005-12-26 devnull break;
304 87a52e04 2005-12-26 devnull }
305 87a52e04 2005-12-26 devnull case Omagic:
306 87a52e04 2005-12-26 devnull p = seprint(p, e, " magic=%ux", NetL(o->data));
307 87a52e04 2005-12-26 devnull break;
308 87a52e04 2005-12-26 devnull case Opc:
309 87a52e04 2005-12-26 devnull p = seprint(p, e, " protocol-compress");
310 87a52e04 2005-12-26 devnull break;
311 87a52e04 2005-12-26 devnull case Oac:
312 87a52e04 2005-12-26 devnull p = seprint(p, e, " addr-compress");
313 87a52e04 2005-12-26 devnull break;
314 87a52e04 2005-12-26 devnull }
315 87a52e04 2005-12-26 devnull }
316 87a52e04 2005-12-26 devnull return p;
317 87a52e04 2005-12-26 devnull }
318 87a52e04 2005-12-26 devnull
319 87a52e04 2005-12-26 devnull
320 87a52e04 2005-12-26 devnull static int
321 87a52e04 2005-12-26 devnull p_seprintlcp(Msg *m)
322 87a52e04 2005-12-26 devnull {
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;
326 87a52e04 2005-12-26 devnull
327 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
328 87a52e04 2005-12-26 devnull return -1;
329 87a52e04 2005-12-26 devnull
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;
333 87a52e04 2005-12-26 devnull
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;
340 87a52e04 2005-12-26 devnull
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);
345 87a52e04 2005-12-26 devnull break;
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);
352 87a52e04 2005-12-26 devnull break;
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]);
361 87a52e04 2005-12-26 devnull break;
362 87a52e04 2005-12-26 devnull }
363 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
364 87a52e04 2005-12-26 devnull return 0;
365 87a52e04 2005-12-26 devnull }
366 87a52e04 2005-12-26 devnull
367 87a52e04 2005-12-26 devnull static char*
368 87a52e04 2005-12-26 devnull seprintipcpopt(char *p, char *e, void *a, int len)
369 87a52e04 2005-12-26 devnull {
370 87a52e04 2005-12-26 devnull Lcpopt *o;
371 87a52e04 2005-12-26 devnull uchar *cp, *ecp;
372 87a52e04 2005-12-26 devnull
373 87a52e04 2005-12-26 devnull cp = a;
374 87a52e04 2005-12-26 devnull ecp = cp+len;
375 87a52e04 2005-12-26 devnull
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;
381 87a52e04 2005-12-26 devnull }
382 87a52e04 2005-12-26 devnull
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);
386 87a52e04 2005-12-26 devnull break;
387 87a52e04 2005-12-26 devnull case Oipaddrs:
388 87a52e04 2005-12-26 devnull p = seprint(p, e, " ipaddrs(deprecated)");
389 87a52e04 2005-12-26 devnull break;
390 87a52e04 2005-12-26 devnull case Oipcompress:
391 87a52e04 2005-12-26 devnull p = seprint(p, e, " ipcompress");
392 87a52e04 2005-12-26 devnull break;
393 87a52e04 2005-12-26 devnull case Oipaddr:
394 87a52e04 2005-12-26 devnull p = seprint(p, e, " ipaddr=%V", o->data);
395 87a52e04 2005-12-26 devnull break;
396 87a52e04 2005-12-26 devnull case Oipdns:
397 87a52e04 2005-12-26 devnull p = seprint(p, e, " dnsaddr=%V", o->data);
398 87a52e04 2005-12-26 devnull break;
399 87a52e04 2005-12-26 devnull case Oipwins:
400 87a52e04 2005-12-26 devnull p = seprint(p, e, " winsaddr=%V", o->data);
401 87a52e04 2005-12-26 devnull break;
402 87a52e04 2005-12-26 devnull case Oipdns2:
403 87a52e04 2005-12-26 devnull p = seprint(p, e, " dns2addr=%V", o->data);
404 87a52e04 2005-12-26 devnull break;
405 87a52e04 2005-12-26 devnull case Oipwins2:
406 87a52e04 2005-12-26 devnull p = seprint(p, e, " wins2addr=%V", o->data);
407 87a52e04 2005-12-26 devnull break;
408 87a52e04 2005-12-26 devnull }
409 87a52e04 2005-12-26 devnull }
410 87a52e04 2005-12-26 devnull return p;
411 87a52e04 2005-12-26 devnull }
412 87a52e04 2005-12-26 devnull
413 87a52e04 2005-12-26 devnull static int
414 87a52e04 2005-12-26 devnull p_seprintipcp(Msg *m)
415 87a52e04 2005-12-26 devnull {
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;
419 87a52e04 2005-12-26 devnull
420 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
421 87a52e04 2005-12-26 devnull return -1;
422 87a52e04 2005-12-26 devnull
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;
426 87a52e04 2005-12-26 devnull
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;
433 87a52e04 2005-12-26 devnull
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);
438 87a52e04 2005-12-26 devnull break;
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);
445 87a52e04 2005-12-26 devnull break;
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]);
449 87a52e04 2005-12-26 devnull break;
450 87a52e04 2005-12-26 devnull }
451 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
452 87a52e04 2005-12-26 devnull return 0;
453 87a52e04 2005-12-26 devnull }
454 87a52e04 2005-12-26 devnull
455 87a52e04 2005-12-26 devnull static char*
456 87a52e04 2005-12-26 devnull seprintccpopt(char *p, char *e, void *a, int len)
457 87a52e04 2005-12-26 devnull {
458 87a52e04 2005-12-26 devnull Lcpopt *o;
459 87a52e04 2005-12-26 devnull uchar *cp, *ecp;
460 87a52e04 2005-12-26 devnull
461 87a52e04 2005-12-26 devnull cp = a;
462 87a52e04 2005-12-26 devnull ecp = cp+len;
463 87a52e04 2005-12-26 devnull
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;
469 87a52e04 2005-12-26 devnull }
470 87a52e04 2005-12-26 devnull
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);
474 87a52e04 2005-12-26 devnull break;
475 87a52e04 2005-12-26 devnull case 0:
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]);
478 87a52e04 2005-12-26 devnull break;
479 87a52e04 2005-12-26 devnull case 17:
480 87a52e04 2005-12-26 devnull p = seprint(p, e, " Stac-LZS");
481 87a52e04 2005-12-26 devnull break;
482 87a52e04 2005-12-26 devnull case 18:
483 87a52e04 2005-12-26 devnull p = seprint(p, e, " Microsoft-PPC=%ux", NetL(o->data));
484 87a52e04 2005-12-26 devnull break;
485 87a52e04 2005-12-26 devnull }
486 87a52e04 2005-12-26 devnull }
487 87a52e04 2005-12-26 devnull return p;
488 87a52e04 2005-12-26 devnull }
489 87a52e04 2005-12-26 devnull
490 87a52e04 2005-12-26 devnull static int
491 87a52e04 2005-12-26 devnull p_seprintccp(Msg *m)
492 87a52e04 2005-12-26 devnull {
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;
496 87a52e04 2005-12-26 devnull
497 87a52e04 2005-12-26 devnull if(m->pe-m->ps < 4)
498 87a52e04 2005-12-26 devnull return -1;
499 87a52e04 2005-12-26 devnull
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;
503 87a52e04 2005-12-26 devnull
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;
510 87a52e04 2005-12-26 devnull
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);
515 87a52e04 2005-12-26 devnull break;
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);
522 87a52e04 2005-12-26 devnull break;
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]);
528 87a52e04 2005-12-26 devnull break;
529 87a52e04 2005-12-26 devnull }
530 87a52e04 2005-12-26 devnull m->p = seprint(p, e, " len=%d", len);
531 87a52e04 2005-12-26 devnull
532 87a52e04 2005-12-26 devnull return 0;
533 87a52e04 2005-12-26 devnull }
534 87a52e04 2005-12-26 devnull
535 87a52e04 2005-12-26 devnull static int
536 87a52e04 2005-12-26 devnull p_seprintcomp(Msg *m)
537 87a52e04 2005-12-26 devnull {
538 87a52e04 2005-12-26 devnull char compflag[5];
539 87a52e04 2005-12-26 devnull ushort x;
540 87a52e04 2005-12-26 devnull int i;
541 87a52e04 2005-12-26 devnull int len;
542 87a52e04 2005-12-26 devnull
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;
546 87a52e04 2005-12-26 devnull
547 87a52e04 2005-12-26 devnull x = NetS(m->ps);
548 87a52e04 2005-12-26 devnull m->ps += 2;
549 87a52e04 2005-12-26 devnull i = 0;
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;
563 87a52e04 2005-12-26 devnull }
564 87a52e04 2005-12-26 devnull
565 87a52e04 2005-12-26 devnull Proto ppp =
566 87a52e04 2005-12-26 devnull {
567 87a52e04 2005-12-26 devnull "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,
571 87a52e04 2005-12-26 devnull p_mux,
572 a38a1836 2006-02-14 devnull "%#.4lux",
573 87a52e04 2005-12-26 devnull nil,
574 87a52e04 2005-12-26 devnull defaultframer,
575 87a52e04 2005-12-26 devnull };
576 87a52e04 2005-12-26 devnull
577 87a52e04 2005-12-26 devnull Proto ppp_ipcp =
578 87a52e04 2005-12-26 devnull {
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,
583 87a52e04 2005-12-26 devnull nil,
584 87a52e04 2005-12-26 devnull nil,
585 a38a1836 2006-02-14 devnull nil,
586 87a52e04 2005-12-26 devnull defaultframer,
587 87a52e04 2005-12-26 devnull };
588 87a52e04 2005-12-26 devnull
589 87a52e04 2005-12-26 devnull Proto ppp_lcp =
590 87a52e04 2005-12-26 devnull {
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,
595 a38a1836 2006-02-14 devnull nil,
596 87a52e04 2005-12-26 devnull nil,
597 87a52e04 2005-12-26 devnull nil,
598 87a52e04 2005-12-26 devnull defaultframer,
599 87a52e04 2005-12-26 devnull };
600 87a52e04 2005-12-26 devnull
601 87a52e04 2005-12-26 devnull Proto ppp_ccp =
602 87a52e04 2005-12-26 devnull {
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,
607 87a52e04 2005-12-26 devnull nil,
608 87a52e04 2005-12-26 devnull nil,
609 a38a1836 2006-02-14 devnull nil,
610 87a52e04 2005-12-26 devnull defaultframer,
611 87a52e04 2005-12-26 devnull };
612 87a52e04 2005-12-26 devnull
613 87a52e04 2005-12-26 devnull Proto ppp_chap =
614 87a52e04 2005-12-26 devnull {
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,
619 87a52e04 2005-12-26 devnull nil,
620 87a52e04 2005-12-26 devnull nil,
621 a38a1836 2006-02-14 devnull nil,
622 87a52e04 2005-12-26 devnull defaultframer,
623 87a52e04 2005-12-26 devnull };
624 87a52e04 2005-12-26 devnull
625 87a52e04 2005-12-26 devnull Proto ppp_comp =
626 87a52e04 2005-12-26 devnull {
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,
631 87a52e04 2005-12-26 devnull nil,
632 87a52e04 2005-12-26 devnull nil,
633 a38a1836 2006-02-14 devnull nil,
634 87a52e04 2005-12-26 devnull defaultframer,
635 87a52e04 2005-12-26 devnull };