Ignore duplicate ACKs for IPCP
authorbodea <bodea>
Fri, 24 Jun 2005 08:34:53 +0000 (08:34 +0000)
committerbodea <bodea>
Fri, 24 Jun 2005 08:34:53 +0000 (08:34 +0000)
Clear RADIUSIPCP for walled garden sessions on ACK

Changes
ppp.c

diff --git a/Changes b/Changes
index 3b885fd..24440df 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,5 +1,7 @@
 * Fri Jun 24 2005 Brendan O'Dea <bod@optus.net> 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 <bod@optusnet.com.au> 2.1.1
 - Add missing newline to backtrace macro.
diff --git a/ppp.c b/ppp.c
index 89b7b87..25e6f8a 100644 (file)
--- 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 <stdio.h>
 #include <string.h>
@@ -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)