1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2018-08-14 tyx the first version
9*10465441SEvalZero */
10*10465441SEvalZero
11*10465441SEvalZero #include <rthw.h>
12*10465441SEvalZero #include <rtthread.h>
13*10465441SEvalZero #include <wlan_dev.h>
14*10465441SEvalZero #include <wlan_prot.h>
15*10465441SEvalZero #include <wlan_workqueue.h>
16*10465441SEvalZero
17*10465441SEvalZero #ifdef RT_USING_LWIP
18*10465441SEvalZero #include <netif/ethernetif.h>
19*10465441SEvalZero #include <lwip/netifapi.h>
20*10465441SEvalZero #ifdef LWIP_USING_DHCPD
21*10465441SEvalZero #include <dhcp_server.h>
22*10465441SEvalZero #endif
23*10465441SEvalZero
24*10465441SEvalZero #define DBG_ENABLE
25*10465441SEvalZero #ifdef RT_WLAN_LWIP_DEBUG
26*10465441SEvalZero #define DBG_LEVEL DBG_LOG
27*10465441SEvalZero #else
28*10465441SEvalZero #define DBG_LEVEL DBG_INFO
29*10465441SEvalZero #endif
30*10465441SEvalZero #define DBG_SECTION_NAME "WLAN.lwip"
31*10465441SEvalZero #define DBG_COLOR
32*10465441SEvalZero #include <rtdbg.h>
33*10465441SEvalZero
34*10465441SEvalZero #ifndef IPADDR_STRLEN_MAX
35*10465441SEvalZero #define IPADDR_STRLEN_MAX (32)
36*10465441SEvalZero #endif
37*10465441SEvalZero
38*10465441SEvalZero struct lwip_prot_des
39*10465441SEvalZero {
40*10465441SEvalZero struct rt_wlan_prot prot;
41*10465441SEvalZero struct eth_device eth;
42*10465441SEvalZero rt_int8_t connected_flag;
43*10465441SEvalZero struct rt_timer timer;
44*10465441SEvalZero struct rt_work work;
45*10465441SEvalZero };
46*10465441SEvalZero
netif_is_ready(struct rt_work * work,void * parameter)47*10465441SEvalZero static void netif_is_ready(struct rt_work *work, void *parameter)
48*10465441SEvalZero {
49*10465441SEvalZero ip_addr_t ip_addr_zero = { 0 };
50*10465441SEvalZero struct rt_wlan_device *wlan = parameter;
51*10465441SEvalZero struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)wlan->prot;
52*10465441SEvalZero struct eth_device *eth_dev = &lwip_prot->eth;
53*10465441SEvalZero rt_base_t level;
54*10465441SEvalZero struct rt_wlan_buff buff;
55*10465441SEvalZero rt_uint32_t ip_addr[4];
56*10465441SEvalZero char str[IPADDR_STRLEN_MAX];
57*10465441SEvalZero
58*10465441SEvalZero rt_timer_stop(&lwip_prot->timer);
59*10465441SEvalZero if (ip_addr_cmp(&(eth_dev->netif->ip_addr), &ip_addr_zero) != 0)
60*10465441SEvalZero {
61*10465441SEvalZero rt_timer_start(&lwip_prot->timer);
62*10465441SEvalZero goto exit;
63*10465441SEvalZero }
64*10465441SEvalZero rt_memset(&ip_addr, 0, sizeof(ip_addr));
65*10465441SEvalZero #if LWIP_IPV4 && LWIP_IPV6
66*10465441SEvalZero if (eth_dev->netif->ip_addr.type == IPADDR_TYPE_V4)
67*10465441SEvalZero {
68*10465441SEvalZero ip_addr[0] = ip4_addr_get_u32(ð_dev->netif->ip_addr.u_addr.ip4);
69*10465441SEvalZero buff.data = &ip_addr[0];
70*10465441SEvalZero buff.len = sizeof(ip_addr[0]);
71*10465441SEvalZero }
72*10465441SEvalZero else if (eth_dev->netif->ip_addr.type == IPADDR_TYPE_V6)
73*10465441SEvalZero {
74*10465441SEvalZero *(ip6_addr_t *)(&ip_addr[0]) = eth_dev->netif->ip_addr.u_addr.ip6;
75*10465441SEvalZero buff.data = ip_addr;
76*10465441SEvalZero buff.len = sizeof(ip_addr);
77*10465441SEvalZero }
78*10465441SEvalZero else
79*10465441SEvalZero {
80*10465441SEvalZero LOG_W("F:%s L:%d ip addr type not support", __FUNCTION__, __LINE__);
81*10465441SEvalZero }
82*10465441SEvalZero #else
83*10465441SEvalZero #if LWIP_IPV4
84*10465441SEvalZero ip_addr[0] = ip4_addr_get_u32(ð_dev->netif->ip_addr);
85*10465441SEvalZero buff.data = &ip_addr[0];
86*10465441SEvalZero buff.len = sizeof(ip_addr[0]);
87*10465441SEvalZero #else
88*10465441SEvalZero *(ip_addr_t *)(&ip_addr[0]) = eth_dev->netif->ip_addr;
89*10465441SEvalZero buff.data = ip_addr;
90*10465441SEvalZero buff.len = sizeof(ip_addr);
91*10465441SEvalZero #endif
92*10465441SEvalZero #endif
93*10465441SEvalZero if (rt_wlan_prot_ready(wlan, &buff) != 0)
94*10465441SEvalZero {
95*10465441SEvalZero rt_timer_start(&lwip_prot->timer);
96*10465441SEvalZero goto exit;
97*10465441SEvalZero }
98*10465441SEvalZero rt_memset(str, 0, IPADDR_STRLEN_MAX);
99*10465441SEvalZero rt_enter_critical();
100*10465441SEvalZero rt_memcpy(str, ipaddr_ntoa(&(eth_dev->netif->ip_addr)), IPADDR_STRLEN_MAX);
101*10465441SEvalZero rt_exit_critical();
102*10465441SEvalZero LOG_I("Got IP address : %s", str);
103*10465441SEvalZero exit:
104*10465441SEvalZero level = rt_hw_interrupt_disable();
105*10465441SEvalZero rt_memset(work, 0, sizeof(struct rt_work));
106*10465441SEvalZero rt_hw_interrupt_enable(level);
107*10465441SEvalZero }
108*10465441SEvalZero
timer_callback(void * parameter)109*10465441SEvalZero static void timer_callback(void *parameter)
110*10465441SEvalZero {
111*10465441SEvalZero struct rt_workqueue *workqueue;
112*10465441SEvalZero struct rt_wlan_device *wlan = parameter;
113*10465441SEvalZero struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)wlan->prot;
114*10465441SEvalZero struct rt_work *work = &lwip_prot->work;
115*10465441SEvalZero rt_base_t level;
116*10465441SEvalZero
117*10465441SEvalZero workqueue = rt_wlan_get_workqueue();
118*10465441SEvalZero if (workqueue != RT_NULL)
119*10465441SEvalZero {
120*10465441SEvalZero level = rt_hw_interrupt_disable();
121*10465441SEvalZero rt_work_init(work, netif_is_ready, parameter);
122*10465441SEvalZero rt_hw_interrupt_enable(level);
123*10465441SEvalZero if (rt_workqueue_dowork(workqueue, work) != RT_EOK)
124*10465441SEvalZero {
125*10465441SEvalZero level = rt_hw_interrupt_disable();
126*10465441SEvalZero rt_memset(work, 0, sizeof(struct rt_work));
127*10465441SEvalZero rt_hw_interrupt_enable(level);
128*10465441SEvalZero }
129*10465441SEvalZero }
130*10465441SEvalZero }
131*10465441SEvalZero
netif_set_connected(void * parameter)132*10465441SEvalZero static void netif_set_connected(void *parameter)
133*10465441SEvalZero {
134*10465441SEvalZero struct rt_wlan_device *wlan = parameter;
135*10465441SEvalZero struct lwip_prot_des *lwip_prot = wlan->prot;
136*10465441SEvalZero struct eth_device *eth_dev = &lwip_prot->eth;
137*10465441SEvalZero
138*10465441SEvalZero if (lwip_prot->connected_flag)
139*10465441SEvalZero {
140*10465441SEvalZero if (wlan->mode == RT_WLAN_STATION)
141*10465441SEvalZero {
142*10465441SEvalZero LOG_D("F:%s L:%d dhcp start run", __FUNCTION__, __LINE__);
143*10465441SEvalZero netifapi_netif_common(eth_dev->netif, netif_set_link_up, NULL);
144*10465441SEvalZero #ifdef RT_LWIP_DHCP
145*10465441SEvalZero dhcp_start(eth_dev->netif);
146*10465441SEvalZero #endif
147*10465441SEvalZero rt_timer_start(&lwip_prot->timer);
148*10465441SEvalZero }
149*10465441SEvalZero else if (wlan->mode == RT_WLAN_AP)
150*10465441SEvalZero {
151*10465441SEvalZero LOG_D("F:%s L:%d dhcpd start run", __FUNCTION__, __LINE__);
152*10465441SEvalZero
153*10465441SEvalZero netifapi_netif_common(eth_dev->netif, netif_set_link_up, NULL);
154*10465441SEvalZero #ifdef LWIP_USING_DHCPD
155*10465441SEvalZero {
156*10465441SEvalZero char netif_name[8];
157*10465441SEvalZero int i;
158*10465441SEvalZero
159*10465441SEvalZero rt_memset(netif_name, 0, sizeof(netif_name));
160*10465441SEvalZero for (i = 0; i < sizeof(eth_dev->netif->name); i++)
161*10465441SEvalZero {
162*10465441SEvalZero netif_name[i] = eth_dev->netif->name[i];
163*10465441SEvalZero }
164*10465441SEvalZero dhcpd_start(netif_name);
165*10465441SEvalZero }
166*10465441SEvalZero #endif
167*10465441SEvalZero }
168*10465441SEvalZero }
169*10465441SEvalZero else
170*10465441SEvalZero {
171*10465441SEvalZero if (wlan->mode == RT_WLAN_STATION)
172*10465441SEvalZero {
173*10465441SEvalZero LOG_D("F:%s L:%d dhcp stop run", __FUNCTION__, __LINE__);
174*10465441SEvalZero netifapi_netif_common(eth_dev->netif, netif_set_link_down, NULL);
175*10465441SEvalZero #ifdef RT_LWIP_DHCP
176*10465441SEvalZero {
177*10465441SEvalZero ip_addr_t ip_addr = { 0 };
178*10465441SEvalZero dhcp_stop(eth_dev->netif);
179*10465441SEvalZero netif_set_addr(eth_dev->netif, &ip_addr, &ip_addr, &ip_addr);
180*10465441SEvalZero }
181*10465441SEvalZero #endif
182*10465441SEvalZero rt_timer_stop(&lwip_prot->timer);
183*10465441SEvalZero }
184*10465441SEvalZero else if (wlan->mode == RT_WLAN_AP)
185*10465441SEvalZero {
186*10465441SEvalZero LOG_D("F:%s L:%d dhcpd stop run", __FUNCTION__, __LINE__);
187*10465441SEvalZero netifapi_netif_common(eth_dev->netif, netif_set_link_down, NULL);
188*10465441SEvalZero }
189*10465441SEvalZero }
190*10465441SEvalZero }
191*10465441SEvalZero
rt_wlan_lwip_event_handle(struct rt_wlan_prot * port,struct rt_wlan_device * wlan,int event)192*10465441SEvalZero static void rt_wlan_lwip_event_handle(struct rt_wlan_prot *port, struct rt_wlan_device *wlan, int event)
193*10465441SEvalZero {
194*10465441SEvalZero struct lwip_prot_des *lwip_prot = (struct lwip_prot_des *)wlan->prot;
195*10465441SEvalZero rt_bool_t flag_old;
196*10465441SEvalZero
197*10465441SEvalZero flag_old = lwip_prot->connected_flag;
198*10465441SEvalZero
199*10465441SEvalZero switch (event)
200*10465441SEvalZero {
201*10465441SEvalZero case RT_WLAN_PROT_EVT_CONNECT:
202*10465441SEvalZero {
203*10465441SEvalZero LOG_D("event: CONNECT");
204*10465441SEvalZero lwip_prot->connected_flag = RT_TRUE;
205*10465441SEvalZero break;
206*10465441SEvalZero }
207*10465441SEvalZero case RT_WLAN_PROT_EVT_DISCONNECT:
208*10465441SEvalZero {
209*10465441SEvalZero LOG_D("event: DISCONNECT");
210*10465441SEvalZero lwip_prot->connected_flag = RT_FALSE;
211*10465441SEvalZero break;
212*10465441SEvalZero }
213*10465441SEvalZero case RT_WLAN_PROT_EVT_AP_START:
214*10465441SEvalZero {
215*10465441SEvalZero LOG_D("event: AP_START");
216*10465441SEvalZero lwip_prot->connected_flag = RT_TRUE;
217*10465441SEvalZero break;
218*10465441SEvalZero }
219*10465441SEvalZero case RT_WLAN_PROT_EVT_AP_STOP:
220*10465441SEvalZero {
221*10465441SEvalZero LOG_D("event: AP_STOP");
222*10465441SEvalZero lwip_prot->connected_flag = RT_FALSE;
223*10465441SEvalZero break;
224*10465441SEvalZero }
225*10465441SEvalZero case RT_WLAN_PROT_EVT_AP_ASSOCIATED:
226*10465441SEvalZero {
227*10465441SEvalZero LOG_D("event: ASSOCIATED");
228*10465441SEvalZero break;
229*10465441SEvalZero }
230*10465441SEvalZero case RT_WLAN_PROT_EVT_AP_DISASSOCIATED:
231*10465441SEvalZero {
232*10465441SEvalZero LOG_D("event: DISASSOCIATED");
233*10465441SEvalZero break;
234*10465441SEvalZero }
235*10465441SEvalZero default :
236*10465441SEvalZero {
237*10465441SEvalZero LOG_D("event: UNKNOWN");
238*10465441SEvalZero break;
239*10465441SEvalZero }
240*10465441SEvalZero }
241*10465441SEvalZero if (flag_old != lwip_prot->connected_flag)
242*10465441SEvalZero {
243*10465441SEvalZero rt_wlan_workqueue_dowork(netif_set_connected, wlan);
244*10465441SEvalZero // netif_set_connected(wlan);
245*10465441SEvalZero }
246*10465441SEvalZero }
247*10465441SEvalZero
rt_wlan_lwip_protocol_control(rt_device_t device,int cmd,void * args)248*10465441SEvalZero static rt_err_t rt_wlan_lwip_protocol_control(rt_device_t device, int cmd, void *args)
249*10465441SEvalZero {
250*10465441SEvalZero struct eth_device *eth_dev = (struct eth_device *)device;
251*10465441SEvalZero struct rt_wlan_device *wlan;
252*10465441SEvalZero rt_err_t err = RT_EOK;
253*10465441SEvalZero
254*10465441SEvalZero RT_ASSERT(eth_dev != RT_NULL);
255*10465441SEvalZero
256*10465441SEvalZero LOG_D("F:%s L:%d device:0x%08x user_data:0x%08x", __FUNCTION__, __LINE__, eth_dev, eth_dev->parent.user_data);
257*10465441SEvalZero
258*10465441SEvalZero switch (cmd)
259*10465441SEvalZero {
260*10465441SEvalZero case NIOCTL_GADDR:
261*10465441SEvalZero /* get MAC address */
262*10465441SEvalZero wlan = eth_dev->parent.user_data;
263*10465441SEvalZero err = rt_device_control((rt_device_t)wlan, RT_WLAN_CMD_GET_MAC, args);
264*10465441SEvalZero break;
265*10465441SEvalZero default :
266*10465441SEvalZero break;
267*10465441SEvalZero }
268*10465441SEvalZero return err;
269*10465441SEvalZero }
270*10465441SEvalZero
rt_wlan_lwip_protocol_recv(struct rt_wlan_device * wlan,void * buff,int len)271*10465441SEvalZero static rt_err_t rt_wlan_lwip_protocol_recv(struct rt_wlan_device *wlan, void *buff, int len)
272*10465441SEvalZero {
273*10465441SEvalZero struct eth_device *eth_dev = &((struct lwip_prot_des *)wlan->prot)->eth;
274*10465441SEvalZero struct pbuf *p = RT_NULL;
275*10465441SEvalZero
276*10465441SEvalZero LOG_D("F:%s L:%d run", __FUNCTION__, __LINE__);
277*10465441SEvalZero
278*10465441SEvalZero if (eth_dev == RT_NULL)
279*10465441SEvalZero {
280*10465441SEvalZero return -RT_ERROR;
281*10465441SEvalZero }
282*10465441SEvalZero #ifdef RT_WLAN_PROT_LWIP_PBUF_FORCE
283*10465441SEvalZero {
284*10465441SEvalZero p = buff;
285*10465441SEvalZero if ((eth_dev->netif->input(p, eth_dev->netif)) != ERR_OK)
286*10465441SEvalZero {
287*10465441SEvalZero return -RT_ERROR;
288*10465441SEvalZero }
289*10465441SEvalZero return RT_EOK;
290*10465441SEvalZero }
291*10465441SEvalZero #else
292*10465441SEvalZero {
293*10465441SEvalZero int count = 0;
294*10465441SEvalZero
295*10465441SEvalZero while (p == RT_NULL)
296*10465441SEvalZero {
297*10465441SEvalZero p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
298*10465441SEvalZero if (p != RT_NULL)
299*10465441SEvalZero break;
300*10465441SEvalZero
301*10465441SEvalZero p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
302*10465441SEvalZero if (p != RT_NULL)
303*10465441SEvalZero break;
304*10465441SEvalZero
305*10465441SEvalZero LOG_D("F:%s L:%d wait for pbuf_alloc!", __FUNCTION__, __LINE__);
306*10465441SEvalZero rt_thread_delay(1);
307*10465441SEvalZero count++;
308*10465441SEvalZero
309*10465441SEvalZero //wait for 10ms or give up!!
310*10465441SEvalZero if (count >= 10)
311*10465441SEvalZero {
312*10465441SEvalZero LOG_W("F:%s L:%d pbuf allocate fail!!!", __FUNCTION__, __LINE__);
313*10465441SEvalZero return -RT_ENOMEM;
314*10465441SEvalZero }
315*10465441SEvalZero }
316*10465441SEvalZero /*copy data dat -> pbuf*/
317*10465441SEvalZero pbuf_take(p, buff, len);
318*10465441SEvalZero if ((eth_dev->netif->input(p, eth_dev->netif)) != ERR_OK)
319*10465441SEvalZero {
320*10465441SEvalZero LOG_D("F:%s L:%d IP input error", __FUNCTION__, __LINE__);
321*10465441SEvalZero pbuf_free(p);
322*10465441SEvalZero p = RT_NULL;
323*10465441SEvalZero }
324*10465441SEvalZero LOG_D("F:%s L:%d netif iput success! len:%d", __FUNCTION__, __LINE__, len);
325*10465441SEvalZero return RT_EOK;
326*10465441SEvalZero }
327*10465441SEvalZero #endif
328*10465441SEvalZero }
329*10465441SEvalZero
rt_wlan_lwip_protocol_send(rt_device_t device,struct pbuf * p)330*10465441SEvalZero static rt_err_t rt_wlan_lwip_protocol_send(rt_device_t device, struct pbuf *p)
331*10465441SEvalZero {
332*10465441SEvalZero struct rt_wlan_device *wlan = ((struct eth_device *)device)->parent.user_data;
333*10465441SEvalZero
334*10465441SEvalZero LOG_D("F:%s L:%d run", __FUNCTION__, __LINE__);
335*10465441SEvalZero
336*10465441SEvalZero if (wlan == RT_NULL)
337*10465441SEvalZero {
338*10465441SEvalZero return RT_EOK;
339*10465441SEvalZero }
340*10465441SEvalZero
341*10465441SEvalZero #ifdef RT_WLAN_PROT_LWIP_PBUF_FORCE
342*10465441SEvalZero {
343*10465441SEvalZero rt_wlan_prot_transfer_dev(wlan, p, p->tot_len);
344*10465441SEvalZero return RT_EOK;
345*10465441SEvalZero }
346*10465441SEvalZero #else
347*10465441SEvalZero {
348*10465441SEvalZero rt_uint8_t *frame;
349*10465441SEvalZero
350*10465441SEvalZero /* sending data directly */
351*10465441SEvalZero if (p->len == p->tot_len)
352*10465441SEvalZero {
353*10465441SEvalZero frame = (rt_uint8_t *)p->payload;
354*10465441SEvalZero rt_wlan_prot_transfer_dev(wlan, frame, p->tot_len);
355*10465441SEvalZero LOG_D("F:%s L:%d run len:%d", __FUNCTION__, __LINE__, p->tot_len);
356*10465441SEvalZero return RT_EOK;
357*10465441SEvalZero }
358*10465441SEvalZero frame = rt_malloc(p->tot_len);
359*10465441SEvalZero if (frame == RT_NULL)
360*10465441SEvalZero {
361*10465441SEvalZero LOG_E("F:%s L:%d malloc out_buf fail\n", __FUNCTION__, __LINE__);
362*10465441SEvalZero return -RT_ENOMEM;
363*10465441SEvalZero }
364*10465441SEvalZero /*copy pbuf -> data dat*/
365*10465441SEvalZero pbuf_copy_partial(p, frame, p->tot_len, 0);
366*10465441SEvalZero /* send data */
367*10465441SEvalZero rt_wlan_prot_transfer_dev(wlan, frame, p->tot_len);
368*10465441SEvalZero LOG_D("F:%s L:%d run len:%d", __FUNCTION__, __LINE__, p->tot_len);
369*10465441SEvalZero rt_free(frame);
370*10465441SEvalZero return RT_EOK;
371*10465441SEvalZero }
372*10465441SEvalZero #endif
373*10465441SEvalZero }
374*10465441SEvalZero
375*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
376*10465441SEvalZero const static struct rt_device_ops wlan_lwip_ops =
377*10465441SEvalZero {
378*10465441SEvalZero RT_NULL,
379*10465441SEvalZero RT_NULL,
380*10465441SEvalZero RT_NULL,
381*10465441SEvalZero RT_NULL,
382*10465441SEvalZero RT_NULL,
383*10465441SEvalZero rt_wlan_lwip_protocol_control
384*10465441SEvalZero };
385*10465441SEvalZero #endif
386*10465441SEvalZero
rt_wlan_lwip_protocol_register(struct rt_wlan_prot * prot,struct rt_wlan_device * wlan)387*10465441SEvalZero static struct rt_wlan_prot *rt_wlan_lwip_protocol_register(struct rt_wlan_prot *prot, struct rt_wlan_device *wlan)
388*10465441SEvalZero {
389*10465441SEvalZero struct eth_device *eth = RT_NULL;
390*10465441SEvalZero static rt_uint8_t id = 0;
391*10465441SEvalZero char eth_name[4], timer_name[16];
392*10465441SEvalZero rt_device_t device = RT_NULL;
393*10465441SEvalZero struct lwip_prot_des *lwip_prot;
394*10465441SEvalZero
395*10465441SEvalZero if (wlan == RT_NULL || prot == RT_NULL)
396*10465441SEvalZero return RT_NULL;;
397*10465441SEvalZero
398*10465441SEvalZero LOG_D("F:%s L:%d is run wlan:0x%08x", __FUNCTION__, __LINE__, wlan);
399*10465441SEvalZero
400*10465441SEvalZero do
401*10465441SEvalZero {
402*10465441SEvalZero /* find ETH device name */
403*10465441SEvalZero eth_name[0] = 'w';
404*10465441SEvalZero eth_name[1] = '0' + id++;
405*10465441SEvalZero eth_name[2] = '\0';
406*10465441SEvalZero device = rt_device_find(eth_name);
407*10465441SEvalZero }
408*10465441SEvalZero while (device);
409*10465441SEvalZero
410*10465441SEvalZero if (id > 9)
411*10465441SEvalZero {
412*10465441SEvalZero LOG_E("F:%s L:%d not find Empty name", __FUNCTION__, __LINE__, eth_name);
413*10465441SEvalZero return RT_NULL;
414*10465441SEvalZero }
415*10465441SEvalZero
416*10465441SEvalZero if (rt_device_open((rt_device_t)wlan, RT_DEVICE_OFLAG_RDWR) != RT_EOK)
417*10465441SEvalZero {
418*10465441SEvalZero LOG_E("F:%s L:%d open wlan failed", __FUNCTION__, __LINE__);
419*10465441SEvalZero return RT_NULL;
420*10465441SEvalZero }
421*10465441SEvalZero
422*10465441SEvalZero lwip_prot = rt_malloc(sizeof(struct lwip_prot_des));
423*10465441SEvalZero if (lwip_prot == RT_NULL)
424*10465441SEvalZero {
425*10465441SEvalZero LOG_E("F:%s L:%d malloc mem failed", __FUNCTION__, __LINE__);
426*10465441SEvalZero rt_device_close((rt_device_t)wlan);
427*10465441SEvalZero return RT_NULL;
428*10465441SEvalZero }
429*10465441SEvalZero rt_memset(lwip_prot, 0, sizeof(struct lwip_prot_des));
430*10465441SEvalZero
431*10465441SEvalZero eth = &lwip_prot->eth;
432*10465441SEvalZero
433*10465441SEvalZero #ifdef RT_USING_DEVICE_OPS
434*10465441SEvalZero eth->parent.ops = &wlan_lwip_ops;
435*10465441SEvalZero #else
436*10465441SEvalZero eth->parent.init = RT_NULL;
437*10465441SEvalZero eth->parent.open = RT_NULL;
438*10465441SEvalZero eth->parent.close = RT_NULL;
439*10465441SEvalZero eth->parent.read = RT_NULL;
440*10465441SEvalZero eth->parent.write = RT_NULL;
441*10465441SEvalZero eth->parent.control = rt_wlan_lwip_protocol_control;
442*10465441SEvalZero #endif
443*10465441SEvalZero
444*10465441SEvalZero eth->parent.user_data = wlan;
445*10465441SEvalZero eth->eth_rx = RT_NULL;
446*10465441SEvalZero eth->eth_tx = rt_wlan_lwip_protocol_send;
447*10465441SEvalZero
448*10465441SEvalZero /* register ETH device */
449*10465441SEvalZero if (eth_device_init(eth, eth_name) != RT_EOK)
450*10465441SEvalZero {
451*10465441SEvalZero LOG_E("eth device init failed");
452*10465441SEvalZero rt_device_close((rt_device_t)wlan);
453*10465441SEvalZero rt_free(lwip_prot);
454*10465441SEvalZero return RT_NULL;
455*10465441SEvalZero }
456*10465441SEvalZero rt_memcpy(&lwip_prot->prot, prot, sizeof(struct rt_wlan_prot));
457*10465441SEvalZero if (wlan->mode == RT_WLAN_STATION)
458*10465441SEvalZero {
459*10465441SEvalZero rt_sprintf(timer_name, "timer_%s", eth_name);
460*10465441SEvalZero rt_timer_init(&lwip_prot->timer, timer_name, timer_callback, wlan, rt_tick_from_millisecond(1000),
461*10465441SEvalZero RT_TIMER_FLAG_SOFT_TIMER | RT_TIMER_FLAG_ONE_SHOT);
462*10465441SEvalZero }
463*10465441SEvalZero netif_set_up(eth->netif);
464*10465441SEvalZero LOG_I("eth device init ok name:%s", eth_name);
465*10465441SEvalZero
466*10465441SEvalZero return &lwip_prot->prot;
467*10465441SEvalZero }
468*10465441SEvalZero
rt_wlan_lwip_protocol_unregister(struct rt_wlan_prot * prot,struct rt_wlan_device * wlan)469*10465441SEvalZero static void rt_wlan_lwip_protocol_unregister(struct rt_wlan_prot *prot, struct rt_wlan_device *wlan)
470*10465441SEvalZero {
471*10465441SEvalZero /*TODO*/
472*10465441SEvalZero LOG_D("F:%s L:%d is run wlan:0x%08x", __FUNCTION__, __LINE__, wlan);
473*10465441SEvalZero }
474*10465441SEvalZero
475*10465441SEvalZero static struct rt_wlan_prot_ops ops =
476*10465441SEvalZero {
477*10465441SEvalZero rt_wlan_lwip_protocol_recv,
478*10465441SEvalZero rt_wlan_lwip_protocol_register,
479*10465441SEvalZero rt_wlan_lwip_protocol_unregister
480*10465441SEvalZero };
481*10465441SEvalZero
rt_wlan_lwip_init(void)482*10465441SEvalZero int rt_wlan_lwip_init(void)
483*10465441SEvalZero {
484*10465441SEvalZero static struct rt_wlan_prot prot;
485*10465441SEvalZero rt_wlan_prot_event_t event;
486*10465441SEvalZero
487*10465441SEvalZero rt_memset(&prot, 0, sizeof(prot));
488*10465441SEvalZero rt_strncpy(&prot.name[0], RT_WLAN_PROT_LWIP, RT_WLAN_PROT_NAME_LEN);
489*10465441SEvalZero prot.ops = &ops;
490*10465441SEvalZero
491*10465441SEvalZero if (rt_wlan_prot_regisetr(&prot) != RT_EOK)
492*10465441SEvalZero {
493*10465441SEvalZero LOG_E("F:%s L:%d protocol regisetr failed", __FUNCTION__, __LINE__);
494*10465441SEvalZero return -1;
495*10465441SEvalZero }
496*10465441SEvalZero
497*10465441SEvalZero for (event = RT_WLAN_PROT_EVT_INIT_DONE; event < RT_WLAN_PROT_EVT_MAX; event++)
498*10465441SEvalZero {
499*10465441SEvalZero rt_wlan_prot_event_register(&prot, event, rt_wlan_lwip_event_handle);
500*10465441SEvalZero }
501*10465441SEvalZero
502*10465441SEvalZero return 0;
503*10465441SEvalZero }
504*10465441SEvalZero INIT_PREV_EXPORT(rt_wlan_lwip_init);
505*10465441SEvalZero
506*10465441SEvalZero #endif
507