aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/ppp/ipcp.c
diff options
context:
space:
mode:
authorBrian Somers <brian@FreeBSD.org>2001-07-28 11:32:08 +0000
committerBrian Somers <brian@FreeBSD.org>2001-07-28 11:32:08 +0000
commit5e3b2d6847bea368e1c03f4de62de7edd5067f9c (patch)
treea455f9c7d7b9b8665276f19ba569deb726871107 /usr.sbin/ppp/ipcp.c
parent43b866b0ed69861df3597a4041cb1a99dd3e733b (diff)
downloadsrc-5e3b2d6847bea368e1c03f4de62de7edd5067f9c.tar.gz
src-5e3b2d6847bea368e1c03f4de62de7edd5067f9c.zip
If the peer sends a REQ without the IPADDR option, only reject it
once. If they repeat the request (again without the IPADDR option) ACK it. I've had reports that some ppp implementations will not assign themselves an IP number. This should negotiate with such things. MFC after: 3 days
Notes
Notes: svn path=/head/; revision=80476
Diffstat (limited to 'usr.sbin/ppp/ipcp.c')
-rw-r--r--usr.sbin/ppp/ipcp.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/usr.sbin/ppp/ipcp.c b/usr.sbin/ppp/ipcp.c
index dfec4788fbe0..031b9b0281a6 100644
--- a/usr.sbin/ppp/ipcp.c
+++ b/usr.sbin/ppp/ipcp.c
@@ -659,7 +659,7 @@ ipcp_Setup(struct ipcp *ipcp, u_int32_t mask)
}
ipcp->heis1172 = 0;
-
+ ipcp->peer_req = 0;
ipcp->peer_ip = ipcp->cfg.peer_range.ipaddr;
ipcp->peer_compproto = 0;
@@ -915,6 +915,7 @@ IpcpLayerStart(struct fsm *fp)
throughput_start(&ipcp->throughput, "IPCP throughput",
Enabled(fp->bundle, OPT_THROUGHPUT));
fp->more.reqs = fp->more.naks = fp->more.rejs = ipcp->cfg.fsm.maxreq * 3;
+ ipcp->peer_req = 0;
}
static void
@@ -1139,14 +1140,13 @@ IpcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
{
/* Deal with incoming PROTO_IPCP */
struct ipcp *ipcp = fsm2ipcp(fp);
- int type, length, gotdnsnak, ipaddr_req;
+ int type, length, gotdnsnak;
u_int32_t compproto;
struct compreq *pcomp;
struct in_addr ipaddr, dstipaddr, have_ip;
char tbuff[100], tbuff2[100];
gotdnsnak = 0;
- ipaddr_req = 0;
while (plen >= sizeof(struct fsmconfig)) {
type = *cp;
@@ -1166,7 +1166,7 @@ IpcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
switch (mode_type) {
case MODE_REQ:
- ipaddr_req = 1;
+ ipcp->peer_req = 1;
ipcp_ValidateReq(ipcp, ipaddr, dec);
break;
@@ -1414,8 +1414,17 @@ IpcpDecodeConfig(struct fsm *fp, u_char *cp, int plen, int mode_type,
}
if (mode_type != MODE_NOP) {
- if (mode_type == MODE_REQ && !ipaddr_req) {
- /* We *REQUIRE* that the peer requests an IP address */
+ if (mode_type == MODE_REQ && !ipcp->peer_req) {
+ if (dec->rejend == dec->rej && dec->nakend == dec->nak) {
+ /*
+ * Pretend the peer has requested an IP.
+ * We do this to ensure that we only send one NAK if the only
+ * reason for the NAK is because the peer isn't sending a
+ * TY_IPADDR REQ. This stops us from repeatedly trying to tell
+ * the peer that we have to have an IP address on their end.
+ */
+ ipcp->peer_req = 1;
+ }
ipaddr.s_addr = INADDR_ANY;
ipcp_ValidateReq(ipcp, ipaddr, dec);
}