--- embedaddon/mpd/src/lcp.c 2021/03/17 00:39:23 1.1.1.3 +++ embedaddon/mpd/src/lcp.c 2023/09/27 11:08:00 1.1.1.3.2.1 @@ -26,6 +26,7 @@ #define LCP_ECHO_INTERVAL 5 /* Enable keep alive by default */ #define LCP_ECHO_TIMEOUT 40 + #define LCP_MAX_RESETS 3 #define LCP_KNOWN_CODES ( (1 << CODE_CONFIGREQ) \ | (1 << CODE_CONFIGACK) \ @@ -180,6 +181,7 @@ LcpInit(Link l) FsmInit(&lcp->fsm, &gLcpFsmType, l); lcp->fsm.conf.echo_int = LCP_ECHO_INTERVAL; lcp->fsm.conf.echo_max = LCP_ECHO_TIMEOUT; + lcp->resets = LCP_MAX_RESETS; lcp->phase = PHASE_DEAD; AuthInit(l); @@ -690,8 +692,17 @@ LcpLayerDown(Fsm fp) LcpState const lcp = &l->lcp; LcpStopActivity(l); - if (lcp->phase == PHASE_AUTHENTICATE || lcp->phase == PHASE_NETWORK) + if (lcp->phase == PHASE_AUTHENTICATE || lcp->phase == PHASE_NETWORK) { lcp->need_reset = 1; + if (lcp->resets > 0) { + Log(LG_LCP2, ("[%s] LCP: Reset (%u left)", l->name, (int)lcp->resets)); + lcp->resets--; + } else { + Log(LG_LCP2, ("[%s] LCP: Too many resets", l->name)); + FsmFailure(&lcp->fsm, FAIL_NEGOT_FAILURE); + lcp->resets = LCP_MAX_RESETS; + } + } } void LcpOpen(Link l)