Lines Matching refs:lcp

60 #include "lcp.h"
159 struct lcp *lcp;
162 lcp = &l->lcp;
164 prompt_Printf(arg->prompt, "%s: %s [%s]\n", l->name, lcp->fsm.name,
165 State2Nam(lcp->fsm.state));
169 lcp->his_mru, (u_long)lcp->his_accmap,
170 lcp->his_protocomp ? "on" : "off",
171 lcp->his_acfcomp ? "on" : "off",
172 (u_long)lcp->his_magic, lcp->his_mrru,
173 lcp->his_shortseq ? "on" : "off", lcp->his_reject);
177 lcp->want_mru, (u_long)lcp->want_accmap,
178 lcp->want_protocomp ? "on" : "off",
179 lcp->want_acfcomp ? "on" : "off",
180 (u_long)lcp->want_magic, lcp->want_mrru,
181 lcp->want_shortseq ? "on" : "off", lcp->my_reject);
183 if (lcp->cfg.mru)
185 lcp->cfg.mru, lcp->cfg.max_mru);
188 lcp->cfg.max_mru);
189 if (lcp->cfg.mtu)
191 lcp->cfg.mtu, lcp->cfg.max_mtu);
193 prompt_Printf(arg->prompt, "MTU = any (max %d), ", lcp->cfg.max_mtu);
194 prompt_Printf(arg->prompt, "ACCMAP = %08lx\n", (u_long)lcp->cfg.accmap);
196 lcp->cfg.lqrperiod);
198 lcp->cfg.openmode == OPEN_PASSIVE ? "passive" : "active");
199 if (lcp->cfg.openmode > 0)
200 prompt_Printf(arg->prompt, " (delay %ds)", lcp->cfg.openmode);
202 " REQ%s, %u Term REQ%s\n", lcp->cfg.fsm.timeout,
203 lcp->cfg.fsm.maxreq, lcp->cfg.fsm.maxreq == 1 ? "" : "s",
204 lcp->cfg.fsm.maxtrm, lcp->cfg.fsm.maxtrm == 1 ? "" : "s");
205 prompt_Printf(arg->prompt, " Ident: %s\n", lcp->cfg.ident);
208 command_ShowNegval(lcp->cfg.acfcomp));
210 command_ShowNegval(lcp->cfg.chap05));
213 command_ShowNegval(lcp->cfg.chap80nt));
215 command_ShowNegval(lcp->cfg.chap80lm));
217 command_ShowNegval(lcp->cfg.chap81));
220 command_ShowNegval(lcp->cfg.lqr));
222 lcp->cfg.echo ? "enabled" : "disabled");
224 command_ShowNegval(lcp->cfg.pap));
226 command_ShowNegval(lcp->cfg.protocomp));
240 lcp_SetupCallbacks(struct lcp *lcp)
242 lcp->fsm.fn = &lcp_Callbacks;
243 lcp->fsm.FsmTimer.name = lcp_TimerNames[0];
244 lcp->fsm.OpenTimer.name = lcp_TimerNames[1];
245 lcp->fsm.StoppedTimer.name = lcp_TimerNames[2];
249 lcp_Init(struct lcp *lcp, struct bundle *bundle, struct link *l,
255 fsm_Init(&lcp->fsm, "LCP", PROTO_LCP, mincode, LCP_MAXCODE, LogLCP,
258 lcp->cfg.mru = 0;
259 lcp->cfg.max_mru = MAX_MRU;
260 lcp->cfg.mtu = 0;
261 lcp->cfg.max_mtu = MAX_MTU;
262 lcp->cfg.accmap = 0;
263 lcp->cfg.openmode = 1;
264 lcp->cfg.lqrperiod = DEF_LQRPERIOD;
265 lcp->cfg.fsm.timeout = DEF_FSMRETRY;
266 lcp->cfg.fsm.maxreq = DEF_FSMTRIES;
267 lcp->cfg.fsm.maxtrm = DEF_FSMTRIES;
269 lcp->cfg.acfcomp = NEG_ENABLED|NEG_ACCEPTED;
270 lcp->cfg.chap05 = NEG_ACCEPTED;
272 lcp->cfg.chap80nt = NEG_ACCEPTED;
273 lcp->cfg.chap80lm = 0;
274 lcp->cfg.chap81 = NEG_ACCEPTED;
276 lcp->cfg.lqr = NEG_ACCEPTED;
277 lcp->cfg.echo = 0;
278 lcp->cfg.pap = NEG_ACCEPTED;
279 lcp->cfg.protocomp = NEG_ENABLED|NEG_ACCEPTED;
280 *lcp->cfg.ident = '\0';
282 lcp_Setup(lcp, lcp->cfg.openmode);
286 lcp_Setup(struct lcp *lcp, int openmode)
288 struct physical *p = link2physical(lcp->fsm.link);
290 lcp->fsm.open_mode = openmode;
292 lcp->his_mru = DEF_MRU;
293 lcp->his_mrru = 0;
294 lcp->his_magic = 0;
295 lcp->his_lqrperiod = 0;
296 lcp->his_acfcomp = 0;
297 lcp->his_auth = 0;
298 lcp->his_authtype = 0;
299 lcp->his_callback.opmask = 0;
300 lcp->his_shortseq = 0;
301 lcp->mru_req = 0;
303 if ((lcp->want_mru = lcp->cfg.mru) == 0)
304 lcp->want_mru = DEF_MRU;
305 lcp->want_mrru = lcp->fsm.bundle->ncp.mp.cfg.mrru;
306 lcp->want_shortseq = IsEnabled(lcp->fsm.bundle->ncp.mp.cfg.shortseq) ? 1 : 0;
307 lcp->want_acfcomp = IsEnabled(lcp->cfg.acfcomp) ? 1 : 0;
309 if (lcp->fsm.parent) {
310 lcp->his_accmap = 0xffffffff;
311 lcp->want_accmap = lcp->cfg.accmap;
312 lcp->his_protocomp = 0;
313 lcp->want_protocomp = IsEnabled(lcp->cfg.protocomp) ? 1 : 0;
314 lcp->want_magic = GenerateMagic();
316 if (IsEnabled(lcp->cfg.chap05)) {
317 lcp->want_auth = PROTO_CHAP;
318 lcp->want_authtype = 0x05;
320 } else if (IsEnabled(lcp->cfg.chap80nt) ||
321 IsEnabled(lcp->cfg.chap80lm)) {
322 lcp->want_auth = PROTO_CHAP;
323 lcp->want_authtype = 0x80;
324 } else if (IsEnabled(lcp->cfg.chap81)) {
325 lcp->want_auth = PROTO_CHAP;
326 lcp->want_authtype = 0x81;
328 } else if (IsEnabled(lcp->cfg.pap)) {
329 lcp->want_auth = PROTO_PAP;
330 lcp->want_authtype = 0;
332 lcp->want_auth = 0;
333 lcp->want_authtype = 0;
337 memcpy(&lcp->want_callback, &p->dl->cfg.callback,
340 lcp->want_callback.opmask = 0;
341 lcp->want_lqrperiod = IsEnabled(lcp->cfg.lqr) ?
342 lcp->cfg.lqrperiod * 100 : 0;
344 lcp->his_accmap = lcp->want_accmap = 0;
345 lcp->his_protocomp = lcp->want_protocomp = 1;
346 lcp->want_magic = 0;
347 lcp->want_auth = 0;
348 lcp->want_authtype = 0;
349 lcp->want_callback.opmask = 0;
350 lcp->want_lqrperiod = 0;
353 lcp->his_reject = lcp->my_reject = 0;
354 lcp->auth_iwait = lcp->auth_ineed = 0;
355 lcp->LcpFailedMagic = 0;
362 struct lcp *lcp = fsm2lcp(fp);
364 fp->FsmTimer.load = lcp->cfg.fsm.timeout * SECTICKS;
367 fp->restart = lcp->cfg.fsm.maxreq;
370 fp->restart = lcp->cfg.fsm.maxtrm;
383 struct lcp *lcp = fsm2lcp(fp);
398 if (lcp->want_acfcomp && !REJECTED(lcp, TY_ACFCOMP))
401 if (lcp->want_protocomp && !REJECTED(lcp, TY_PROTOCOMP))
404 if (!REJECTED(lcp, TY_ACCMAP)) {
405 ua_htonl(&lcp->want_accmap, o->data);
411 if (lcp->cfg.max_mru && (!maxmru || maxmru > lcp->cfg.max_mru))
412 maxmru = lcp->cfg.max_mru;
413 if (maxmru && lcp->want_mru > maxmru) {
415 fp->link->name, lcp->want_mru, maxmru);
416 lcp->want_mru = maxmru;
418 if (!REJECTED(lcp, TY_MRU)) {
419 ua_htons(&lcp->want_mru, o->data);
423 if (lcp->want_magic && !REJECTED(lcp, TY_MAGICNUM)) {
424 ua_htonl(&lcp->want_magic, o->data);
428 if (lcp->want_lqrperiod && !REJECTED(lcp, TY_QUALPROTO)) {
431 ua_htonl(&lcp->want_lqrperiod, o->data + 2);
435 switch (lcp->want_auth) {
445 o->data[2] = lcp->want_authtype;
450 if (!REJECTED(lcp, TY_CALLBACK)) {
451 if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_AUTH)) {
454 } else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_CBCP)) {
457 } else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_E164)) {
458 size_t sz = strlen(lcp->want_callback.msg);
466 memcpy(o->data + 1, lcp->want_callback.msg, sz);
471 if (lcp->want_mrru && !REJECTED(lcp, TY_MRRU)) {
472 ua_htons(&lcp->want_mrru, o->data);
475 if (lcp->want_shortseq && !REJECTED(lcp, TY_SHORTSEQ))
479 mp = &lcp->fsm.bundle->ncp.mp;
481 !REJECTED(lcp, TY_ENDDISC)) {
492 lcp_SendProtoRej(struct lcp *lcp, u_char *option, int count)
495 fsm_Output(&lcp->fsm, CODE_PROTOREJ, lcp->fsm.reqid, option, count,
500 lcp_SendIdentification(struct lcp *lcp)
507 if (*lcp->cfg.ident == '\0')
510 argv[0] = lcp->cfg.ident;
513 command_Expand(exp, 1, argv, lcp->fsm.bundle, 1, getpid());
515 ua_htonl(&lcp->want_magic, msg);
519 fsm_Output(&lcp->fsm, CODE_IDENT, id++, msg, 4 + strlen(msg + 4), MB_LCPOUT);
520 log_Printf(LogLCP, " MAGICNUM %08x\n", lcp->want_magic);
528 lcp_RecvIdentification(struct lcp *lcp, char *data)
530 log_Printf(LogLCP, " MAGICNUM %08x\n", lcp->his_magic);
556 struct lcp *lcp = fsm2lcp(fp);
559 lcp->LcpFailedMagic = 0;
560 fp->more.reqs = fp->more.naks = fp->more.rejs = lcp->cfg.fsm.maxreq * 3;
561 lcp->mru_req = 0;
576 struct lcp *lcp = fsm2lcp(fp);
579 physical_SetAsyncParams(p, lcp->want_accmap, lcp->his_accmap);
580 lqr_Start(lcp);
582 fp->more.reqs = fp->more.naks = fp->more.rejs = lcp->cfg.fsm.maxreq * 3;
584 lcp_SendIdentification(lcp);
621 lcp_auth_nak(struct lcp *lcp, struct fsm_decode *dec)
627 if (IsAccepted(lcp->cfg.pap)) {
639 if (IsAccepted(lcp->cfg.chap05)) {
643 } else if (IsAccepted(lcp->cfg.chap80nt) ||
644 IsAccepted(lcp->cfg.chap80lm)) {
647 } else if (IsAccepted(lcp->cfg.chap81)) {
663 struct lcp *lcp = fsm2lcp(fp);
686 mp = &lcp->fsm.bundle->ncp.mp;
693 if (REJECTED(lcp, TY_MRRU))
695 lcp->his_reject &= ~(1 << opt->hdr.id);
699 lcp->his_mrru = MAX_MRU;
702 ua_htons(&lcp->his_mrru, nak.data);
706 lcp->his_mrru = MIN_MRU;
709 ua_htons(&lcp->his_mrru, nak.data);
712 lcp->his_mrru = mru;
718 lcp->my_reject |= (1 << opt->hdr.id);
723 if (REJECTED(lcp, TY_MRRU))
725 lcp->his_reject &= ~(1 << opt->hdr.id);
728 lcp->want_mrru = MAX_MRU;
730 lcp->want_mrru = MIN_MRU;
732 lcp->want_mrru = mru;
737 lcp->his_reject |= (1 << opt->hdr.id);
738 lcp->want_mrru = 0; /* Ah well, no multilink :-( */
744 lcp->mru_req = 1;
751 if (lcp->cfg.max_mtu && (!maxmtu || maxmtu > lcp->cfg.max_mtu))
752 maxmtu = lcp->cfg.max_mtu;
753 wantmtu = lcp->cfg.mtu;
761 lcp->his_mru = maxmtu;
764 ua_htons(&lcp->his_mru, nak.data);
768 lcp->his_mru = wantmtu;
771 ua_htons(&lcp->his_mru, nak.data);
774 lcp->his_mru = mru;
780 if (lcp->cfg.max_mru && (!maxmru || maxmru > lcp->cfg.max_mru))
781 maxmru = lcp->cfg.max_mru;
782 wantmru = lcp->cfg.mru > maxmru ? maxmru : lcp->cfg.mru;
785 lcp->want_mru = wantmru;
787 lcp->want_mru = maxmru;
789 lcp->want_mru = MIN_MRU;
791 lcp->want_mru = mru;
794 lcp->his_reject |= (1 << opt->hdr.id);
796 if (lcp->his_mru > lcp->want_mru)
797 lcp->his_mru = lcp->want_mru;
808 lcp->his_accmap = accmap;
812 lcp->want_accmap = accmap;
815 lcp->his_reject |= (1 << opt->hdr.id);
831 if (opt->hdr.len == 4 && IsAccepted(lcp->cfg.pap)) {
832 lcp->his_auth = proto;
833 lcp->his_authtype = 0;
835 } else if (!lcp_auth_nak(lcp, dec)) {
836 lcp->my_reject |= (1 << opt->hdr.id);
842 if ((chap_type == 0x05 && IsAccepted(lcp->cfg.chap05))
844 || (chap_type == 0x80 && (IsAccepted(lcp->cfg.chap80nt) ||
845 (IsAccepted(lcp->cfg.chap80lm))))
846 || (chap_type == 0x81 && IsAccepted(lcp->cfg.chap81))
849 lcp->his_auth = proto;
850 lcp->his_authtype = chap_type;
864 if (!lcp_auth_nak(lcp, dec)) {
865 lcp->my_reject |= (1 << opt->hdr.id);
874 if (!lcp_auth_nak(lcp, dec)) {
875 lcp->my_reject |= (1 << opt->hdr.id);
885 if (IsEnabled(lcp->cfg.pap)) {
886 lcp->want_auth = PROTO_PAP;
887 lcp->want_authtype = 0;
890 lcp->his_reject |= (1 << opt->hdr.id);
894 if (chap_type == 0x05 && IsEnabled(lcp->cfg.chap05)) {
895 lcp->want_auth = PROTO_CHAP;
896 lcp->want_authtype = 0x05;
898 } else if (chap_type == 0x80 && (IsEnabled(lcp->cfg.chap80nt) ||
899 IsEnabled(lcp->cfg.chap80lm))) {
900 lcp->want_auth = PROTO_CHAP;
901 lcp->want_authtype = 0x80;
902 } else if (chap_type == 0x81 && IsEnabled(lcp->cfg.chap81)) {
903 lcp->want_auth = PROTO_CHAP;
904 lcp->want_authtype = 0x81;
922 lcp->his_reject |= (1 << opt->hdr.id);
927 lcp->his_reject |= (1 << opt->hdr.id);
933 lcp->his_reject |= (1 << opt->hdr.id);
944 if (ntohs(req.proto) != PROTO_LQR || !IsAccepted(lcp->cfg.lqr)) {
946 lcp->my_reject |= (1 << opt->hdr.id);
948 lcp->his_lqrperiod = ntohl(req.period);
949 if (lcp->his_lqrperiod < MIN_LQRPERIOD * 100)
950 lcp->his_lqrperiod = MIN_LQRPERIOD * 100;
951 req.period = htonl(lcp->his_lqrperiod);
956 lcp->want_lqrperiod = ntohl(req.period);
959 lcp->his_reject |= (1 << opt->hdr.id);
970 if (lcp->want_magic) {
972 if (magic == lcp->want_magic) {
976 (u_long)magic, ++lcp->LcpFailedMagic);
977 lcp->want_magic = GenerateMagic();
979 ualarm(TICKUNIT * (4 + 4 * lcp->LcpFailedMagic), 0);
983 lcp->his_magic = magic;
984 lcp->LcpFailedMagic = 0;
988 lcp->my_reject |= (1 << opt->hdr.id);
994 lcp->want_magic = GenerateMagic();
998 lcp->want_magic = 0;
999 lcp->his_reject |= (1 << opt->hdr.id);
1009 if (IsAccepted(lcp->cfg.protocomp)) {
1010 lcp->his_protocomp = 1;
1018 lcp->my_reject |= (1 << opt->hdr.id);
1024 lcp->want_protocomp = 0;
1025 lcp->his_reject |= (1 << opt->hdr.id);
1034 if (IsAccepted(lcp->cfg.acfcomp)) {
1035 lcp->his_acfcomp = 1;
1043 lcp->my_reject |= (1 << opt->hdr.id);
1049 lcp->want_acfcomp = 0;
1050 lcp->his_reject |= (1 << opt->hdr.id);
1106 lcp->my_reject |= (1 << opt->hdr.id);
1111 (op != CALLBACK_AUTH || p->link.lcp.want_auth) &&
1114 lcp->his_callback.opmask = CALLBACK_BIT(op);
1115 if (sz > sizeof lcp->his_callback.msg - 1) {
1116 sz = sizeof lcp->his_callback.msg - 1;
1119 memcpy(lcp->his_callback.msg, opt->data + 1, sz);
1120 lcp->his_callback.msg[sz] = '\0';
1123 p->link.lcp.auth_ineed) {
1138 lcp->my_reject |= (1 << opt->hdr.id);
1144 if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_AUTH))
1145 lcp->want_callback.opmask &= ~CALLBACK_BIT(CALLBACK_AUTH);
1146 else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_CBCP))
1147 lcp->want_callback.opmask &= ~CALLBACK_BIT(CALLBACK_CBCP);
1148 else if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_E164))
1149 lcp->want_callback.opmask &= ~CALLBACK_BIT(CALLBACK_E164);
1150 if (lcp->want_callback.opmask == CALLBACK_BIT(CALLBACK_NONE)) {
1152 lcp->want_callback.opmask = 0;
1153 } else if (!lcp->want_callback.opmask) {
1155 fsm_Close(&lcp->fsm);
1159 if (lcp->want_callback.opmask & CALLBACK_BIT(CALLBACK_NONE)) {
1160 lcp->his_reject |= (1 << opt->hdr.id);
1161 lcp->want_callback.opmask = 0;
1164 fsm_Close(&lcp->fsm);
1171 mp = &lcp->fsm.bundle->ncp.mp;
1176 if (lcp->want_mrru && IsAccepted(mp->cfg.shortseq)) {
1177 lcp->his_shortseq = 1;
1181 lcp->my_reject |= (1 << opt->hdr.id);
1191 lcp->his_reject |= (1 << opt->hdr.id);
1192 lcp->want_shortseq = 0; /* For when we hit MP */
1198 mp = &lcp->fsm.bundle->ncp.mp;
1206 lcp->my_reject |= (1 << opt->hdr.id);
1208 lcp->my_reject |= (1 << opt->hdr.id);
1226 lcp->my_reject |= (1 << opt->hdr.id);
1232 lcp->his_reject |= (1 << opt->hdr.id);
1250 lcp->my_reject |= (1 << opt->hdr.id);
1264 p->link.lcp.want_auth)
1277 if (mode_type == MODE_REQ && !lcp->mru_req) {
1282 if (mru > lcp->cfg.max_mtu)
1283 mru = lcp->cfg.max_mtu;
1286 lcp->his_mru = lcp->cfg.mtu && lcp->cfg.mtu < mru ? lcp->cfg.mtu : mru;
1289 ua_htons(&lcp->his_mru, nak.data);
1291 lcp->mru_req = 1; /* Don't keep NAK'ing this */
1303 fsm_Input(&l->lcp.fsm, bp);