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} |