From a9ac45c5f063586002ac68c6c0ad5479db20bcac Mon Sep 17 00:00:00 2001 From: Sylvain Rochet Date: Thu, 7 Jun 2012 01:48:12 +0200 Subject: [PATCH] added PPPoE persist support (don't timeout sending PADI packets) --- src/include/netif/ppp_oe.h | 15 +++++++++------ src/netif/ppp/ppp.c | 4 ++-- src/netif/ppp/ppp_oe.c | 14 +++++++++----- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/include/netif/ppp_oe.h b/src/include/netif/ppp_oe.h index ada32934..c098f583 100644 --- a/src/include/netif/ppp_oe.h +++ b/src/include/netif/ppp_oe.h @@ -67,12 +67,13 @@ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ +#include "lwip/opt.h" +#if PPP_SUPPORT && PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */ + #ifndef PPP_OE_H #define PPP_OE_H -#include "lwip/opt.h" - -#if PPPOE_SUPPORT > 0 +#include "ppp_impl.h" #include "netif/etharp.h" @@ -163,6 +164,8 @@ struct pppoe_softc { #endif int sc_padi_retried; /* number of PADI retries already done */ int sc_padr_retried; /* number of PADR retries already done */ + + u_int persist : 1; /* Persist mode, don't timeout sending PADI packets */ }; @@ -171,7 +174,7 @@ struct pppoe_softc { err_t pppoe_create(struct netif *ethif, int pd, void (*link_status_cb)(int pd, int up), struct pppoe_softc **scptr); err_t pppoe_destroy(struct netif *ifp); -int pppoe_connect(struct pppoe_softc *sc); +int pppoe_connect(struct pppoe_softc *sc, bool persist); void pppoe_disconnect(struct pppoe_softc *sc); void pppoe_disc_input(struct netif *netif, struct pbuf *p); @@ -182,6 +185,6 @@ err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); /** used in ppp.c */ #define PPPOE_HDRLEN (sizeof(struct eth_hdr) + PPPOE_HEADERLEN) -#endif /* PPPOE_SUPPORT */ - #endif /* PPP_OE_H */ + +#endif /* PPP_SUPPORT && PPPOE_SUPPORT */ diff --git a/src/netif/ppp/ppp.c b/src/netif/ppp/ppp.c index 4400078a..9df70260 100644 --- a/src/netif/ppp/ppp.c +++ b/src/netif/ppp/ppp.c @@ -625,7 +625,7 @@ int ppp_over_ethernet_open(struct netif *ethif, const char *service_name, const return PPPERR_OPEN; } - pppoe_connect(pc->pppoe_sc); + pppoe_connect(pc->pppoe_sc, ppp_settings.persist); } return pd; @@ -1866,7 +1866,7 @@ static void ppp_over_ethernet_link_status_cb(int pd, int state) { if(ppp_settings.persist) { if(pc->link_status_cb) pc->link_status_cb(pc->link_status_ctx, pc->err_code ? pc->err_code : pppoe_err_code, NULL); - pppoe_connect(pc->pppoe_sc); + pppoe_connect(pc->pppoe_sc, ppp_settings.persist); return; } diff --git a/src/netif/ppp/ppp_oe.c b/src/netif/ppp/ppp_oe.c index ab71d163..04f76987 100644 --- a/src/netif/ppp/ppp_oe.c +++ b/src/netif/ppp/ppp_oe.c @@ -748,10 +748,14 @@ pppoe_timeout(void *arg) */ /* initialize for quick retry mode */ - retry_wait = PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried); + retry_wait = LWIP_MIN(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), PPPOE_SLOW_RETRY); - sc->sc_padi_retried++; - if (sc->sc_padi_retried >= PPPOE_DISC_MAXPADI) { + /* prevent sc_padi_retried integer overflow << ~2^31/PPPOE_DISC_TIMEOUT + * FIXME: can be improved + */ + if(sc->sc_padi_retried < 100000) + sc->sc_padi_retried++; + if (!sc->persist && sc->sc_padi_retried >= PPPOE_DISC_MAXPADI) { #if 0 if ((sc->sc_sppp.pp_if.if_flags & IFF_LINK1) == 0) { /* slow retry mode */ @@ -798,7 +802,7 @@ pppoe_timeout(void *arg) /* Start a connection (i.e. initiate discovery phase) */ int -pppoe_connect(struct pppoe_softc *sc) +pppoe_connect(struct pppoe_softc *sc, bool persist) { int err; @@ -811,7 +815,7 @@ pppoe_connect(struct pppoe_softc *sc) sc->sc_session = 0; sc->sc_padi_retried = 0; sc->sc_padr_retried = 0; - + sc->persist = persist; #ifdef PPPOE_SERVER /* wait PADI if IFF_PASSIVE */ if ((sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) {