diff --git a/usr.sbin/ppp/arp.c b/usr.sbin/ppp/arp.c index f1550847c83b..b775bd9d64d8 100644 --- a/usr.sbin/ppp/arp.c +++ b/usr.sbin/ppp/arp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: arp.c,v 1.27.2.2 1998/02/07 20:49:14 brian Exp $ + * $Id: arp.c,v 1.27.2.3 1998/02/08 11:04:37 brian Exp $ * */ @@ -57,7 +57,6 @@ #include "throughput.h" #include "defs.h" #include "iplist.h" -#include "ipcp.h" #include "arp.h" static int get_ether_addr(int, struct in_addr, struct sockaddr_dl *); @@ -87,7 +86,7 @@ static struct { static int arpmsg_valid; int -sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) +sifproxyarp(struct bundle *bundle, struct in_addr addr, int s) { int routes; @@ -96,7 +95,7 @@ sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) * address. */ memset(&arpmsg, 0, sizeof arpmsg); - if (!get_ether_addr(s, ipcp->if_peer, &arpmsg.hwa)) { + if (!get_ether_addr(s, addr, &arpmsg.hwa)) { LogPrintf(LogERROR, "Cannot determine ethernet address for proxy ARP\n"); return 0; } @@ -114,7 +113,7 @@ sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) arpmsg.hdr.rtm_inits = RTV_EXPIRE; arpmsg.dst.sin_len = sizeof(struct sockaddr_inarp); arpmsg.dst.sin_family = AF_INET; - arpmsg.dst.sin_addr.s_addr = ipcp->if_peer.s_addr; + arpmsg.dst.sin_addr.s_addr = addr.s_addr; arpmsg.dst.sin_other = SIN_PROXY; arpmsg.hdr.rtm_msglen = (char *) &arpmsg.hwa - (char *) &arpmsg @@ -133,7 +132,7 @@ sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) * cifproxyarp - Delete the proxy ARP entry for the peer. */ int -cifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) +cifproxyarp(struct bundle *bundle, struct in_addr addr, int s) { int routes; @@ -165,7 +164,7 @@ cifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) * sifproxyarp - Make a proxy ARP entry for the peer. */ int -sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) +sifproxyarp(struct bundle *bundle, struct in_addr addr, int s) { struct arpreq arpreq; struct { @@ -179,7 +178,7 @@ sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) * Get the hardware address of an interface on the same subnet as our local * address. */ - if (!get_ether_addr(s, ipcp->if_peer, &dls.sdl)) { + if (!get_ether_addr(s, addr, &dls.sdl)) { LogPrintf(LOG_PHASE_BIT, "Cannot determine ethernet address for proxy ARP\n"); return 0; } @@ -187,8 +186,7 @@ sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) arpreq.arp_ha.sa_family = AF_UNSPEC; memcpy(arpreq.arp_ha.sa_data, LLADDR(&dls.sdl), dls.sdl.sdl_alen); SET_SA_FAMILY(arpreq.arp_pa, AF_INET); - ((struct sockaddr_in *)&arpreq.arp_pa)->sin_addr.s_addr = - ipcp->if_peer.s_addr; + ((struct sockaddr_in *)&arpreq.arp_pa)->sin_addr.s_addr = addr.s_addr; arpreq.arp_flags = ATF_PERM | ATF_PUBL; if (ID0ioctl(s, SIOCSARP, (caddr_t) & arpreq) < 0) { LogPrintf(LogERROR, "sifproxyarp: ioctl(SIOCSARP): %s\n", strerror(errno)); @@ -201,14 +199,13 @@ sifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) * cifproxyarp - Delete the proxy ARP entry for the peer. */ int -cifproxyarp(struct bundle *bundle, struct ipcp *ipcp, int s) +cifproxyarp(struct bundle *bundle, struct in_addr addr, int s) { struct arpreq arpreq; memset(&arpreq, '\0', sizeof arpreq); SET_SA_FAMILY(arpreq.arp_pa, AF_INET); - ((struct sockaddr_in *)&arpreq.arp_pa)->sin_addr.s_addr = - ipcp->if_peer.s_addr; + ((struct sockaddr_in *)&arpreq.arp_pa)->sin_addr.s_addr = addr.s_addr; if (ID0ioctl(s, SIOCDARP, (caddr_t) & arpreq) < 0) { LogPrintf(LogERROR, "cifproxyarp: ioctl(SIOCDARP): %s\n", strerror(errno)); return 0; diff --git a/usr.sbin/ppp/arp.h b/usr.sbin/ppp/arp.h index 1a50a5b5e140..2e4e58daecc5 100644 --- a/usr.sbin/ppp/arp.h +++ b/usr.sbin/ppp/arp.h @@ -17,11 +17,9 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: arp.h,v 1.7.2.2 1998/02/07 20:49:16 brian Exp $ + * $Id: arp.h,v 1.7.2.3 1998/02/08 11:04:38 brian Exp $ * */ -struct ipcp; - -extern int cifproxyarp(struct bundle *, struct ipcp *, int); -extern int sifproxyarp(struct bundle *, struct ipcp *, int); +extern int cifproxyarp(struct bundle *, struct in_addr, int); +extern int sifproxyarp(struct bundle *, struct in_addr, int); diff --git a/usr.sbin/ppp/auth.c b/usr.sbin/ppp/auth.c index 40aa8b782477..90e12ae07afb 100644 --- a/usr.sbin/ppp/auth.c +++ b/usr.sbin/ppp/auth.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: auth.c,v 1.27.2.7 1998/02/09 19:20:32 brian Exp $ + * $Id: auth.c,v 1.27.2.8 1998/02/13 05:10:05 brian Exp $ * * TODO: * o Implement check against with registered IP addresses. @@ -151,7 +151,7 @@ AuthValidate(struct bundle *bundle, const char *fname, const char *system, if (n > 2 && !UseHisaddr(bundle, vector[2], 1)) return (0); /* XXX This should be deferred - we may join an existing bundle ! */ - IpcpInit(bundle, physical2link(physical)); + ipcp_Setup(&IpcpInfo); if (n > 3) SetLabel(vector[3]); return (1); /* Valid */ @@ -186,11 +186,11 @@ AuthGetSecret(struct bundle *bundle, const char *fname, const char *system, if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) { chat_ExpandString(NULL, vector[1], passwd, sizeof passwd, 0); if (setaddr) - memset(&IpcpInfo.DefHisAddress, '\0', sizeof IpcpInfo.DefHisAddress); + memset(&IpcpInfo.cfg.peer_range, '\0', sizeof IpcpInfo.cfg.peer_range); if (n > 2 && setaddr) if (UseHisaddr(bundle, vector[2], 1)) /* XXX This should be deferred - we may join an existing bundle ! */ - IpcpInit(bundle, physical2link(physical)); + ipcp_Setup(&IpcpInfo); else return NULL; if (n > 3) diff --git a/usr.sbin/ppp/bundle.c b/usr.sbin/ppp/bundle.c index 86bd43f84cc8..430968f233a6 100644 --- a/usr.sbin/ppp/bundle.c +++ b/usr.sbin/ppp/bundle.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bundle.c,v 1.1.2.13 1998/02/17 19:28:19 brian Exp $ + * $Id: bundle.c,v 1.1.2.14 1998/02/18 00:27:44 brian Exp $ */ #include @@ -126,7 +126,7 @@ bundle_NewPhase(struct bundle *bundle, struct physical *physical, u_int new) case PHASE_NETWORK: tun_configure(bundle, LcpInfo.his_mru, modem_Speed(physical)); - IpcpInit(bundle, &physical->link); + ipcp_Setup(&IpcpInfo); IpcpUp(); IpcpOpen(); CcpUp(); @@ -356,8 +356,6 @@ bundle_Create(const char *prefix) return NULL; } - IpcpInit(&bundle, &bundle.links->physical->link); - return &bundle; } @@ -660,6 +658,12 @@ bundle2physical(struct bundle *bundle, const char *name) return dl ? dl->physical : NULL; } +struct ccp * +bundle2ccp(struct bundle *bundle, const char *name) +{ + return &CcpInfo; +} + struct link * bundle2link(struct bundle *bundle, const char *name) { diff --git a/usr.sbin/ppp/bundle.h b/usr.sbin/ppp/bundle.h index ae069d27626e..b47eff7eccfe 100644 --- a/usr.sbin/ppp/bundle.h +++ b/usr.sbin/ppp/bundle.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bundle.h,v 1.1.2.8 1998/02/15 23:59:40 brian Exp $ + * $Id: bundle.h,v 1.1.2.9 1998/02/17 19:27:49 brian Exp $ */ #define PHASE_DEAD 0 /* Link is dead */ @@ -66,10 +66,12 @@ extern void bundle_LayerDown(struct bundle *, struct fsm *); extern void bundle_LayerFinish(struct bundle *, struct fsm *); extern void bundle_LinkClosed(struct bundle *, struct datalink *); -extern struct link *bundle2link(struct bundle *, const char *); -extern struct physical *bundle2physical(struct bundle *, const char *); -extern struct datalink *bundle2datalink(struct bundle *, const char *); extern int bundle_UpdateSet(struct bundle *, fd_set *, fd_set *, fd_set *, int *); extern int bundle_FillQueues(struct bundle *); extern int bundle_ShowLinks(struct cmdargs const *); + +extern struct link *bundle2link(struct bundle *, const char *); +extern struct physical *bundle2physical(struct bundle *, const char *); +extern struct datalink *bundle2datalink(struct bundle *, const char *); +extern struct ccp *bundle2ccp(struct bundle *, const char *); diff --git a/usr.sbin/ppp/ccp.c b/usr.sbin/ppp/ccp.c index 7732bcce0f67..47dbcb17b33d 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.10 1998/02/18 19:36:09 brian Exp $ + * $Id: ccp.c,v 1.30.2.11 1998/02/19 19:56:53 brian Exp $ * * TODO: * o Support other compression protocols @@ -45,6 +45,11 @@ #include "bundle.h" #include "descriptor.h" #include "prompt.h" +#include "hdlc.h" +#include "throughput.h" +#include "link.h" +#include "chat.h" +#include "datalink.h" static void CcpSendConfigReq(struct fsm *); static void CcpSendTerminateReq(struct fsm *); @@ -55,6 +60,8 @@ static void CcpLayerFinish(struct fsm *); static void CcpLayerUp(struct fsm *); static void CcpLayerDown(struct fsm *); static void CcpInitRestartCounter(struct fsm *); +static void CcpRecvResetReq(struct fsm *); +static void CcpRecvResetAck(struct fsm *, u_char); static struct fsm_callbacks ccp_Callbacks = { CcpLayerUp, @@ -65,27 +72,12 @@ static struct fsm_callbacks ccp_Callbacks = { CcpSendConfigReq, CcpSendTerminateReq, CcpSendTerminateAck, - CcpDecodeConfig + CcpDecodeConfig, + CcpRecvResetReq, + CcpRecvResetAck }; -struct ccp CcpInfo = { - { - "CCP", - PROTO_CCP, - CCP_MAXCODE, - 0, - ST_INITIAL, - 0, 0, 0, - {0, 0, 0, NULL, NULL, NULL}, /* FSM timer */ - {0, 0, 0, NULL, NULL, NULL}, /* Open timer */ - {0, 0, 0, NULL, NULL, NULL}, /* Stopped timer */ - LogCCP, - NULL, /* link */ - NULL, /* bundle */ - &ccp_Callbacks - }, - -1, -1, -1, -1, -1, -1 -}; +struct ccp CcpInfo; static char const *cftypes[] = { /* Check out the latest ``Compression Control Protocol'' rfc (rfc1962.txt) */ @@ -129,30 +121,41 @@ static const struct ccp_algorithm *algorithm[] = { #define NALGORITHMS (sizeof algorithm/sizeof algorithm[0]) int -ReportCcpStatus(struct cmdargs const *arg) +ccp_ReportStatus(struct cmdargs const *arg) { - prompt_Printf(&prompt, "%s [%s]\n", CcpInfo.fsm.name, - StateNames[CcpInfo.fsm.state]); + struct ccp *ccp = bundle2ccp(arg->bundle, arg->cx ? arg->cx->name : NULL); + + prompt_Printf(&prompt, "%s [%s]\n", ccp->fsm.name, + StateNames[ccp->fsm.state]); prompt_Printf(&prompt, "My protocol = %s, His protocol = %s\n", - protoname(CcpInfo.my_proto), protoname(CcpInfo.his_proto)); + protoname(ccp->my_proto), protoname(ccp->his_proto)); prompt_Printf(&prompt, "Output: %ld --> %ld, Input: %ld --> %ld\n", - CcpInfo.uncompout, CcpInfo.compout, - CcpInfo.compin, CcpInfo.uncompin); + ccp->uncompout, ccp->compout, + ccp->compin, ccp->uncompin); return 0; } void -CcpInit(struct bundle *bundle, struct link *l) +ccp_Init(struct ccp *ccp, struct bundle *bundle, struct link *l) { /* Initialise ourselves */ - FsmInit(&CcpInfo.fsm, bundle, l, 10); - CcpInfo.his_proto = CcpInfo.my_proto = -1; - CcpInfo.reset_sent = CcpInfo.last_reset = -1; - CcpInfo.in_algorithm = CcpInfo.out_algorithm = -1; - CcpInfo.his_reject = CcpInfo.my_reject = 0; - CcpInfo.out_init = CcpInfo.in_init = 0; - CcpInfo.uncompout = CcpInfo.compout = 0; - CcpInfo.uncompin = CcpInfo.compin = 0; + fsm_Init(&CcpInfo.fsm, "CCP", PROTO_CCP, CCP_MAXCODE, 10, LogCCP, + bundle, l, &ccp_Callbacks); + ccp_Setup(ccp); +} + +void +ccp_Setup(struct ccp *ccp) +{ + /* Set ourselves up for a startup */ + ccp->fsm.open_mode = 0; + ccp->his_proto = ccp->my_proto = -1; + ccp->reset_sent = ccp->last_reset = -1; + ccp->in_algorithm = ccp->out_algorithm = -1; + ccp->his_reject = ccp->my_reject = 0; + ccp->out_init = ccp->in_init = 0; + ccp->uncompout = ccp->compout = 0; + ccp->uncompin = ccp->compin = 0; } static void @@ -213,7 +216,7 @@ CcpSendTerminateAck(struct fsm *fp) FsmOutput(fp, CODE_TERMACK, fp->reqid++, NULL, 0); } -void +static void CcpRecvResetReq(struct fsm *fp) { /* Got a reset REQ, reset outgoing dictionary */ @@ -417,8 +420,8 @@ CcpInput(struct bundle *bundle, struct mbuf *bp) } } -void -CcpResetInput(u_char id) +static void +CcpRecvResetAck(struct fsm *fp, u_char id) { /* Got a reset ACK, reset incoming dictionary */ if (CcpInfo.reset_sent != -1) { @@ -442,35 +445,36 @@ CcpResetInput(u_char id) } int -CcpOutput(struct link *l, int pri, u_short proto, struct mbuf *m) +ccp_Output(struct ccp *ccp, struct link *l, int pri, u_short proto, + struct mbuf *m) { - /* Compress outgoing data */ - if (CcpInfo.out_init) - return (*algorithm[CcpInfo.out_algorithm]->o.Write)(l, pri, proto, m); + /* Compress outgoing Network Layer data */ + if ((proto & 0xfff1) == 0x21 && ccp->fsm.state == ST_OPENED && ccp->out_init) + return (*algorithm[ccp->out_algorithm]->o.Write)(l, pri, proto, m); return 0; } struct mbuf * -ccp_Decompress(u_short *proto, struct mbuf *bp) +ccp_Decompress(struct ccp *ccp, u_short *proto, struct mbuf *bp) { /* * If proto isn't PROTO_COMPD, we still want to pass it to the * decompression routines so that the dictionary's updated */ - if (CcpInfo.fsm.state == ST_OPENED) + if (ccp->fsm.state == ST_OPENED) if (*proto == PROTO_COMPD) { /* Decompress incoming data */ - if (CcpInfo.reset_sent != -1) { + if (ccp->reset_sent != -1) { /* Send another REQ and put the packet in the bit bucket */ - LogPrintf(LogCCP, "ReSendResetReq(%d)\n", CcpInfo.reset_sent); - FsmOutput(&CcpInfo.fsm, CODE_RESETREQ, CcpInfo.reset_sent, NULL, 0); - } else if (CcpInfo.in_init) - return (*algorithm[CcpInfo.in_algorithm]->i.Read)(proto, bp); + LogPrintf(LogCCP, "ReSendResetReq(%d)\n", ccp->reset_sent); + FsmOutput(&ccp->fsm, CODE_RESETREQ, ccp->reset_sent, NULL, 0); + } else if (ccp->in_init) + return (*algorithm[ccp->in_algorithm]->i.Read)(proto, bp); pfree(bp); bp = NULL; - } else if ((*proto & 0xfff1) == 0x21 && CcpInfo.in_init) + } else if ((*proto & 0xfff1) == 0x21 && ccp->in_init) /* Add incoming Network Layer traffic to our dictionary */ - (*algorithm[CcpInfo.in_algorithm]->i.DictSetup)(*proto, bp); + (*algorithm[ccp->in_algorithm]->i.DictSetup)(*proto, bp); return bp; } diff --git a/usr.sbin/ppp/ccp.h b/usr.sbin/ppp/ccp.h index 8028eb99bb6b..f111fa740561 100644 --- a/usr.sbin/ppp/ccp.h +++ b/usr.sbin/ppp/ccp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: ccp.h,v 1.14.2.8 1998/02/08 11:04:49 brian Exp $ + * $Id: ccp.h,v 1.14.2.9 1998/02/18 19:36:11 brian Exp $ * * TODO: */ @@ -84,13 +84,13 @@ struct ccp_algorithm { } o; }; -extern void CcpRecvResetReq(struct fsm *); +extern void ccp_Init(struct ccp *, struct bundle *, struct link *); +extern void ccp_Setup(struct ccp *); + extern void CcpSendResetReq(struct fsm *); extern void CcpInput(struct bundle *, struct mbuf *); extern void CcpUp(void); extern void CcpOpen(void); -extern void CcpInit(struct bundle *, struct link *); -extern int ReportCcpStatus(struct cmdargs const *); -extern void CcpResetInput(u_char); -extern int CcpOutput(struct link *, int, u_short, struct mbuf *); -extern struct mbuf *ccp_Decompress(u_short *, struct mbuf *); +extern int ccp_ReportStatus(struct cmdargs const *); +extern int ccp_Output(struct ccp *, struct link *, int, u_short, struct mbuf *); +extern struct mbuf *ccp_Decompress(struct ccp *, u_short *, struct mbuf *); diff --git a/usr.sbin/ppp/command.c b/usr.sbin/ppp/command.c index e41f0c8274f9..dad143861654 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.26 1998/02/18 19:35:14 brian Exp $ + * $Id: command.c,v 1.131.2.27 1998/02/18 19:35:32 brian Exp $ * */ #include @@ -278,11 +278,11 @@ ShellCommand(struct cmdargs const *arg, int bg) argv[0] = strdup(arg->argv[0]); for (argc = 1; argc < arg->argc; argc++) { if (strcasecmp(arg->argv[argc], "HISADDR") == 0) - argv[argc] = strdup(inet_ntoa(IpcpInfo.his_ipaddr)); + argv[argc] = strdup(inet_ntoa(IpcpInfo.peer_ip)); else if (strcasecmp(arg->argv[argc], "INTERFACE") == 0) argv[argc] = strdup(arg->bundle->ifname); else if (strcasecmp(arg->argv[argc], "MYADDR") == 0) - argv[argc] = strdup(inet_ntoa(IpcpInfo.want_ipaddr)); + argv[argc] = strdup(inet_ntoa(IpcpInfo.my_ip)); else argv[argc] = strdup(arg->argv[argc]); } @@ -556,13 +556,13 @@ ShowMSExt(struct cmdargs const *arg) { prompt_Printf(&prompt, " MS PPP extention values \n"); prompt_Printf(&prompt, " Primary NS : %s\n", - inet_ntoa(IpcpInfo.ns_entries[0])); + inet_ntoa(IpcpInfo.cfg.ns_entries[0])); prompt_Printf(&prompt, " Secondary NS : %s\n", - inet_ntoa(IpcpInfo.ns_entries[1])); + inet_ntoa(IpcpInfo.cfg.ns_entries[1])); prompt_Printf(&prompt, " Primary NBNS : %s\n", - inet_ntoa(IpcpInfo.nbns_entries[0])); + inet_ntoa(IpcpInfo.cfg.nbns_entries[0])); prompt_Printf(&prompt, " Secondary NBNS : %s\n", - inet_ntoa(IpcpInfo.nbns_entries[1])); + inet_ntoa(IpcpInfo.cfg.nbns_entries[1])); return 0; } @@ -574,7 +574,7 @@ static struct cmdtab const ShowCommands[] = { "Show keep-alive filters", "show afilter option .."}, {"auth", NULL, ShowAuthKey, LOCAL_AUTH, "Show auth details", "show auth"}, - {"ccp", NULL, ReportCcpStatus, LOCAL_AUTH, + {"ccp", NULL, ccp_ReportStatus, LOCAL_AUTH | LOCAL_CX_OPT, "Show CCP status", "show cpp"}, {"compress", NULL, ReportCompress, LOCAL_AUTH, "Show compression stats", "show compress"}, @@ -1201,27 +1201,27 @@ SetInterfaceAddr(struct cmdargs const *arg) const char *hisaddr; hisaddr = NULL; - IpcpInfo.DefMyAddress.ipaddr.s_addr = INADDR_ANY; - IpcpInfo.DefHisAddress.ipaddr.s_addr = INADDR_ANY; + IpcpInfo.cfg.my_range.ipaddr.s_addr = INADDR_ANY; + IpcpInfo.cfg.peer_range.ipaddr.s_addr = INADDR_ANY; if (arg->argc > 4) return -1; - IpcpInfo.HaveTriggerAddress = 0; + IpcpInfo.cfg.HaveTriggerAddress = 0; ifnetmask.s_addr = 0; - iplist_reset(&IpcpInfo.DefHisChoice); + iplist_reset(&IpcpInfo.cfg.peer_list); if (arg->argc > 0) { - if (!ParseAddr(arg->argc, arg->argv, &IpcpInfo.DefMyAddress.ipaddr, - &IpcpInfo.DefMyAddress.mask, &IpcpInfo.DefMyAddress.width)) + if (!ParseAddr(arg->argc, arg->argv, &IpcpInfo.cfg.my_range.ipaddr, + &IpcpInfo.cfg.my_range.mask, &IpcpInfo.cfg.my_range.width)) return 1; if (arg->argc > 1) { hisaddr = arg->argv[1]; if (arg->argc > 2) { ifnetmask = GetIpAddr(arg->argv[2]); if (arg->argc > 3) { - IpcpInfo.TriggerAddress = GetIpAddr(arg->argv[3]); - IpcpInfo.HaveTriggerAddress = 1; + IpcpInfo.cfg.TriggerAddress = GetIpAddr(arg->argv[3]); + IpcpInfo.cfg.HaveTriggerAddress = 1; } } } @@ -1230,15 +1230,15 @@ SetInterfaceAddr(struct cmdargs const *arg) /* * For backwards compatibility, 0.0.0.0 means any address. */ - if (IpcpInfo.DefMyAddress.ipaddr.s_addr == INADDR_ANY) { - IpcpInfo.DefMyAddress.mask.s_addr = INADDR_ANY; - IpcpInfo.DefMyAddress.width = 0; + if (IpcpInfo.cfg.my_range.ipaddr.s_addr == INADDR_ANY) { + IpcpInfo.cfg.my_range.mask.s_addr = INADDR_ANY; + IpcpInfo.cfg.my_range.width = 0; } - IpcpInfo.want_ipaddr.s_addr = IpcpInfo.DefMyAddress.ipaddr.s_addr; + IpcpInfo.my_ip.s_addr = IpcpInfo.cfg.my_range.ipaddr.s_addr; - if (IpcpInfo.DefHisAddress.ipaddr.s_addr == INADDR_ANY) { - IpcpInfo.DefHisAddress.mask.s_addr = INADDR_ANY; - IpcpInfo.DefHisAddress.width = 0; + if (IpcpInfo.cfg.peer_range.ipaddr.s_addr == INADDR_ANY) { + IpcpInfo.cfg.peer_range.mask.s_addr = INADDR_ANY; + IpcpInfo.cfg.peer_range.width = 0; } if (hisaddr && !UseHisaddr(arg->bundle, hisaddr, mode & MODE_AUTO)) @@ -1280,7 +1280,7 @@ SetMSEXT(struct in_addr * pri_addr, static int SetNS(struct cmdargs const *arg) { - SetMSEXT(&IpcpInfo.ns_entries[0], &IpcpInfo.ns_entries[1], + SetMSEXT(&IpcpInfo.cfg.ns_entries[0], &IpcpInfo.cfg.ns_entries[1], arg->argc, arg->argv); return 0; } @@ -1288,7 +1288,7 @@ SetNS(struct cmdargs const *arg) static int SetNBNS(struct cmdargs const *arg) { - SetMSEXT(&IpcpInfo.nbns_entries[0], &IpcpInfo.nbns_entries[1], + SetMSEXT(&IpcpInfo.cfg.nbns_entries[0], &IpcpInfo.cfg.nbns_entries[1], arg->argc, arg->argv); return 0; } @@ -1511,16 +1511,16 @@ AddCommand(struct cmdargs const *arg) } else { if (strcasecmp(arg->argv[0], "MYADDR") == 0) - dest = IpcpInfo.want_ipaddr; + dest = IpcpInfo.my_ip; else if (strcasecmp(arg->argv[0], "HISADDR") == 0) - dest = IpcpInfo.his_ipaddr; + dest = IpcpInfo.peer_ip; else dest = GetIpAddr(arg->argv[0]); netmask = GetIpAddr(arg->argv[1]); gw = 2; } if (strcasecmp(arg->argv[gw], "HISADDR") == 0) - gateway = IpcpInfo.his_ipaddr; + gateway = IpcpInfo.peer_ip; else if (strcasecmp(arg->argv[gw], "INTERFACE") == 0) gateway.s_addr = INADDR_ANY; else @@ -1540,7 +1540,7 @@ DeleteCommand(struct cmdargs const *arg) DeleteIfRoutes(arg->bundle, 0); else { if (strcasecmp(arg->argv[0], "MYADDR") == 0) - dest = IpcpInfo.want_ipaddr; + dest = IpcpInfo.my_ip; else if (strcasecmp(arg->argv[0], "default") == 0) dest.s_addr = INADDR_ANY; else diff --git a/usr.sbin/ppp/datalink.c b/usr.sbin/ppp/datalink.c index 155dfd2b4bba..bbf6d0f3fd41 100644 --- a/usr.sbin/ppp/datalink.c +++ b/usr.sbin/ppp/datalink.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: datalink.c,v 1.1.2.10 1998/02/17 19:29:09 brian Exp $ + * $Id: datalink.c,v 1.1.2.11 1998/02/18 00:27:47 brian Exp $ */ #include @@ -143,10 +143,10 @@ datalink_LoginDone(struct datalink *dl) LogPrintf(LogPHASE, "%s: Entering OPEN state\n", dl->name); dl->state = DATALINK_OPEN; - LcpInit(dl->bundle, dl->physical); - CcpInit(dl->bundle, &dl->physical->link); + lcp_Setup(&LcpInfo, dl->state == DATALINK_READY ? 0 : VarOpenMode); + ccp_Setup(&CcpInfo); + FsmUp(&LcpInfo.fsm); - LcpInfo.fsm.open_mode = dl->state == DATALINK_READY ? 0 : VarOpenMode; FsmOpen(&LcpInfo.fsm); } } @@ -352,16 +352,16 @@ datalink_Create(const char *name, struct bundle *bundle) dl->cfg.reconnect_timeout = RECONNECT_TIMEOUT; dl->name = strdup(name); - if ((dl->physical = modem_Create(dl->name)) == NULL) { + if ((dl->physical = modem_Create(dl->name, &CcpInfo)) == NULL) { free(dl->name); free(dl); return NULL; } chat_Init(&dl->chat, dl->physical, NULL, 1); - IpcpDefAddress(); - LcpInit(dl->bundle, dl->physical); - CcpInit(dl->bundle, &dl->physical->link); + ipcp_Init(&IpcpInfo, dl->bundle, &dl->physical->link); + lcp_Init(&LcpInfo, dl->bundle, dl->physical); + ccp_Init(&CcpInfo, dl->bundle, &dl->physical->link); LogPrintf(LogPHASE, "%s: Created in CLOSED state\n", dl->name); diff --git a/usr.sbin/ppp/filter.c b/usr.sbin/ppp/filter.c index c9e9df6202bd..f12e6530d738 100644 --- a/usr.sbin/ppp/filter.c +++ b/usr.sbin/ppp/filter.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: filter.c,v 1.22.2.3 1998/01/31 02:48:17 brian Exp $ + * $Id: filter.c,v 1.22.2.4 1998/02/10 03:23:18 brian Exp $ * * TODO: Shoud send ICMP error message when we discard packets. */ @@ -91,9 +91,9 @@ ParseAddr(int argc, len = cp ? cp - *argv : strlen(*argv); if (strncasecmp(*argv, "HISADDR", len) == 0) - *paddr = IpcpInfo.his_ipaddr; + *paddr = IpcpInfo.peer_ip; else if (strncasecmp(*argv, "MYADDR", len) == 0) - *paddr = IpcpInfo.want_ipaddr; + *paddr = IpcpInfo.my_ip; else if (len > 15) LogPrintf(LogWARN, "ParseAddr: %s: Bad address\n", *argv); else { diff --git a/usr.sbin/ppp/fsm.c b/usr.sbin/ppp/fsm.c index 194892008cb3..d6f75f80c5df 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.11 1998/02/18 19:35:38 brian Exp $ + * $Id: fsm.c,v 1.27.2.12 1998/02/19 19:56:54 brian Exp $ * * TODO: * o Refer loglevel for log output @@ -84,16 +84,24 @@ StoppedTimeout(void *v) } void -FsmInit(struct fsm *fp, struct bundle *bundle, struct link *l, int maxcfg) +fsm_Init(struct fsm *fp, const char *name, u_short proto, int maxcode, + int maxcfg, int LogLevel, struct bundle *bundle, struct link *l, + struct fsm_callbacks *fn) { - LogPrintf(LogDEBUG, "FsmInit\n"); + fp->name = name; + fp->proto = proto; + fp->max_code = maxcode; fp->state = ST_INITIAL; fp->reqid = 1; fp->restart = 1; - fp->maxconfig = 3; + fp->maxconfig = maxcfg; + memset(&fp->FsmTimer, '\0', sizeof fp->FsmTimer); + memset(&fp->OpenTimer, '\0', sizeof fp->OpenTimer); + memset(&fp->StoppedTimer, '\0', sizeof fp->StoppedTimer); + fp->LogLevel = LogLevel; fp->link = l; fp->bundle = bundle; - fp->maxconfig = maxcfg; + fp->fn = fn; } static void @@ -783,10 +791,10 @@ FsmRecvTimeRemain(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp) } static void -FsmRecvResetReq(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp) +FsmRecvResetReq(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) { LogPrintf(fp->LogLevel, "RecvResetReq(%d)\n", lhp->id); - CcpRecvResetReq(fp); + (*fp->fn->RecvResetReq)(fp); /* * All sendable compressed packets are queued in the PRI_NORMAL modem * output queue.... dump 'em to the priority queue so that they arrive @@ -799,10 +807,10 @@ FsmRecvResetReq(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp) } static void -FsmRecvResetAck(struct fsm * fp, struct fsmheader * lhp, struct mbuf * bp) +FsmRecvResetAck(struct fsm *fp, struct fsmheader *lhp, struct mbuf *bp) { LogPrintf(fp->LogLevel, "RecvResetAck(%d)\n", lhp->id); - CcpResetInput(lhp->id); + (*fp->fn->RecvResetAck)(fp, lhp->id); fp->reqid++; pfree(bp); } @@ -858,3 +866,15 @@ FsmInput(struct fsm * fp, struct mbuf * bp) if (LogIsKept(LogDEBUG)) LogMemory(); } + +void +NullRecvResetReq(struct fsm *fp) +{ + LogPrintf(fp->LogLevel, "Oops - received unexpected reset req\n"); +} + +void +NullRecvResetAck(struct fsm *fp, u_char id) +{ + LogPrintf(fp->LogLevel, "Oops - received unexpected reset ack\n"); +} diff --git a/usr.sbin/ppp/fsm.h b/usr.sbin/ppp/fsm.h index 142ccb53ff44..5a4cff4de727 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.5 1998/02/06 02:24:16 brian Exp $ + * $Id: fsm.h,v 1.16.2.6 1998/02/19 19:56:57 brian Exp $ * * TODO: */ @@ -57,6 +57,9 @@ struct fsm_callbacks { void (*SendTerminateReq) (struct fsm *); /* Term REQ just sent */ void (*SendTerminateAck) (struct fsm *); /* Send Term ACK please */ void (*DecodeConfig) (struct fsm *, u_char *, int, int); + /* Deal with incoming data */ + void (*RecvResetReq) (struct fsm *fp); /* Reset output */ + void (*RecvResetAck) (struct fsm *fp, u_char); /* Reset input */ }; struct fsm { @@ -131,10 +134,14 @@ extern u_char *rejp; extern char const *StateNames[]; -extern void FsmInit(struct fsm *, struct bundle *, struct link *, int); +extern void fsm_Init(struct fsm *, const char *, u_short, int, int, int, + struct bundle *, struct link *, struct fsm_callbacks *); extern void FsmOutput(struct fsm *, u_int, u_int, u_char *, int); extern void FsmOpen(struct fsm *); extern void FsmUp(struct fsm *); extern void FsmDown(struct fsm *); extern void FsmInput(struct fsm *, struct mbuf *); extern void FsmClose(struct fsm *); + +extern void NullRecvResetReq(struct fsm *fp); +extern void NullRecvResetAck(struct fsm *fp, u_char); diff --git a/usr.sbin/ppp/hdlc.c b/usr.sbin/ppp/hdlc.c index d751c35778cb..3a57cd3da5bd 100644 --- a/usr.sbin/ppp/hdlc.c +++ b/usr.sbin/ppp/hdlc.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: hdlc.c,v 1.28.2.11 1998/02/18 19:35:41 brian Exp $ + * $Id: hdlc.c,v 1.28.2.12 1998/02/18 19:36:13 brian Exp $ * * TODO: */ @@ -56,6 +56,7 @@ #include "prompt.h" #include "chat.h" #include "datalink.h" +#include "bundle.h" static u_short const fcstab[256] = { /* 00 */ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, @@ -139,10 +140,8 @@ HdlcOutput(struct link *l, int pri, u_short proto, struct mbuf *bp) u_char *cp; u_short fcs; - if ((proto & 0xfff1) == 0x21) /* Network Layer protocol */ - if (CcpInfo.fsm.state == ST_OPENED) - if (CcpOutput(l, pri, proto, bp)) - return; + if (ccp_Output(l->ccp, l, pri, proto, bp)) + return; if (!p) { /* @@ -360,12 +359,13 @@ DecodePacket(struct bundle *bundle, u_short proto, struct mbuf * bp, struct link *l) { struct physical *p = link2physical(l); + struct ccp *ccp = bundle2ccp(bundle, l->name); u_char *cp; LogPrintf(LogDEBUG, "DecodePacket: proto = 0x%04x\n", proto); /* decompress everything. CCP needs uncompressed data too */ - if ((bp = ccp_Decompress(&proto, bp)) == NULL) + if ((bp = ccp_Decompress(ccp, &proto, bp)) == NULL) return; switch (proto) { diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c index 6458c411f569..281a068a11c2 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.13 1998/02/10 03:23:20 brian Exp $ + * $Id: ipcp.c,v 1.50.2.14 1998/02/19 19:56:59 brian Exp $ * * TODO: * o More RFC1772 backwoard compatibility @@ -69,6 +69,9 @@ #include "systems.h" #include "prompt.h" +#undef REJECTED +#define REJECTED(p, x) ((p)->peer_reject & (1<<(x))) + struct compreq { u_short proto; u_char slots; @@ -95,27 +98,11 @@ static struct fsm_callbacks ipcp_Callbacks = { IpcpSendTerminateReq, IpcpSendTerminateAck, IpcpDecodeConfig, + NullRecvResetReq, + NullRecvResetAck }; -struct ipcp IpcpInfo = { - { - "IPCP", - PROTO_IPCP, - IPCP_MAXCODE, - 0, - ST_INITIAL, - 0, 0, 0, - {0, 0, 0, NULL, NULL, NULL}, /* FSM timer */ - {0, 0, 0, NULL, NULL, NULL}, /* Open timer */ - {0, 0, 0, NULL, NULL, NULL}, /* Stopped timer */ - LogIPCP, - NULL, /* link */ - NULL, /* bundle */ - &ipcp_Callbacks, - }, - MAX_VJ_STATES, - 1 -}; +struct ipcp IpcpInfo; static const char *cftypes[] = { /* Check out the latest ``Assigned numbers'' rfc (rfc1700.txt) */ @@ -157,29 +144,30 @@ ReportIpcpStatus(struct cmdargs const *arg) StateNames[IpcpInfo.fsm.state]); if (IpcpInfo.fsm.state == ST_OPENED) { prompt_Printf(&prompt, " His side: %s, %s\n", - inet_ntoa(IpcpInfo.his_ipaddr), vj2asc(IpcpInfo.his_compproto)); + inet_ntoa(IpcpInfo.peer_ip), vj2asc(IpcpInfo.peer_compproto)); prompt_Printf(&prompt, " My side: %s, %s\n", - inet_ntoa(IpcpInfo.want_ipaddr), vj2asc(IpcpInfo.want_compproto)); + inet_ntoa(IpcpInfo.my_ip), vj2asc(IpcpInfo.my_compproto)); } prompt_Printf(&prompt, "\nDefaults:\n"); prompt_Printf(&prompt, " My Address: %s/%d\n", - inet_ntoa(IpcpInfo.DefMyAddress.ipaddr), IpcpInfo.DefMyAddress.width); - if (iplist_isvalid(&IpcpInfo.DefHisChoice)) + inet_ntoa(IpcpInfo.cfg.my_range.ipaddr), IpcpInfo.cfg.my_range.width); + if (iplist_isvalid(&IpcpInfo.cfg.peer_list)) prompt_Printf(&prompt, " His Address: %s\n", - IpcpInfo.DefHisChoice.src); + IpcpInfo.cfg.peer_list.src); else prompt_Printf(&prompt, " His Address: %s/%d\n", - inet_ntoa(IpcpInfo.DefHisAddress.ipaddr), - IpcpInfo.DefHisAddress.width); - if (IpcpInfo.HaveTriggerAddress) + inet_ntoa(IpcpInfo.cfg.peer_range.ipaddr), + IpcpInfo.cfg.peer_range.width); + if (IpcpInfo.cfg.HaveTriggerAddress) prompt_Printf(&prompt, " Negotiation(trigger): %s\n", - inet_ntoa(IpcpInfo.TriggerAddress)); + inet_ntoa(IpcpInfo.cfg.TriggerAddress)); else prompt_Printf(&prompt, " Negotiation(trigger): MYADDR\n"); - prompt_Printf(&prompt, " Initial VJ slots: %d\n", IpcpInfo.VJInitSlots); + prompt_Printf(&prompt, " Initial VJ slots: %d\n", + IpcpInfo.cfg.VJInitSlots); prompt_Printf(&prompt, " Initial VJ compression: %s\n", - IpcpInfo.VJInitComp ? "on" : "off"); + IpcpInfo.cfg.VJInitComp ? "on" : "off"); prompt_Printf(&prompt, "\n"); throughput_disp(&IpcpInfo.throughput); @@ -187,24 +175,6 @@ ReportIpcpStatus(struct cmdargs const *arg) return 0; } -void -IpcpDefAddress() -{ - /* Setup default IP addresses (`hostname` -> 0.0.0.0) */ - struct hostent *hp; - char name[200]; - - memset(&IpcpInfo.DefMyAddress, '\0', sizeof IpcpInfo.DefMyAddress); - memset(&IpcpInfo.DefHisAddress, '\0', sizeof IpcpInfo.DefHisAddress); - IpcpInfo.HaveTriggerAddress = 0; - if (gethostname(name, sizeof name) == 0) { - hp = gethostbyname(name); - if (hp && hp->h_addrtype == AF_INET) - memcpy(&IpcpInfo.DefMyAddress.ipaddr.s_addr, hp->h_addr, hp->h_length); - } - IpcpInfo.if_mine.s_addr = IpcpInfo.if_peer.s_addr = INADDR_ANY; -} - int SetInitVJ(struct cmdargs const *args) { @@ -216,13 +186,13 @@ SetInitVJ(struct cmdargs const *args) slots = atoi(args->argv[1]); if (slots < 4 || slots > 16) return 1; - IpcpInfo.VJInitSlots = slots; + IpcpInfo.cfg.VJInitSlots = slots; return 0; } else if (!strcasecmp(args->argv[0], "slotcomp")) { if (!strcasecmp(args->argv[1], "on")) - IpcpInfo.VJInitComp = 1; + IpcpInfo.cfg.VJInitComp = 1; else if (!strcasecmp(args->argv[1], "off")) - IpcpInfo.VJInitComp = 0; + IpcpInfo.cfg.VJInitComp = 0; else return 2; return 0; @@ -231,44 +201,86 @@ SetInitVJ(struct cmdargs const *args) } void -IpcpInit(struct bundle *bundle, struct link *l) +ipcp_Init(struct ipcp *ipcp, struct bundle *bundle, struct link *l) { - /* Initialise ourselves */ - FsmInit(&IpcpInfo.fsm, bundle, l, 10); - if (iplist_isvalid(&IpcpInfo.DefHisChoice)) - iplist_setrandpos(&IpcpInfo.DefHisChoice); - IpcpInfo.his_compproto = 0; - IpcpInfo.his_reject = IpcpInfo.my_reject = 0; + struct hostent *hp; + char name[MAXHOSTNAMELEN]; - if ((mode & MODE_DEDICATED) && !GetLabel()) { - IpcpInfo.want_ipaddr.s_addr = IpcpInfo.his_ipaddr.s_addr = INADDR_ANY; - IpcpInfo.his_ipaddr.s_addr = INADDR_ANY; - } else { - IpcpInfo.want_ipaddr.s_addr = IpcpInfo.DefMyAddress.ipaddr.s_addr; - IpcpInfo.his_ipaddr.s_addr = IpcpInfo.DefHisAddress.ipaddr.s_addr; + fsm_Init(&ipcp->fsm, "IPCP", PROTO_IPCP, IPCP_MAXCODE, 10, LogIPCP, + bundle, l, &ipcp_Callbacks); + + ipcp->cfg.VJInitSlots = DEF_VJ_STATES; + ipcp->cfg.VJInitComp = 1; + memset(&ipcp->cfg.my_range, '\0', sizeof ipcp->cfg.my_range); + if (gethostname(name, sizeof name) == 0) { + hp = gethostbyname(name); + if (hp && hp->h_addrtype == AF_INET) { + memcpy(&ipcp->cfg.my_range.ipaddr.s_addr, hp->h_addr, hp->h_length); + ipcp->cfg.peer_range.mask.s_addr = INADDR_BROADCAST; + ipcp->cfg.peer_range.width = 32; + } } + memset(&ipcp->cfg.peer_range, '\0', sizeof ipcp->cfg.peer_range); + iplist_setsrc(&ipcp->cfg.peer_list, ""); + ipcp->cfg.HaveTriggerAddress = 0; + + ipcp->cfg.ns_entries[0].s_addr = INADDR_ANY; + ipcp->cfg.ns_entries[1].s_addr = INADDR_ANY; + ipcp->cfg.nbns_entries[0].s_addr = INADDR_ANY; + ipcp->cfg.nbns_entries[1].s_addr = INADDR_ANY; + + ipcp->my_ifip.s_addr = INADDR_ANY; + ipcp->peer_ifip.s_addr = INADDR_ANY; + + ipcp_Setup(ipcp); +} + +void +ipcp_Setup(struct ipcp *ipcp) +{ + int pos; + + ipcp->fsm.open_mode = 0; + + if (iplist_isvalid(&ipcp->cfg.peer_list)) { + if (ipcp->my_ifip.s_addr != INADDR_ANY && + (pos = iplist_ip2pos(&ipcp->cfg.peer_list, ipcp->my_ifip)) != -1) + ipcp->cfg.peer_range.ipaddr = iplist_setcurpos(&ipcp->cfg.peer_list, pos); + else + ipcp->cfg.peer_range.ipaddr = iplist_setrandpos(&ipcp->cfg.peer_list); + ipcp->cfg.peer_range.mask.s_addr = INADDR_BROADCAST; + ipcp->cfg.peer_range.width = 32; + } + + ipcp->heis1172 = 0; + + ipcp->peer_ip = ipcp->cfg.peer_range.ipaddr; + ipcp->peer_compproto = 0; /* * Some implementations of PPP require that we send a * *special* value as our address, even though the rfc specifies * full negotiation (e.g. "0.0.0.0" or Not "0.0.0.0"). */ - if (IpcpInfo.HaveTriggerAddress) { - IpcpInfo.want_ipaddr.s_addr = IpcpInfo.TriggerAddress.s_addr; + if (ipcp->cfg.HaveTriggerAddress) { + ipcp->my_ip = ipcp->cfg.TriggerAddress; LogPrintf(LogIPCP, "Using trigger address %s\n", - inet_ntoa(IpcpInfo.TriggerAddress)); - } + inet_ntoa(ipcp->cfg.TriggerAddress)); + } else + ipcp->my_ip = ipcp->cfg.my_range.ipaddr; if (Enabled(ConfVjcomp)) - IpcpInfo.want_compproto = (PROTO_VJCOMP << 16) + - ((IpcpInfo.VJInitSlots - 1) << 8) + - IpcpInfo.VJInitComp; + ipcp->my_compproto = (PROTO_VJCOMP << 16) + + ((ipcp->cfg.VJInitSlots - 1) << 8) + + ipcp->cfg.VJInitComp; else - IpcpInfo.want_compproto = 0; - VjInit(IpcpInfo.VJInitSlots - 1); + ipcp->my_compproto = 0; + VjInit(ipcp->cfg.VJInitSlots - 1); - IpcpInfo.heis1172 = 0; - throughput_init(&IpcpInfo.throughput); + ipcp->peer_reject = 0; + ipcp->my_reject = 0; + + throughput_init(&ipcp->throughput); } static int @@ -282,8 +294,8 @@ ipcp_SetIPaddress(struct bundle *bundle, struct ipcp *ipcp, struct ifaliasreq ifra; /* If given addresses are alreay set, then ignore this request */ - if (ipcp->if_mine.s_addr == myaddr.s_addr && - ipcp->if_peer.s_addr == hisaddr.s_addr) + if (ipcp->my_ifip.s_addr == myaddr.s_addr && + ipcp->peer_ifip.s_addr == hisaddr.s_addr) return 0; IpcpCleanInterface(&ipcp->fsm); @@ -335,11 +347,11 @@ ipcp_SetIPaddress(struct bundle *bundle, struct ipcp *ipcp, return (-1); } - ipcp->if_peer.s_addr = hisaddr.s_addr; - ipcp->if_mine.s_addr = myaddr.s_addr; + ipcp->peer_ifip.s_addr = hisaddr.s_addr; + ipcp->my_ifip.s_addr = myaddr.s_addr; if (Enabled(ConfProxy)) - sifproxyarp(bundle, ipcp, s); + sifproxyarp(bundle, ipcp->peer_ifip, s); close(s); return (0); @@ -352,8 +364,8 @@ ChooseHisAddr(struct bundle *bundle, struct ipcp *ipcp, struct in_addr try; int f; - for (f = 0; f < IpcpInfo.DefHisChoice.nItems; f++) { - try = iplist_next(&IpcpInfo.DefHisChoice); + for (f = 0; f < IpcpInfo.cfg.peer_list.nItems; f++) { + try = iplist_next(&IpcpInfo.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) { @@ -363,7 +375,7 @@ ChooseHisAddr(struct bundle *bundle, struct ipcp *ipcp, } } - if (f == IpcpInfo.DefHisChoice.nItems) { + if (f == IpcpInfo.cfg.peer_list.nItems) { LogPrintf(LogDEBUG, "ChooseHisAddr: All addresses in use !\n"); try.s_addr = INADDR_ANY; } @@ -393,12 +405,12 @@ IpcpSendConfigReq(struct fsm *fp) if ((p && !Physical_IsSync(p)) || !REJECTED(ipcp, TY_IPADDR)) { o.id = TY_IPADDR; o.len = 6; - *(u_long *)o.data = ipcp->want_ipaddr.s_addr; + *(u_long *)o.data = ipcp->my_ip.s_addr; cp += LcpPutConf(LogIPCP, cp, &o, cftypes[o.id], - inet_ntoa(ipcp->want_ipaddr)); + inet_ntoa(ipcp->my_ip)); } - if (ipcp->want_compproto && !REJECTED(ipcp, TY_COMPPROTO)) { + if (ipcp->my_compproto && !REJECTED(ipcp, TY_COMPPROTO)) { const char *args; o.id = TY_COMPPROTO; if (ipcp->heis1172) { @@ -407,8 +419,8 @@ IpcpSendConfigReq(struct fsm *fp) args = ""; } else { o.len = 6; - *(u_long *)o.data = htonl(ipcp->want_compproto); - args = vj2asc(ipcp->want_compproto); + *(u_long *)o.data = htonl(ipcp->my_compproto); + args = vj2asc(ipcp->my_compproto); } cp += LcpPutConf(LogIPCP, cp, &o, cftypes[o.id], args); } @@ -460,10 +472,10 @@ IpcpCleanInterface(struct fsm *fp) } if (Enabled(ConfProxy)) - cifproxyarp(fp->bundle, ipcp, s); + cifproxyarp(fp->bundle, ipcp->peer_ifip, s); - if (ipcp->if_mine.s_addr != INADDR_ANY || - ipcp->if_peer.s_addr != INADDR_ANY) { + if (ipcp->my_ifip.s_addr != INADDR_ANY || + ipcp->peer_ifip.s_addr != INADDR_ANY) { memset(&ifra, '\0', sizeof ifra); strncpy(ifra.ifra_name, fp->bundle->ifname, sizeof ifra.ifra_name - 1); ifra.ifra_name[sizeof ifra.ifra_name - 1] = '\0'; @@ -471,14 +483,14 @@ IpcpCleanInterface(struct fsm *fp) peer = (struct sockaddr_in *)&ifra.ifra_broadaddr; me->sin_family = peer->sin_family = AF_INET; me->sin_len = peer->sin_len = sizeof(struct sockaddr_in); - me->sin_addr = ipcp->if_mine; - peer->sin_addr = ipcp->if_peer; + me->sin_addr = ipcp->my_ifip; + peer->sin_addr = ipcp->peer_ifip; if (ID0ioctl(s, SIOCDIFADDR, &ifra) < 0) { LogPrintf(LogERROR, "IpcpCleanInterface: ioctl(SIOCDIFADDR): %s\n", strerror(errno)); close(s); } - ipcp->if_mine.s_addr = ipcp->if_peer.s_addr = INADDR_ANY; + ipcp->my_ifip.s_addr = ipcp->peer_ifip.s_addr = INADDR_ANY; } close(s); @@ -491,7 +503,7 @@ IpcpLayerDown(struct fsm *fp) struct ipcp *ipcp = fsm2ipcp(fp); const char *s; - s = inet_ntoa(ipcp->if_peer); + s = inet_ntoa(ipcp->peer_ifip); LogPrintf(LogIsKept(LogLINK) ? LogLINK : LogIPCP, "IpcpLayerDown: %s\n", s); throughput_stop(&ipcp->throughput); @@ -520,32 +532,32 @@ IpcpLayerUp(struct fsm *fp) char tbuff[100]; LogPrintf(LogIPCP, "IpcpLayerUp(%d).\n", fp->state); - snprintf(tbuff, sizeof tbuff, "myaddr = %s ", inet_ntoa(ipcp->want_ipaddr)); + snprintf(tbuff, sizeof tbuff, "myaddr = %s ", inet_ntoa(ipcp->my_ip)); LogPrintf(LogIsKept(LogIPCP) ? LogIPCP : LogLINK, " %s hisaddr = %s\n", - tbuff, inet_ntoa(ipcp->his_ipaddr)); + tbuff, inet_ntoa(ipcp->peer_ip)); - if (ipcp->his_compproto >> 16 == PROTO_VJCOMP) - VjInit((ipcp->his_compproto >> 8) & 255); + if (ipcp->peer_compproto >> 16 == PROTO_VJCOMP) + VjInit((ipcp->peer_compproto >> 8) & 255); - if (ipcp_SetIPaddress(fp->bundle, ipcp, ipcp->want_ipaddr, - ipcp->his_ipaddr, ifnetmask, 0) < 0) { + if (ipcp_SetIPaddress(fp->bundle, ipcp, ipcp->my_ip, + ipcp->peer_ip, ifnetmask, 0) < 0) { LogPrintf(LogERROR, "IpcpLayerUp: unable to set ip address\n"); return; } #ifndef NOALIAS if (mode & MODE_ALIAS) - VarPacketAliasSetAddress(ipcp->want_ipaddr); + VarPacketAliasSetAddress(ipcp->my_ip); #endif LogPrintf(LogIsKept(LogLINK) ? LogLINK : LogIPCP, "IpcpLayerUp: %s\n", - inet_ntoa(ipcp->if_peer)); + inet_ntoa(ipcp->peer_ifip)); /* * XXX this stuff should really live in the FSM. Our config should * associate executable sections in files with events. */ - if (SelectSystem(fp->bundle, inet_ntoa(ipcp->if_mine), LINKUPFILE) < 0) + if (SelectSystem(fp->bundle, inet_ntoa(ipcp->my_ifip), LINKUPFILE) < 0) if (GetLabel()) { if (SelectSystem(fp->bundle, GetLabel(), LINKUPFILE) < 0) SelectSystem(fp->bundle, "MYADDR", LINKUPFILE); @@ -619,53 +631,53 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) switch (mode_type) { case MODE_REQ: - if (iplist_isvalid(&ipcp->DefHisChoice)) { + if (iplist_isvalid(&ipcp->cfg.peer_list)) { if (ipaddr.s_addr == INADDR_ANY || - iplist_ip2pos(&ipcp->DefHisChoice, ipaddr) < 0 || - ipcp_SetIPaddress(fp->bundle, ipcp, ipcp->DefMyAddress.ipaddr, + iplist_ip2pos(&ipcp->cfg.peer_list, ipaddr) < 0 || + ipcp_SetIPaddress(fp->bundle, ipcp, ipcp->cfg.my_range.ipaddr, ipaddr, ifnetmask, 1)) { LogPrintf(LogIPCP, "%s: Address invalid or already in use\n", inet_ntoa(ipaddr)); - ipcp->his_ipaddr = ChooseHisAddr - (fp->bundle, ipcp, ipcp->DefMyAddress.ipaddr); - if (ipcp->his_ipaddr.s_addr == INADDR_ANY) { + ipcp->peer_ip = ChooseHisAddr + (fp->bundle, ipcp, ipcp->cfg.my_range.ipaddr); + if (ipcp->peer_ip.s_addr == INADDR_ANY) { memcpy(rejp, cp, length); rejp += length; } else { memcpy(nakp, cp, 2); - memcpy(nakp+2, &ipcp->his_ipaddr.s_addr, length - 2); + memcpy(nakp+2, &ipcp->peer_ip.s_addr, length - 2); nakp += length; } break; } - } else if (!AcceptableAddr(&ipcp->DefHisAddress, ipaddr)) { + } else if (!AcceptableAddr(&ipcp->cfg.peer_range, ipaddr)) { /* * If destination address is not acceptable, insist to use what we * want to use. */ memcpy(nakp, cp, 2); - memcpy(nakp+2, &ipcp->his_ipaddr.s_addr, length - 2); + memcpy(nakp+2, &ipcp->peer_ip.s_addr, length - 2); nakp += length; break; } - ipcp->his_ipaddr = ipaddr; + ipcp->peer_ip = ipaddr; memcpy(ackp, cp, length); ackp += length; break; case MODE_NAK: - if (AcceptableAddr(&ipcp->DefMyAddress, ipaddr)) { + if (AcceptableAddr(&ipcp->cfg.my_range, ipaddr)) { /* Use address suggested by peer */ snprintf(tbuff2, sizeof tbuff2, "%s changing address: %s ", tbuff, - inet_ntoa(ipcp->want_ipaddr)); + inet_ntoa(ipcp->my_ip)); LogPrintf(LogIPCP, "%s --> %s\n", tbuff2, inet_ntoa(ipaddr)); - ipcp->want_ipaddr = ipaddr; + ipcp->my_ip = ipaddr; } else { LogPrintf(LogIPCP, "%s: Unacceptable address!\n", inet_ntoa(ipaddr)); FsmClose(&ipcp->fsm); } break; case MODE_REJ: - ipcp->his_reject |= (1 << type); + ipcp->peer_reject |= (1 << type); break; } break; @@ -686,7 +698,7 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) if (ntohs(pcomp->proto) == PROTO_VJCOMP) { LogPrintf(LogWARN, "Peer is speaking RFC1172 compression protocol !\n"); ipcp->heis1172 = 1; - ipcp->his_compproto = compproto; + ipcp->peer_compproto = compproto; memcpy(ackp, cp, length); ackp += length; } else { @@ -698,15 +710,16 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) break; case 6: /* RFC1332 */ if (ntohs(pcomp->proto) == PROTO_VJCOMP - && pcomp->slots < MAX_VJ_STATES && pcomp->slots > 2) { - ipcp->his_compproto = compproto; + && pcomp->slots <= MAX_VJ_STATES + && pcomp->slots >= MIN_VJ_STATES) { + ipcp->peer_compproto = compproto; ipcp->heis1172 = 0; memcpy(ackp, cp, length); ackp += length; } else { memcpy(nakp, cp, 2); pcomp->proto = htons(PROTO_VJCOMP); - pcomp->slots = MAX_VJ_STATES - 1; + pcomp->slots = DEF_VJ_STATES; pcomp->compcid = 0; memcpy(nakp+2, &pcomp, sizeof pcomp); nakp += length; @@ -721,11 +734,11 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) break; case MODE_NAK: LogPrintf(LogIPCP, "%s changing compproto: %08x --> %08x\n", - tbuff, ipcp->want_compproto, compproto); - ipcp->want_compproto = compproto; + tbuff, ipcp->my_compproto, compproto); + ipcp->my_compproto = compproto; break; case MODE_REJ: - ipcp->his_reject |= (1 << type); + ipcp->peer_reject |= (1 << type); break; } break; @@ -739,20 +752,20 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) switch (mode_type) { case MODE_REQ: - ipcp->his_ipaddr = ipaddr; - ipcp->want_ipaddr = dstipaddr; + ipcp->peer_ip = ipaddr; + ipcp->my_ip = dstipaddr; memcpy(ackp, cp, length); ackp += length; break; case MODE_NAK: snprintf(tbuff2, sizeof tbuff2, "%s changing address: %s", tbuff, - inet_ntoa(ipcp->want_ipaddr)); + inet_ntoa(ipcp->my_ip)); LogPrintf(LogIPCP, "%s --> %s\n", tbuff2, inet_ntoa(ipaddr)); - ipcp->want_ipaddr = ipaddr; - ipcp->his_ipaddr = dstipaddr; + ipcp->my_ip = ipaddr; + ipcp->peer_ip = dstipaddr; break; case MODE_REJ: - ipcp->his_reject |= (1 << type); + ipcp->peer_reject |= (1 << type); break; } break; @@ -775,7 +788,7 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) case MODE_REQ: lp = (u_long *) (cp + 2); dnsstuff.s_addr = *lp; - ms_info_req.s_addr = ipcp->ns_entries + ms_info_req.s_addr = ipcp->cfg.ns_entries [(type - TY_PRIMARY_DNS) ? 1 : 0].s_addr; if (dnsstuff.s_addr != ms_info_req.s_addr) { @@ -825,7 +838,7 @@ IpcpDecodeConfig(struct fsm *fp, u_char * cp, int plen, int mode_type) case MODE_REQ: lp = (u_long *) (cp + 2); dnsstuff.s_addr = *lp; - ms_info_req.s_addr = ipcp->nbns_entries + 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); @@ -876,36 +889,36 @@ int UseHisaddr(struct bundle *bundle, const char *hisaddr, int setaddr) { /* Use `hisaddr' for the peers address (set iface if `setaddr') */ - memset(&IpcpInfo.DefHisAddress, '\0', sizeof IpcpInfo.DefHisAddress); - iplist_reset(&IpcpInfo.DefHisChoice); + memset(&IpcpInfo.cfg.peer_range, '\0', sizeof IpcpInfo.cfg.peer_range); + iplist_reset(&IpcpInfo.cfg.peer_list); if (strpbrk(hisaddr, ",-")) { - iplist_setsrc(&IpcpInfo.DefHisChoice, hisaddr); - if (iplist_isvalid(&IpcpInfo.DefHisChoice)) { - iplist_setrandpos(&IpcpInfo.DefHisChoice); - IpcpInfo.his_ipaddr = ChooseHisAddr - (bundle, &IpcpInfo, IpcpInfo.want_ipaddr); - if (IpcpInfo.his_ipaddr.s_addr == INADDR_ANY) { - LogPrintf(LogWARN, "%s: None available !\n", IpcpInfo.DefHisChoice.src); + iplist_setsrc(&IpcpInfo.cfg.peer_list, hisaddr); + if (iplist_isvalid(&IpcpInfo.cfg.peer_list)) { + iplist_setrandpos(&IpcpInfo.cfg.peer_list); + IpcpInfo.peer_ip = ChooseHisAddr + (bundle, &IpcpInfo, IpcpInfo.my_ip); + if (IpcpInfo.peer_ip.s_addr == INADDR_ANY) { + LogPrintf(LogWARN, "%s: None available !\n", IpcpInfo.cfg.peer_list.src); return(0); } - IpcpInfo.DefHisAddress.ipaddr.s_addr = IpcpInfo.his_ipaddr.s_addr; - IpcpInfo.DefHisAddress.mask.s_addr = INADDR_BROADCAST; - IpcpInfo.DefHisAddress.width = 32; + IpcpInfo.cfg.peer_range.ipaddr.s_addr = IpcpInfo.peer_ip.s_addr; + IpcpInfo.cfg.peer_range.mask.s_addr = INADDR_BROADCAST; + IpcpInfo.cfg.peer_range.width = 32; } else { LogPrintf(LogWARN, "%s: Invalid range !\n", hisaddr); return 0; } - } else if (ParseAddr(1, &hisaddr, &IpcpInfo.DefHisAddress.ipaddr, - &IpcpInfo.DefHisAddress.mask, - &IpcpInfo.DefHisAddress.width) != 0) { - IpcpInfo.his_ipaddr.s_addr = IpcpInfo.DefHisAddress.ipaddr.s_addr; + } else if (ParseAddr(1, &hisaddr, &IpcpInfo.cfg.peer_range.ipaddr, + &IpcpInfo.cfg.peer_range.mask, + &IpcpInfo.cfg.peer_range.width) != 0) { + IpcpInfo.peer_ip.s_addr = IpcpInfo.cfg.peer_range.ipaddr.s_addr; if (setaddr && ipcp_SetIPaddress(bundle, &IpcpInfo, - IpcpInfo.DefMyAddress.ipaddr, - IpcpInfo.DefHisAddress.ipaddr, ifnetmask, + IpcpInfo.cfg.my_range.ipaddr, + IpcpInfo.cfg.peer_range.ipaddr, ifnetmask, 0) < 0) { - IpcpInfo.DefMyAddress.ipaddr.s_addr = INADDR_ANY; - IpcpInfo.DefHisAddress.ipaddr.s_addr = INADDR_ANY; + IpcpInfo.cfg.my_range.ipaddr.s_addr = INADDR_ANY; + IpcpInfo.cfg.peer_range.ipaddr.s_addr = INADDR_ANY; return 0; } } else diff --git a/usr.sbin/ppp/ipcp.h b/usr.sbin/ppp/ipcp.h index 19ddc116eda0..63223ce36983 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.11 1998/02/08 11:04:52 brian Exp $ + * $Id: ipcp.h,v 1.18.2.12 1998/02/08 19:29:44 brian Exp $ * * TODO: */ @@ -42,35 +42,36 @@ struct in_range { struct ipcp { struct fsm fsm; /* The finite state machine */ - int VJInitSlots; /* Maximum VJ slots */ - int VJInitComp : 1; /* Slot compression */ + struct { + int VJInitSlots; /* Maximum VJ slots */ + int VJInitComp : 1; /* Slot compression */ + + struct in_range my_range; /* MYADDR spec */ + struct in_range peer_range; /* HISADDR spec */ + struct iplist peer_list; /* Ranges of HISADDR values */ + + struct in_addr TriggerAddress; /* Address to suggest in REQ */ + int HaveTriggerAddress : 1; /* Trigger address specified */ + +#ifndef NOMSEXT + struct in_addr ns_entries[2]; /* DNS addresses offered */ + struct in_addr nbns_entries[2]; /* NetBIOS NS addresses offered */ +#endif + } cfg; int heis1172 : 1; /* True if he is speaking rfc1172 */ - struct in_addr his_ipaddr; /* IP address he's willing to use */ - u_int32_t his_compproto; /* VJ params he's willing to use */ + struct in_addr peer_ip; /* IP address he's willing to use */ + u_int32_t peer_compproto; /* VJ params he's willing to use */ - struct in_addr want_ipaddr; /* IP address I'm willing to use */ - u_int32_t want_compproto; /* VJ params I'm willing to use */ + struct in_addr my_ip; /* IP address I'm willing to use */ + u_int32_t my_compproto; /* VJ params I'm willing to use */ - u_int32_t his_reject; /* Request codes rejected by peer */ + u_int32_t peer_reject; /* Request codes rejected by peer */ u_int32_t my_reject; /* Request codes I have rejected */ -#ifndef NOMSEXT - struct in_addr ns_entries[2]; /* DNS addresses offered */ - struct in_addr nbns_entries[2]; /* NetBIOS NS addresses offered */ -#endif - - struct in_range DefMyAddress; /* MYADDR spec */ - - struct in_range DefHisAddress; /* HISADDR spec */ - struct iplist DefHisChoice; /* Ranges of HISADDR values */ - - struct in_addr TriggerAddress; /* Address to suggest in REQ */ - int HaveTriggerAddress : 1; /* Trigger address specified */ - - struct in_addr if_mine; /* My configured interface address */ - struct in_addr if_peer; /* My congigured destination address */ + struct in_addr my_ifip; /* My configured interface address */ + struct in_addr peer_ifip; /* My congigured destination address */ struct pppThroughput throughput; /* throughput statistics */ }; @@ -79,8 +80,9 @@ extern struct ipcp IpcpInfo; #define fsm2ipcp(fp) (fp->proto == PROTO_IPCP ? (struct ipcp *)fp : NULL) -extern void IpcpInit(struct bundle *, struct link *l); -extern void IpcpDefAddress(void); +extern void ipcp_Init(struct ipcp *, struct bundle *, struct link *l); +extern void ipcp_Setup(struct ipcp *); + extern void IpcpUp(void); extern void IpcpOpen(void); extern int ReportIpcpStatus(struct cmdargs const *); diff --git a/usr.sbin/ppp/lcp.c b/usr.sbin/ppp/lcp.c index 86bbe0442a7e..410c0a6545d8 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.17 1998/02/18 19:35:48 brian Exp $ + * $Id: lcp.c,v 1.55.2.18 1998/02/19 19:57:01 brian Exp $ * * TODO: * o Limit data field length by MRU @@ -96,7 +96,9 @@ static struct fsm_callbacks lcp_Callbacks = { LcpSendConfigReq, LcpSendTerminateReq, LcpSendTerminateAck, - LcpDecodeConfig + LcpDecodeConfig, + NullRecvResetReq, + NullRecvResetAck }; struct lcp LcpInfo = { @@ -183,32 +185,43 @@ GenerateMagic(void) } void -LcpInit(struct bundle *bundle, struct physical *physical) +lcp_Init(struct lcp *lcp, struct bundle *bundle, struct physical *physical) { /* Initialise ourselves */ - FsmInit(&LcpInfo.fsm, bundle, physical2link(physical), 10); - hdlc_Init(&physical->hdlc); - async_Init(&physical->async); + fsm_Init(&lcp->fsm, "LCP", PROTO_LCP, LCP_MAXCODE, 10, LogLCP, bundle, + &physical->link, &lcp_Callbacks); + lcp_Setup(lcp, 1); +} - LcpInfo.his_mru = DEF_MRU; - LcpInfo.his_accmap = 0xffffffff; - LcpInfo.his_magic = 0; - LcpInfo.his_lqrperiod = 0; - LcpInfo.his_protocomp = 0; - LcpInfo.his_acfcomp = 0; - LcpInfo.his_auth = 0; +void +lcp_Setup(struct lcp *lcp, int openmode) +{ + struct physical *p = link2physical(lcp->fsm.link); - LcpInfo.want_mru = VarMRU; - LcpInfo.want_accmap = VarAccmap; - LcpInfo.want_magic = GenerateMagic(); - LcpInfo.want_auth = Enabled(ConfChap) ? PROTO_CHAP : - Enabled(ConfPap) ? PROTO_PAP : 0; - LcpInfo.want_lqrperiod = Enabled(ConfLqr) ? VarLqrTimeout * 100 : 0; - LcpInfo.want_protocomp = Enabled(ConfProtocomp) ? 1 : 0; - LcpInfo.want_acfcomp = Enabled(ConfAcfcomp) ? 1 : 0; + lcp->fsm.open_mode = openmode; - LcpInfo.his_reject = LcpInfo.my_reject = 0; - LcpInfo.auth_iwait = LcpInfo.auth_ineed = 0; + hdlc_Init(&p->hdlc); + async_Init(&p->async); + + lcp->his_mru = DEF_MRU; + lcp->his_accmap = 0xffffffff; + lcp->his_magic = 0; + lcp->his_lqrperiod = 0; + lcp->his_protocomp = 0; + lcp->his_acfcomp = 0; + lcp->his_auth = 0; + + lcp->want_mru = VarMRU; + lcp->want_accmap = VarAccmap; + lcp->want_magic = GenerateMagic(); + lcp->want_auth = Enabled(ConfChap) ? PROTO_CHAP : + Enabled(ConfPap) ? PROTO_PAP : 0; + lcp->want_lqrperiod = Enabled(ConfLqr) ? VarLqrTimeout * 100 : 0; + lcp->want_protocomp = Enabled(ConfProtocomp) ? 1 : 0; + lcp->want_acfcomp = Enabled(ConfAcfcomp) ? 1 : 0; + + lcp->his_reject = lcp->my_reject = 0; + lcp->auth_iwait = lcp->auth_ineed = 0; } static void diff --git a/usr.sbin/ppp/lcp.h b/usr.sbin/ppp/lcp.h index 492a9eb60bce..db4a770b7fb5 100644 --- a/usr.sbin/ppp/lcp.h +++ b/usr.sbin/ppp/lcp.h @@ -15,7 +15,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: lcp.h,v 1.16.2.9 1998/02/17 19:29:14 brian Exp $ + * $Id: lcp.h,v 1.16.2.10 1998/02/19 19:56:39 brian Exp $ * * TODO: */ @@ -75,7 +75,9 @@ extern struct lcp LcpInfo; #define fsm2lcp(fp) (fp->proto == PROTO_LCP ? (struct lcp *)fp : NULL) -extern void LcpInit(struct bundle *, struct physical *); +extern void lcp_Init(struct lcp *, struct bundle *, struct physical *); +extern void lcp_Setup(struct lcp *, int); + extern void LcpSendProtoRej(u_char *, int); extern int LcpPutConf(int, u_char *, const struct lcp_opt *, const char *, const char *, ...); diff --git a/usr.sbin/ppp/link.h b/usr.sbin/ppp/link.h index 228f3c01dcc1..333788957211 100644 --- a/usr.sbin/ppp/link.h +++ b/usr.sbin/ppp/link.h @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: link.h,v 1.1.2.3 1998/02/07 20:49:48 brian Exp $ + * $Id: link.h,v 1.1.2.4 1998/02/16 00:00:25 brian Exp $ * */ @@ -35,6 +35,7 @@ #define NPROTOSTAT 11 struct bundle; +struct ccp; struct link { int type; /* _LINK type */ @@ -43,6 +44,7 @@ struct link { struct pppThroughput throughput; /* Link throughput statistics */ struct pppTimer Timer; /* inactivity timeout */ struct mqueue Queue[LINK_QUEUES]; /* Our output queue of mbufs */ + struct ccp *ccp; /* Link compression */ u_long proto_in[NPROTOSTAT]; /* outgoing protocol stats */ u_long proto_out[NPROTOSTAT]; /* incoming protocol stats */ diff --git a/usr.sbin/ppp/main.c b/usr.sbin/ppp/main.c index d9c181c18c74..0567e84c80b7 100644 --- a/usr.sbin/ppp/main.c +++ b/usr.sbin/ppp/main.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: main.c,v 1.121.2.25 1998/02/17 19:28:29 brian Exp $ + * $Id: main.c,v 1.121.2.26 1998/02/18 00:27:49 brian Exp $ * * TODO: * o Add commands for traffic summary, version display, etc. @@ -407,7 +407,7 @@ main(int argc, char **argv) */ SetLabel(label); if (mode & MODE_AUTO && - IpcpInfo.DefHisAddress.ipaddr.s_addr == INADDR_ANY) { + IpcpInfo.cfg.peer_range.ipaddr.s_addr == INADDR_ANY) { LogPrintf(LogWARN, "You must \"set ifaddr\" in label %s for auto mode.\n", label); Cleanup(EX_START); @@ -590,7 +590,7 @@ DoLoop(struct bundle *bundle) } if (!tun_check_header(tun, AF_INET)) continue; - if (((struct ip *) rbuff)->ip_dst.s_addr == IpcpInfo.want_ipaddr.s_addr) { + if (((struct ip *) rbuff)->ip_dst.s_addr == IpcpInfo.my_ip.s_addr) { /* we've been asked to send something addressed *to* us :( */ if (VarLoopback) { pri = PacketCheck(rbuff, n, FL_IN); diff --git a/usr.sbin/ppp/modem.c b/usr.sbin/ppp/modem.c index 33cf65535374..eec301968934 100644 --- a/usr.sbin/ppp/modem.c +++ b/usr.sbin/ppp/modem.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: modem.c,v 1.77.2.22 1998/02/17 19:29:00 brian Exp $ + * $Id: modem.c,v 1.77.2.23 1998/02/19 02:08:51 brian Exp $ * * TODO: */ @@ -84,31 +84,50 @@ static int modem_UpdateSet(struct descriptor *, fd_set *, fd_set *, fd_set *, int *); struct physical * -modem_Create(const char *name) +modem_Create(const char *name, struct ccp *ccp) { struct physical *p; p = (struct physical *)malloc(sizeof(struct physical)); if (!p) return NULL; - memset(p, '\0', sizeof *p); + p->link.type = PHYSICAL_LINK; p->link.name = strdup(name); p->link.len = sizeof *p; + memset(&p->link.throughput, '\0', sizeof p->link.throughput); + memset(&p->link.Timer, '\0', sizeof p->link.Timer); + memset(p->link.Queue, '\0', sizeof p->link.Queue); + p->link.ccp = ccp; + memset(p->link.proto_in, '\0', sizeof p->link.proto_in); + memset(p->link.proto_out, '\0', sizeof p->link.proto_out); p->link.StartOutput = modem_StartOutput; p->link.IsActive = modem_IsActive; p->link.Close = modem_Hangup; p->link.Destroy = modem_Destroy; - p->fd = -1; - p->cfg.rts_cts = MODEM_CTSRTS; - p->cfg.speed = MODEM_SPEED; - p->cfg.parity = CS8; + p->desc.type = PHYSICAL_DESCRIPTOR; p->desc.UpdateSet = modem_UpdateSet; p->desc.IsSet = Physical_IsSet; p->desc.Read = modem_DescriptorRead; p->desc.Write = Physical_DescriptorWrite; + hdlc_Init(&p->hdlc); + async_Init(&p->async); + + p->fd = -1; + p->mbits = 0; + p->abort = 0; + p->dev_is_modem = 0; + p->out = NULL; + p->connect_count = 0; + + p->cfg.is_direct = 0; /* not yet used */ + p->cfg.is_dedicated = 0; /* not yet used */ + p->cfg.rts_cts = MODEM_CTSRTS; + p->cfg.speed = MODEM_SPEED; + p->cfg.parity = CS8; + return p; } diff --git a/usr.sbin/ppp/modem.h b/usr.sbin/ppp/modem.h index 1b085d247d40..f47447c92f05 100644 --- a/usr.sbin/ppp/modem.h +++ b/usr.sbin/ppp/modem.h @@ -15,15 +15,16 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: modem.h,v 1.16.2.7 1998/02/16 00:00:51 brian Exp $ + * $Id: modem.h,v 1.16.2.8 1998/02/17 19:27:58 brian Exp $ * * TODO: */ struct physical; +struct ccp; extern int modem_Raw(struct physical *, struct bundle *); -extern struct physical *modem_Create(const char *); +extern struct physical *modem_Create(const char *, struct ccp *); extern int modem_Open(struct physical *, struct bundle *); extern int modem_Speed(struct physical *); extern speed_t IntToSpeed(int); diff --git a/usr.sbin/ppp/physical.h b/usr.sbin/ppp/physical.h index fe57af70e7bf..30e48805d20b 100644 --- a/usr.sbin/ppp/physical.h +++ b/usr.sbin/ppp/physical.h @@ -16,7 +16,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: physical.h,v 1.1.2.9 1998/02/17 19:29:03 brian Exp $ + * $Id: physical.h,v 1.1.2.10 1998/02/18 19:35:58 brian Exp $ * */ @@ -40,8 +40,8 @@ struct physical { belong in the generic physical struct. It comes from modem.c. */ struct { - unsigned is_dedicated : 1; /* Dedicated mode? XXX-ML - not yet init'd */ - unsigned is_direct : 1; /* Direct mode? XXX-ML - not yet initialized */ + unsigned is_dedicated : 1; /* Dedicated mode? XXX-ML - not yet used */ + unsigned is_direct : 1; /* Direct mode? XXX-ML - not yet used */ unsigned rts_cts : 1; /* Is rts/cts enabled? */ unsigned int parity; /* What parity is enabled? (TTY flags) */ unsigned int speed; /* Modem speed */ diff --git a/usr.sbin/ppp/slcompress.h b/usr.sbin/ppp/slcompress.h index b1003cc69ab9..8cbafa015049 100644 --- a/usr.sbin/ppp/slcompress.h +++ b/usr.sbin/ppp/slcompress.h @@ -1,7 +1,7 @@ /* * Definitions for tcp compression routines. * - * $Header: /home/ncvs/src/usr.sbin/ppp/slcompress.h,v 1.10 1997/11/22 03:37:50 brian Exp $ + * $Header: /home/ncvs/src/usr.sbin/ppp/slcompress.h,v 1.10.2.1 1998/01/29 23:11:44 brian Exp $ * * Copyright (c) 1989 Regents of the University of California. * All rights reserved. @@ -18,13 +18,15 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: slcompress.h,v 1.10 1997/11/22 03:37:50 brian Exp $ + * $Id: slcompress.h,v 1.10.2.1 1998/01/29 23:11:44 brian Exp $ * * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: * - Initial distribution. */ -#define MAX_VJ_STATES 16 /* must be > 2 and < 256 */ +#define MIN_VJ_STATES 3 +#define MAX_VJ_STATES 255 +#define DEF_VJ_STATES 16 /* must be > 2 and < 256 */ #define MAX_HDR 128 /* XXX 4bsd-ism: should really be 128 */ /* diff --git a/usr.sbin/ppp/vjcomp.c b/usr.sbin/ppp/vjcomp.c index 45c4ff081c66..88346e135acf 100644 --- a/usr.sbin/ppp/vjcomp.c +++ b/usr.sbin/ppp/vjcomp.c @@ -17,7 +17,7 @@ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * - * $Id: vjcomp.c,v 1.16.2.2 1998/01/29 23:11:44 brian Exp $ + * $Id: vjcomp.c,v 1.16.2.3 1998/01/30 19:46:06 brian Exp $ * * TODO: */ @@ -58,13 +58,13 @@ SendPppFrame(struct link *l, struct mbuf * bp) { int type; u_short proto; - u_short cproto = IpcpInfo.his_compproto >> 16; + u_short cproto = IpcpInfo.peer_compproto >> 16; - LogPrintf(LogDEBUG, "SendPppFrame: proto = %x\n", IpcpInfo.his_compproto); + LogPrintf(LogDEBUG, "SendPppFrame: proto = %x\n", IpcpInfo.peer_compproto); if (((struct ip *) MBUF_CTOP(bp))->ip_p == IPPROTO_TCP && cproto == PROTO_VJCOMP) { type = sl_compress_tcp(bp, (struct ip *)MBUF_CTOP(bp), &cslc, - IpcpInfo.his_compproto & 0xff); + IpcpInfo.peer_compproto & 0xff); LogPrintf(LogDEBUG, "SendPppFrame: type = %x\n", type); switch (type) { case TYPE_IP: