From 872ee44e6164e26770b8a3c0e6edc68ad66f56a4 Mon Sep 17 00:00:00 2001 From: bodea Date: Fri, 24 Jun 2005 08:34:53 +0000 Subject: [PATCH] Ignore duplicate ACKs for IPCP Clear RADIUSIPCP for walled garden sessions on ACK --- Changes | 2 ++ ppp.c | 28 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Changes b/Changes index 3b885fd..24440df 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ * Fri Jun 24 2005 Brendan O'Dea 2.1.2 - Don't resend IPCP while still in progress. +- Ignore duplicate ACKs for IPCP. +- Clear RADIUSIPCP for walled garden sessions on ACK. * Tue Jun 14 2005 Brendan O'Dea 2.1.1 - Add missing newline to backtrace macro. diff --git a/ppp.c b/ppp.c index 89b7b87..25e6f8a 100644 --- a/ppp.c +++ b/ppp.c @@ -1,6 +1,6 @@ // L2TPNS PPP Stuff -char const *cvs_id_ppp = "$Id: ppp.c,v 1.63 2005/06/24 06:59:06 bodea Exp $"; +char const *cvs_id_ppp = "$Id: ppp.c,v 1.64 2005/06/24 08:34:53 bodea Exp $"; #include #include @@ -718,15 +718,13 @@ void processipcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) if (*p == ConfigAck) { - // happy with our IPCP uint16_t r = sess_local[s].radius; - if ((!r || radius[r].state == RADIUSIPCP) && !session[s].walled_garden) - { - if (!r) - r = radiusnew(s); - if (r) - radiussend(r, RADIUSSTART); // send radius start, having got IPCP at last - } + + // ignore duplicate ACKs + if (session[s].flags & SF_IPCP_ACKED) + return; + + // happy with our IPCP session[s].flags |= SF_IPCP_ACKED; LOG(3, s, t, "IPCP Acked, session is now active\n"); @@ -734,6 +732,18 @@ void processipcp(tunnelidt t, sessionidt s, uint8_t *p, uint16_t l) // clear LCP_ACKED/CCP_ACKED flag for possible fast renegotiation for routers session[s].flags &= ~(SF_LCP_ACKED|SF_CCP_ACKED); + if (r && session[s].walled_garden) + { + radiusclear(r, s); + return; + } + + if (!r) + r = radiusnew(s); + + if (r) + radiussend(r, RADIUSSTART); // send radius start, having got IPCP at last + return; } if (*p != ConfigReq) -- 2.20.1