mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2024-08-26 16:12:55 +00:00
Revert "PPP, PPPoS, fixed thread safety of pppos_input()"
This reverts commit ea58a8103c
.
This commit is contained in:
parent
52de24b95b
commit
ab0f3da650
@ -67,9 +67,6 @@ typedef struct pppos_pcb_s pppos_pcb;
|
|||||||
struct pppos_pcb_s {
|
struct pppos_pcb_s {
|
||||||
/* -- below are data that will NOT be cleared between two sessions */
|
/* -- below are data that will NOT be cleared between two sessions */
|
||||||
ppp_pcb *ppp; /* PPP PCB */
|
ppp_pcb *ppp; /* PPP PCB */
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_t mutex; /* Mutex for pppos_input() */
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
sio_fd_t fd; /* File device ID of port. */
|
sio_fd_t fd; /* File device ID of port. */
|
||||||
|
|
||||||
/* -- below are data that will be cleared between two sessions
|
/* -- below are data that will be cleared between two sessions
|
||||||
|
@ -180,33 +180,19 @@ ppp_pcb *pppos_create(struct netif *pppif, sio_fd_t fd,
|
|||||||
|
|
||||||
ppp = ppp_new(pppif, link_status_cb, ctx_cb);
|
ppp = ppp_new(pppif, link_status_cb, ctx_cb);
|
||||||
if (ppp == NULL) {
|
if (ppp == NULL) {
|
||||||
goto ppp_new_fail;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pppos = (pppos_pcb *)memp_malloc(MEMP_PPPOS_PCB);
|
pppos = (pppos_pcb *)memp_malloc(MEMP_PPPOS_PCB);
|
||||||
if (pppos == NULL) {
|
if (pppos == NULL) {
|
||||||
goto pppos_malloc_fail;
|
ppp_free(ppp);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
if (sys_mutex_new(&pppos->mutex) != ERR_OK) {
|
|
||||||
goto mutex_new_fail;
|
|
||||||
}
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
|
|
||||||
pppos->ppp = ppp;
|
pppos->ppp = ppp;
|
||||||
pppos->fd = fd;
|
pppos->fd = fd;
|
||||||
ppp_link_set_callbacks(ppp, &pppos_callbacks, pppos);
|
ppp_link_set_callbacks(ppp, &pppos_callbacks, pppos);
|
||||||
return ppp;
|
return ppp;
|
||||||
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
mutex_new_fail:
|
|
||||||
memp_free(MEMP_PPPOS_PCB, pppos);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
pppos_malloc_fail:
|
|
||||||
ppp_free(ppp);
|
|
||||||
ppp_new_fail:
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called by PPP core */
|
/* Called by PPP core */
|
||||||
@ -397,18 +383,12 @@ pppos_connect(ppp_pcb *ppp, void *ctx)
|
|||||||
{
|
{
|
||||||
pppos_pcb *pppos = (pppos_pcb *)ctx;
|
pppos_pcb *pppos = (pppos_pcb *)ctx;
|
||||||
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
/* input pbuf left over from last session? */
|
||||||
sys_mutex_lock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
/* input pbuf left ? */
|
|
||||||
pppos_free_current_input_packet(pppos);
|
pppos_free_current_input_packet(pppos);
|
||||||
/* reset PPPoS control block to its initial state */
|
|
||||||
memset(&pppos->out_accm, 0, sizeof(pppos_pcb) - ( (char*)&((pppos_pcb*)0)->out_accm - (char*)0 ) );
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_unlock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
|
|
||||||
ppp_clear(ppp);
|
ppp_clear(ppp);
|
||||||
|
/* reset PPPoS control block to its initial state */
|
||||||
|
memset(&pppos->out_accm, 0, sizeof(pppos_pcb) - ( (char*)&((pppos_pcb*)0)->out_accm - (char*)0 ) );
|
||||||
|
|
||||||
#if PPP_IPV4_SUPPORT && VJ_SUPPORT
|
#if PPP_IPV4_SUPPORT && VJ_SUPPORT
|
||||||
vj_compress_init(&pppos->vj_comp);
|
vj_compress_init(&pppos->vj_comp);
|
||||||
@ -439,18 +419,12 @@ pppos_listen(ppp_pcb *ppp, void *ctx, struct ppp_addrs *addrs)
|
|||||||
#endif /* PPP_IPV4_SUPPORT */
|
#endif /* PPP_IPV4_SUPPORT */
|
||||||
lcp_options *lcp_wo;
|
lcp_options *lcp_wo;
|
||||||
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
/* input pbuf left over from last session? */
|
||||||
sys_mutex_lock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
/* input pbuf left ? */
|
|
||||||
pppos_free_current_input_packet(pppos);
|
pppos_free_current_input_packet(pppos);
|
||||||
/* reset PPPoS control block to its initial state */
|
|
||||||
memset(&pppos->out_accm, 0, sizeof(pppos_pcb) - ( (char*)&((pppos_pcb*)0)->out_accm - (char*)0 ) );
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_unlock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
|
|
||||||
ppp_clear(ppp);
|
ppp_clear(ppp);
|
||||||
|
/* reset PPPoS control block to its initial state */
|
||||||
|
memset(&pppos->out_accm, 0, sizeof(pppos_pcb) - ( (char*)&((pppos_pcb*)0)->out_accm - (char*)0 ) );
|
||||||
|
|
||||||
/* Wait passively */
|
/* Wait passively */
|
||||||
lcp_wo = &ppp->lcp_wantoptions;
|
lcp_wo = &ppp->lcp_wantoptions;
|
||||||
@ -498,17 +472,11 @@ pppos_listen(ppp_pcb *ppp, void *ctx, struct ppp_addrs *addrs)
|
|||||||
static void
|
static void
|
||||||
pppos_disconnect(ppp_pcb *ppp, void *ctx)
|
pppos_disconnect(ppp_pcb *ppp, void *ctx)
|
||||||
{
|
{
|
||||||
pppos_pcb *pppos = (pppos_pcb *)ctx;
|
LWIP_UNUSED_ARG(ctx);
|
||||||
|
|
||||||
/* input pbuf left ? */
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_lock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
pppos_free_current_input_packet(pppos);
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_unlock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
|
|
||||||
|
/* We cannot call pppos_free_current_input_packet() here because
|
||||||
|
* rx thread might still call pppos_input()
|
||||||
|
*/
|
||||||
ppp_link_end(ppp); /* notify upper layers */
|
ppp_link_end(ppp); /* notify upper layers */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,9 +489,6 @@ pppos_destroy(ppp_pcb *ppp, void *ctx)
|
|||||||
/* input pbuf left ? */
|
/* input pbuf left ? */
|
||||||
pppos_free_current_input_packet(pppos);
|
pppos_free_current_input_packet(pppos);
|
||||||
|
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_free(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
memp_free(MEMP_PPPOS_PCB, pppos);
|
memp_free(MEMP_PPPOS_PCB, pppos);
|
||||||
return ERR_OK;
|
return ERR_OK;
|
||||||
}
|
}
|
||||||
@ -558,15 +523,15 @@ pppos_input(ppp_pcb *ppp, u_char *s, int l)
|
|||||||
struct pbuf *next_pbuf;
|
struct pbuf *next_pbuf;
|
||||||
u_char cur_char;
|
u_char cur_char;
|
||||||
u_char escaped;
|
u_char escaped;
|
||||||
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
|
|
||||||
PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l));
|
PPPDEBUG(LOG_DEBUG, ("pppos_input[%d]: got %d bytes\n", ppp->netif->num, l));
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_lock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
while (l-- > 0) {
|
while (l-- > 0) {
|
||||||
cur_char = *s++;
|
cur_char = *s++;
|
||||||
|
|
||||||
|
SYS_ARCH_PROTECT(lev);
|
||||||
escaped = ESCAPE_P(pppos->in_accm, cur_char);
|
escaped = ESCAPE_P(pppos->in_accm, cur_char);
|
||||||
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
/* Handle special characters. */
|
/* Handle special characters. */
|
||||||
if (escaped) {
|
if (escaped) {
|
||||||
/* Check for escape sequences. */
|
/* Check for escape sequences. */
|
||||||
@ -770,9 +735,6 @@ pppos_input(ppp_pcb *ppp, u_char *s, int l)
|
|||||||
pppos->in_fcs = PPP_FCS(pppos->in_fcs, cur_char);
|
pppos->in_fcs = PPP_FCS(pppos->in_fcs, cur_char);
|
||||||
}
|
}
|
||||||
} /* while (l-- > 0), all bytes processed */
|
} /* while (l-- > 0), all bytes processed */
|
||||||
#if PPP_INPROC_MULTITHREADED
|
|
||||||
sys_mutex_unlock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
|
|
||||||
magic_randomize();
|
magic_randomize();
|
||||||
}
|
}
|
||||||
@ -823,18 +785,15 @@ pppos_recv_config(ppp_pcb *ppp, void *ctx, u32_t accm)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
pppos_pcb *pppos = (pppos_pcb *)ctx;
|
pppos_pcb *pppos = (pppos_pcb *)ctx;
|
||||||
|
SYS_ARCH_DECL_PROTECT(lev);
|
||||||
LWIP_UNUSED_ARG(ppp);
|
LWIP_UNUSED_ARG(ppp);
|
||||||
|
|
||||||
/* Load the ACCM bits for the 32 control codes. */
|
/* Load the ACCM bits for the 32 control codes. */
|
||||||
#if PPP_INPROC_MULTITHREADED
|
SYS_ARCH_PROTECT(lev);
|
||||||
sys_mutex_lock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
for (i = 0; i < 32 / 8; i++) {
|
for (i = 0; i < 32 / 8; i++) {
|
||||||
pppos->in_accm[i] = (u_char)(accm >> (i * 8));
|
pppos->in_accm[i] = (u_char)(accm >> (i * 8));
|
||||||
}
|
}
|
||||||
#if PPP_INPROC_MULTITHREADED
|
SYS_ARCH_UNPROTECT(lev);
|
||||||
sys_mutex_unlock(&pppos->mutex);
|
|
||||||
#endif /* PPP_INPROC_MULTITHREADED */
|
|
||||||
|
|
||||||
PPPDEBUG(LOG_INFO, ("pppos_recv_config[%d]: in_accm=%X %X %X %X\n",
|
PPPDEBUG(LOG_INFO, ("pppos_recv_config[%d]: in_accm=%X %X %X %X\n",
|
||||||
pppos->ppp->netif->num,
|
pppos->ppp->netif->num,
|
||||||
|
Loading…
Reference in New Issue
Block a user