PPP, CORE, now using const callbacks struct from lower level protocols

Saving some RAM by using callbacks struct in rodata for required
callbacks called by PPP core to PPP low level protocols.
This commit is contained in:
Sylvain Rochet 2015-02-19 23:25:21 +01:00
parent 2e40ceaaa4
commit 985de035bc
6 changed files with 115 additions and 152 deletions

View File

@ -303,19 +303,13 @@ struct ppp_addrs {
/*
* PPP interface control block.
*/
typedef int (*link_command_cb_fn)(void *pcb, u8_t command);
typedef int (*link_write_cb_fn)(void *pcb, struct pbuf *p);
typedef err_t (*link_netif_output_cb_fn)(void *pcb, struct pbuf *p, u_short protocol);
struct ppp_pcb_s {
/* -- below are data that will NOT be cleared between two sessions */
#if PPP_DEBUG
u8_t num; /* Interface number - only useful for debugging */
#endif /* PPP_DEBUG */
ppp_settings settings;
link_command_cb_fn link_command_cb;
link_write_cb_fn link_write_cb;
link_netif_output_cb_fn link_netif_output_cb;
const struct link_callbacks *link_cb;
void *link_ctx_cb;
void (*link_status_cb)(ppp_pcb *pcb, int err_code, void *ctx); /* Status change callback */
#if PPP_NOTIFY_PHASE

View File

@ -93,16 +93,6 @@
*/
#define PPP_LINK_ENABLED_NUMBER (!!PPPOS_SUPPORT+!!PPPOE_SUPPORT+!!PPPOL2TP_SUPPORT)
/*
* Low-level links commands
*/
/* Start a connection (i.e. initiate discovery phase) */
#define PPP_LINK_COMMAND_CONNECT 0
/* End a connection (i.e. initiate disconnect phase) */
#define PPP_LINK_COMMAND_DISCONNECT 1
/* Free link connection */
#define PPP_LINK_COMMAND_FREE 2
/*
* Protocol field values.
*/
@ -152,6 +142,23 @@
#define PPP_EAP 0xc227 /* Extensible Authentication Protocol */
#endif /* EAP_SUPPORT */
/*
* The following struct gives the addresses of procedures to call
* for a particular lower link level protocol.
*/
struct link_callbacks {
/* Start a connection (e.g. Initiate discovery phase) */
err_t (*connect) (ppp_pcb *pcb, void *ctx);
/* End a connection (i.e. initiate disconnect phase) */
void (*disconnect) (ppp_pcb *pcb, void *ctx);
/* Free lower protocol control block */
err_t (*free) (ppp_pcb *pcb, void *ctx);
/* Write a pbuf to a ppp link, only used from PPP functions to send PPP packets. */
err_t (*write)(ppp_pcb *pcb, void *ctx, struct pbuf *p);
/* Send a packet from lwIP core (IPv4 or IPv6) */
err_t (*netif_output)(ppp_pcb *pcb, void *ctx, struct pbuf *p, u_short protocol);
};
/*
* What to do with network protocol (NP) packets.
*/
@ -380,8 +387,8 @@ ppp_pcb *ppp_new(struct netif *pppif, ppp_link_status_cb_fn link_status_cb, void
/* Set a PPP PCB to its initial state */
void ppp_clear(ppp_pcb *pcb);
/* Set link callback function */
void ppp_link_set_callbacks(ppp_pcb *pcb, link_command_cb_fn command, link_write_cb_fn write, link_netif_output_cb_fn netif_output, void *ctx);
/* Set link callback functions */
void ppp_link_set_callbacks(ppp_pcb *pcb, const struct link_callbacks *callbacks, void *ctx);
/* Initiate LCP open request */
void ppp_start(ppp_pcb *pcb);

View File

@ -258,7 +258,7 @@ int ppp_open(ppp_pcb *pcb, u16_t holdoff) {
PPPDEBUG(LOG_DEBUG, ("ppp_open() called, holdoff=%d\n", holdoff));
if (holdoff == 0) {
return pcb->link_command_cb(pcb->link_ctx_cb, PPP_LINK_COMMAND_CONNECT);
return pcb->link_cb->connect(pcb, pcb->link_ctx_cb);
}
new_phase(pcb, PPP_PHASE_HOLDOFF);
@ -329,7 +329,7 @@ int ppp_free(ppp_pcb *pcb) {
netif_remove(pcb->netif);
err = pcb->link_command_cb(pcb->link_ctx_cb, PPP_LINK_COMMAND_FREE);
err = pcb->link_cb->free(pcb, pcb->link_ctx_cb);
memp_free(MEMP_PPP_PCB, pcb);
return err;
@ -425,7 +425,7 @@ static void ppp_do_open(void *arg) {
LWIP_ASSERT("pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF", pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF);
pcb->link_command_cb(pcb->link_ctx_cb, PPP_LINK_COMMAND_CONNECT);
pcb->link_cb->connect(pcb, pcb->link_ctx_cb);
}
/*
@ -491,7 +491,7 @@ static err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u_short prot
return ERR_RTE;
}
return pcb->link_netif_output_cb(pcb->link_ctx_cb, pb, protocol);
return pcb->link_cb->netif_output(pcb, pcb->link_ctx_cb, pb, protocol);
}
@ -614,10 +614,8 @@ void ppp_clear(ppp_pcb *pcb) {
new_phase(pcb, PPP_PHASE_INITIALIZE);
}
void ppp_link_set_callbacks(ppp_pcb *pcb, link_command_cb_fn command, link_write_cb_fn write, link_netif_output_cb_fn netif_output, void *ctx) {
pcb->link_command_cb = command;
pcb->link_write_cb = write;
pcb->link_netif_output_cb = netif_output;
void ppp_link_set_callbacks(ppp_pcb *pcb, const struct link_callbacks *callbacks, void *ctx) {
pcb->link_cb = callbacks;
pcb->link_ctx_cb = ctx;
}
@ -809,7 +807,7 @@ int ppp_write(ppp_pcb *pcb, struct pbuf *p) {
#if PRINTPKT_SUPPORT
ppp_dump_packet("sent", (unsigned char *)p->payload+2, p->len-2);
#endif /* PRINTPKT_SUPPORT */
return pcb->link_write_cb(pcb->link_ctx_cb, p);
return pcb->link_cb->write(pcb, pcb->link_ctx_cb, p);
}
/* merge a pbuf chain into one pbuf */
@ -840,7 +838,7 @@ struct pbuf * ppp_singlebuf(struct pbuf *p) {
void ppp_link_terminated(ppp_pcb *pcb) {
PPPDEBUG(LOG_DEBUG, ("ppp_link_terminated: unit %d\n", pcb->num));
pcb->link_command_cb(pcb->link_ctx_cb, PPP_LINK_COMMAND_DISCONNECT);
pcb->link_cb->disconnect(pcb, pcb->link_ctx_cb);
PPPDEBUG(LOG_DEBUG, ("ppp_link_terminated: finished.\n"));
}

View File

@ -117,14 +117,13 @@ static char pppoe_error_tmp[PPPOE_ERRORSTRING_LEN];
/* callbacks called from PPP core */
static int pppoe_link_command_callback(void *pcb, u8_t command);
static int pppoe_link_write_callback(void *pcb, struct pbuf *p);
static err_t pppoe_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol);
static err_t pppoe_link_write_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p);
static err_t pppoe_link_netif_output_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol);
static err_t pppoe_connect(ppp_pcb *ppp, void *ctx);
static void pppoe_disconnect(ppp_pcb *ppp, void *ctx);
static err_t pppoe_destroy(ppp_pcb *ppp, void *ctx);
/* management routines */
static err_t pppoe_destroy(struct pppoe_softc *sc);
static int pppoe_connect(struct pppoe_softc *sc);
static void pppoe_disconnect(struct pppoe_softc *sc);
static void pppoe_abort_connect(struct pppoe_softc *);
static void pppoe_clear_softc(struct pppoe_softc *, const char *);
@ -148,6 +147,15 @@ static struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len,
/** linked list of created pppoe interfaces */
static struct pppoe_softc *pppoe_softc_list;
/* Callbacks structure for PPP core */
static const struct link_callbacks pppoe_callbacks = {
pppoe_connect,
pppoe_disconnect,
pppoe_destroy,
pppoe_link_write_callback,
pppoe_link_netif_output_callback
};
/*
* Create a new PPP Over Ethernet (PPPoE) connection.
*
@ -185,35 +193,13 @@ ppp_pcb *pppoe_create(struct netif *pppif,
sc->next = pppoe_softc_list;
pppoe_softc_list = sc;
ppp_link_set_callbacks(ppp, pppoe_link_command_callback, pppoe_link_write_callback, pppoe_link_netif_output_callback, sc);
ppp_link_set_callbacks(ppp, &pppoe_callbacks, sc);
return ppp;
}
/* Called by PPP core */
static int pppoe_link_command_callback(void *pcb, u8_t command) {
struct pppoe_softc *sc = (struct pppoe_softc *)pcb;
switch(command) {
case PPP_LINK_COMMAND_CONNECT:
return pppoe_connect(sc);
case PPP_LINK_COMMAND_DISCONNECT:
pppoe_disconnect(sc);
break;
case PPP_LINK_COMMAND_FREE:
return pppoe_destroy(sc);
default: ;
}
return PPPERR_NONE;
}
/* Called by PPP core */
static int pppoe_link_write_callback(void *pcb, struct pbuf *p) {
struct pppoe_softc *sc = (struct pppoe_softc *)pcb;
ppp_pcb *ppp = sc->pcb;
static err_t pppoe_link_write_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p) {
struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
struct pbuf *ph; /* Ethernet + PPPoE header */
#if LWIP_SNMP
u16_t tot_len;
@ -252,9 +238,8 @@ static int pppoe_link_write_callback(void *pcb, struct pbuf *p) {
}
/* Called by PPP core */
static err_t pppoe_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol) {
struct pppoe_softc *sc = (struct pppoe_softc *)pcb;
ppp_pcb *ppp = sc->pcb;
static err_t pppoe_link_netif_output_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol) {
struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
struct pbuf *pb;
int i=0;
#if LWIP_SNMP
@ -298,9 +283,11 @@ static err_t pppoe_link_netif_output_callback(void *pcb, struct pbuf *p, u_short
}
static err_t
pppoe_destroy(struct pppoe_softc *sc)
pppoe_destroy(ppp_pcb *ppp, void *ctx)
{
struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
struct pppoe_softc **copp, *freep;
LWIP_UNUSED_ARG(ppp);
sys_untimeout(pppoe_timeout, sc);
@ -906,11 +893,11 @@ pppoe_timeout(void *arg)
}
/* Start a connection (i.e. initiate discovery phase) */
static int
pppoe_connect(struct pppoe_softc *sc)
static err_t
pppoe_connect(ppp_pcb *ppp, void *ctx)
{
int err;
ppp_pcb *ppp = sc->pcb;
struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
lcp_options *lcp_wo;
lcp_options *lcp_ao;
ipcp_options *ipcp_wo;
@ -965,8 +952,10 @@ pppoe_connect(struct pppoe_softc *sc)
/* disconnect */
static void
pppoe_disconnect(struct pppoe_softc *sc)
pppoe_disconnect(ppp_pcb *ppp, void *ctx)
{
struct pppoe_softc *sc = (struct pppoe_softc *)ctx;
if (sc->sc_state < PPPOE_STATE_SESSION) {
return;
}
@ -989,7 +978,7 @@ pppoe_disconnect(struct pppoe_softc *sc)
sc->sc_padi_retried = 0;
sc->sc_padr_retried = 0;
ppp_link_end(sc->pcb); /* notify upper layers */
ppp_link_end(ppp); /* notify upper layers */
return;
}

View File

@ -75,14 +75,13 @@
#endif /* PPPOL2TP_AUTH_SUPPORT */
/* callbacks called from PPP core */
static int pppol2tp_link_command_callback(void *pcb, u8_t command);
static int pppol2tp_link_write_callback(void *pcb, struct pbuf *p);
static err_t pppol2tp_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol);
static err_t pppol2tp_link_write_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p);
static err_t pppol2tp_link_netif_output_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol);
static err_t pppol2tp_destroy(ppp_pcb *ppp, void *ctx); /* Destroy a L2TP control block */
static err_t pppol2tp_connect(ppp_pcb *ppp, void *ctx); /* Be a LAC, connect to a LNS. */
static void pppol2tp_disconnect(ppp_pcb *ppp, void *ctx); /* Disconnect */
/* Prototypes for procedures local to this file. */
static err_t pppol2tp_destroy(pppol2tp_pcb *l2tp); /* Destroy a L2TP control block */
static err_t pppol2tp_connect(pppol2tp_pcb *l2tp); /* Be a LAC, connect to a LNS. */
static void pppol2tp_disconnect(pppol2tp_pcb *l2tp); /* Disconnect */
static void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port);
static void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, struct ip_addr *addr, u16_t port,
struct pbuf *p, u16_t len, u16_t tunnel_id, u16_t session_id, u16_t ns, u16_t nr);
@ -97,6 +96,15 @@ static err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns);
static err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns);
static err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb);
/* Callbacks structure for PPP core */
static const struct link_callbacks pppol2tp_callbacks = {
pppol2tp_connect,
pppol2tp_disconnect,
pppol2tp_destroy,
pppol2tp_link_write_callback,
pppol2tp_link_netif_output_callback
};
/* Create a new L2TP session. */
ppp_pcb *pppol2tp_create(struct netif *pppif,
@ -138,35 +146,13 @@ ppp_pcb *pppol2tp_create(struct netif *pppif,
l2tp->secret_len = secret_len;
#endif /* PPPOL2TP_AUTH_SUPPORT */
ppp_link_set_callbacks(ppp, pppol2tp_link_command_callback, pppol2tp_link_write_callback, pppol2tp_link_netif_output_callback, l2tp);
ppp_link_set_callbacks(ppp, &pppol2tp_callbacks, l2tp);
return ppp;
}
/* Called by PPP core */
static int pppol2tp_link_command_callback(void *pcb, u8_t command) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)pcb;
switch(command) {
case PPP_LINK_COMMAND_CONNECT:
return pppol2tp_connect(l2tp);
case PPP_LINK_COMMAND_DISCONNECT:
pppol2tp_disconnect(l2tp);
break;
case PPP_LINK_COMMAND_FREE:
return pppol2tp_destroy(l2tp);
default: ;
}
return PPPERR_NONE;
}
/* Called by PPP core */
static int pppol2tp_link_write_callback(void *pcb, struct pbuf *p) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)pcb;
ppp_pcb *ppp = l2tp->ppp;
static err_t pppol2tp_link_write_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
struct pbuf *ph; /* UDP + L2TP header */
#if LWIP_SNMP
u16_t tot_len;
@ -202,9 +188,8 @@ static int pppol2tp_link_write_callback(void *pcb, struct pbuf *p) {
}
/* Called by PPP core */
static err_t pppol2tp_link_netif_output_callback(void *pcb, struct pbuf *p, u_short protocol) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)pcb;
ppp_pcb *ppp = l2tp->ppp;
static err_t pppol2tp_link_netif_output_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
struct pbuf *pb;
int i=0;
#if LWIP_SNMP
@ -248,7 +233,9 @@ static err_t pppol2tp_link_netif_output_callback(void *pcb, struct pbuf *p, u_sh
}
/* Destroy a L2TP control block */
static err_t pppol2tp_destroy(pppol2tp_pcb *l2tp) {
static err_t pppol2tp_destroy(ppp_pcb *ppp, void *ctx) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
LWIP_UNUSED_ARG(ppp);
sys_untimeout(pppol2tp_timeout, l2tp);
if (l2tp->udp != NULL) {
@ -259,9 +246,9 @@ static err_t pppol2tp_destroy(pppol2tp_pcb *l2tp) {
}
/* Be a LAC, connect to a LNS. */
static err_t pppol2tp_connect(pppol2tp_pcb *l2tp) {
static err_t pppol2tp_connect(ppp_pcb *ppp, void *ctx) {
err_t err;
ppp_pcb *ppp = l2tp->ppp;
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
lcp_options *lcp_wo;
lcp_options *lcp_ao;
ipcp_options *ipcp_wo;
@ -321,7 +308,8 @@ static err_t pppol2tp_connect(pppol2tp_pcb *l2tp) {
}
/* Disconnect */
static void pppol2tp_disconnect(pppol2tp_pcb *l2tp) {
static void pppol2tp_disconnect(ppp_pcb *ppp, void *ctx) {
pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;
if (l2tp->phase < PPPOL2TP_STATE_DATA) {
return;
@ -331,7 +319,7 @@ static void pppol2tp_disconnect(pppol2tp_pcb *l2tp) {
pppol2tp_send_stopccn(l2tp, l2tp->our_ns);
pppol2tp_clear(l2tp);
ppp_link_end(l2tp->ppp); /* notify upper layers */
ppp_link_end(ppp); /* notify upper layers */
}
/* UDP Callback for incoming L2TP frames */

View File

@ -82,14 +82,13 @@ static u8_t pppos_exist(pppos_pcb *pppos);
#endif /* PPPOS_PCB_LIST */
/* callbacks called from PPP core */
static int pppos_link_command_callback(void *pcb, u8_t command);
static int pppos_link_write_callback(void *pcb, struct pbuf *p);
static err_t pppos_link_netif_output_callback(void *pcb, struct pbuf *pb, u_short protocol);
static err_t pppos_link_write_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p);
static err_t pppos_link_netif_output_callback(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u_short protocol);
static err_t pppos_connect(ppp_pcb *ppp, void *ctx);
static void pppos_disconnect(ppp_pcb *ppp, void *ctx);
static err_t pppos_destroy(ppp_pcb *ppp, void *ctx);
/* Prototypes for procedures local to this file. */
static void pppos_connect(pppos_pcb *pppos);
static void pppos_disconnect(pppos_pcb *pppos);
static err_t pppos_destroy(pppos_pcb *pppos);
#if PPP_INPROC_MULTITHREADED
static void pppos_input_callback(void *arg);
#endif /* PPP_INPROC_MULTITHREADED */
@ -98,6 +97,15 @@ static void pppos_free_current_input_packet(pppos_pcb *pppos);
static struct pbuf *pppos_append(u_char c, struct pbuf *nb, ext_accm *out_accm);
static void pppos_drop(pppos_pcb *pppos);
/* Callbacks structure for PPP core */
static const struct link_callbacks pppos_callbacks = {
pppos_connect,
pppos_disconnect,
pppos_destroy,
pppos_link_write_callback,
pppos_link_netif_output_callback
};
/* PPP's Asynchronous-Control-Character-Map. The mask array is used
* to select the specific bit for a character. */
static const u_char ppp_accm_mask[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
@ -200,40 +208,15 @@ ppp_pcb *pppos_create(struct netif *pppif, sio_fd_t fd,
pppos->ppp = ppp;
pppos->fd = fd;
ppp_link_set_callbacks(ppp, pppos_link_command_callback, pppos_link_write_callback, pppos_link_netif_output_callback, pppos);
ppp_link_set_callbacks(ppp, &pppos_callbacks, pppos);
return ppp;
}
/* Called by PPP core */
static int
pppos_link_command_callback(void *pcb, u8_t command)
static err_t
pppos_link_write_callback(ppp_pcb *ppp, void *ctx, struct pbuf *p)
{
pppos_pcb *pppos = (pppos_pcb *)pcb;
switch(command) {
case PPP_LINK_COMMAND_CONNECT:
pppos_connect(pppos);
break;
case PPP_LINK_COMMAND_DISCONNECT:
pppos_disconnect(pppos);
break;
case PPP_LINK_COMMAND_FREE:
return pppos_destroy(pppos);
default: ;
}
return PPPERR_NONE;
}
/* Called by PPP core */
static int
pppos_link_write_callback(void *pcb, struct pbuf *p)
{
pppos_pcb *pppos = (pppos_pcb *)pcb;
ppp_pcb *ppp = pppos->ppp;
pppos_pcb *pppos = (pppos_pcb *)ctx;
u_char *s = (u_char*)p->payload;
int n = p->len;
u_char c;
@ -300,10 +283,9 @@ pppos_link_write_callback(void *pcb, struct pbuf *p)
/* Called by PPP core */
static err_t
pppos_link_netif_output_callback(void *pcb, struct pbuf *pb, u_short protocol)
pppos_link_netif_output_callback(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u_short protocol)
{
pppos_pcb *pppos = (pppos_pcb *)pcb;
ppp_pcb *ppp = pppos->ppp;
pppos_pcb *pppos = (pppos_pcb *)ctx;
u_int fcs_out = PPP_INITFCS;
struct pbuf *head = NULL, *tail = NULL, *p;
u_char c;
@ -427,10 +409,10 @@ pppos_exist(pppos_pcb *pppos)
}
#endif /* PPPOS_PCB_LIST */
static void
pppos_connect(pppos_pcb *pppos)
static err_t
pppos_connect(ppp_pcb *ppp, void *ctx)
{
ppp_pcb *ppp = pppos->ppp;
pppos_pcb *pppos = (pppos_pcb *)ctx;
#if !VJ_SUPPORT
ipcp_options *ipcp_wo;
ipcp_options *ipcp_ao;
@ -468,12 +450,13 @@ pppos_connect(pppos_pcb *pppos)
*/
PPPDEBUG(LOG_INFO, ("pppos_connect: unit %d: connecting\n", ppp->num));
ppp_start(ppp); /* notify upper layers */
return ERR_OK;
}
static void
pppos_disconnect(pppos_pcb *pppos)
pppos_disconnect(ppp_pcb *ppp, void *ctx)
{
ppp_pcb *ppp = pppos->ppp;
LWIP_UNUSED_ARG(ctx);
/* We cannot call ppp_free_current_input_packet() here because
* rx thread might still call pppos_input()
@ -482,11 +465,15 @@ pppos_disconnect(pppos_pcb *pppos)
}
static err_t
pppos_destroy(pppos_pcb *pppos)
pppos_destroy(ppp_pcb *ppp, void *ctx)
{
pppos_pcb *pppos = (pppos_pcb *)ctx;
#if PPPOS_PCB_LIST
pppos_pcb **copp, *freep;
#endif /* PPPOS_PCB_LIST */
LWIP_UNUSED_ARG(ppp);
#if PPPOS_PCB_LIST
/* remove interface from list */
for (copp = &pppos_pcb_list; (freep = *copp); copp = &freep->next) {
if (freep == pppos) {