xref: /nrf52832-nimble/rt-thread/components/drivers/wlan/wlan_lwip.c (revision 104654410c56c573564690304ae786df310c91fc)
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(&eth_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(&eth_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