Deleted Added
full compact
lcp.c (78189) lcp.c (78410)
1/*-
2 * Copyright (c) 1996 - 2001 Brian Somers <brian@Awfulhak.org>
3 * based on work by Toshiharu OHNO <tony-o@iij.ad.jp>
4 * Internet Initiative Japan, Inc (IIJ)
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 1996 - 2001 Brian Somers <brian@Awfulhak.org>
3 * based on work by Toshiharu OHNO <tony-o@iij.ad.jp>
4 * Internet Initiative Japan, Inc (IIJ)
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 11 unchanged lines hidden (view full) ---

20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * $FreeBSD: head/usr.sbin/ppp/lcp.c 78189 2001-06-13 21:52:19Z brian $
28 * $FreeBSD: head/usr.sbin/ppp/lcp.c 78410 2001-06-18 14:59:36Z brian $
29 */
30
31#include <sys/param.h>
32#include <netinet/in.h>
33#include <netinet/in_systm.h>
34#include <netinet/ip.h>
35#include <sys/un.h>
36

--- 135 unchanged lines hidden (view full) ---

172 " my side: MRU %d, ACCMAP %08lx, PROTOCOMP %s, ACFCOMP %s,\n"
173 " MAGIC %08lx, MRRU %u, SHORTSEQ %s, REJECT %04x\n",
174 lcp->want_mru, (u_long)lcp->want_accmap,
175 lcp->want_protocomp ? "on" : "off",
176 lcp->want_acfcomp ? "on" : "off",
177 (u_long)lcp->want_magic, lcp->want_mrru,
178 lcp->want_shortseq ? "on" : "off", lcp->my_reject);
179
29 */
30
31#include <sys/param.h>
32#include <netinet/in.h>
33#include <netinet/in_systm.h>
34#include <netinet/ip.h>
35#include <sys/un.h>
36

--- 135 unchanged lines hidden (view full) ---

172 " my side: MRU %d, ACCMAP %08lx, PROTOCOMP %s, ACFCOMP %s,\n"
173 " MAGIC %08lx, MRRU %u, SHORTSEQ %s, REJECT %04x\n",
174 lcp->want_mru, (u_long)lcp->want_accmap,
175 lcp->want_protocomp ? "on" : "off",
176 lcp->want_acfcomp ? "on" : "off",
177 (u_long)lcp->want_magic, lcp->want_mrru,
178 lcp->want_shortseq ? "on" : "off", lcp->my_reject);
179
180 prompt_Printf(arg->prompt, "\n Defaults: MRU = %d, ", lcp->cfg.mru);
180 prompt_Printf(arg->prompt, "\n Defaults: MRU = %d (max %d), ",
181 lcp->cfg.mru, lcp->cfg.max_mru);
182 if (lcp->cfg.mtu)
183 prompt_Printf(arg->prompt, "MTU = %d (max %d), ",
184 lcp->cfg.mtu, lcp->cfg.max_mtu);
185 else
186 prompt_Printf(arg->prompt, "MTU = any (max %d), ", lcp->cfg.max_mtu);
181 prompt_Printf(arg->prompt, "ACCMAP = %08lx\n", (u_long)lcp->cfg.accmap);
182 prompt_Printf(arg->prompt, " LQR period = %us, ",
183 lcp->cfg.lqrperiod);
184 prompt_Printf(arg->prompt, "Open Mode = %s",
185 lcp->cfg.openmode == OPEN_PASSIVE ? "passive" : "active");
186 if (lcp->cfg.openmode > 0)
187 prompt_Printf(arg->prompt, " (delay %ds)", lcp->cfg.openmode);
188 prompt_Printf(arg->prompt, "\n FSM retry = %us, max %u Config"

--- 47 unchanged lines hidden (view full) ---

236{
237 /* Initialise ourselves */
238 int mincode = parent ? 1 : LCP_MINMPCODE;
239
240 fsm_Init(&lcp->fsm, "LCP", PROTO_LCP, mincode, LCP_MAXCODE, LogLCP,
241 bundle, l, parent, &lcp_Callbacks, lcp_TimerNames);
242
243 lcp->cfg.mru = DEF_MRU;
187 prompt_Printf(arg->prompt, "ACCMAP = %08lx\n", (u_long)lcp->cfg.accmap);
188 prompt_Printf(arg->prompt, " LQR period = %us, ",
189 lcp->cfg.lqrperiod);
190 prompt_Printf(arg->prompt, "Open Mode = %s",
191 lcp->cfg.openmode == OPEN_PASSIVE ? "passive" : "active");
192 if (lcp->cfg.openmode > 0)
193 prompt_Printf(arg->prompt, " (delay %ds)", lcp->cfg.openmode);
194 prompt_Printf(arg->prompt, "\n FSM retry = %us, max %u Config"

--- 47 unchanged lines hidden (view full) ---

242{
243 /* Initialise ourselves */
244 int mincode = parent ? 1 : LCP_MINMPCODE;
245
246 fsm_Init(&lcp->fsm, "LCP", PROTO_LCP, mincode, LCP_MAXCODE, LogLCP,
247 bundle, l, parent, &lcp_Callbacks, lcp_TimerNames);
248
249 lcp->cfg.mru = DEF_MRU;
250 lcp->cfg.max_mru = MAX_MRU;
251 lcp->cfg.mtu = 0;
252 lcp->cfg.max_mtu = MAX_MTU;
244 lcp->cfg.accmap = 0;
245 lcp->cfg.openmode = 1;
246 lcp->cfg.lqrperiod = DEF_LQRPERIOD;
247 lcp->cfg.fsm.timeout = DEF_FSMRETRY;
248 lcp->cfg.fsm.maxreq = DEF_FSMTRIES;
249 lcp->cfg.fsm.maxtrm = DEF_FSMTRIES;
250
251 lcp->cfg.acfcomp = NEG_ENABLED|NEG_ACCEPTED;

--- 9 unchanged lines hidden (view full) ---

261 *lcp->cfg.ident = '\0';
262
263 lcp_Setup(lcp, lcp->cfg.openmode);
264}
265
266void
267lcp_Setup(struct lcp *lcp, int openmode)
268{
253 lcp->cfg.accmap = 0;
254 lcp->cfg.openmode = 1;
255 lcp->cfg.lqrperiod = DEF_LQRPERIOD;
256 lcp->cfg.fsm.timeout = DEF_FSMRETRY;
257 lcp->cfg.fsm.maxreq = DEF_FSMTRIES;
258 lcp->cfg.fsm.maxtrm = DEF_FSMTRIES;
259
260 lcp->cfg.acfcomp = NEG_ENABLED|NEG_ACCEPTED;

--- 9 unchanged lines hidden (view full) ---

270 *lcp->cfg.ident = '\0';
271
272 lcp_Setup(lcp, lcp->cfg.openmode);
273}
274
275void
276lcp_Setup(struct lcp *lcp, int openmode)
277{
278 struct physical *p = link2physical(lcp->fsm.link);
279 int phmtu = p ? physical_DeviceMTU(p) : 0;
280
269 lcp->fsm.open_mode = openmode;
270
281 lcp->fsm.open_mode = openmode;
282
271 lcp->his_mru = lcp->fsm.bundle->cfg.mtu;
272 if (!lcp->his_mru || lcp->his_mru > DEF_MRU)
273 lcp->his_mru = DEF_MRU;
283 lcp->his_mru = DEF_MRU;
274 lcp->his_mrru = 0;
275 lcp->his_magic = 0;
276 lcp->his_lqrperiod = 0;
277 lcp->his_acfcomp = 0;
278 lcp->his_auth = 0;
279 lcp->his_authtype = 0;
280 lcp->his_callback.opmask = 0;
281 lcp->his_shortseq = 0;
282
283 lcp->want_mru = lcp->cfg.mru;
284 lcp->his_mrru = 0;
285 lcp->his_magic = 0;
286 lcp->his_lqrperiod = 0;
287 lcp->his_acfcomp = 0;
288 lcp->his_auth = 0;
289 lcp->his_authtype = 0;
290 lcp->his_callback.opmask = 0;
291 lcp->his_shortseq = 0;
292
293 lcp->want_mru = lcp->cfg.mru;
294 if (phmtu && lcp->want_mru > phmtu)
295 lcp->want_mru = phmtu;
284 lcp->want_mrru = lcp->fsm.bundle->ncp.mp.cfg.mrru;
285 lcp->want_shortseq = IsEnabled(lcp->fsm.bundle->ncp.mp.cfg.shortseq) ? 1 : 0;
286 lcp->want_acfcomp = IsEnabled(lcp->cfg.acfcomp) ? 1 : 0;
287
288 if (lcp->fsm.parent) {
296 lcp->want_mrru = lcp->fsm.bundle->ncp.mp.cfg.mrru;
297 lcp->want_shortseq = IsEnabled(lcp->fsm.bundle->ncp.mp.cfg.shortseq) ? 1 : 0;
298 lcp->want_acfcomp = IsEnabled(lcp->cfg.acfcomp) ? 1 : 0;
299
300 if (lcp->fsm.parent) {
289 struct physical *p = link2physical(lcp->fsm.link);
290
291 lcp->his_accmap = 0xffffffff;
292 lcp->want_accmap = lcp->cfg.accmap;
293 lcp->his_protocomp = 0;
294 lcp->want_protocomp = IsEnabled(lcp->cfg.protocomp) ? 1 : 0;
295 lcp->want_magic = GenerateMagic();
296
297 if (IsEnabled(lcp->cfg.chap05)) {
298 lcp->want_auth = PROTO_CHAP;

--- 288 unchanged lines hidden (view full) ---

587}
588
589static void
590LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
591 struct fsm_decode *dec)
592{
593 /* Deal with incoming PROTO_LCP */
594 struct lcp *lcp = fsm2lcp(fp);
301 lcp->his_accmap = 0xffffffff;
302 lcp->want_accmap = lcp->cfg.accmap;
303 lcp->his_protocomp = 0;
304 lcp->want_protocomp = IsEnabled(lcp->cfg.protocomp) ? 1 : 0;
305 lcp->want_magic = GenerateMagic();
306
307 if (IsEnabled(lcp->cfg.chap05)) {
308 lcp->want_auth = PROTO_CHAP;

--- 288 unchanged lines hidden (view full) ---

597}
598
599static void
600LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
601 struct fsm_decode *dec)
602{
603 /* Deal with incoming PROTO_LCP */
604 struct lcp *lcp = fsm2lcp(fp);
595 int type, length, sz, pos, op, callback_req;
605 int type, length, sz, pos, op, callback_req, mru_req;
596 u_int32_t magic, accmap;
606 u_int32_t magic, accmap;
597 u_short mtu, mru, proto;
607 u_short mru, phmtu, proto;
598 struct lqrreq *req;
599 char request[20], desc[22];
600 struct mp *mp;
601 struct physical *p = link2physical(fp->link);
602
608 struct lqrreq *req;
609 char request[20], desc[22];
610 struct mp *mp;
611 struct physical *p = link2physical(fp->link);
612
603 sz = op = callback_req = 0;
613 sz = op = callback_req = mru_req = 0;
604
605 while (plen >= sizeof(struct fsmconfig)) {
606 type = *cp;
607 length = cp[1];
608
609 snprintf(request, sizeof request, " %s[%d]", protoname(type), length);
610
611 if (length < 2) {

--- 9 unchanged lines hidden (view full) ---

621
622 switch (mode_type) {
623 case MODE_REQ:
624 if (mp->cfg.mrru) {
625 if (REJECTED(lcp, TY_MRRU))
626 /* Ignore his previous reject so that we REQ next time */
627 lcp->his_reject &= ~(1 << type);
628
614
615 while (plen >= sizeof(struct fsmconfig)) {
616 type = *cp;
617 length = cp[1];
618
619 snprintf(request, sizeof request, " %s[%d]", protoname(type), length);
620
621 if (length < 2) {

--- 9 unchanged lines hidden (view full) ---

631
632 switch (mode_type) {
633 case MODE_REQ:
634 if (mp->cfg.mrru) {
635 if (REJECTED(lcp, TY_MRRU))
636 /* Ignore his previous reject so that we REQ next time */
637 lcp->his_reject &= ~(1 << type);
638
629 if (mru < MIN_MRU) {
639 if (mru > MAX_MRU) {
640 /* Push him down to MAX_MRU */
641 lcp->his_mrru = MAX_MRU;
642 memcpy(dec->nakend, cp, 2);
643 ua_htons(&lcp->his_mrru, dec->nakend + 2);
644 dec->nakend += 4;
645 } else if (mru < MIN_MRU) {
630 /* Push him up to MIN_MRU */
631 lcp->his_mrru = MIN_MRU;
632 memcpy(dec->nakend, cp, 2);
633 ua_htons(&lcp->his_mrru, dec->nakend + 2);
634 dec->nakend += 4;
635 } else {
636 lcp->his_mrru = mru;
637 memcpy(dec->ackend, cp, 4);

--- 21 unchanged lines hidden (view full) ---

659 case MODE_REJ:
660 lcp->his_reject |= (1 << type);
661 lcp->want_mrru = 0; /* Ah well, no multilink :-( */
662 break;
663 }
664 break;
665
666 case TY_MRU:
646 /* Push him up to MIN_MRU */
647 lcp->his_mrru = MIN_MRU;
648 memcpy(dec->nakend, cp, 2);
649 ua_htons(&lcp->his_mrru, dec->nakend + 2);
650 dec->nakend += 4;
651 } else {
652 lcp->his_mrru = mru;
653 memcpy(dec->ackend, cp, 4);

--- 21 unchanged lines hidden (view full) ---

675 case MODE_REJ:
676 lcp->his_reject |= (1 << type);
677 lcp->want_mrru = 0; /* Ah well, no multilink :-( */
678 break;
679 }
680 break;
681
682 case TY_MRU:
683 mru_req = 1;
667 ua_ntohs(cp + 2, &mru);
668 log_Printf(LogLCP, "%s %d\n", request, mru);
669
670 switch (mode_type) {
671 case MODE_REQ:
684 ua_ntohs(cp + 2, &mru);
685 log_Printf(LogLCP, "%s %d\n", request, mru);
686
687 switch (mode_type) {
688 case MODE_REQ:
672 mtu = lcp->fsm.bundle->cfg.mtu;
673 if (mru < MIN_MRU || (!lcp->want_mrru && mru < mtu)) {
689 phmtu = p ? physical_DeviceMTU(p) : 0;
690 if (phmtu && mru > phmtu) {
691 lcp->his_mru = lcp->cfg.mtu ? lcp->cfg.mtu : phmtu;
692 memcpy(dec->nakend, cp, 2);
693 ua_htons(&lcp->his_mru, dec->nakend + 2);
694 dec->nakend += 4;
695 } if (mru > lcp->cfg.max_mtu) {
696 lcp->his_mru = lcp->cfg.mtu ? lcp->cfg.mtu : lcp->cfg.max_mtu;
697 memcpy(dec->nakend, cp, 2);
698 ua_htons(&lcp->his_mru, dec->nakend + 2);
699 dec->nakend += 4;
700 } else if (mru < MIN_MRU || mru < lcp->cfg.mtu) {
674 /* Push him up to MTU or MIN_MRU */
701 /* Push him up to MTU or MIN_MRU */
675 lcp->his_mru = mru < mtu ? mtu : MIN_MRU;
702 lcp->his_mru = mru < lcp->cfg.mtu ? lcp->cfg.mtu : MIN_MRU;
676 memcpy(dec->nakend, cp, 2);
677 ua_htons(&lcp->his_mru, dec->nakend + 2);
678 dec->nakend += 4;
679 } else {
703 memcpy(dec->nakend, cp, 2);
704 ua_htons(&lcp->his_mru, dec->nakend + 2);
705 dec->nakend += 4;
706 } else {
680 lcp->his_mru = mtu ? mtu : mru;
707 lcp->his_mru = lcp->cfg.mtu ? lcp->cfg.mtu : mru;
681 memcpy(dec->ackend, cp, 4);
682 dec->ackend += 4;
683 }
684 break;
685 case MODE_NAK:
708 memcpy(dec->ackend, cp, 4);
709 dec->ackend += 4;
710 }
711 break;
712 case MODE_NAK:
686 if (mru > MAX_MRU)
687 lcp->want_mru = MAX_MRU;
688 else if (mru < MIN_MRU)
713 if (mru > lcp->cfg.max_mru) {
714 lcp->want_mru = lcp->cfg.max_mru;
715 if (p && lcp->want_mru > physical_DeviceMTU(p))
716 lcp->want_mru = physical_DeviceMTU(p);
717 } else if (mru < MIN_MRU)
689 lcp->want_mru = MIN_MRU;
690 else
691 lcp->want_mru = mru;
692 break;
693 case MODE_REJ:
694 lcp->his_reject |= (1 << type);
695 break;
696 }

--- 515 unchanged lines hidden (view full) ---

1212 else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_E164))
1213 *dec->nakend++ = CALLBACK_E164;
1214 else {
1215 log_Printf(LogWARN, "Cannot insist on auth callback without"
1216 " PAP or CHAP enabled !\n");
1217 dec->nakend[-1] = 2; /* XXX: Silly ! */
1218 }
1219 }
718 lcp->want_mru = MIN_MRU;
719 else
720 lcp->want_mru = mru;
721 break;
722 case MODE_REJ:
723 lcp->his_reject |= (1 << type);
724 break;
725 }

--- 515 unchanged lines hidden (view full) ---

1241 else if (p->dl->cfg.callback.opmask & CALLBACK_BIT(CALLBACK_E164))
1242 *dec->nakend++ = CALLBACK_E164;
1243 else {
1244 log_Printf(LogWARN, "Cannot insist on auth callback without"
1245 " PAP or CHAP enabled !\n");
1246 dec->nakend[-1] = 2; /* XXX: Silly ! */
1247 }
1248 }
1249 if (mode_type == MODE_REQ && !mru_req) {
1250 mru = DEF_MRU;
1251 phmtu = p ? physical_DeviceMTU(p) : 0;
1252 if (phmtu && mru > phmtu)
1253 mru = phmtu;
1254 if (mru > lcp->cfg.max_mtu)
1255 mru = lcp->cfg.max_mtu;
1256 if (mru < DEF_MRU) {
1257 /* Don't let the peer use the default MRU */
1258 lcp->his_mru = lcp->cfg.mtu && lcp->cfg.mtu < mru ? lcp->cfg.mtu : mru;
1259 *dec->nakend++ = TY_MRU;
1260 *dec->nakend++ = 4;
1261 ua_htons(&lcp->his_mru, dec->nakend);
1262 dec->nakend += 2;
1263 }
1264 }
1220 if (dec->rejend != dec->rej) {
1221 /* rejects are preferred */
1222 dec->ackend = dec->ack;
1223 dec->nakend = dec->nak;
1224 } else if (dec->nakend != dec->nak)
1225 /* then NAKs */
1226 dec->ackend = dec->ack;
1227 }
1228}
1229
1230extern struct mbuf *
1231lcp_Input(struct bundle *bundle, struct link *l, struct mbuf *bp)
1232{
1233 /* Got PROTO_LCP from link */
1234 m_settype(bp, MB_LCPIN);
1235 fsm_Input(&l->lcp.fsm, bp);
1236 return NULL;
1237}
1265 if (dec->rejend != dec->rej) {
1266 /* rejects are preferred */
1267 dec->ackend = dec->ack;
1268 dec->nakend = dec->nak;
1269 } else if (dec->nakend != dec->nak)
1270 /* then NAKs */
1271 dec->ackend = dec->ack;
1272 }
1273}
1274
1275extern struct mbuf *
1276lcp_Input(struct bundle *bundle, struct link *l, struct mbuf *bp)
1277{
1278 /* Got PROTO_LCP from link */
1279 m_settype(bp, MB_LCPIN);
1280 fsm_Input(&l->lcp.fsm, bp);
1281 return NULL;
1282}