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
This commit is contained in:
parent
43b866b0ed
commit
5e3b2d6847
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=80476
@ -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);
|
||||
}
|
||||
|
@ -108,6 +108,7 @@ struct ipcp {
|
||||
|
||||
unsigned heis1172 : 1; /* True if he is speaking rfc1172 */
|
||||
|
||||
unsigned peer_req : 1; /* Any TY_IPADDR REQs from the peer ? */
|
||||
struct in_addr peer_ip; /* IP address he's willing to use */
|
||||
u_int32_t peer_compproto; /* VJ params he's willing to use */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user