diff --git a/subsys/net/l2/ppp/fsm.c b/subsys/net/l2/ppp/fsm.c index 3dd280230883c..e5ca056e1c035 100644 --- a/subsys/net/l2/ppp/fsm.c +++ b/subsys/net/l2/ppp/fsm.c @@ -53,6 +53,13 @@ struct net_if *ppp_fsm_iface(struct ppp_fsm *fsm) return ctx->iface; } +static bool ppp_fsm_is_dead(struct ppp_fsm *fsm) +{ + struct ppp_context *ctx = ppp_fsm_ctx(fsm); + + return ctx->phase == PPP_DEAD; +} + static void fsm_send_configure_req(struct ppp_fsm *fsm, bool retransmit) { struct net_pkt *pkt = NULL; @@ -246,6 +253,10 @@ void ppp_fsm_close(struct ppp_fsm *fsm, const uint8_t *reason) case PPP_STOPPING: ppp_change_state(fsm, PPP_CLOSING); + if (ppp_fsm_is_dead(fsm)) { + fsm->retransmits = 0; + k_work_reschedule(&fsm->timer, K_NO_WAIT); + } break; default: diff --git a/subsys/net/l2/ppp/lcp.c b/subsys/net/l2/ppp/lcp.c index 6cc8f32716c1f..2ac7e9c773f69 100644 --- a/subsys/net/l2/ppp/lcp.c +++ b/subsys/net/l2/ppp/lcp.c @@ -189,7 +189,12 @@ static void lcp_open(struct ppp_context *ctx) static void lcp_close(struct ppp_context *ctx, const uint8_t *reason) { if (ctx->phase != PPP_DEAD) { - ppp_change_phase(ctx, PPP_TERMINATE); + if (ctx->phase == PPP_ESTABLISH) { + /* Link is not established yet, so we can go directly to DEAD */ + ppp_change_phase(ctx, PPP_DEAD); + } else { + ppp_change_phase(ctx, PPP_TERMINATE); + } } ppp_fsm_close(&ctx->lcp.fsm, reason);