diff --git a/src/include/netif/ppp/pppos.h b/src/include/netif/ppp/pppos.h index da884503..4978f3d2 100644 --- a/src/include/netif/ppp/pppos.h +++ b/src/include/netif/ppp/pppos.h @@ -76,6 +76,10 @@ struct pppos_pcb_s { */ ext_accm out_accm; /* Async-Ctl-Char-Map for output. */ + /* flags */ + unsigned int open :1; /* Set if PPPoS is open */ + unsigned int :7; /* 7 bits of padding to round out to 8 bits */ + /* PPPoS rx */ ext_accm in_accm; /* Async-Ctl-Char-Map for input. */ struct pbuf *in_head, *in_tail; /* The input packet. */ diff --git a/src/netif/ppp/pppos.c b/src/netif/ppp/pppos.c index c6e37b71..26684225 100644 --- a/src/netif/ppp/pppos.c +++ b/src/netif/ppp/pppos.c @@ -409,6 +409,7 @@ pppos_connect(ppp_pcb *ppp, void *ctx) */ pppos->in_accm[15] = 0x60; /* no need to protect since RX is not running */ pppos->out_accm[15] = 0x60; + pppos->open = 1; /* * Start the connection and handle incoming events (packet or timeout). @@ -468,6 +469,7 @@ pppos_listen(ppp_pcb *ppp, void *ctx, struct ppp_addrs *addrs) */ pppos->in_accm[15] = 0x60; /* no need to protect since RX is not running */ pppos->out_accm[15] = 0x60; + pppos->open = 1; /* * Wait for something to happen. @@ -481,7 +483,12 @@ pppos_listen(ppp_pcb *ppp, void *ctx, struct ppp_addrs *addrs) static void pppos_disconnect(ppp_pcb *ppp, void *ctx) { - LWIP_UNUSED_ARG(ctx); + pppos_pcb *pppos = (pppos_pcb *)ctx; + PPPOS_DECL_PROTECT(lev); + + PPPOS_PROTECT(lev); + pppos->open = 0; + PPPOS_UNPROTECT(lev); /* We cannot call pppos_free_current_input_packet() here because * rx thread might still call pppos_input() @@ -534,6 +541,13 @@ pppos_input(ppp_pcb *ppp, u_char *s, int l) u_char escaped; PPPOS_DECL_PROTECT(lev); + PPPOS_PROTECT(lev); + if (!pppos->open) { + PPPOS_UNPROTECT(lev); + return; + } + PPPOS_UNPROTECT(lev); + PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l)); while (l-- > 0) { cur_char = *s++;