mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-10-03 21:32:08 +00:00
PPP, CORE, ppp_close() and ppp_sighup() ended up sharing almost everything, merged
Merged ppp_sighup() to ppp_close() using an optional argument "nocarrier" on ppp_close().
This commit is contained in:
parent
b040ace4c2
commit
4be7fccad3
15
doc/ppp.txt
15
doc/ppp.txt
@ -256,7 +256,8 @@ ppp_set_default(ppp);
|
|||||||
* Initiate PPP negotiation, without waiting (holdoff=0), can only be called
|
* Initiate PPP negotiation, without waiting (holdoff=0), can only be called
|
||||||
* if PPP session is in the dead state (i.e. disconnected).
|
* if PPP session is in the dead state (i.e. disconnected).
|
||||||
*/
|
*/
|
||||||
ppp_open(ppp, 0);
|
u16_t holdoff = 0;
|
||||||
|
ppp_open(ppp, holdoff);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -264,8 +265,13 @@ ppp_open(ppp, 0);
|
|||||||
* ======================
|
* ======================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* You can call this function anytime */
|
/*
|
||||||
ppp_close(ppp);
|
* Initiate the end of the PPP session, without carrier lost signal
|
||||||
|
* (nocarrier=0), meaning a clean shutdown of PPP protocols.
|
||||||
|
* You can call this function at anytime.
|
||||||
|
*/
|
||||||
|
u8_t nocarrier = 0;
|
||||||
|
ppp_close(ppp, nocarrier);
|
||||||
/*
|
/*
|
||||||
* Then you must wait your status_cb() to be called, it may takes from a few
|
* Then you must wait your status_cb() to be called, it may takes from a few
|
||||||
* seconds to several tens of seconds depending on the current PPP state.
|
* seconds to several tens of seconds depending on the current PPP state.
|
||||||
@ -354,3 +360,6 @@ from previous lwIP version is pretty easy:
|
|||||||
|
|
||||||
* If you used tcpip_callback_with_block() on ppp_ functions you may wish to use
|
* If you used tcpip_callback_with_block() on ppp_ functions you may wish to use
|
||||||
the PPPAPI API instead.
|
the PPPAPI API instead.
|
||||||
|
|
||||||
|
* ppp_sighup and ppp_close functions were merged using an optional argument
|
||||||
|
"nocarrier" on ppp_close.
|
||||||
|
@ -267,7 +267,7 @@ pppapi_open(ppp_pcb *pcb, u16_t holdoff)
|
|||||||
static void
|
static void
|
||||||
pppapi_do_ppp_close(struct pppapi_msg_msg *msg)
|
pppapi_do_ppp_close(struct pppapi_msg_msg *msg)
|
||||||
{
|
{
|
||||||
msg->err = ppp_close(msg->ppp);
|
msg->err = ppp_close(msg->ppp, msg->msg.close.nocarrier);
|
||||||
TCPIP_PPPAPI_ACK(msg);
|
TCPIP_PPPAPI_ACK(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -276,40 +276,17 @@ pppapi_do_ppp_close(struct pppapi_msg_msg *msg)
|
|||||||
* tcpip_thread context.
|
* tcpip_thread context.
|
||||||
*/
|
*/
|
||||||
err_t
|
err_t
|
||||||
pppapi_close(ppp_pcb *pcb)
|
pppapi_close(ppp_pcb *pcb, u8_t nocarrier)
|
||||||
{
|
{
|
||||||
struct pppapi_msg msg;
|
struct pppapi_msg msg;
|
||||||
msg.function = pppapi_do_ppp_close;
|
msg.function = pppapi_do_ppp_close;
|
||||||
msg.msg.ppp = pcb;
|
msg.msg.ppp = pcb;
|
||||||
|
msg.msg.msg.close.nocarrier = nocarrier;
|
||||||
TCPIP_PPPAPI(&msg);
|
TCPIP_PPPAPI(&msg);
|
||||||
return msg.msg.err;
|
return msg.msg.err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call ppp_sighup() inside the tcpip_thread context.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
pppapi_do_ppp_sighup(struct pppapi_msg_msg *msg)
|
|
||||||
{
|
|
||||||
ppp_sighup(msg->ppp);
|
|
||||||
TCPIP_PPPAPI_ACK(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Call ppp_sighup() in a thread-safe way by running that function inside the
|
|
||||||
* tcpip_thread context.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
pppapi_sighup(ppp_pcb *pcb)
|
|
||||||
{
|
|
||||||
struct pppapi_msg msg;
|
|
||||||
msg.function = pppapi_do_ppp_sighup;
|
|
||||||
msg.msg.ppp = pcb;
|
|
||||||
TCPIP_PPPAPI(&msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call ppp_free() inside the tcpip_thread context.
|
* Call ppp_free() inside the tcpip_thread context.
|
||||||
*/
|
*/
|
||||||
|
@ -92,6 +92,9 @@ struct pppapi_msg_msg {
|
|||||||
struct {
|
struct {
|
||||||
u16_t holdoff;
|
u16_t holdoff;
|
||||||
} open;
|
} open;
|
||||||
|
struct {
|
||||||
|
u8_t nocarrier;
|
||||||
|
} close;
|
||||||
struct {
|
struct {
|
||||||
u8_t cmd;
|
u8_t cmd;
|
||||||
void *arg;
|
void *arg;
|
||||||
@ -134,8 +137,7 @@ ppp_pcb *pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_add
|
|||||||
ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
|
ppp_link_status_cb_fn link_status_cb, void *ctx_cb);
|
||||||
#endif /* PPPOL2TP_SUPPORT */
|
#endif /* PPPOL2TP_SUPPORT */
|
||||||
err_t pppapi_open(ppp_pcb *pcb, u16_t holdoff);
|
err_t pppapi_open(ppp_pcb *pcb, u16_t holdoff);
|
||||||
err_t pppapi_close(ppp_pcb *pcb);
|
err_t pppapi_close(ppp_pcb *pcb, u8_t nocarrier);
|
||||||
void pppapi_sighup(ppp_pcb *pcb);
|
|
||||||
err_t pppapi_free(ppp_pcb *pcb);
|
err_t pppapi_free(ppp_pcb *pcb);
|
||||||
err_t pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg);
|
err_t pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg);
|
||||||
#if LWIP_NETIF_STATUS_CALLBACK
|
#if LWIP_NETIF_STATUS_CALLBACK
|
||||||
|
@ -467,13 +467,13 @@ err_t ppp_open(ppp_pcb *pcb, u16_t holdoff);
|
|||||||
* Initiate the end of a PPP connection.
|
* Initiate the end of a PPP connection.
|
||||||
* Any outstanding packets in the queues are dropped.
|
* Any outstanding packets in the queues are dropped.
|
||||||
* Return 0 on success, an error code on failure.
|
* Return 0 on success, an error code on failure.
|
||||||
|
*
|
||||||
|
* Setting nocarrier to 1 close the PPP connection without initiating the
|
||||||
|
* shutdown procedure. Always using nocarrier = 0 is still recommended,
|
||||||
|
* this is going to take a little longer time if your link is down, but
|
||||||
|
* is a safer choice for the PPP state machine.
|
||||||
*/
|
*/
|
||||||
err_t ppp_close(ppp_pcb *pcb);
|
err_t ppp_close(ppp_pcb *pcb, u8_t nocarrier);
|
||||||
|
|
||||||
/*
|
|
||||||
* Indicate to the PPP stack that the line has disconnected.
|
|
||||||
*/
|
|
||||||
void ppp_sighup(ppp_pcb *pcb);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Release the control block.
|
* Release the control block.
|
||||||
|
@ -278,7 +278,7 @@ err_t ppp_open(ppp_pcb *pcb, u16_t holdoff) {
|
|||||||
* Return 0 on success, an error code on failure.
|
* Return 0 on success, an error code on failure.
|
||||||
*/
|
*/
|
||||||
err_t
|
err_t
|
||||||
ppp_close(ppp_pcb *pcb)
|
ppp_close(ppp_pcb *pcb, u8_t nocarrier)
|
||||||
{
|
{
|
||||||
pcb->err_code = PPPERR_USER;
|
pcb->err_code = PPPERR_USER;
|
||||||
|
|
||||||
@ -296,52 +296,26 @@ ppp_close(ppp_pcb *pcb)
|
|||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disconnect */
|
|
||||||
PPPDEBUG(LOG_DEBUG, ("ppp_close: unit %d kill_link -> lcp_close\n", pcb->netif->num));
|
|
||||||
/* LCP close request, this will leave us at PPP_PHASE_DEAD. */
|
|
||||||
lcp_close(pcb, "User request");
|
|
||||||
|
|
||||||
return ERR_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is called when carrier is lost on the PPP channel. */
|
|
||||||
void
|
|
||||||
ppp_sighup(ppp_pcb *pcb)
|
|
||||||
{
|
|
||||||
pcb->err_code = PPPERR_PEERDEAD;
|
|
||||||
|
|
||||||
/* dead phase, nothing to do, call the status callback to be consistent */
|
|
||||||
if (pcb->phase == PPP_PHASE_DEAD) {
|
|
||||||
pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* holdoff phase, cancel the reconnection and call the status callback */
|
|
||||||
if (pcb->phase == PPP_PHASE_HOLDOFF) {
|
|
||||||
sys_untimeout(ppp_do_open, pcb);
|
|
||||||
pcb->phase = PPP_PHASE_DEAD;
|
|
||||||
pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only accept carrier lost signal on the stable running phase in order
|
* Only accept carrier lost signal on the stable running phase in order
|
||||||
* to prevent changing the PPP phase FSM in transition phases.
|
* to prevent changing the PPP phase FSM in transition phases.
|
||||||
*
|
*
|
||||||
* Always calling ppp_close() instead is still recommended, this is going to
|
* Always using nocarrier = 0 is still recommended, this is going to
|
||||||
* take a little longer time, but is a safer choice from FSM point of view.
|
* take a little longer time, but is a safer choice from FSM point of view.
|
||||||
*/
|
*/
|
||||||
if (pcb->phase != PPP_PHASE_RUNNING) {
|
if (nocarrier && pcb->phase == PPP_PHASE_RUNNING) {
|
||||||
PPPDEBUG(LOG_DEBUG, ("ppp_sighup: unit %d -> lcp_close\n", pcb->netif->num));
|
PPPDEBUG(LOG_DEBUG, ("ppp_close: unit %d -> lcp_lowerdown\n", pcb->netif->num));
|
||||||
lcp_close(pcb, "Carrier lost");
|
lcp_lowerdown(pcb);
|
||||||
return;
|
/* forced link termination, this will leave us at PPP_PHASE_DEAD. */
|
||||||
|
link_terminated(pcb);
|
||||||
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
PPPDEBUG(LOG_DEBUG, ("ppp_sighup: unit %d -> lcp_lowerdown\n", pcb->netif->num));
|
/* Disconnect */
|
||||||
lcp_lowerdown(pcb);
|
PPPDEBUG(LOG_DEBUG, ("ppp_close: unit %d kill_link -> lcp_close\n", pcb->netif->num));
|
||||||
/* forced link termination, this will leave us at PPP_PHASE_DEAD. */
|
/* LCP close request, this will leave us at PPP_PHASE_DEAD. */
|
||||||
link_terminated(pcb);
|
lcp_close(pcb, "User request");
|
||||||
return;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user