removed ppp_input_header, replaced using 2 chained pbuf the only area we need it

This commit is contained in:
Sylvain Rochet 2012-06-12 23:28:09 +02:00
parent a87096cdc9
commit 3a30e5bf78
4 changed files with 104 additions and 141 deletions

View File

@ -188,7 +188,6 @@ struct protent *protocols[] = {
/* Prototypes for procedures local to this file. */
static void ppp_start(ppp_pcb *pcb); /** Initiate LCP open request */
static void ppp_input(void *arg);
#if PPPOS_SUPPORT
static void ppp_receive_wakeup(ppp_pcb *pcb);
@ -203,6 +202,7 @@ static void ppp_input_thread(void *arg);
#endif /* PPP_INPROC_OWNTHREAD */
static void ppp_drop(ppp_pcb_rx *pcrx);
static void pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l);
static void pppos_input_callback(void *arg);
static void ppp_free_current_input_packet(ppp_pcb_rx *pcrx);
#endif /* PPPOS_SUPPORT */
@ -215,25 +215,6 @@ static err_t ppp_netif_output_over_ethernet(ppp_pcb *pcb, struct pbuf *p);
static int ppp_write_over_ethernet(ppp_pcb *pcb, const u_char *s, int n);
#endif /* PPPOE_SUPPORT */
/******************************/
/*** PUBLIC DATA STRUCTURES ***/
/******************************/
/** Input helper struct, must be packed since it is stored to pbuf->payload,
* which might be unaligned.
*/
#ifdef PACK_STRUCT_USE_INCLUDES
# include "arch/bpstruct.h"
#endif
PACK_STRUCT_BEGIN
struct ppp_input_header {
PACK_STRUCT_FIELD(int unit);
PACK_STRUCT_FIELD(u16_t proto);
} PACK_STRUCT_STRUCT;
PACK_STRUCT_END
#ifdef PACK_STRUCT_USE_INCLUDES
# include "arch/epstruct.h"
#endif
/***********************************/
/*** PUBLIC FUNCTION DEFINITIONS ***/
@ -354,7 +335,7 @@ int ppp_over_serial_open(ppp_pcb *pcb, sio_fd_t fd, ppp_link_status_cb_fn link_s
pcb->fd = fd;
pcb->rx.pd = pcb->unit;
pcb->rx.pcb = (void*)pcb;
pcb->rx.fd = fd;
#if VJ_SUPPORT
@ -508,27 +489,23 @@ static void ppp_hup(ppp_pcb *pcb) {
* Pass the processed input packet to the appropriate handler.
* This function and all handlers run in the context of the tcpip_thread
*/
/* FIXME: maybe we should pass in two arguments ppp_input_header and payload
* this is totally stupid to make room for it and then modify the packet directly
* or it is used in output ? have to find out...
*/
static void ppp_input(void *arg) {
struct pbuf *nb = (struct pbuf *)arg;
void ppp_input(ppp_pcb *pcb, struct pbuf *pb) {
u16_t protocol;
ppp_pcb *pcb;
pcb = &ppp_pcb_list[((struct ppp_input_header *)nb->payload)->unit];
protocol = ((struct ppp_input_header *)nb->payload)->proto;
protocol = (((u8_t *)pb->payload)[0] << 8) | ((u8_t*)pb->payload)[1];
if(pbuf_header(nb, -(int)sizeof(struct ppp_input_header))) {
#if PRINTPKT_SUPPORT
dump_packet("rcvd", pb->payload, pb->len);
#endif /* PRINTPKT_SUPPORT */
if(pbuf_header(pb, -(int)sizeof(protocol))) {
LWIP_ASSERT("pbuf_header failed\n", 0);
goto drop;
}
LINK_STATS_INC(link.recv);
snmp_inc_ifinucastpkts(&pcb->netif);
snmp_add_ifinoctets(&pcb->netif, nb->tot_len);
snmp_add_ifinoctets(&pcb->netif, pb->tot_len);
/*
* Toss all non-LCP packets unless LCP is OPEN.
@ -568,13 +545,13 @@ static void ppp_input(void *arg) {
#if PPPOS_SUPPORT && VJ_SUPPORT
case PPP_VJC_COMP: /* VJ compressed TCP */
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_comp in pbuf len=%d\n", pcb->unit, nb->len));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_comp in pbuf len=%d\n", pcb->unit, pb->len));
/*
* Clip off the VJ header and prepend the rebuilt TCP/IP header and
* pass the result to IP.
*/
if ((vj_uncompress_tcp(&nb, &pcb->vj_comp) >= 0) && (pcb->netif.input)) {
pcb->netif.input(nb, &pcb->netif);
if ((vj_uncompress_tcp(&pb, &pcb->vj_comp) >= 0) && (pcb->netif.input)) {
pcb->netif.input(pb, &pcb->netif);
return;
}
/* Something's wrong so drop it. */
@ -582,13 +559,13 @@ static void ppp_input(void *arg) {
break;
case PPP_VJC_UNCOMP: /* VJ uncompressed TCP */
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_un in pbuf len=%d\n", pcb->unit, nb->len));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_un in pbuf len=%d\n", pcb->unit, pb->len));
/*
* Process the TCP/IP header for VJ header compression and then pass
* the packet to IP.
*/
if ((vj_uncompress_uncomp(nb, &pcb->vj_comp) >= 0) && pcb->netif.input) {
pcb->netif.input(nb, &pcb->netif);
if ((vj_uncompress_uncomp(pb, &pcb->vj_comp) >= 0) && pcb->netif.input) {
pcb->netif.input(pb, &pcb->netif);
return;
}
/* Something's wrong so drop it. */
@ -597,9 +574,9 @@ static void ppp_input(void *arg) {
#endif /* PPPOS_SUPPORT && VJ_SUPPORT */
case PPP_IP: /* Internet Protocol */
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: ip in pbuf len=%d\n", pcb->unit, nb->len));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: ip in pbuf len=%d\n", pcb->unit, pb->len));
if (pcb->netif.input) {
pcb->netif.input(nb, &pcb->netif);
pcb->netif.input(pb, &pcb->netif);
return;
}
break;
@ -613,8 +590,8 @@ static void ppp_input(void *arg) {
*/
for (i = 0; (protp = protocols[i]) != NULL; ++i) {
if (protp->protocol == protocol && protp->enabled_flag) {
nb = ppp_singlebuf(nb);
(*protp->input)(pcb->unit, nb->payload, nb->len);
pb = ppp_singlebuf(pb);
(*protp->input)(pcb->unit, pb->payload, pb->len);
goto out;
}
#if 0 /* UNUSED
@ -628,7 +605,7 @@ static void ppp_input(void *arg) {
*/
if (protocol == (protp->protocol & ~0x8000) && protp->enabled_flag
&& protp->datainput != NULL) {
(*protp->datainput)(pcb->unit, nb->payload, nb->len);
(*protp->datainput)(pcb->unit, pb->payload, pb->len);
goto out;
}
#endif /* UNUSED */
@ -643,11 +620,11 @@ static void ppp_input(void *arg) {
#endif /* PPP_PROTOCOLNAME */
warn("Unsupported protocol 0x%x received", protocol);
#endif /* PPP_DEBUG */
if (pbuf_header(nb, sizeof(protocol))) {
if (pbuf_header(pb, sizeof(protocol))) {
LWIP_ASSERT("pbuf_header failed\n", 0);
goto drop;
}
lcp_sprotrej(pcb->unit, nb->payload, nb->len);
lcp_sprotrej(pcb->unit, pb->payload, pb->len);
}
break;
}
@ -657,7 +634,7 @@ drop:
snmp_inc_ifindiscards(&pcb->netif);
out:
pbuf_free(nb);
pbuf_free(pb);
return;
#if 0
@ -677,32 +654,32 @@ out:
switch(protocol) {
case PPP_VJC_COMP: /* VJ compressed TCP */
#if PPPOS_SUPPORT && VJ_SUPPORT
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_comp in pbuf len=%d\n", pcb->unit, nb->len));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_comp in pbuf len=%d\n", pcb->unit, pb->len));
/*
* Clip off the VJ header and prepend the rebuilt TCP/IP header and
* pass the result to IP.
*/
if ((vj_uncompress_tcp(&nb, pcb->vj_comp) >= 0) && (pcb->netif.input)) {
pcb->netif.input(nb, pcb->netif);
if ((vj_uncompress_tcp(&pb, pcb->vj_comp) >= 0) && (pcb->netif.input)) {
pcb->netif.input(pb, pcb->netif);
return;
}
/* Something's wrong so drop it. */
PPPDEBUG(LOG_WARNING, ("ppp_input[%d]: Dropping VJ compressed\n", pcb->unit));
#else /* PPPOS_SUPPORT && VJ_SUPPORT */
/* No handler for this protocol so drop the packet. */
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: drop VJ Comp in %d:%s\n", pcb->unit, nb->len, nb->payload));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: drop VJ Comp in %d:%s\n", pcb->unit, pb->len, pb->payload));
#endif /* PPPOS_SUPPORT && VJ_SUPPORT */
break;
case PPP_VJC_UNCOMP: /* VJ uncompressed TCP */
#if PPPOS_SUPPORT && VJ_SUPPORT
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_un in pbuf len=%d\n", pcb->unit, nb->len));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: vj_un in pbuf len=%d\n", pcb->unit, pb->len));
/*
* Process the TCP/IP header for VJ header compression and then pass
* the packet to IP.
*/
if ((vj_uncompress_uncomp(nb, pcb->vj_comp) >= 0) && pcb->netif.input) {
pcb->netif.input(nb, pcb->netif);
if ((vj_uncompress_uncomp(pb, pcb->vj_comp) >= 0) && pcb->netif.input) {
pcb->netif.input(pb, pcb->netif);
return;
}
/* Something's wrong so drop it. */
@ -711,14 +688,14 @@ out:
/* No handler for this protocol so drop the packet. */
PPPDEBUG(LOG_INFO,
("ppp_input[%d]: drop VJ UnComp in %d:.*H\n",
pcb->unit, nb->len, LWIP_MIN(nb->len * 2, 40), nb->payload));
pcb->unit, pb->len, LWIP_MIN(pb->len * 2, 40), pb->payload));
#endif /* PPPOS_SUPPORT && VJ_SUPPORT */
break;
case PPP_IP: /* Internet Protocol */
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: ip in pbuf len=%d\n", pcb->unit, nb->len));
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: ip in pbuf len=%d\n", pcb->unit, pb->len));
if (pcb->netif.input) {
pcb->netif.input(nb, pcb->netif);
pcb->netif.input(pb, pcb->netif);
return;
}
break;
@ -732,25 +709,25 @@ out:
*/
for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) {
if (protp->protocol == protocol && protp->enabled_flag) {
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: %s len=%d\n", pcb->unit, protp->name, nb->len));
nb = ppp_singlebuf(nb);
(*protp->input)(pcb->unit, nb->payload, nb->len);
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: %s len=%d\n", pcb->unit, protp->name, pb->len));
pb = ppp_singlebuf(pb);
(*protp->input)(pcb->unit, pb->payload, pb->len);
PPPDEBUG(LOG_DETAIL, ("ppp_input[%d]: packet processed\n", pcb->unit));
goto out;
}
}
/* No handler for this protocol so reject the packet. */
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: rejecting unsupported proto 0x%"X16_F" len=%d\n", pcb->unit, protocol, nb->len));
if (pbuf_header(nb, sizeof(protocol))) {
PPPDEBUG(LOG_INFO, ("ppp_input[%d]: rejecting unsupported proto 0x%"X16_F" len=%d\n", pcb->unit, protocol, pb->len));
if (pbuf_header(pb, sizeof(protocol))) {
LWIP_ASSERT("pbuf_header failed\n", 0);
goto drop;
}
#if BYTE_ORDER == LITTLE_ENDIAN
protocol = htons(protocol);
#endif /* BYTE_ORDER == LITTLE_ENDIAN */
SMEMCPY(nb->payload, &protocol, sizeof(protocol));
lcp_sprotrej(pcb->unit, nb->payload, nb->len);
SMEMCPY(pb->payload, &protocol, sizeof(protocol));
lcp_sprotrej(pcb->unit, pb->payload, pb->len);
}
break;
}
@ -824,54 +801,6 @@ ppp_receive_wakeup(ppp_pcb *pcb)
#endif /* PPP_INPROC_OWNTHREAD */
#endif /* PPPOS_SUPPORT */
#if PPPOE_SUPPORT
/* ppp_input_over_ethernet
*
* take a packet from PPPoE subsystem and pass it to the PPP stack through ppp_input()
*/
/* FIXME: maybe we should pass in two arguments ppp_input_header and payload
* this is totally stupid to make room for it and then modify the packet directly
* or it is used in output ? have to find out...
*/
void ppp_input_over_ethernet(ppp_pcb *pcb, struct pbuf *pb) {
struct ppp_input_header *pih;
u16_t in_protocol;
if(pb->len < sizeof(in_protocol)) {
PPPDEBUG(LOG_ERR, ("ppp_input_over_ethernet: too small for protocol field\n"));
goto drop;
}
#if PRINTPKT_SUPPORT
dump_packet("rcvd", pb->payload, pb->len);
#endif /* PRINTPKT_SUPPORT */
in_protocol = (((u8_t *)pb->payload)[0] << 8) | ((u8_t*)pb->payload)[1];
/* make room for ppp_input_header - should not fail */
if (pbuf_header(pb, sizeof(*pih) - sizeof(in_protocol)) != 0) {
PPPDEBUG(LOG_ERR, ("ppp_input_over_ethernet: could not allocate room for header\n"));
goto drop;
}
pih = pb->payload;
pih->unit = pcb->unit;
pih->proto = in_protocol; /* pih->proto is now in host byte order */
/* Dispatch the packet thereby consuming it. */
ppp_input(pb);
return;
drop:
LINK_STATS_INC(link.drop);
snmp_inc_ifindiscards(&pcb->netif);
pbuf_free(pb);
return;
}
#endif /* PPPOE_SUPPORT */
/*
* ppp_netif_init_cb - netif init callback
*/
@ -901,7 +830,7 @@ ppp_input_thread(void *arg)
{
int count;
ppp_pcb_rx *pcrx = arg;
ppp_pcb *pcb = &ppp_pcb_list[pcrx->pd];
ppp_pcb *pcb = (ppp_pcb*)pcrx->pcb;
while (pcb->phase != PHASE_DEAD) {
count = sio_read(pcrx->fd, pcrx->rxbuf, PPPOS_RX_BUFSIZE);
@ -1361,6 +1290,7 @@ ppp_free_current_input_packet(ppp_pcb_rx *pcrx)
static void
ppp_drop(ppp_pcb_rx *pcrx)
{
ppp_pcb *pcb = (ppp_pcb*)pcrx->pcb;
if (pcrx->in_head != NULL) {
#if 0
PPPDEBUG(LOG_INFO, ("ppp_drop: %d:%.*H\n", pcrx->in_head->len, min(60, pcrx->in_head->len * 2), pcrx->in_head->payload));
@ -1369,11 +1299,11 @@ ppp_drop(ppp_pcb_rx *pcrx)
}
ppp_free_current_input_packet(pcrx);
#if VJ_SUPPORT
vj_uncompress_err(&ppp_pcb_list[pcrx->pd].vj_comp);
vj_uncompress_err(&pcb->vj_comp);
#endif /* VJ_SUPPORT */
LINK_STATS_INC(link.drop);
snmp_inc_ifindiscards(&ppp_pcb_list[pcrx->pd].netif);
snmp_inc_ifindiscards(&pcb->netif);
}
#if !PPP_INPROC_OWNTHREAD
@ -1397,12 +1327,13 @@ pppos_input(ppp_pcb *pcb, u_char* data, int len)
static void
pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
{
ppp_pcb *pcb = (ppp_pcb*)pcrx->pcb;
struct pbuf *next_pbuf;
u_char cur_char;
u_char escaped;
SYS_ARCH_DECL_PROTECT(lev);
PPPDEBUG(LOG_DEBUG, ("pppos_input_proc[%d]: got %d bytes\n", pcrx->pd, l));
PPPDEBUG(LOG_DEBUG, ("pppos_input_proc[%d]: got %d bytes\n", pcb->unit, l));
while (l-- > 0) {
cur_char = *s++;
@ -1427,20 +1358,23 @@ pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
} else if (pcrx->in_state < PDDATA) {
PPPDEBUG(LOG_WARNING,
("pppos_input_proc[%d]: Dropping incomplete packet %d\n",
pcrx->pd, pcrx->in_state));
pcb->unit, pcrx->in_state));
LINK_STATS_INC(link.lenerr);
ppp_drop(pcrx);
/* If the fcs is invalid, drop the packet. */
} else if (pcrx->in_fcs != PPP_GOODFCS) {
PPPDEBUG(LOG_INFO,
("pppos_input_proc[%d]: Dropping bad fcs 0x%"X16_F" proto=0x%"X16_F"\n",
pcrx->pd, pcrx->in_fcs, pcrx->in_protocol));
pcb->unit, pcrx->in_fcs, pcrx->in_protocol));
/* Note: If you get lots of these, check for UART frame errors or try different baud rate */
LINK_STATS_INC(link.chkerr);
ppp_drop(pcrx);
/* Otherwise it's a good packet so pass it on. */
} else {
struct pbuf *inp;
#if PPP_INPROC_MULTITHREADED
struct pbuf *head;
#endif /* PPP_INPROC_MULTITHREADED */
/* Trim off the checksum. */
if(pcrx->in_tail->len > 2) {
pcrx->in_tail->len -= 2;
@ -1464,14 +1398,20 @@ pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
pcrx->in_head = NULL;
pcrx->in_tail = NULL;
#if PPP_INPROC_MULTITHREADED
if(tcpip_callback_with_block(ppp_input, inp, 0) != ERR_OK) {
PPPDEBUG(LOG_ERR, ("pppos_input_proc[%d]: tcpip_callback() failed, dropping packet\n", pcrx->pd));
pbuf_free(inp);
LINK_STATS_INC(link.drop);
snmp_inc_ifindiscards(&ppp_pcb_list[pcrx->pd].netif);
head = pbuf_alloc(PBUF_RAW, sizeof(void*), PBUF_POOL);
if(NULL != head) {
MEMCPY(head->payload, pcb, sizeof(void*));
pbuf_chain(head, inp);
if(tcpip_callback_with_block(pppos_input_callback, head, 0) != ERR_OK) {
PPPDEBUG(LOG_ERR, ("pppos_input_proc[%d]: tcpip_callback() failed, dropping packet\n", pcb->unit));
pbuf_free(head);
pbuf_free(inp);
LINK_STATS_INC(link.drop);
snmp_inc_ifindiscards(&pcb->netif);
}
}
#else /* PPP_INPROC_MULTITHREADED */
ppp_input(inp);
ppp_input(pcrx->pcb, inp);
#endif /* PPP_INPROC_MULTITHREADED */
}
@ -1483,7 +1423,7 @@ pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
* been inserted by the physical layer so here we just drop them. */
} else {
PPPDEBUG(LOG_WARNING,
("pppos_input_proc[%d]: Dropping ACCM char <%d>\n", pcrx->pd, cur_char));
("pppos_input_proc[%d]: Dropping ACCM char <%d>\n", pcb->unit, cur_char));
}
/* Process other characters. */
} else {
@ -1530,7 +1470,7 @@ pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
#if 0
else {
PPPDEBUG(LOG_WARNING,
("pppos_input_proc[%d]: Invalid control <%d>\n", pcrx->pd, cur_char));
("pppos_input_proc[%d]: Invalid control <%d>\n", pcb->unit, cur_char));
pcrx->in_state = PDSTART;
}
#endif
@ -1566,19 +1506,16 @@ pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
/* No free buffers. Drop the input packet and let the
* higher layers deal with it. Continue processing
* the received pbuf chain in case a new packet starts. */
PPPDEBUG(LOG_ERR, ("pppos_input_proc[%d]: NO FREE MBUFS!\n", pcrx->pd));
PPPDEBUG(LOG_ERR, ("pppos_input_proc[%d]: NO FREE MBUFS!\n", pcb->unit));
LINK_STATS_INC(link.memerr);
ppp_drop(pcrx);
pcrx->in_state = PDSTART; /* Wait for flag sequence. */
break;
}
if (pcrx->in_head == NULL) {
struct ppp_input_header *pih = next_pbuf->payload;
pih->unit = pcrx->pd;
pih->proto = pcrx->in_protocol;
next_pbuf->len += sizeof(*pih);
((u8_t*)next_pbuf->payload)[0] = pcrx->in_protocol & 0xFF;
((u8_t*)next_pbuf->payload)[1] = pcrx->in_protocol >> 8;
next_pbuf->len += sizeof(pcrx->in_protocol);
pcrx->in_head = next_pbuf;
}
@ -1596,6 +1533,34 @@ pppos_input_proc(ppp_pcb_rx *pcrx, u_char *s, int l)
magic_randomize();
}
/* PPPoS input callback using one input pointer
* *arg is a pbuf chain of two chained pbuf, the first contains
* a pointer to the PPP PCB structure, the second contains the
* PPP payload
*/
static void pppos_input_callback(void *arg) {
struct pbuf *hd, *pl;
ppp_pcb *pcb;
hd = (struct pbuf *)arg;
pcb = (ppp_pcb *)hd->payload;
pl = hd->next;
pbuf_free(hd);
if(NULL == pl)
goto drop;
/* Dispatch the packet thereby consuming it. */
ppp_input(pcb, pl);
return;
drop:
LINK_STATS_INC(link.drop);
snmp_inc_ifindiscards(&pcb->netif);
pbuf_free(pl);
return;
}
#endif /* PPPOS_SUPPORT */
/* merge a pbuf chain into one pbuf */
@ -1642,7 +1607,7 @@ static void ppp_over_ethernet_link_status_cb(ppp_pcb *pcb, int state) {
pppoe_err_code = PPPERR_CONNECT;
break;
/* PPPoE link failed to setup (i.e. PADI/PADO timeout */
/* PPPoE link failed to setup (i.e. PADI/PADO timeout) */
case PPPOE_CB_STATE_FAILED:
PPPDEBUG(LOG_INFO, ("ppp_over_ethernet_link_status_cb: unit %d: FAILED, aborting\n", pcb->unit));
pppoe_err_code = PPPERR_OPEN;

View File

@ -193,8 +193,8 @@ typedef enum {
* PPP interface RX control block.
*/
typedef struct ppp_pcb_rx_s {
/** unit number / ppp descriptor */
int pd;
/** ppp descriptor */
void *pcb;
/** the rx file descriptor */
sio_fd_t fd;
/** receive buffer - encoded data is stored here */

View File

@ -387,10 +387,8 @@ ppp_pcb ppp_pcb_list[NUM_PPP]; /* The PPP interface control blocks. */
/* PPP flow functions
*/
#if PPPOE_SUPPORT
/* function called by pppoe.c */
void ppp_input_over_ethernet(ppp_pcb *pcb, struct pbuf *pb);
#endif /* PPPOE_SUPPORT */
void ppp_input(ppp_pcb *pcb, struct pbuf *pb);
/* function called by all PPP subsystems to send packets */
int ppp_write(ppp_pcb *pcb, const u_char *s, int n);

View File

@ -622,8 +622,8 @@ pppoe_data_input(struct netif *netif, struct pbuf *pb)
goto drop;
}
ppp_input_over_ethernet(sc->pcb, pb);
/* Dispatch the packet thereby consuming it. */
ppp_input(sc->pcb, pb);
return;
drop: