Hi. When remote side in sppp doesn't reply for to PPP IPCP IP-Address
sppp will try to negotiate remote IP in endless loop. Instead use
10.64.64.1 + if_index as remote IP.
While at it maybe it's worth to add that SPP is in RFC 1332 ?
Krzysztof Kanas
Index: share/man/man4/sppp.4
===================================================================
RCS file: /home/cvs//src/share/man/man4/sppp.4,v
retrieving revision 1.26
diff -r1.26 sppp.4
284,285c284,285
< Negotiation loop avoidance is not fully implemented.
< If the negotiation doesn't converge, this can cause an endless loop.
---
> In case when remote IP can't be negotiation after 10 retries pick
> 10.64.64.1 + if_index.
Index: sys/net/if_sppp.h
===================================================================
RCS file: /home/cvs//src/sys/net/if_sppp.h,v
retrieving revision 1.30
diff -r1.30 if_sppp.h
148a149,150
> #define IPCP_HISADDR_COUNTER_MAX 10
> u_int8_t hisaddr_counter; /* number of ipcp req for peer addr */
Index: sys/net/if_spppsubr.c
===================================================================
RCS file: /home/cvs//src/sys/net/if_spppsubr.c,v
retrieving revision 1.190
diff -r1.190 if_spppsubr.c
2466,2468c2466,2469
< * XXX This can result in an endless req - nak loop if peer
< * doesn't want to send us his address. Q: What should we do
< * about it? XXX A: implement the max-failure counter.
---
> * This can result in an endless req - nak loop if peer
> * doesn't want to send us his address. Therefore we count
> * the number of request if it exceeds IPCP_HISADDR_COUNTER_MAX
> * assign remote address 10.64.64.1 + if_index.
2471,2479c2472,2492
< buf[0] = IPCP_OPT_ADDRESS;
< buf[1] = 6;
< buf[2] = hisaddr >> 24;
< buf[3] = hisaddr >> 16;
< buf[4] = hisaddr >> 8;
< buf[5] = hisaddr;
< rlen = 6;
< if (debug)
< addlog("still need hisaddr ");
---
> if (sp->ipcp.hisaddr_counter++ > IPCP_HISADDR_COUNTER_MAX) {
> sp->ipcp.hisaddr_counter = 0;
> desiredaddr = 10 << 24 | 64 << 16 | 64 << 8 | 1;
> desiredaddr += sp->pp_if.if_index;
> hisaddr = desiredaddr;
> sp->ipcp.req_hisaddr = desiredaddr;
> sp->ipcp.flags |= IPCP_HISADDR_SEEN;
> if (debug)
> addlog("%s guess ",
> sppp_dotted_quad(desiredaddr));
> } else {
> buf[0] = IPCP_OPT_ADDRESS;
> buf[1] = 6;
> buf[2] = hisaddr >> 24;
> buf[3] = hisaddr >> 16;
> buf[4] = hisaddr >> 8;
> buf[5] = hisaddr;
> rlen = 6;
> if (debug)
> addlog("still need hisaddr ");
> }