From 30c2f2ffe26d680a600fbff9f2fdd2a473905597 Mon Sep 17 00:00:00 2001 From: Brian Somers Date: Fri, 13 Mar 1998 21:08:05 +0000 Subject: [PATCH] Remove more globals --- usr.sbin/ppp/ccp.c | 46 +++++------ usr.sbin/ppp/chat.c | 3 +- usr.sbin/ppp/chat.h | 4 +- usr.sbin/ppp/command.c | 7 +- usr.sbin/ppp/fsm.c | 52 +++++++----- usr.sbin/ppp/fsm.h | 18 ++--- usr.sbin/ppp/ipcp.c | 176 ++++++++++++++++++++--------------------- usr.sbin/ppp/ipcp.h | 3 +- usr.sbin/ppp/lcp.c | 110 +++++++++++++------------- 9 files changed, 211 insertions(+), 208 deletions(-) diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c index 7bf9c8973ef3..29e29d6ca5e2 100644 --- a/usr.sbin/ppp/ccp.c +++ b/usr.sbin/ppp/ccp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ccp.c,v 1.30.2.19 1998/03/13 00:44:39 brian Exp $ + * $Id: ccp.c,v 1.30.2.20 1998/03/13 21:07:28 brian Exp $ * * TODO: * o Support other compression protocols @@ -59,7 +59,8 @@ static void CcpSendConfigReq(struct fsm *); static void CcpSendTerminateReq(struct fsm *); static void CcpSendTerminateAck(struct fsm *); -static void CcpDecodeConfig(struct fsm *, u_char *, int, int); +static void CcpDecodeConfig(struct fsm *, u_char *, int, int, + struct fsm_decode *); static void CcpLayerStart(struct fsm *); static void CcpLayerFinish(struct fsm *); static void CcpLayerUp(struct fsm *); @@ -176,11 +177,11 @@ CcpSendConfigReq(struct fsm *fp) { /* Send config REQ please */ struct ccp *ccp = fsm2ccp(fp); - u_char *cp; + u_char *cp, buff[100]; int f; LogPrintf(LogCCP, "CcpSendConfigReq\n"); - cp = ReqBuff; + cp = buff; ccp->my_proto = -1; ccp->out_algorithm = -1; for (f = 0; f < NALGORITHMS; f++) @@ -188,12 +189,16 @@ CcpSendConfigReq(struct fsm *fp) struct lcp_opt o; (*algorithm[f]->o.Get)(&o); + if (cp + o.len > buff + sizeof buff) { + LogPrintf(LogERROR, "CCP REQ buffer overrun !\n"); + break; + } cp += LcpPutConf(LogCCP, cp, &o, cftypes[o.id], (*algorithm[f]->Disp)(&o)); ccp->my_proto = o.id; ccp->out_algorithm = f; } - FsmOutput(fp, CODE_CONFIGREQ, fp->reqid++, ReqBuff, cp - ReqBuff); + FsmOutput(fp, CODE_CONFIGREQ, fp->reqid++, buff, cp - buff); } void @@ -295,17 +300,14 @@ CcpLayerUp(struct fsm *fp) } static void -CcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) +CcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type, + struct fsm_decode *dec) { /* Deal with incoming data */ struct ccp *ccp = fsm2ccp(fp); int type, length; int f; - ackp = AckBuff; - nakp = NakBuff; - rejp = RejBuff; - while (plen >= sizeof(struct fsmconfig)) { type = *cp; length = cp[1]; @@ -322,8 +324,8 @@ CcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) /* Don't understand that :-( */ if (mode_type == MODE_REQ) { ccp->my_reject |= (1 << type); - memcpy(rejp, cp, length); - rejp += length; + memcpy(dec->rejend, cp, length); + dec->rejend += length; } } else { struct lcp_opt o; @@ -334,23 +336,23 @@ CcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) memcpy(&o, cp, length); switch ((*algorithm[f]->i.Set)(&o)) { case MODE_REJ: - memcpy(rejp, &o, o.len); - rejp += o.len; + memcpy(dec->rejend, &o, o.len); + dec->rejend += o.len; break; case MODE_NAK: - memcpy(nakp, &o, o.len); - nakp += o.len; + memcpy(dec->nakend, &o, o.len); + dec->nakend += o.len; break; case MODE_ACK: - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; ccp->his_proto = type; ccp->in_algorithm = f; /* This one'll do ! */ break; } } else { - memcpy(rejp, cp, length); - rejp += length; + memcpy(dec->rejend, cp, length); + dec->rejend += length; } break; case MODE_NAK: @@ -373,8 +375,8 @@ CcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) cp += length; } - if (rejp != RejBuff) { - ackp = AckBuff; /* let's not send both ! */ + if (mode_type != MODE_NOP && dec->rejend != dec->rej) { + dec->ackend = dec->ack; /* let's not send both ! */ if (!ccp->in_init) { ccp->his_proto = -1; ccp->in_algorithm = -1; diff --git a/usr.sbin/ppp/chat.c b/usr.sbin/ppp/chat.c index d58592f6579c..bbfc7bf77e1a 100644 --- a/usr.sbin/ppp/chat.c +++ b/usr.sbin/ppp/chat.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: chat.c,v 1.44.2.14 1998/03/09 19:25:33 brian Exp $ + * $Id: chat.c,v 1.44.2.15 1998/03/13 00:43:55 brian Exp $ */ #include @@ -65,7 +65,6 @@ #define BUFLEFT(c) (sizeof (c)->buf - ((c)->bufend - (c)->buf)) #define issep(c) ((c) == '\t' || (c) == ' ') -struct chat chat; static void ExecStr(struct physical *, char *, char *, int); static char *ExpandString(struct chat *, const char *, char *, int, int); diff --git a/usr.sbin/ppp/chat.h b/usr.sbin/ppp/chat.h index 2c1965586490..d773a2f9f0ee 100644 --- a/usr.sbin/ppp/chat.h +++ b/usr.sbin/ppp/chat.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: chat.h,v 1.9.2.4 1998/03/09 19:24:52 brian Exp $ + * $Id: chat.h,v 1.9.2.5 1998/03/09 19:25:34 brian Exp $ */ #define CHAT_EXPECT 0 @@ -78,8 +78,6 @@ void chat_Init(struct chat *, struct physical *, const char *, int, const char *); void chat_Destroy(struct chat *); -extern struct chat chat; - #define VECSIZE(v) (sizeof(v) / sizeof(v[0])) extern int MakeArgs(char *, char **, int); /* Mangles the first arg ! */ diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index b302c93d16c1..b22941f7b7f6 100644 --- a/usr.sbin/ppp/command.c +++ b/usr.sbin/ppp/command.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: command.c,v 1.131.2.36 1998/03/13 21:07:01 brian Exp $ + * $Id: command.c,v 1.131.2.37 1998/03/13 21:07:29 brian Exp $ * */ #include @@ -82,7 +82,6 @@ #include "chap.h" #include "datalink.h" -struct in_addr ifnetmask; static const char *HIDDEN = "********"; static int ShowCommand(struct cmdargs const *); @@ -1192,7 +1191,7 @@ SetInterfaceAddr(struct cmdargs const *arg) return -1; ipcp->cfg.HaveTriggerAddress = 0; - ifnetmask.s_addr = 0; + ipcp->cfg.netmask.s_addr = INADDR_ANY; iplist_reset(&ipcp->cfg.peer_list); if (arg->argc > 0) { @@ -1202,7 +1201,7 @@ SetInterfaceAddr(struct cmdargs const *arg) if (arg->argc > 1) { hisaddr = arg->argv[1]; if (arg->argc > 2) { - ifnetmask = GetIpAddr(arg->argv[2]); + ipcp->cfg.netmask = GetIpAddr(arg->argv[2]); if (arg->argc > 3) { ipcp->cfg.TriggerAddress = GetIpAddr(arg->argv[3]); ipcp->cfg.HaveTriggerAddress = 1; diff --git a/usr.sbin/ppp/fsm.c b/usr.sbin/ppp/fsm.c index f5ad000d316f..1485de00c507 100644 --- a/usr.sbin/ppp/fsm.c +++ b/usr.sbin/ppp/fsm.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: fsm.c,v 1.27.2.18 1998/03/13 00:44:43 brian Exp $ + * $Id: fsm.c,v 1.27.2.19 1998/03/13 21:07:32 brian Exp $ * * TODO: * o Refer loglevel for log output @@ -58,14 +58,6 @@ #include "pap.h" #include "datalink.h" -u_char AckBuff[200]; -u_char NakBuff[200]; -u_char RejBuff[100]; -u_char ReqBuff[200]; -u_char *ackp = NULL; -u_char *nakp = NULL; -u_char *rejp = NULL; - static void FsmSendConfigReq(struct fsm *); static void FsmSendTerminateReq(struct fsm *); static void FsmInitRestartCounter(struct fsm *); @@ -312,7 +304,9 @@ FsmSendConfigAck(struct fsm *fp, struct fsmheader *lhp, u_char *option, int count) { LogPrintf(fp->LogLevel, "SendConfigAck(%s)\n", StateNames[fp->state]); - (*fp->fn->DecodeConfig)(fp, option, count, MODE_NOP); + (*fp->fn->DecodeConfig)(fp, option, count, MODE_NOP, NULL); + if (count < sizeof(struct fsmconfig)) + LogPrintf(fp->LogLevel, " [EMPTY]\n"); FsmOutput(fp, CODE_CONFIGACK, lhp->id, option, count); } @@ -321,7 +315,9 @@ FsmSendConfigRej(struct fsm *fp, struct fsmheader *lhp, u_char *option, int count) { LogPrintf(fp->LogLevel, "SendConfigRej(%s)\n", StateNames[fp->state]); - (*fp->fn->DecodeConfig)(fp, option, count, MODE_NOP); + (*fp->fn->DecodeConfig)(fp, option, count, MODE_NOP, NULL); + if (count < sizeof(struct fsmconfig)) + LogPrintf(fp->LogLevel, " [EMPTY]\n"); FsmOutput(fp, CODE_CONFIGREJ, lhp->id, option, count); } @@ -330,7 +326,9 @@ FsmSendConfigNak(struct fsm *fp, struct fsmheader *lhp, u_char *option, int count) { LogPrintf(fp->LogLevel, "SendConfigNak(%s)\n", StateNames[fp->state]); - (*fp->fn->DecodeConfig)(fp, option, count, MODE_NOP); + (*fp->fn->DecodeConfig)(fp, option, count, MODE_NOP, NULL); + if (count < sizeof(struct fsmconfig)) + LogPrintf(fp->LogLevel, " [EMPTY]\n"); FsmOutput(fp, CODE_CONFIGNAK, lhp->id, option, count); } @@ -398,6 +396,7 @@ static void FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) /* RCR */ { + struct fsm_decode dec; int plen, flen; int ackaction = 0; @@ -431,9 +430,12 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) return; } - (*fp->fn->DecodeConfig)(fp, MBUF_CTOP(bp), flen, MODE_REQ); + dec.ackend = dec.ack; + dec.nakend = dec.nak; + dec.rejend = dec.rej; + (*fp->fn->DecodeConfig)(fp, MBUF_CTOP(bp), flen, MODE_REQ, &dec); - if (nakp == NakBuff && rejp == RejBuff) + if (dec.nakend == dec.nak && dec.rejend == dec.rej) ackaction = 1; switch (fp->state) { @@ -448,12 +450,12 @@ FsmRecvConfigReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) break; } - if (rejp != RejBuff) - FsmSendConfigRej(fp, lhp, RejBuff, rejp - RejBuff); - if (nakp != NakBuff) - FsmSendConfigNak(fp, lhp, NakBuff, nakp - NakBuff); + if (dec.rejend != dec.rej) + FsmSendConfigRej(fp, lhp, dec.rej, dec.rejend - dec.rej); + if (dec.nakend != dec.nak) + FsmSendConfigNak(fp, lhp, dec.nak, dec.nakend - dec.nak); if (ackaction) - FsmSendConfigAck(fp, lhp, AckBuff, ackp - AckBuff); + FsmSendConfigAck(fp, lhp, dec.ack, dec.ackend - dec.ack); switch (fp->state) { case ST_OPENED: @@ -522,6 +524,7 @@ static void FsmRecvConfigNak(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) /* RCN */ { + struct fsm_decode dec; int plen, flen; plen = plength(bp); @@ -551,7 +554,10 @@ FsmRecvConfigNak(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) return; } - (*fp->fn->DecodeConfig)(fp, MBUF_CTOP(bp), flen, MODE_NAK); + dec.ackend = dec.ack; + dec.nakend = dec.nak; + dec.rejend = dec.rej; + (*fp->fn->DecodeConfig)(fp, MBUF_CTOP(bp), flen, MODE_NAK, &dec); switch (fp->state) { case ST_REQSENT: @@ -639,6 +645,7 @@ static void FsmRecvConfigRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) /* RCJ */ { + struct fsm_decode dec; int plen, flen; plen = plength(bp); @@ -669,7 +676,10 @@ FsmRecvConfigRej(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) return; } - (*fp->fn->DecodeConfig)(fp, MBUF_CTOP(bp), flen, MODE_REJ); + dec.ackend = dec.ack; + dec.nakend = dec.nak; + dec.rejend = dec.rej; + (*fp->fn->DecodeConfig)(fp, MBUF_CTOP(bp), flen, MODE_REJ, &dec); switch (fp->state) { case ST_REQSENT: diff --git a/usr.sbin/ppp/fsm.h b/usr.sbin/ppp/fsm.h index 2526c994935a..cad36e587487 100644 --- a/usr.sbin/ppp/fsm.h +++ b/usr.sbin/ppp/fsm.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: fsm.h,v 1.16.2.8 1998/02/24 03:36:47 brian Exp $ + * $Id: fsm.h,v 1.16.2.9 1998/02/27 01:22:24 brian Exp $ * * TODO: */ @@ -47,6 +47,12 @@ struct fsm; +struct fsm_decode { + u_char ack[100], *ackend; + u_char nak[100], *nakend; + u_char rej[100], *rejend; +}; + struct fsm_callbacks { void (*LayerUp) (struct fsm *); /* Layer is now up (tlu) */ void (*LayerDown) (struct fsm *); /* About to come down (tld) */ @@ -56,7 +62,7 @@ struct fsm_callbacks { void (*SendConfigReq) (struct fsm *); /* Send REQ please */ void (*SendTerminateReq) (struct fsm *); /* Term REQ just sent */ void (*SendTerminateAck) (struct fsm *); /* Send Term ACK please */ - void (*DecodeConfig) (struct fsm *, u_char *, int, int); + void (*DecodeConfig) (struct fsm *, u_char *, int, int, struct fsm_decode *); /* Deal with incoming data */ void (*RecvResetReq) (struct fsm *fp); /* Reset output */ void (*RecvResetAck) (struct fsm *fp, u_char); /* Reset input */ @@ -133,14 +139,6 @@ struct fsmconfig { u_char length; }; -extern u_char AckBuff[200]; -extern u_char NakBuff[200]; -extern u_char RejBuff[100]; -extern u_char ReqBuff[200]; -extern u_char *ackp; -extern u_char *nakp; -extern u_char *rejp; - extern char const *StateNames[]; extern void fsm_Init(struct fsm *, const char *, u_short, int, int, int, diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c index 76ae05fc0df9..5c2531589954 100644 --- a/usr.sbin/ppp/ipcp.c +++ b/usr.sbin/ppp/ipcp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ipcp.c,v 1.50.2.20 1998/03/13 00:44:05 brian Exp $ + * $Id: ipcp.c,v 1.50.2.21 1998/03/13 21:07:36 brian Exp $ * * TODO: * o More RFC1772 backwoard compatibility @@ -87,7 +87,8 @@ static void IpcpInitRestartCounter(struct fsm *); static void IpcpSendConfigReq(struct fsm *); static void IpcpSendTerminateReq(struct fsm *); static void IpcpSendTerminateAck(struct fsm *); -static void IpcpDecodeConfig(struct fsm *, u_char *, int, int); +static void IpcpDecodeConfig(struct fsm *, u_char *, int, int, + struct fsm_decode *); static struct fsm_callbacks ipcp_Callbacks = { IpcpLayerUp, @@ -223,6 +224,7 @@ ipcp_Init(struct ipcp *ipcp, struct bundle *bundle, struct link *l, ipcp->cfg.peer_range.width = 32; } } + ipcp->cfg.netmask.s_addr = INADDR_ANY; memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range); iplist_setsrc(&ipcp->cfg.peer_list, ""); ipcp->cfg.HaveTriggerAddress = 0; @@ -288,9 +290,8 @@ ipcp_Setup(struct ipcp *ipcp) } static int -ipcp_SetIPaddress(struct bundle *bundle, struct ipcp *ipcp, - struct in_addr myaddr, struct in_addr hisaddr, - struct in_addr netmask, int silent) +ipcp_SetIPaddress(struct bundle *bundle, struct in_addr myaddr, + struct in_addr hisaddr, int silent) { struct sockaddr_in *sock_in; int s; @@ -298,11 +299,11 @@ ipcp_SetIPaddress(struct bundle *bundle, struct ipcp *ipcp, struct ifaliasreq ifra; /* If given addresses are alreay set, then ignore this request */ - if (ipcp->my_ifip.s_addr == myaddr.s_addr && - ipcp->peer_ifip.s_addr == hisaddr.s_addr) + if (bundle->ncp.ipcp.my_ifip.s_addr == myaddr.s_addr && + bundle->ncp.ipcp.peer_ifip.s_addr == hisaddr.s_addr) return 0; - IpcpCleanInterface(&ipcp->fsm); + IpcpCleanInterface(&bundle->ncp.ipcp.fsm); s = ID0socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { @@ -335,8 +336,9 @@ ipcp_SetIPaddress(struct bundle *bundle, struct ipcp *ipcp, mask = IN_CLASSC_NET; /* if subnet mask is given, use it instead of class mask */ - if (netmask.s_addr != INADDR_ANY && (ntohl(netmask.s_addr) & mask) == mask) - mask = ntohl(netmask.s_addr); + if (bundle->ncp.ipcp.cfg.netmask.s_addr != INADDR_ANY && + (ntohl(bundle->ncp.ipcp.cfg.netmask.s_addr) & mask) == mask) + mask = ntohl(bundle->ncp.ipcp.cfg.netmask.s_addr); sock_in = (struct sockaddr_in *)&ifra.ifra_mask; sock_in->sin_family = AF_INET; @@ -351,19 +353,18 @@ ipcp_SetIPaddress(struct bundle *bundle, struct ipcp *ipcp, return (-1); } - ipcp->peer_ifip.s_addr = hisaddr.s_addr; - ipcp->my_ifip.s_addr = myaddr.s_addr; + bundle->ncp.ipcp.peer_ifip.s_addr = hisaddr.s_addr; + bundle->ncp.ipcp.my_ifip.s_addr = myaddr.s_addr; if (Enabled(ConfProxy)) - sifproxyarp(bundle, ipcp->peer_ifip, s); + sifproxyarp(bundle, bundle->ncp.ipcp.peer_ifip, s); close(s); return (0); } static struct in_addr -ChooseHisAddr(struct bundle *bundle, struct ipcp *ipcp, - const struct in_addr gw) +ChooseHisAddr(struct bundle *bundle, const struct in_addr gw) { struct in_addr try; int f; @@ -372,7 +373,7 @@ ChooseHisAddr(struct bundle *bundle, struct ipcp *ipcp, try = iplist_next(&bundle->ncp.ipcp.cfg.peer_list); LogPrintf(LogDEBUG, "ChooseHisAddr: Check item %d (%s)\n", f, inet_ntoa(try)); - if (ipcp_SetIPaddress(bundle, ipcp, gw, try, ifnetmask, 1) == 0) { + if (ipcp_SetIPaddress(bundle, gw, try, 1) == 0) { LogPrintf(LogIPCP, "ChooseHisAddr: Selected IP address %s\n", inet_ntoa(try)); break; @@ -401,11 +402,12 @@ IpcpSendConfigReq(struct fsm *fp) /* Send config REQ please */ struct physical *p = link2physical(fp->link); struct ipcp *ipcp = fsm2ipcp(fp); - u_char *cp; + u_char *cp, buff[12]; struct lcp_opt o; - cp = ReqBuff; LogPrintf(LogIPCP, "IpcpSendConfigReq\n"); + cp = buff; + if ((p && !Physical_IsSync(p)) || !REJECTED(ipcp, TY_IPADDR)) { o.id = TY_IPADDR; o.len = 6; @@ -428,7 +430,7 @@ IpcpSendConfigReq(struct fsm *fp) } cp += LcpPutConf(LogIPCP, cp, &o, cftypes[o.id], args); } - FsmOutput(fp, CODE_CONFIGREQ, fp->reqid++, ReqBuff, cp - ReqBuff); + FsmOutput(fp, CODE_CONFIGREQ, fp->reqid++, buff, cp - buff); } static void @@ -542,8 +544,8 @@ IpcpLayerUp(struct fsm *fp) if (ipcp->peer_compproto >> 16 == PROTO_VJCOMP) VjInit((ipcp->peer_compproto >> 8) & 255); - if (ipcp_SetIPaddress(fp->bundle, ipcp, ipcp->my_ip, - ipcp->peer_ip, ifnetmask, 0) < 0) { + if (ipcp_SetIPaddress(fp->bundle, ipcp->my_ip, + ipcp->peer_ip, 0) < 0) { LogPrintf(LogERROR, "IpcpLayerUp: unable to set ip address\n"); return; } @@ -585,7 +587,8 @@ AcceptableAddr(struct in_range *prange, struct in_addr ipaddr) } static void -IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) +IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type, + struct fsm_decode *dec) { /* Deal with incoming PROTO_IPCP */ struct ipcp *ipcp = fsm2ipcp(fp); @@ -593,12 +596,7 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) u_long *lp, compproto; struct compreq *pcomp; struct in_addr ipaddr, dstipaddr, dnsstuff, ms_info_req; - char tbuff[100]; - char tbuff2[100]; - - ackp = AckBuff; - nakp = NakBuff; - rejp = RejBuff; + char tbuff[100], tbuff2[100]; while (plen >= sizeof(struct fsmconfig)) { type = *cp; @@ -621,19 +619,19 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) if (iplist_isvalid(&ipcp->cfg.peer_list)) { if (ipaddr.s_addr == INADDR_ANY || iplist_ip2pos(&ipcp->cfg.peer_list, ipaddr) < 0 || - ipcp_SetIPaddress(fp->bundle, ipcp, ipcp->cfg.my_range.ipaddr, - ipaddr, ifnetmask, 1)) { + ipcp_SetIPaddress(fp->bundle, ipcp->cfg.my_range.ipaddr, + ipaddr, 1)) { LogPrintf(LogIPCP, "%s: Address invalid or already in use\n", inet_ntoa(ipaddr)); ipcp->peer_ip = ChooseHisAddr - (fp->bundle, ipcp, ipcp->cfg.my_range.ipaddr); + (fp->bundle, ipcp->cfg.my_range.ipaddr); if (ipcp->peer_ip.s_addr == INADDR_ANY) { - memcpy(rejp, cp, length); - rejp += length; + memcpy(dec->rejend, cp, length); + dec->rejend += length; } else { - memcpy(nakp, cp, 2); - memcpy(nakp+2, &ipcp->peer_ip.s_addr, length - 2); - nakp += length; + memcpy(dec->nakend, cp, 2); + memcpy(dec->nakend+2, &ipcp->peer_ip.s_addr, length - 2); + dec->nakend += length; } break; } @@ -642,14 +640,14 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) * If destination address is not acceptable, insist to use what we * want to use. */ - memcpy(nakp, cp, 2); - memcpy(nakp+2, &ipcp->peer_ip.s_addr, length - 2); - nakp += length; + memcpy(dec->nakend, cp, 2); + memcpy(dec->nakend+2, &ipcp->peer_ip.s_addr, length - 2); + dec->nakend += length; break; } ipcp->peer_ip = ipaddr; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; break; case MODE_NAK: if (AcceptableAddr(&ipcp->cfg.my_range, ipaddr)) { @@ -676,8 +674,8 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) switch (mode_type) { case MODE_REQ: if (!Acceptable(ConfVjcomp)) { - memcpy(rejp, cp, length); - rejp += length; + memcpy(dec->rejend, cp, length); + dec->rejend += length; } else { pcomp = (struct compreq *) (cp + 2); switch (length) { @@ -686,13 +684,13 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) LogPrintf(LogWARN, "Peer is speaking RFC1172 compression protocol !\n"); ipcp->heis1172 = 1; ipcp->peer_compproto = compproto; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; } else { - memcpy(nakp, cp, 2); + memcpy(dec->nakend, cp, 2); pcomp->proto = htons(PROTO_VJCOMP); - memcpy(nakp+2, &pcomp, 2); - nakp += length; + memcpy(dec->nakend+2, &pcomp, 2); + dec->nakend += length; } break; case 6: /* RFC1332 */ @@ -701,20 +699,20 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) && pcomp->slots >= MIN_VJ_STATES) { ipcp->peer_compproto = compproto; ipcp->heis1172 = 0; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; } else { - memcpy(nakp, cp, 2); + memcpy(dec->nakend, cp, 2); pcomp->proto = htons(PROTO_VJCOMP); pcomp->slots = DEF_VJ_STATES; pcomp->compcid = 0; - memcpy(nakp+2, &pcomp, sizeof pcomp); - nakp += length; + memcpy(dec->nakend+2, &pcomp, sizeof pcomp); + dec->nakend += length; } break; default: - memcpy(rejp, cp, length); - rejp += length; + memcpy(dec->rejend, cp, length); + dec->rejend += length; break; } } @@ -741,8 +739,8 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) case MODE_REQ: ipcp->peer_ip = ipaddr; ipcp->my_ip = dstipaddr; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; break; case MODE_NAK: snprintf(tbuff2, sizeof tbuff2, "%s changing address: %s", tbuff, @@ -764,15 +762,15 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) #ifndef NOMSEXT case TY_PRIMARY_DNS: /* MS PPP DNS negotiation hack */ case TY_SECONDARY_DNS: - if (!Enabled(ConfMSExt)) { - LogPrintf(LogIPCP, "MS NS req - rejected - msext disabled\n"); - ipcp->my_reject |= (1 << type); - memcpy(rejp, cp, length); - rejp += length; - break; - } switch (mode_type) { case MODE_REQ: + if (!Enabled(ConfMSExt)) { + LogPrintf(LogIPCP, "MS NS req - rejected - msext disabled\n"); + ipcp->my_reject |= (1 << type); + memcpy(dec->rejend, cp, length); + dec->rejend += length; + break; + } lp = (u_long *) (cp + 2); dnsstuff.s_addr = *lp; ms_info_req.s_addr = ipcp->cfg.ns_entries @@ -783,13 +781,13 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) * So the client has got the DNS stuff wrong (first request) so * we'll tell 'em how it is */ - memcpy(nakp, cp, 2); /* copy first two (type/length) */ + memcpy(dec->nakend, cp, 2); /* copy first two (type/length) */ LogPrintf(LogIPCP, "MS NS req %d:%s->%s - nak\n", type, inet_ntoa(dnsstuff), inet_ntoa(ms_info_req)); - memcpy(nakp+2, &ms_info_req, length); - nakp += length; + memcpy(dec->nakend+2, &ms_info_req, length); + dec->nakend += length; break; } @@ -800,8 +798,8 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) LogPrintf(LogIPCP, "MS NS req %d:%s ok - ack\n", type, inet_ntoa(ms_info_req)); - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; break; case MODE_NAK: /* what does this mean?? */ LogPrintf(LogIPCP, "MS NS req %d - NAK??\n", type); @@ -814,34 +812,34 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) case TY_PRIMARY_NBNS: /* MS PPP NetBIOS nameserver hack */ case TY_SECONDARY_NBNS: - if (!Enabled(ConfMSExt)) { - LogPrintf(LogIPCP, "MS NBNS req - rejected - msext disabled\n"); - ipcp->my_reject |= (1 << type); - memcpy(rejp, cp, length); - rejp += length; - break; - } switch (mode_type) { case MODE_REQ: + if (!Enabled(ConfMSExt)) { + LogPrintf(LogIPCP, "MS NBNS req - rejected - msext disabled\n"); + ipcp->my_reject |= (1 << type); + memcpy(dec->rejend, cp, length); + dec->rejend += length; + break; + } lp = (u_long *) (cp + 2); dnsstuff.s_addr = *lp; ms_info_req.s_addr = ipcp->cfg.nbns_entries [(type - TY_PRIMARY_NBNS) ? 1 : 0].s_addr; if (dnsstuff.s_addr != ms_info_req.s_addr) { - memcpy(nakp, cp, 2); - memcpy(nakp+2, &ms_info_req.s_addr, length); + memcpy(dec->nakend, cp, 2); + memcpy(dec->nakend+2, &ms_info_req.s_addr, length); LogPrintf(LogIPCP, "MS NBNS req %d:%s->%s - nak\n", type, inet_ntoa(dnsstuff), inet_ntoa(ms_info_req)); - nakp += length; + dec->nakend += length; break; } LogPrintf(LogIPCP, "MS NBNS req %d:%s ok - ack\n", type, inet_ntoa(ms_info_req)); - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; break; case MODE_NAK: LogPrintf(LogIPCP, "MS NBNS req %d - NAK??\n", type); @@ -855,9 +853,11 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) #endif default: - ipcp->my_reject |= (1 << type); - memcpy(rejp, cp, length); - rejp += length; + if (mode_type != MODE_NOP) { + ipcp->my_reject |= (1 << type); + memcpy(dec->rejend, cp, length); + dec->rejend += length; + } break; } plen -= length; @@ -884,7 +884,7 @@ UseHisaddr(struct bundle *bundle, const char *hisaddr, int setaddr) iplist_setsrc(&ipcp->cfg.peer_list, hisaddr); if (iplist_isvalid(&ipcp->cfg.peer_list)) { iplist_setrandpos(&ipcp->cfg.peer_list); - ipcp->peer_ip = ChooseHisAddr(bundle, ipcp, ipcp->my_ip); + ipcp->peer_ip = ChooseHisAddr(bundle, ipcp->my_ip); if (ipcp->peer_ip.s_addr == INADDR_ANY) { LogPrintf(LogWARN, "%s: None available !\n", ipcp->cfg.peer_list.src); @@ -902,10 +902,8 @@ UseHisaddr(struct bundle *bundle, const char *hisaddr, int setaddr) &ipcp->cfg.peer_range.width) != 0) { ipcp->peer_ip.s_addr = ipcp->cfg.peer_range.ipaddr.s_addr; - if (setaddr && ipcp_SetIPaddress(bundle, ipcp, - ipcp->cfg.my_range.ipaddr, - ipcp->cfg.peer_range.ipaddr, - ifnetmask, 0) < 0) { + if (setaddr && ipcp_SetIPaddress(bundle, ipcp->cfg.my_range.ipaddr, + ipcp->cfg.peer_range.ipaddr, 0) < 0) { ipcp->cfg.my_range.ipaddr.s_addr = INADDR_ANY; ipcp->cfg.peer_range.ipaddr.s_addr = INADDR_ANY; return 0; diff --git a/usr.sbin/ppp/ipcp.h b/usr.sbin/ppp/ipcp.h index 5c6bc5d54dbd..c9581ec92cdf 100644 --- a/usr.sbin/ppp/ipcp.h +++ b/usr.sbin/ppp/ipcp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ipcp.h,v 1.18.2.14 1998/02/27 01:22:27 brian Exp $ + * $Id: ipcp.h,v 1.18.2.15 1998/03/13 21:07:37 brian Exp $ * * TODO: */ @@ -47,6 +47,7 @@ struct ipcp { int VJInitComp : 1; /* Slot compression */ struct in_range my_range; /* MYADDR spec */ + struct in_addr netmask; /* netmask (unused by most OSs) */ struct in_range peer_range; /* HISADDR spec */ struct iplist peer_list; /* Ranges of HISADDR values */ diff --git a/usr.sbin/ppp/lcp.c b/usr.sbin/ppp/lcp.c index dabc64f0ff4c..9c15afc29ad4 100644 --- a/usr.sbin/ppp/lcp.c +++ b/usr.sbin/ppp/lcp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: lcp.c,v 1.55.2.26 1998/03/13 00:44:08 brian Exp $ + * $Id: lcp.c,v 1.55.2.27 1998/03/13 21:07:06 brian Exp $ * * TODO: * o Limit data field length by MRU @@ -88,7 +88,8 @@ static void LcpInitRestartCounter(struct fsm *); static void LcpSendConfigReq(struct fsm *); static void LcpSendTerminateReq(struct fsm *); static void LcpSendTerminateAck(struct fsm *); -static void LcpDecodeConfig(struct fsm *, u_char *, int, int); +static void LcpDecodeConfig(struct fsm *, u_char *, int, int, + struct fsm_decode *); static struct fsm_callbacks lcp_Callbacks = { LcpLayerUp, @@ -303,7 +304,7 @@ LcpSendConfigReq(struct fsm *fp) /* Send config REQ please */ struct physical *p = link2physical(fp->link); struct lcp *lcp = fsm2lcp(fp); - u_char *cp; + u_char *cp, buff[100]; struct lcp_opt o; if (!p) { @@ -312,7 +313,7 @@ LcpSendConfigReq(struct fsm *fp) } LogPrintf(LogLCP, "LcpSendConfigReq\n"); - cp = ReqBuff; + cp = buff; if (!Physical_IsSync(p)) { if (lcp->want_acfcomp && !REJECTED(lcp, TY_ACFCOMP)) PUTN(TY_ACFCOMP); @@ -347,7 +348,7 @@ LcpSendConfigReq(struct fsm *fp) PUTMD5CHAP(); /* Use MD5 */ break; } - FsmOutput(fp, CODE_CONFIGREQ, fp->reqid++, ReqBuff, cp - ReqBuff); + FsmOutput(fp, CODE_CONFIGREQ, fp->reqid++, buff, cp - buff); } void @@ -418,7 +419,8 @@ LcpLayerDown(struct fsm *fp) } static void -LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) +LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type, + struct fsm_decode *dec) { /* Deal with incoming PROTO_LCP */ struct lcp *lcp = fsm2lcp(fp); @@ -428,10 +430,6 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) struct lqrreq *req; char request[20], desc[22]; - ackp = AckBuff; - nakp = NakBuff; - rejp = RejBuff; - while (plen >= sizeof(struct fsmconfig)) { type = *cp; length = cp[1]; @@ -454,16 +452,16 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) mtu = MAX_MTU; if (mru > mtu) { *sp = htons(mtu); - memcpy(nakp, cp, 4); - nakp += 4; + memcpy(dec->nakend, cp, 4); + dec->nakend += 4; } else if (mru < MIN_MRU) { *sp = htons(MIN_MRU); - memcpy(nakp, cp, 4); - nakp += 4; + memcpy(dec->nakend, cp, 4); + dec->nakend += 4; } else { lcp->his_mru = mru; - memcpy(ackp, cp, 4); - ackp += 4; + memcpy(dec->ackend, cp, 4); + dec->ackend += 4; } break; case MODE_NAK: @@ -484,8 +482,8 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) switch (mode_type) { case MODE_REQ: lcp->his_accmap = accmap; - memcpy(ackp, cp, 6); - ackp += 6; + memcpy(dec->ackend, cp, 6); + dec->ackend += 6; break; case MODE_NAK: lcp->want_accmap = accmap; @@ -521,19 +519,19 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) } if (Acceptable(ConfPap)) { lcp->his_auth = proto; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; } else if (Acceptable(ConfChap)) { - *nakp++ = *cp; - *nakp++ = 5; - *nakp++ = (unsigned char) (PROTO_CHAP >> 8); - *nakp++ = (unsigned char) PROTO_CHAP; + *dec->nakend++ = *cp; + *dec->nakend++ = 5; + *dec->nakend++ = (unsigned char) (PROTO_CHAP >> 8); + *dec->nakend++ = (unsigned char) PROTO_CHAP; #ifdef HAVE_DES if (VarMSChap) - *nakp++ = 0x80; + *dec->nakend++ = 0x80; else #endif - *nakp++ = 5; + *dec->nakend++ = 5; } else goto reqreject; break; @@ -550,16 +548,16 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) #endif { lcp->his_auth = proto; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; #ifdef HAVE_DES VarMSChap = cp[4] == 0x80; #endif } else if (Acceptable(ConfPap)) { - *nakp++ = *cp; - *nakp++ = 4; - *nakp++ = (unsigned char) (PROTO_PAP >> 8); - *nakp++ = (unsigned char) PROTO_PAP; + *dec->nakend++ = *cp; + *dec->nakend++ = 4; + *dec->nakend++ = (unsigned char) (PROTO_PAP >> 8); + *dec->nakend++ = (unsigned char) PROTO_PAP; } else goto reqreject; break; @@ -567,8 +565,8 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) default: LogPrintf(LogLCP, "%s 0x%04x - not recognised, NAK\n", request, proto); - memcpy(nakp, cp, length); - nakp += length; + memcpy(dec->nakend, cp, length); + dec->nakend += length; break; } break; @@ -615,8 +613,8 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) if (lcp->his_lqrperiod < 500) lcp->his_lqrperiod = 500; req->period = htonl(lcp->his_lqrperiod); - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; } break; case MODE_NAK: @@ -640,14 +638,14 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) LogPrintf(LogLCP, "Magic is same (%08lx) - %d times\n", (u_long)magic, ++lcp->LcpFailedMagic); lcp->want_magic = GenerateMagic(); - memcpy(nakp, cp, 6); - nakp += 6; + memcpy(dec->nakend, cp, 6); + dec->nakend += 6; ualarm(TICKUNIT * (4 + 4 * lcp->LcpFailedMagic), 0); sigpause(0); } else { lcp->his_magic = magic; - memcpy(ackp, cp, length); - ackp += length; + memcpy(dec->ackend, cp, length); + dec->ackend += length; lcp->LcpFailedMagic = 0; } } else { @@ -674,18 +672,18 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) case MODE_REQ: if (Acceptable(ConfProtocomp)) { lcp->his_protocomp = 1; - memcpy(ackp, cp, 2); - ackp += 2; + memcpy(dec->ackend, cp, 2); + dec->ackend += 2; } else { #ifdef OLDMST /* * MorningStar before v1.3 needs NAK */ - memcpy(nakp, cp, 2); - nakp += 2; + memcpy(dec->nakend, cp, 2); + dec->nakend += 2; #else - memcpy(rejp, cp, 2); - rejp += 2; + memcpy(dec->rejend, cp, 2); + dec->rejend += 2; lcp->my_reject |= (1 << type); #endif } @@ -704,18 +702,18 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) case MODE_REQ: if (Acceptable(ConfAcfcomp)) { lcp->his_acfcomp = 1; - memcpy(ackp, cp, 2); - ackp += 2; + memcpy(dec->ackend, cp, 2); + dec->ackend += 2; } else { #ifdef OLDMST /* * MorningStar before v1.3 needs NAK */ - memcpy(nakp, cp, 2); - nakp += 2; + memcpy(dec->nakend, cp, 2); + dec->nakend += 2; #else - memcpy(rejp, cp, 2); - rejp += 2; + memcpy(dec->rejend, cp, 2); + dec->rejend += 2; lcp->my_reject |= (1 << type); #endif } @@ -751,13 +749,13 @@ LcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type) if (mode_type == MODE_REQ) { reqreject: - if (length > sizeof RejBuff - (rejp - RejBuff)) { - length = sizeof RejBuff - (rejp - RejBuff); + if (length > sizeof dec->rej - (dec->rejend - dec->rej)) { + length = sizeof dec->rej - (dec->rejend - dec->rej); LogPrintf(LogLCP, "Can't REJ length %d - trunating to %d\n", cp[1], length); } - memcpy(rejp, cp, length); - rejp += length; + memcpy(dec->rejend, cp, length); + dec->rejend += length; lcp->my_reject |= (1 << type); if (length != cp[1]) return;