1*5d5fbe79SDavid van Moolenbroek /**
2*5d5fbe79SDavid van Moolenbroek * @file
3*5d5fbe79SDavid van Moolenbroek * Point To Point Protocol Sequential API module
4*5d5fbe79SDavid van Moolenbroek *
5*5d5fbe79SDavid van Moolenbroek */
6*5d5fbe79SDavid van Moolenbroek
7*5d5fbe79SDavid van Moolenbroek /*
8*5d5fbe79SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without modification,
9*5d5fbe79SDavid van Moolenbroek * are permitted provided that the following conditions are met:
10*5d5fbe79SDavid van Moolenbroek *
11*5d5fbe79SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright notice,
12*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer.
13*5d5fbe79SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright notice,
14*5d5fbe79SDavid van Moolenbroek * this list of conditions and the following disclaimer in the documentation
15*5d5fbe79SDavid van Moolenbroek * and/or other materials provided with the distribution.
16*5d5fbe79SDavid van Moolenbroek * 3. The name of the author may not be used to endorse or promote products
17*5d5fbe79SDavid van Moolenbroek * derived from this software without specific prior written permission.
18*5d5fbe79SDavid van Moolenbroek *
19*5d5fbe79SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
20*5d5fbe79SDavid van Moolenbroek * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21*5d5fbe79SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
22*5d5fbe79SDavid van Moolenbroek * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23*5d5fbe79SDavid van Moolenbroek * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24*5d5fbe79SDavid van Moolenbroek * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*5d5fbe79SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*5d5fbe79SDavid van Moolenbroek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27*5d5fbe79SDavid van Moolenbroek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
28*5d5fbe79SDavid van Moolenbroek * OF SUCH DAMAGE.
29*5d5fbe79SDavid van Moolenbroek *
30*5d5fbe79SDavid van Moolenbroek * This file is part of the lwIP TCP/IP stack.
31*5d5fbe79SDavid van Moolenbroek *
32*5d5fbe79SDavid van Moolenbroek */
33*5d5fbe79SDavid van Moolenbroek
34*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/ppp_opts.h"
35*5d5fbe79SDavid van Moolenbroek
36*5d5fbe79SDavid van Moolenbroek #if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */
37*5d5fbe79SDavid van Moolenbroek
38*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/pppapi.h"
39*5d5fbe79SDavid van Moolenbroek #include "lwip/priv/tcpip_priv.h"
40*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/pppoe.h"
41*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/pppol2tp.h"
42*5d5fbe79SDavid van Moolenbroek #include "netif/ppp/pppos.h"
43*5d5fbe79SDavid van Moolenbroek
44*5d5fbe79SDavid van Moolenbroek #if LWIP_MPU_COMPATIBLE
45*5d5fbe79SDavid van Moolenbroek LWIP_MEMPOOL_DECLARE(PPPAPI_MSG, MEMP_NUM_PPP_API_MSG, sizeof(struct pppapi_msg), "PPPAPI_MSG")
46*5d5fbe79SDavid van Moolenbroek #endif
47*5d5fbe79SDavid van Moolenbroek
48*5d5fbe79SDavid van Moolenbroek #define PPPAPI_VAR_REF(name) API_VAR_REF(name)
49*5d5fbe79SDavid van Moolenbroek #define PPPAPI_VAR_DECLARE(name) API_VAR_DECLARE(struct pppapi_msg, name)
50*5d5fbe79SDavid van Moolenbroek #define PPPAPI_VAR_ALLOC(name) API_VAR_ALLOC_POOL(struct pppapi_msg, PPPAPI_MSG, name, ERR_MEM)
51*5d5fbe79SDavid van Moolenbroek #define PPPAPI_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC_POOL(struct pppapi_msg, PPPAPI_MSG, name, NULL)
52*5d5fbe79SDavid van Moolenbroek #define PPPAPI_VAR_FREE(name) API_VAR_FREE_POOL(PPPAPI_MSG, name)
53*5d5fbe79SDavid van Moolenbroek
54*5d5fbe79SDavid van Moolenbroek /**
55*5d5fbe79SDavid van Moolenbroek * Call ppp_set_default() inside the tcpip_thread context.
56*5d5fbe79SDavid van Moolenbroek */
57*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_set_default(struct tcpip_api_call_data * m)58*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_set_default(struct tcpip_api_call_data *m)
59*5d5fbe79SDavid van Moolenbroek {
60*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
61*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
62*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
63*5d5fbe79SDavid van Moolenbroek
64*5d5fbe79SDavid van Moolenbroek ppp_set_default(msg->msg.ppp);
65*5d5fbe79SDavid van Moolenbroek return ERR_OK;
66*5d5fbe79SDavid van Moolenbroek }
67*5d5fbe79SDavid van Moolenbroek
68*5d5fbe79SDavid van Moolenbroek /**
69*5d5fbe79SDavid van Moolenbroek * Call ppp_set_default() in a thread-safe way by running that function inside the
70*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
71*5d5fbe79SDavid van Moolenbroek */
72*5d5fbe79SDavid van Moolenbroek err_t
pppapi_set_default(ppp_pcb * pcb)73*5d5fbe79SDavid van Moolenbroek pppapi_set_default(ppp_pcb *pcb)
74*5d5fbe79SDavid van Moolenbroek {
75*5d5fbe79SDavid van Moolenbroek err_t err;
76*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
77*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
78*5d5fbe79SDavid van Moolenbroek
79*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
80*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_set_default, &PPPAPI_VAR_REF(msg).call);
81*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
82*5d5fbe79SDavid van Moolenbroek return err;
83*5d5fbe79SDavid van Moolenbroek }
84*5d5fbe79SDavid van Moolenbroek
85*5d5fbe79SDavid van Moolenbroek
86*5d5fbe79SDavid van Moolenbroek #if PPP_NOTIFY_PHASE
87*5d5fbe79SDavid van Moolenbroek /**
88*5d5fbe79SDavid van Moolenbroek * Call ppp_set_notify_phase_callback() inside the tcpip_thread context.
89*5d5fbe79SDavid van Moolenbroek */
90*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_set_notify_phase_callback(struct tcpip_api_call_data * m)91*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_set_notify_phase_callback(struct tcpip_api_call_data *m)
92*5d5fbe79SDavid van Moolenbroek {
93*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
94*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
95*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
96*5d5fbe79SDavid van Moolenbroek
97*5d5fbe79SDavid van Moolenbroek ppp_set_notify_phase_callback(msg->msg.ppp, msg->msg.msg.setnotifyphasecb.notify_phase_cb);
98*5d5fbe79SDavid van Moolenbroek return ERR_OK;
99*5d5fbe79SDavid van Moolenbroek }
100*5d5fbe79SDavid van Moolenbroek
101*5d5fbe79SDavid van Moolenbroek /**
102*5d5fbe79SDavid van Moolenbroek * Call ppp_set_notify_phase_callback() in a thread-safe way by running that function inside the
103*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
104*5d5fbe79SDavid van Moolenbroek */
105*5d5fbe79SDavid van Moolenbroek err_t
pppapi_set_notify_phase_callback(ppp_pcb * pcb,ppp_notify_phase_cb_fn notify_phase_cb)106*5d5fbe79SDavid van Moolenbroek pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb)
107*5d5fbe79SDavid van Moolenbroek {
108*5d5fbe79SDavid van Moolenbroek err_t err;
109*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
110*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
111*5d5fbe79SDavid van Moolenbroek
112*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
113*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.setnotifyphasecb.notify_phase_cb = notify_phase_cb;
114*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_set_notify_phase_callback, &PPPAPI_VAR_REF(msg).call);
115*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
116*5d5fbe79SDavid van Moolenbroek return err;
117*5d5fbe79SDavid van Moolenbroek }
118*5d5fbe79SDavid van Moolenbroek #endif /* PPP_NOTIFY_PHASE */
119*5d5fbe79SDavid van Moolenbroek
120*5d5fbe79SDavid van Moolenbroek
121*5d5fbe79SDavid van Moolenbroek #if PPPOS_SUPPORT
122*5d5fbe79SDavid van Moolenbroek /**
123*5d5fbe79SDavid van Moolenbroek * Call pppos_create() inside the tcpip_thread context.
124*5d5fbe79SDavid van Moolenbroek */
125*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_pppos_create(struct tcpip_api_call_data * m)126*5d5fbe79SDavid van Moolenbroek pppapi_do_pppos_create(struct tcpip_api_call_data *m)
127*5d5fbe79SDavid van Moolenbroek {
128*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
129*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
130*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
131*5d5fbe79SDavid van Moolenbroek
132*5d5fbe79SDavid van Moolenbroek msg->msg.ppp = pppos_create(msg->msg.msg.serialcreate.pppif, msg->msg.msg.serialcreate.output_cb,
133*5d5fbe79SDavid van Moolenbroek msg->msg.msg.serialcreate.link_status_cb, msg->msg.msg.serialcreate.ctx_cb);
134*5d5fbe79SDavid van Moolenbroek return ERR_OK;
135*5d5fbe79SDavid van Moolenbroek }
136*5d5fbe79SDavid van Moolenbroek
137*5d5fbe79SDavid van Moolenbroek /**
138*5d5fbe79SDavid van Moolenbroek * Call pppos_create() in a thread-safe way by running that function inside the
139*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
140*5d5fbe79SDavid van Moolenbroek */
141*5d5fbe79SDavid van Moolenbroek ppp_pcb*
pppapi_pppos_create(struct netif * pppif,pppos_output_cb_fn output_cb,ppp_link_status_cb_fn link_status_cb,void * ctx_cb)142*5d5fbe79SDavid van Moolenbroek pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,
143*5d5fbe79SDavid van Moolenbroek ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
144*5d5fbe79SDavid van Moolenbroek {
145*5d5fbe79SDavid van Moolenbroek ppp_pcb* result;
146*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
147*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC_RETURN_NULL(msg);
148*5d5fbe79SDavid van Moolenbroek
149*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = NULL;
150*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.serialcreate.pppif = pppif;
151*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.serialcreate.output_cb = output_cb;
152*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.serialcreate.link_status_cb = link_status_cb;
153*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.serialcreate.ctx_cb = ctx_cb;
154*5d5fbe79SDavid van Moolenbroek tcpip_api_call(pppapi_do_pppos_create, &PPPAPI_VAR_REF(msg).call);
155*5d5fbe79SDavid van Moolenbroek result = PPPAPI_VAR_REF(msg).msg.ppp;
156*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
157*5d5fbe79SDavid van Moolenbroek return result;
158*5d5fbe79SDavid van Moolenbroek }
159*5d5fbe79SDavid van Moolenbroek #endif /* PPPOS_SUPPORT */
160*5d5fbe79SDavid van Moolenbroek
161*5d5fbe79SDavid van Moolenbroek
162*5d5fbe79SDavid van Moolenbroek #if PPPOE_SUPPORT
163*5d5fbe79SDavid van Moolenbroek /**
164*5d5fbe79SDavid van Moolenbroek * Call pppoe_create() inside the tcpip_thread context.
165*5d5fbe79SDavid van Moolenbroek */
166*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_pppoe_create(struct tcpip_api_call_data * m)167*5d5fbe79SDavid van Moolenbroek pppapi_do_pppoe_create(struct tcpip_api_call_data *m)
168*5d5fbe79SDavid van Moolenbroek {
169*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
170*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
171*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
172*5d5fbe79SDavid van Moolenbroek
173*5d5fbe79SDavid van Moolenbroek msg->msg.ppp = pppoe_create(msg->msg.msg.ethernetcreate.pppif, msg->msg.msg.ethernetcreate.ethif,
174*5d5fbe79SDavid van Moolenbroek msg->msg.msg.ethernetcreate.service_name, msg->msg.msg.ethernetcreate.concentrator_name,
175*5d5fbe79SDavid van Moolenbroek msg->msg.msg.ethernetcreate.link_status_cb, msg->msg.msg.ethernetcreate.ctx_cb);
176*5d5fbe79SDavid van Moolenbroek return ERR_OK;
177*5d5fbe79SDavid van Moolenbroek }
178*5d5fbe79SDavid van Moolenbroek
179*5d5fbe79SDavid van Moolenbroek /**
180*5d5fbe79SDavid van Moolenbroek * Call pppoe_create() in a thread-safe way by running that function inside the
181*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
182*5d5fbe79SDavid van Moolenbroek */
183*5d5fbe79SDavid van Moolenbroek ppp_pcb*
pppapi_pppoe_create(struct netif * pppif,struct netif * ethif,const char * service_name,const char * concentrator_name,ppp_link_status_cb_fn link_status_cb,void * ctx_cb)184*5d5fbe79SDavid van Moolenbroek pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name,
185*5d5fbe79SDavid van Moolenbroek const char *concentrator_name, ppp_link_status_cb_fn link_status_cb,
186*5d5fbe79SDavid van Moolenbroek void *ctx_cb)
187*5d5fbe79SDavid van Moolenbroek {
188*5d5fbe79SDavid van Moolenbroek ppp_pcb* result;
189*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
190*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC_RETURN_NULL(msg);
191*5d5fbe79SDavid van Moolenbroek
192*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = NULL;
193*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.pppif = pppif;
194*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.ethif = ethif;
195*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.service_name = service_name;
196*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.concentrator_name = concentrator_name;
197*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.link_status_cb = link_status_cb;
198*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.ctx_cb = ctx_cb;
199*5d5fbe79SDavid van Moolenbroek tcpip_api_call(pppapi_do_pppoe_create, &PPPAPI_VAR_REF(msg).call);
200*5d5fbe79SDavid van Moolenbroek result = PPPAPI_VAR_REF(msg).msg.ppp;
201*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
202*5d5fbe79SDavid van Moolenbroek return result;
203*5d5fbe79SDavid van Moolenbroek }
204*5d5fbe79SDavid van Moolenbroek #endif /* PPPOE_SUPPORT */
205*5d5fbe79SDavid van Moolenbroek
206*5d5fbe79SDavid van Moolenbroek
207*5d5fbe79SDavid van Moolenbroek #if PPPOL2TP_SUPPORT
208*5d5fbe79SDavid van Moolenbroek /**
209*5d5fbe79SDavid van Moolenbroek * Call pppol2tp_create() inside the tcpip_thread context.
210*5d5fbe79SDavid van Moolenbroek */
211*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_pppol2tp_create(struct tcpip_api_call_data * m)212*5d5fbe79SDavid van Moolenbroek pppapi_do_pppol2tp_create(struct tcpip_api_call_data *m)
213*5d5fbe79SDavid van Moolenbroek {
214*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
215*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
216*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
217*5d5fbe79SDavid van Moolenbroek
218*5d5fbe79SDavid van Moolenbroek msg->msg.ppp = pppol2tp_create(msg->msg.msg.l2tpcreate.pppif,
219*5d5fbe79SDavid van Moolenbroek msg->msg.msg.l2tpcreate.netif, API_EXPR_REF(msg->msg.msg.l2tpcreate.ipaddr), msg->msg.msg.l2tpcreate.port,
220*5d5fbe79SDavid van Moolenbroek #if PPPOL2TP_AUTH_SUPPORT
221*5d5fbe79SDavid van Moolenbroek msg->msg.msg.l2tpcreate.secret,
222*5d5fbe79SDavid van Moolenbroek msg->msg.msg.l2tpcreate.secret_len,
223*5d5fbe79SDavid van Moolenbroek #else /* PPPOL2TP_AUTH_SUPPORT */
224*5d5fbe79SDavid van Moolenbroek NULL,
225*5d5fbe79SDavid van Moolenbroek 0,
226*5d5fbe79SDavid van Moolenbroek #endif /* PPPOL2TP_AUTH_SUPPORT */
227*5d5fbe79SDavid van Moolenbroek msg->msg.msg.l2tpcreate.link_status_cb, msg->msg.msg.l2tpcreate.ctx_cb);
228*5d5fbe79SDavid van Moolenbroek return ERR_OK;
229*5d5fbe79SDavid van Moolenbroek }
230*5d5fbe79SDavid van Moolenbroek
231*5d5fbe79SDavid van Moolenbroek /**
232*5d5fbe79SDavid van Moolenbroek * Call pppol2tp_create() in a thread-safe way by running that function inside the
233*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
234*5d5fbe79SDavid van Moolenbroek */
235*5d5fbe79SDavid van Moolenbroek ppp_pcb*
pppapi_pppol2tp_create(struct netif * pppif,struct netif * netif,ip_addr_t * ipaddr,u16_t port,const u8_t * secret,u8_t secret_len,ppp_link_status_cb_fn link_status_cb,void * ctx_cb)236*5d5fbe79SDavid van Moolenbroek pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port,
237*5d5fbe79SDavid van Moolenbroek const u8_t *secret, u8_t secret_len,
238*5d5fbe79SDavid van Moolenbroek ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
239*5d5fbe79SDavid van Moolenbroek {
240*5d5fbe79SDavid van Moolenbroek ppp_pcb* result;
241*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
242*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC_RETURN_NULL(msg);
243*5d5fbe79SDavid van Moolenbroek #if !PPPOL2TP_AUTH_SUPPORT
244*5d5fbe79SDavid van Moolenbroek LWIP_UNUSED_ARG(secret);
245*5d5fbe79SDavid van Moolenbroek LWIP_UNUSED_ARG(secret_len);
246*5d5fbe79SDavid van Moolenbroek #endif /* !PPPOL2TP_AUTH_SUPPORT */
247*5d5fbe79SDavid van Moolenbroek
248*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = NULL;
249*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.pppif = pppif;
250*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.netif = netif;
251*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.ipaddr = PPPAPI_VAR_REF(ipaddr);
252*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.port = port;
253*5d5fbe79SDavid van Moolenbroek #if PPPOL2TP_AUTH_SUPPORT
254*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.secret = secret;
255*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.secret_len = secret_len;
256*5d5fbe79SDavid van Moolenbroek #endif /* PPPOL2TP_AUTH_SUPPORT */
257*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.link_status_cb = link_status_cb;
258*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.ctx_cb = ctx_cb;
259*5d5fbe79SDavid van Moolenbroek tcpip_api_call(pppapi_do_pppol2tp_create, &PPPAPI_VAR_REF(msg).call);
260*5d5fbe79SDavid van Moolenbroek result = PPPAPI_VAR_REF(msg).msg.ppp;
261*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
262*5d5fbe79SDavid van Moolenbroek return result;
263*5d5fbe79SDavid van Moolenbroek }
264*5d5fbe79SDavid van Moolenbroek #endif /* PPPOL2TP_SUPPORT */
265*5d5fbe79SDavid van Moolenbroek
266*5d5fbe79SDavid van Moolenbroek
267*5d5fbe79SDavid van Moolenbroek /**
268*5d5fbe79SDavid van Moolenbroek * Call ppp_connect() inside the tcpip_thread context.
269*5d5fbe79SDavid van Moolenbroek */
270*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_connect(struct tcpip_api_call_data * m)271*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_connect(struct tcpip_api_call_data *m)
272*5d5fbe79SDavid van Moolenbroek {
273*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
274*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
275*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
276*5d5fbe79SDavid van Moolenbroek
277*5d5fbe79SDavid van Moolenbroek return ppp_connect(msg->msg.ppp, msg->msg.msg.connect.holdoff);
278*5d5fbe79SDavid van Moolenbroek }
279*5d5fbe79SDavid van Moolenbroek
280*5d5fbe79SDavid van Moolenbroek /**
281*5d5fbe79SDavid van Moolenbroek * Call ppp_connect() in a thread-safe way by running that function inside the
282*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
283*5d5fbe79SDavid van Moolenbroek */
284*5d5fbe79SDavid van Moolenbroek err_t
pppapi_connect(ppp_pcb * pcb,u16_t holdoff)285*5d5fbe79SDavid van Moolenbroek pppapi_connect(ppp_pcb *pcb, u16_t holdoff)
286*5d5fbe79SDavid van Moolenbroek {
287*5d5fbe79SDavid van Moolenbroek err_t err;
288*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
289*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
290*5d5fbe79SDavid van Moolenbroek
291*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
292*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.connect.holdoff = holdoff;
293*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_connect, &PPPAPI_VAR_REF(msg).call);
294*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
295*5d5fbe79SDavid van Moolenbroek return err;
296*5d5fbe79SDavid van Moolenbroek }
297*5d5fbe79SDavid van Moolenbroek
298*5d5fbe79SDavid van Moolenbroek
299*5d5fbe79SDavid van Moolenbroek #if PPP_SERVER
300*5d5fbe79SDavid van Moolenbroek /**
301*5d5fbe79SDavid van Moolenbroek * Call ppp_listen() inside the tcpip_thread context.
302*5d5fbe79SDavid van Moolenbroek */
303*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_listen(struct tcpip_api_call_data * m)304*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_listen(struct tcpip_api_call_data *m)
305*5d5fbe79SDavid van Moolenbroek {
306*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
307*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
308*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
309*5d5fbe79SDavid van Moolenbroek
310*5d5fbe79SDavid van Moolenbroek return ppp_listen(msg->msg.ppp);
311*5d5fbe79SDavid van Moolenbroek }
312*5d5fbe79SDavid van Moolenbroek
313*5d5fbe79SDavid van Moolenbroek /**
314*5d5fbe79SDavid van Moolenbroek * Call ppp_listen() in a thread-safe way by running that function inside the
315*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
316*5d5fbe79SDavid van Moolenbroek */
317*5d5fbe79SDavid van Moolenbroek err_t
pppapi_listen(ppp_pcb * pcb)318*5d5fbe79SDavid van Moolenbroek pppapi_listen(ppp_pcb *pcb)
319*5d5fbe79SDavid van Moolenbroek {
320*5d5fbe79SDavid van Moolenbroek err_t err;
321*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
322*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
323*5d5fbe79SDavid van Moolenbroek
324*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
325*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_listen, &PPPAPI_VAR_REF(msg).call);
326*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
327*5d5fbe79SDavid van Moolenbroek return err;
328*5d5fbe79SDavid van Moolenbroek }
329*5d5fbe79SDavid van Moolenbroek #endif /* PPP_SERVER */
330*5d5fbe79SDavid van Moolenbroek
331*5d5fbe79SDavid van Moolenbroek
332*5d5fbe79SDavid van Moolenbroek /**
333*5d5fbe79SDavid van Moolenbroek * Call ppp_close() inside the tcpip_thread context.
334*5d5fbe79SDavid van Moolenbroek */
335*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_close(struct tcpip_api_call_data * m)336*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_close(struct tcpip_api_call_data *m)
337*5d5fbe79SDavid van Moolenbroek {
338*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
339*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
340*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
341*5d5fbe79SDavid van Moolenbroek
342*5d5fbe79SDavid van Moolenbroek return ppp_close(msg->msg.ppp, msg->msg.msg.close.nocarrier);
343*5d5fbe79SDavid van Moolenbroek }
344*5d5fbe79SDavid van Moolenbroek
345*5d5fbe79SDavid van Moolenbroek /**
346*5d5fbe79SDavid van Moolenbroek * Call ppp_close() in a thread-safe way by running that function inside the
347*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
348*5d5fbe79SDavid van Moolenbroek */
349*5d5fbe79SDavid van Moolenbroek err_t
pppapi_close(ppp_pcb * pcb,u8_t nocarrier)350*5d5fbe79SDavid van Moolenbroek pppapi_close(ppp_pcb *pcb, u8_t nocarrier)
351*5d5fbe79SDavid van Moolenbroek {
352*5d5fbe79SDavid van Moolenbroek err_t err;
353*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
354*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
355*5d5fbe79SDavid van Moolenbroek
356*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
357*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.close.nocarrier = nocarrier;
358*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_close, &PPPAPI_VAR_REF(msg).call);
359*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
360*5d5fbe79SDavid van Moolenbroek return err;
361*5d5fbe79SDavid van Moolenbroek }
362*5d5fbe79SDavid van Moolenbroek
363*5d5fbe79SDavid van Moolenbroek
364*5d5fbe79SDavid van Moolenbroek /**
365*5d5fbe79SDavid van Moolenbroek * Call ppp_free() inside the tcpip_thread context.
366*5d5fbe79SDavid van Moolenbroek */
367*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_free(struct tcpip_api_call_data * m)368*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_free(struct tcpip_api_call_data *m)
369*5d5fbe79SDavid van Moolenbroek {
370*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
371*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
372*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
373*5d5fbe79SDavid van Moolenbroek
374*5d5fbe79SDavid van Moolenbroek return ppp_free(msg->msg.ppp);
375*5d5fbe79SDavid van Moolenbroek }
376*5d5fbe79SDavid van Moolenbroek
377*5d5fbe79SDavid van Moolenbroek /**
378*5d5fbe79SDavid van Moolenbroek * Call ppp_free() in a thread-safe way by running that function inside the
379*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
380*5d5fbe79SDavid van Moolenbroek */
381*5d5fbe79SDavid van Moolenbroek err_t
pppapi_free(ppp_pcb * pcb)382*5d5fbe79SDavid van Moolenbroek pppapi_free(ppp_pcb *pcb)
383*5d5fbe79SDavid van Moolenbroek {
384*5d5fbe79SDavid van Moolenbroek err_t err;
385*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
386*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
387*5d5fbe79SDavid van Moolenbroek
388*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
389*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_free, &PPPAPI_VAR_REF(msg).call);
390*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
391*5d5fbe79SDavid van Moolenbroek return err;
392*5d5fbe79SDavid van Moolenbroek }
393*5d5fbe79SDavid van Moolenbroek
394*5d5fbe79SDavid van Moolenbroek
395*5d5fbe79SDavid van Moolenbroek /**
396*5d5fbe79SDavid van Moolenbroek * Call ppp_ioctl() inside the tcpip_thread context.
397*5d5fbe79SDavid van Moolenbroek */
398*5d5fbe79SDavid van Moolenbroek static err_t
pppapi_do_ppp_ioctl(struct tcpip_api_call_data * m)399*5d5fbe79SDavid van Moolenbroek pppapi_do_ppp_ioctl(struct tcpip_api_call_data *m)
400*5d5fbe79SDavid van Moolenbroek {
401*5d5fbe79SDavid van Moolenbroek /* cast through void* to silence alignment warnings.
402*5d5fbe79SDavid van Moolenbroek * We know it works because the structs have been instantiated as struct pppapi_msg */
403*5d5fbe79SDavid van Moolenbroek struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;
404*5d5fbe79SDavid van Moolenbroek
405*5d5fbe79SDavid van Moolenbroek return ppp_ioctl(msg->msg.ppp, msg->msg.msg.ioctl.cmd, msg->msg.msg.ioctl.arg);
406*5d5fbe79SDavid van Moolenbroek }
407*5d5fbe79SDavid van Moolenbroek
408*5d5fbe79SDavid van Moolenbroek /**
409*5d5fbe79SDavid van Moolenbroek * Call ppp_ioctl() in a thread-safe way by running that function inside the
410*5d5fbe79SDavid van Moolenbroek * tcpip_thread context.
411*5d5fbe79SDavid van Moolenbroek */
412*5d5fbe79SDavid van Moolenbroek err_t
pppapi_ioctl(ppp_pcb * pcb,u8_t cmd,void * arg)413*5d5fbe79SDavid van Moolenbroek pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg)
414*5d5fbe79SDavid van Moolenbroek {
415*5d5fbe79SDavid van Moolenbroek err_t err;
416*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_DECLARE(msg);
417*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_ALLOC(msg);
418*5d5fbe79SDavid van Moolenbroek
419*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.ppp = pcb;
420*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ioctl.cmd = cmd;
421*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_REF(msg).msg.msg.ioctl.arg = arg;
422*5d5fbe79SDavid van Moolenbroek err = tcpip_api_call(pppapi_do_ppp_ioctl, &PPPAPI_VAR_REF(msg).call);
423*5d5fbe79SDavid van Moolenbroek PPPAPI_VAR_FREE(msg);
424*5d5fbe79SDavid van Moolenbroek return err;
425*5d5fbe79SDavid van Moolenbroek }
426*5d5fbe79SDavid van Moolenbroek
427*5d5fbe79SDavid van Moolenbroek #endif /* LWIP_PPP_API */
428