net_lwip2.c 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707
  1. #include "platform_def.h"
  2. #include "luat_base.h"
  3. #include "luat_timer.h"
  4. #include "luat_mcu.h"
  5. #include "luat_rtos.h"
  6. #include "dns_def.h"
  7. #include "luat_network_adapter.h"
  8. #include "lwip/init.h"
  9. #include "lwip/tcpip.h"
  10. #include "lwip/udp.h"
  11. #include "lwip/sockets.h"
  12. #include "net_lwip2.h"
  13. #include "luat_crypto.h"
  14. #include "luat_msgbus.h"
  15. #include "luat_malloc.h"
  16. #define LUAT_LOG_TAG "net"
  17. #include "luat_log.h"
  18. #define NET_DBG LLOGD
  19. #define NET_ERR LLOGE
  20. #ifndef SOCKET_BUF_LEN
  21. #define SOCKET_BUF_LEN (3 * TCP_MSS)
  22. #endif
  23. extern void luat_netdrv_etharp_tmr(void);
  24. static int net_lwip2_set_dns_server(uint8_t server_index, luat_ip_addr_t *ip, void *user_data);
  25. enum
  26. {
  27. EV_LWIP_EVENT_START = USER_EVENT_ID_START + 0x2000000,
  28. EV_LWIP_SOCKET_TX,
  29. EV_LWIP_NETIF_INPUT,
  30. EV_LWIP_TCP_TIMER,
  31. EV_LWIP_DNS_TIMER,
  32. EV_LWIP_SOCKET_RX_DONE,
  33. EV_LWIP_SOCKET_CREATE,
  34. EV_LWIP_SOCKET_CONNECT,
  35. EV_LWIP_SOCKET_DNS,
  36. EV_LWIP_SOCKET_DNS_IPV6,
  37. EV_LWIP_SOCKET_LISTEN,
  38. EV_LWIP_SOCKET_ACCPET,
  39. EV_LWIP_SOCKET_CLOSE,
  40. EV_LWIP_NETIF_LINK_STATE,
  41. EV_LWIP_DHCP_TIMER,
  42. EV_LWIP_FAST_TIMER,
  43. EV_LWIP_NETIF_SET_IP,
  44. EV_LWIP_NETIF_IPV6_BY_MAC,
  45. EV_LWIP_ARP_TIMER,
  46. };
  47. #define SOCKET_LOCK(ID) platform_lock_mutex(prvlwip.socket[ID].mutex)
  48. #define SOCKET_UNLOCK(ID) platform_unlock_mutex(prvlwip.socket[ID].mutex)
  49. #undef platform_send_event
  50. // static net_lwip2_ctrl_struct* lwip_ctrls[NW_ADAPTER_INDEX_LWIP_NETIF_QTY];
  51. static net_lwip2_ctrl_struct prvlwip;
  52. static void net_lwip2_check_network_ready(uint8_t adapter_index);
  53. static void net_lwip2_task(void *param);
  54. static void net_lwip2_create_socket_now(uint8_t adapter_index, uint8_t socket_id);
  55. static void platform_send_event(void *p, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3);
  56. static ip_addr_t *net_lwip2_get_ip6(uint8_t adapter_index);
  57. static err_t net_lwip2_dns_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);
  58. static int net_lwip2_check_ack(uint8_t adapter_index, int socket_id);
  59. static uint32_t register_statue;
  60. static uint8_t prvlwip_inited = 0;
  61. static LUAT_RT_RET_TYPE net_lwip2_timer_cb(LUAT_RT_CB_PARAM)
  62. {
  63. platform_send_event(NULL, (uint32_t)EV_LWIP_DNS_TIMER, 0, 0, (uint32_t)param);
  64. return LUAT_RT_RET;
  65. }
  66. #ifdef LUAT_USE_NETDRV_LWIP_ARP
  67. static LUAT_RT_RET_TYPE net_lwip_arp_timer_cb(LUAT_RT_CB_PARAM)
  68. {
  69. platform_send_event(NULL, (uint32_t)EV_LWIP_ARP_TIMER, 0, 0, (uint32_t)param);
  70. return LUAT_RT_RET;
  71. }
  72. #endif
  73. void net_lwip2_init(uint8_t adapter_index)
  74. {
  75. uint8_t i;
  76. for(i = 0; i < MAX_SOCK_NUM; i++)
  77. {
  78. INIT_LLIST_HEAD(&prvlwip.socket[i].wait_ack_head);
  79. INIT_LLIST_HEAD(&prvlwip.socket[i].tx_head);
  80. INIT_LLIST_HEAD(&prvlwip.socket[i].rx_head);
  81. prvlwip.socket[i].mutex = platform_create_mutex();
  82. }
  83. }
  84. void net_lwip2_set_netif(uint8_t adapter_index, struct netif *netif) {
  85. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) {
  86. return; // 超范围了
  87. }
  88. if (0 == prvlwip_inited) {
  89. prvlwip_inited = 1;
  90. net_lwip2_init(adapter_index);
  91. #ifdef LUAT_USE_NETDRV_LWIP_ARP
  92. prvlwip.arp_timer = platform_create_timer(net_lwip_arp_timer_cb, (void *)NULL, NULL);
  93. platform_start_timer(prvlwip.arp_timer, 1000, 1);
  94. #endif
  95. }
  96. if (NULL == prvlwip.dns_client[adapter_index]) {
  97. prvlwip.dns_client[adapter_index] = luat_heap_zalloc(sizeof(dns_client_t));
  98. // memset(prvlwip.dns_client[adapter_index], 0, sizeof(dns_client_t));
  99. dns_init_client(prvlwip.dns_client[adapter_index]);
  100. }
  101. if (NULL == prvlwip.dns_udp[adapter_index]) {
  102. prvlwip.dns_udp[adapter_index] = udp_new();
  103. prvlwip.dns_udp[adapter_index]->recv = net_lwip2_dns_recv_cb;
  104. prvlwip.dns_udp[adapter_index]->recv_arg = adapter_index;
  105. #if LWIP_VERSION_MAJOR == 2 && LWIP_VERSION_MINOR >= 1
  106. //udp_bind_netif(prvlwip.dns_udp[adapter_index], netif);
  107. #endif
  108. int tmp = adapter_index;
  109. prvlwip.dns_timer[adapter_index] = platform_create_timer(net_lwip2_timer_cb, (void *)tmp, NULL);
  110. }
  111. prvlwip.lwip_netif[adapter_index] = netif;
  112. }
  113. static int net_lwip2_del_data_cache(void *p, void *u)
  114. {
  115. socket_data_t *pdata = (socket_data_t *)p;
  116. luat_heap_free(pdata->data);
  117. return LIST_DEL;
  118. }
  119. static int net_lwip2_next_data_cache(void *p, void *u)
  120. {
  121. socket_ctrl_t *socket = (socket_ctrl_t *)u;
  122. socket_data_t *pdata = (socket_data_t *)p;
  123. if (socket->tag != pdata->tag)
  124. {
  125. NET_DBG("tag error");
  126. luat_heap_free(pdata->data);
  127. return LIST_DEL;
  128. }
  129. return LIST_FIND;
  130. }
  131. static socket_data_t * net_lwip2_create_data_node(uint8_t socket_id, uint8_t *data, uint32_t len, luat_ip_addr_t *remote_ip, uint16_t remote_port)
  132. {
  133. socket_data_t *p = (socket_data_t *)luat_heap_zalloc(sizeof(socket_data_t));
  134. if (p)
  135. {
  136. memset(p, 0, sizeof(socket_data_t));
  137. p->len = len;
  138. p->port = remote_port;
  139. if (remote_ip)
  140. {
  141. p->ip = *remote_ip;
  142. }
  143. else
  144. {
  145. ip_addr_set_zero(&p->ip);
  146. }
  147. p->tag = prvlwip.socket[socket_id].tag;
  148. if (data && len)
  149. {
  150. p->data = luat_heap_zalloc(len);
  151. if (p->data)
  152. {
  153. memcpy(p->data, data, len);
  154. }
  155. else
  156. {
  157. luat_heap_free(p);
  158. return NULL;
  159. }
  160. }
  161. }
  162. return p;
  163. }
  164. static void net_lwip2_callback_to_nw_task(uint8_t adapter_index, uint32_t event_id, uint32_t param1, uint32_t param2, uint32_t param3)
  165. {
  166. luat_network_cb_param_t param = {.tag = 0, .param = prvlwip.user_data};
  167. OS_EVENT event = { .ID = event_id, .Param1 = param1, .Param2 = param2, .Param3 = param3};
  168. if ((event_id > EV_NW_DNS_RESULT))
  169. {
  170. if (event_id != EV_NW_SOCKET_CLOSE_OK)
  171. {
  172. event.Param3 = prvlwip.socket[param1].param;
  173. param.tag = prvlwip.socket[param1].tag;
  174. }
  175. else
  176. {
  177. event.Param3 = ((luat_network_cb_param_t *)param3)->param;
  178. param.tag = ((luat_network_cb_param_t *)param3)->tag;
  179. }
  180. }
  181. switch(event_id)
  182. {
  183. case EV_NW_SOCKET_CLOSE_OK:
  184. case EV_NW_SOCKET_CONNECT_OK:
  185. case EV_NW_SOCKET_ERROR:
  186. prvlwip.socket_busy &= ~(1 << param1);
  187. break;
  188. }
  189. prvlwip.socket_cb(&event, &param);
  190. }
  191. static void net_lwip2_tcp_error(uint8_t adapter_index, int socket_id)
  192. {
  193. prvlwip.socket[socket_id].remote_close = 1;
  194. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  195. }
  196. static err_t net_lwip2_tcp_connected_cb(void *arg, struct tcp_pcb *tpcb, err_t err)
  197. {
  198. int socket_id = ((uint32_t)arg) & 0x0000ffff;
  199. uint8_t adapter_index = ((uint32_t)arg) >> 16;
  200. prvlwip.socket_connect &= ~(1 << socket_id);
  201. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_CONNECT_OK, socket_id, 0, 0);
  202. return ERR_OK;
  203. }
  204. static int net_lwip2_rx_data(int socket_id, struct pbuf *p, const ip_addr_t *addr, u16_t port)
  205. {
  206. int is_mem_err = 0;
  207. SOCKET_LOCK(socket_id);
  208. socket_data_t *data_p = net_lwip2_create_data_node(socket_id, NULL, 0, addr, port);
  209. if (data_p)
  210. {
  211. data_p->data = luat_heap_zalloc(p->tot_len);
  212. if (data_p->data)
  213. {
  214. data_p->len = pbuf_copy_partial(p, data_p->data, p->tot_len, 0);
  215. // NET_DBG("new data %ubyte", p->tot_len);
  216. llist_add_tail(&data_p->node, &prvlwip.socket[socket_id].rx_head);
  217. prvlwip.socket[socket_id].rx_wait_size += p->tot_len;
  218. }
  219. else
  220. {
  221. luat_heap_free(data_p);
  222. is_mem_err = 1;
  223. }
  224. }
  225. else
  226. {
  227. is_mem_err = 1;
  228. }
  229. SOCKET_UNLOCK(socket_id);
  230. return is_mem_err;
  231. }
  232. static void net_lwip2_tcp_close_done(uint8_t adapter_index, int socket_id, uint8_t notify)
  233. {
  234. luat_network_cb_param_t cb_param;
  235. // LLOGD("net_lwip2_tcp_close_done 1");
  236. // OS_LOCK;
  237. // LLOGD("net_lwip2_tcp_close_done 2");
  238. SOCKET_LOCK(socket_id);
  239. // LLOGD("net_lwip2_tcp_close_done 3");
  240. cb_param.param = prvlwip.socket[socket_id].param;
  241. cb_param.tag = prvlwip.socket[socket_id].tag;
  242. prvlwip.socket[socket_id].pcb.ip = NULL;
  243. prvlwip.socket[socket_id].listen_tcp = NULL;
  244. prvlwip.socket[socket_id].remote_close = 0;
  245. prvlwip.socket[socket_id].state = 0;
  246. prvlwip.socket[socket_id].in_use = 0;
  247. prvlwip.socket[socket_id].param = NULL;
  248. prvlwip.socket[socket_id].rx_wait_size = 0;
  249. prvlwip.socket[socket_id].tx_wait_size = 0;
  250. llist_traversal(&prvlwip.socket[socket_id].wait_ack_head, net_lwip2_del_data_cache, NULL);
  251. llist_traversal(&prvlwip.socket[socket_id].tx_head, net_lwip2_del_data_cache, NULL);
  252. llist_traversal(&prvlwip.socket[socket_id].rx_head, net_lwip2_del_data_cache, NULL);
  253. prvlwip.socket_busy &= ~(1 << socket_id);
  254. prvlwip.socket_connect &= ~(1 << socket_id);
  255. // OS_UNLOCK;
  256. SOCKET_UNLOCK(socket_id);
  257. if (notify)
  258. {
  259. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_CLOSE_OK, socket_id, 0, &cb_param);
  260. }
  261. }
  262. static err_t net_lwip2_tcp_recv_cb(void *arg, struct tcp_pcb *tpcb,
  263. struct pbuf *p, err_t err)
  264. {
  265. int socket_id = ((uint32_t)arg) & 0x0000ffff;
  266. uint8_t adapter_index = ((uint32_t)arg) >> 16;
  267. uint16_t len;
  268. if (p)
  269. {
  270. // tcp_recved(tpcb, p->tot_len);
  271. len = p->tot_len;
  272. if (net_lwip2_rx_data(socket_id, p, NULL, 0))
  273. {
  274. NET_DBG("no memory!");
  275. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  276. }
  277. else
  278. {
  279. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_RX_NEW, socket_id, len, 0);
  280. }
  281. pbuf_free(p);
  282. }
  283. else if (err == ERR_OK)
  284. {
  285. {
  286. prvlwip.socket[socket_id].remote_close = 1;
  287. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_REMOTE_CLOSE, socket_id, 0, 0);
  288. }
  289. }
  290. else
  291. {
  292. net_lwip2_tcp_error(adapter_index, socket_id);
  293. }
  294. return ERR_OK;
  295. }
  296. static err_t net_lwip2_tcp_sent_cb(void *arg, struct tcp_pcb *tpcb,
  297. u16_t len)
  298. {
  299. int socket_id = ((uint32_t)arg) & 0x0000ffff;
  300. uint8_t adapter_index = ((uint32_t)arg) >> 16;
  301. volatile uint16_t check_len = 0;
  302. volatile uint32_t rest_len;
  303. socket_data_t *p;
  304. SOCKET_LOCK(socket_id);
  305. while(check_len < len)
  306. {
  307. if (llist_empty(&prvlwip.socket[socket_id].wait_ack_head))
  308. {
  309. NET_DBG("!");
  310. goto SOCEKT_ERROR;
  311. }
  312. p = (socket_data_t *)prvlwip.socket[socket_id].wait_ack_head.next;
  313. rest_len = p->len - p->read_pos;
  314. if ((len - check_len) >= rest_len)
  315. {
  316. // NET_DBG("adapter %d socket %d, %ubytes ack", adapter_index, socket_id, p->len);
  317. llist_del(&p->node);
  318. luat_heap_free(p->data);
  319. luat_heap_free(p);
  320. check_len += rest_len;
  321. }
  322. else
  323. {
  324. p->read_pos += (len - check_len);
  325. check_len = len;
  326. // NET_DBG("adapter %d socket %d, all %ubytes ack %ubytes ", adapter_index, socket_id, p->len, p->read_pos);
  327. }
  328. }
  329. while (!llist_empty(&prvlwip.socket[socket_id].tx_head))
  330. {
  331. p = llist_traversal(&prvlwip.socket[socket_id].tx_head, net_lwip2_next_data_cache, &prvlwip.socket[socket_id]);
  332. if (p)
  333. {
  334. #if ENABLE_PSIF
  335. #if defined(CHIP_EC618)
  336. if (ERR_OK == tcp_write(prvlwip.socket[socket_id].pcb.tcp, p->data, p->len, TCP_WRITE_FLAG_COPY, 0, 0, 0))
  337. #else
  338. sockdataflag_t dataflag={0};
  339. if (ERR_OK == tcp_write(prvlwip.socket[socket_id].pcb.tcp, p->data, p->len, 0, dataflag, 0))
  340. #endif
  341. #else
  342. if (ERR_OK == tcp_write(prvlwip.socket[socket_id].pcb.tcp, p->data, p->len, 0))
  343. #endif
  344. {
  345. llist_del(&p->node);
  346. llist_add_tail(&p->node, &prvlwip.socket[socket_id].wait_ack_head);
  347. }
  348. else
  349. {
  350. // NET_DBG("tcp buf is full, wait ack and send again");
  351. break;
  352. }
  353. }
  354. }
  355. SOCKET_UNLOCK(socket_id);
  356. tcp_output(tpcb);
  357. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_TX_OK, socket_id, len, 0);
  358. return ERR_OK;
  359. SOCEKT_ERROR:
  360. SOCKET_UNLOCK(socket_id);
  361. net_lwip2_tcp_error(adapter_index, socket_id);
  362. return ERR_OK;
  363. }
  364. static err_t net_lwip2_tcp_err_cb(void *arg, err_t err)
  365. {
  366. int socket_id = ((uint32_t)arg) & 0x0000ffff;
  367. uint8_t adapter_index = ((uint32_t)arg) >> 16;
  368. if (prvlwip.socket[socket_id].is_tcp)
  369. {
  370. if (prvlwip.socket[socket_id].pcb.tcp)
  371. {
  372. prvlwip.socket[socket_id].pcb.tcp = NULL;
  373. }
  374. }
  375. if (!prvlwip.socket[socket_id].state && !prvlwip.socket[socket_id].remote_close)
  376. {
  377. NET_DBG("adapter %d socket %d not closing, but error %d", adapter_index, socket_id, err);
  378. net_lwip2_tcp_error(adapter_index, socket_id);
  379. }
  380. return 0;
  381. }
  382. static err_t net_lwip2_tcp_fast_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err)
  383. {
  384. int socket_id = ((uint32_t)arg) & 0x0000ffff;
  385. uint8_t adapter_index = ((uint32_t)arg) >> 16;
  386. if (err || !newpcb)
  387. {
  388. net_lwip2_tcp_error(adapter_index, socket_id);
  389. return 0;
  390. }
  391. prvlwip.socket[socket_id].pcb.tcp = newpcb;
  392. // prvlwip.socket[socket_id].pcb.tcp->sockid = socket_id;
  393. prvlwip.socket[socket_id].rx_wait_size = 0;
  394. prvlwip.socket[socket_id].tx_wait_size = 0;
  395. prvlwip.socket[socket_id].pcb.tcp->callback_arg = arg;
  396. prvlwip.socket[socket_id].pcb.tcp->recv = net_lwip2_tcp_recv_cb;
  397. prvlwip.socket[socket_id].pcb.tcp->sent = net_lwip2_tcp_sent_cb;
  398. prvlwip.socket[socket_id].pcb.tcp->errf = net_lwip2_tcp_err_cb;
  399. prvlwip.socket[socket_id].pcb.tcp->so_options |= SOF_KEEPALIVE|SOF_REUSEADDR;
  400. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_CONNECT_OK, socket_id, 0, 0);
  401. return ERR_OK;
  402. }
  403. static err_t net_lwip2_tcp_accept_cb(void *arg, struct tcp_pcb *newpcb, err_t err)
  404. {
  405. // int socket_id = ((uint32_t)arg) & 0x0000ffff;
  406. // uint8_t adapter_index = ((uint32_t)arg) >> 16;
  407. return ERR_OK;
  408. }
  409. static err_t net_lwip2_udp_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p,
  410. const ip_addr_t *addr, u16_t port)
  411. {
  412. int socket_id = ((uint32_t)arg) & 0x0000ffff;
  413. uint8_t adapter_index = ((uint32_t)arg) >> 16;
  414. uint16_t len = 0;
  415. // LLOGD("net_lwip2_udp_recv_cb %d %d", socket_id, adapter_index);
  416. if (p)
  417. {
  418. len = p->tot_len;
  419. if (net_lwip2_rx_data(socket_id, p, addr, port))
  420. {
  421. NET_DBG("no memory!");
  422. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  423. }
  424. else
  425. {
  426. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_RX_NEW, socket_id, len, 0);
  427. }
  428. pbuf_free(p);
  429. }
  430. return ERR_OK;
  431. }
  432. static int32_t net_lwip2_dns_check_result(void *data, void *param)
  433. {
  434. luat_dns_require_t *require = (luat_dns_require_t *)data;
  435. if (require->result != 0)
  436. {
  437. luat_heap_free(require->uri.Data);
  438. require->uri.Data = NULL;
  439. if (require->result > 0)
  440. {
  441. luat_dns_ip_result *ip_result = zalloc(sizeof(luat_dns_ip_result) * require->result);
  442. int i;
  443. for(i = 0; i < require->result; i++)
  444. {
  445. ip_result[i] = require->ip_result[i];
  446. }
  447. net_lwip2_callback_to_nw_task(require->adapter_index, EV_NW_DNS_RESULT, require->result, ip_result, require->param);
  448. }
  449. else
  450. {
  451. net_lwip2_callback_to_nw_task(require->adapter_index, EV_NW_DNS_RESULT, 0, 0, require->param);
  452. }
  453. return LIST_DEL;
  454. }
  455. else
  456. {
  457. return LIST_PASS;
  458. }
  459. }
  460. static err_t net_lwip2_dns_recv_cb(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
  461. {
  462. Buffer_Struct msg_buf = {0};
  463. Buffer_Struct tx_msg_buf = {0,0,0};
  464. struct pbuf *out_p = NULL;
  465. int i = 0;
  466. int ret = 0;
  467. char ip_string[64] = {0};
  468. char ipstr2[64] = {0};
  469. uint8_t adapter_index = (uint32_t)arg;
  470. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY || prvlwip.lwip_netif[adapter_index] == NULL) {
  471. return ERR_OK;
  472. }
  473. //LLOGD("%s:%d", __FILE__, __LINE__);
  474. if (p)
  475. {
  476. OS_InitBuffer(&msg_buf, p->tot_len);
  477. pbuf_copy_partial(p, msg_buf.Data, p->tot_len, 0);
  478. pbuf_free(p);
  479. dns_run(prvlwip.dns_client[adapter_index], &msg_buf, NULL, &i);
  480. OS_DeInitBuffer(&msg_buf);
  481. llist_traversal(&prvlwip.dns_client[adapter_index]->require_head, net_lwip2_dns_check_result, NULL);
  482. {
  483. dns_run(prvlwip.dns_client[adapter_index], NULL, &tx_msg_buf, &i);
  484. if (tx_msg_buf.Pos && NULL != tx_msg_buf.Data)
  485. {
  486. out_p = pbuf_alloc(PBUF_TRANSPORT, tx_msg_buf.Pos, PBUF_RAM);
  487. if (out_p && NULL != tx_msg_buf.Data)
  488. {
  489. pbuf_take(p, tx_msg_buf.Data, tx_msg_buf.Pos);
  490. memcpy(&prvlwip.dns_udp[adapter_index]->local_ip, &prvlwip.lwip_netif[adapter_index]->ip_addr, sizeof(ip_addr_t));
  491. ipaddr_ntoa_r(&prvlwip.dns_client[adapter_index]->dns_server[i], ip_string, sizeof(ip_string));
  492. ipaddr_ntoa_r(&prvlwip.dns_udp[adapter_index]->local_ip, ipstr2, sizeof(ipstr2));
  493. LLOGD("dns udp sendto %s:%d from %s", ip_string, DNS_SERVER_PORT, ipstr2);
  494. ret = udp_sendto_if(prvlwip.dns_udp[adapter_index], out_p, &prvlwip.dns_client[adapter_index]->dns_server[i], DNS_SERVER_PORT, prvlwip.lwip_netif[adapter_index]);
  495. if (ret) {
  496. LLOGE("dns udp sendto %s:%d ret %d", ip_string, DNS_SERVER_PORT, ret);
  497. }
  498. }
  499. if (out_p) {
  500. pbuf_free(out_p);
  501. }
  502. OS_DeInitBuffer(&tx_msg_buf);
  503. llist_traversal(&prvlwip.dns_client[adapter_index]->require_head, net_lwip2_dns_check_result, NULL);
  504. }
  505. }
  506. }
  507. if (!prvlwip.dns_client[adapter_index]->is_run && prvlwip.dns_timer[adapter_index])
  508. {
  509. platform_stop_timer(prvlwip.dns_timer[adapter_index]);
  510. }
  511. return ERR_OK;
  512. }
  513. static void net_lwip2_dns_tx_next(uint8_t adapter_index, Buffer_Struct *tx_msg_buf)
  514. {
  515. int i = 0;
  516. err_t err = 0;
  517. struct pbuf *p = NULL;
  518. char ipstr[64] = {0};
  519. char ipstr2[64] = {0};
  520. dns_run(prvlwip.dns_client[adapter_index], NULL, tx_msg_buf, &i);
  521. char ip_string[64] = {0};
  522. // LLOGI("net_lwip2_dns_tx_next %d %p", adapter_index, prvlwip.dns_client[adapter_index]);
  523. ipaddr_ntoa_r(&prvlwip.dns_client[adapter_index]->dns_server[i], ip_string, sizeof(ip_string));
  524. LLOGD("adatper %d dns server %s", adapter_index, ip_string);
  525. if (tx_msg_buf->Pos && NULL != tx_msg_buf->Data) {
  526. p = pbuf_alloc(PBUF_TRANSPORT, tx_msg_buf->Pos, PBUF_RAM);
  527. if (p == NULL) {
  528. LLOGE("dns upd pbuf alloc fail!!!");
  529. }
  530. else {
  531. pbuf_take(p, tx_msg_buf->Data, tx_msg_buf->Pos);
  532. memcpy(&prvlwip.dns_udp[adapter_index]->local_ip, &prvlwip.lwip_netif[adapter_index]->ip_addr, sizeof(ip_addr_t));
  533. ipaddr_ntoa_r(&prvlwip.dns_udp[adapter_index]->local_ip, ipstr2, sizeof(ipstr2));
  534. ipaddr_ntoa_r(&prvlwip.dns_client[adapter_index]->dns_server[i], ipstr, sizeof(ipstr));
  535. LLOGD("dns udp sendto %s:%d from %s", ipstr, DNS_SERVER_PORT, ipstr2);
  536. err = udp_sendto_if(prvlwip.dns_udp[adapter_index], p, &prvlwip.dns_client[adapter_index]->dns_server[i], DNS_SERVER_PORT, prvlwip.lwip_netif[adapter_index]);
  537. pbuf_free(p);
  538. if (err) {
  539. LLOGE("dns udp sendto %s:%d from %s ret %d", ipstr, DNS_SERVER_PORT, ipstr2, err);
  540. }
  541. }
  542. }
  543. OS_DeInitBuffer(tx_msg_buf);
  544. if (prvlwip.dns_client[adapter_index]->new_result)
  545. {
  546. llist_traversal(&prvlwip.dns_client[adapter_index]->require_head, net_lwip2_dns_check_result, NULL);
  547. prvlwip.dns_client[adapter_index]->new_result = 0;
  548. }
  549. }
  550. // uint32_t net_lwip2_rand()
  551. // {
  552. // PV_Union uPV;
  553. // luat_crypto_trng(uPV.u8, 4);
  554. // return uPV.u32;
  555. // }
  556. // void net_lwip2_set_local_ip6(ip6_addr_t *ip)
  557. // {
  558. // prvlwip.ec618_ipv6.u_addr.ip6 = *ip;
  559. // prvlwip.ec618_ipv6.type = IPADDR_TYPE_V6;
  560. // }
  561. static void net_lwip2_close_tcp(int socket_id)
  562. {
  563. prvlwip.socket[socket_id].pcb.tcp->sent = NULL;
  564. prvlwip.socket[socket_id].pcb.tcp->errf = NULL;
  565. prvlwip.socket[socket_id].pcb.tcp->recv = tcp_recv_null;
  566. prvlwip.socket[socket_id].pcb.tcp->callback_arg = 0;
  567. prvlwip.socket[socket_id].pcb.tcp->pollinterval = 2;
  568. if (tcp_close(prvlwip.socket[socket_id].pcb.tcp))
  569. {
  570. tcp_abort(prvlwip.socket[socket_id].pcb.tcp);
  571. }
  572. prvlwip.socket[socket_id].pcb.tcp = NULL;
  573. }
  574. static void net_lwip2_task(void *param)
  575. {
  576. // luat_network_cb_param_t cb_param;
  577. OS_EVENT event = *((OS_EVENT *)param);
  578. luat_heap_free(param);
  579. Buffer_Struct tx_msg_buf = {0,0,0};
  580. // HANDLE cur_task = luat_get_current_task();
  581. socket_data_t *p = NULL;
  582. ip_addr_t *p_ip, *local_ip;
  583. struct pbuf *out_p = NULL;
  584. int error = 0;
  585. // uint8_t active_flag;
  586. uint8_t socket_id = 0;
  587. uint8_t adapter_index = 0;
  588. socket_id = event.Param1;
  589. adapter_index = event.Param3;
  590. char ip_string[64] = {0};
  591. ip_addr_t* ips;
  592. uint32_t is_ipv6;
  593. switch(event.ID)
  594. {
  595. case EV_LWIP_SOCKET_TX:
  596. SOCKET_LOCK(socket_id);
  597. if (prvlwip.socket[socket_id].in_use && prvlwip.socket[socket_id].pcb.ip)
  598. {
  599. // if (!prvlwip.socket[socket_id].pcb.tcp->unsent && !prvlwip.socket[socket_id].pcb.tcp->unacked)
  600. // {
  601. // active_flag = 0;
  602. // }
  603. // else
  604. // {
  605. // active_flag = 1;
  606. // }
  607. if (prvlwip.socket[socket_id].is_tcp)
  608. {
  609. while (!llist_empty(&prvlwip.socket[socket_id].tx_head))
  610. {
  611. p = llist_traversal(&prvlwip.socket[socket_id].tx_head, net_lwip2_next_data_cache, &prvlwip.socket[socket_id]);
  612. if (p->len <= tcp_sndbuf(prvlwip.socket[socket_id].pcb.tcp))
  613. {
  614. #if ENABLE_PSIF
  615. #if defined(CHIP_EC618)
  616. if (ERR_OK == tcp_write(prvlwip.socket[socket_id].pcb.tcp, p->data, p->len, TCP_WRITE_FLAG_COPY, 0, 0, 0))
  617. #else
  618. sockdataflag_t dataflag={0};
  619. if (ERR_OK == tcp_write(prvlwip.socket[socket_id].pcb.tcp, p->data, p->len, 0, dataflag, 0))
  620. #endif
  621. #else
  622. if (ERR_OK == tcp_write(prvlwip.socket[socket_id].pcb.tcp, p->data, p->len, TCP_WRITE_FLAG_COPY))
  623. #endif
  624. {
  625. llist_del(&p->node);
  626. llist_add_tail(&p->node, &prvlwip.socket[socket_id].wait_ack_head);
  627. }
  628. else
  629. {
  630. // NET_DBG("tcp buf is full, wait ack and send again");
  631. break;
  632. }
  633. }
  634. else
  635. {
  636. // NET_DBG("tcp buf is full, wait ack and send again");
  637. break;
  638. }
  639. }
  640. SOCKET_UNLOCK(socket_id);
  641. tcp_output(prvlwip.socket[socket_id].pcb.tcp);
  642. prvlwip.socket_busy |= (1 << socket_id);
  643. }
  644. else
  645. {
  646. p = llist_traversal(&prvlwip.socket[socket_id].tx_head, net_lwip2_next_data_cache, &prvlwip.socket[socket_id]);
  647. if (p)
  648. {
  649. llist_del(&p->node);
  650. }
  651. SOCKET_UNLOCK(socket_id);
  652. if (p)
  653. {
  654. uint32_t len = p->len;
  655. out_p = pbuf_alloc(PBUF_TRANSPORT, p->len, PBUF_RAM);
  656. if (out_p)
  657. {
  658. pbuf_take(out_p, p->data, p->len);
  659. error = udp_sendto_if(prvlwip.socket[socket_id].pcb.udp, out_p, &p->ip, p->port, prvlwip.lwip_netif[adapter_index]);
  660. if (error) {
  661. ipaddr_ntoa_r(&p->ip, ip_string, sizeof(ip_string));
  662. LLOGI("udp_sendto_if err %d %s:%d", error, ip_string, p->port);
  663. }
  664. pbuf_free(out_p);
  665. }
  666. else
  667. {
  668. NET_DBG("mem err send fail");
  669. }
  670. luat_heap_free(p->data);
  671. luat_heap_free(p);
  672. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_TX_OK, socket_id, len, 0);
  673. }
  674. }
  675. }
  676. else
  677. {
  678. NET_DBG("adapter %d socket %d no in use! %x", adapter_index, socket_id, prvlwip.socket[socket_id].pcb.ip);
  679. SOCKET_UNLOCK(socket_id);
  680. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  681. }
  682. break;
  683. case EV_LWIP_DNS_TIMER:
  684. #ifdef LUAT_USE_DNS
  685. net_lwip2_dns_tx_next(adapter_index, &tx_msg_buf);
  686. if (!prvlwip.dns_client[adapter_index]->is_run && prvlwip.dns_timer[adapter_index])
  687. {
  688. platform_stop_timer(prvlwip.dns_timer[adapter_index]);
  689. }
  690. #endif
  691. break;
  692. case EV_LWIP_SOCKET_RX_DONE:
  693. if (!prvlwip.socket[socket_id].in_use || !prvlwip.socket[socket_id].pcb.ip || !prvlwip.socket[socket_id].is_tcp)
  694. {
  695. NET_DBG("error socket %d state %d,%x,%d", socket_id, prvlwip.socket[socket_id].in_use, prvlwip.socket[socket_id].pcb.ip, prvlwip.socket[socket_id].is_tcp);
  696. break;
  697. }
  698. // NET_DBG("socket %d rx ack %dbytes", socket_id, event.Param2);
  699. tcp_recved(prvlwip.socket[socket_id].pcb.tcp, event.Param2);
  700. break;
  701. case EV_LWIP_SOCKET_CREATE:
  702. net_lwip2_create_socket_now(adapter_index, socket_id);
  703. break;
  704. case EV_LWIP_SOCKET_CONNECT:
  705. if (!prvlwip.socket[socket_id].in_use || !prvlwip.socket[socket_id].pcb.ip)
  706. {
  707. NET_DBG("adapter %d socket %d cannot use! %d,%x", adapter_index, socket_id, prvlwip.socket[socket_id].in_use, prvlwip.socket[socket_id].pcb.ip);
  708. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  709. break;
  710. }
  711. p_ip = (ip_addr_t *)event.Param2;
  712. ipaddr_ntoa_r(p_ip, ip_string, 64);
  713. LLOGD("connect %s:%d %s", ip_string, prvlwip.socket[socket_id].remote_port, prvlwip.socket[socket_id].is_tcp ? "TCP" : "UDP");
  714. local_ip = NULL;
  715. #if LWIP_IPV6
  716. if (p_ip->type == IPADDR_TYPE_V4)
  717. {
  718. #endif
  719. local_ip = &prvlwip.lwip_netif[adapter_index]->ip_addr;
  720. // char ip_string[64];
  721. // ipaddr_ntoa_r(&prvlwip.lwip_netif->ip_addr, ip_string, 64);
  722. // LLOGD("EV_LWIP_SOCKET_CONNECT local_ip %s", ip_string);
  723. #if LWIP_IPV6
  724. }
  725. else
  726. {
  727. local_ip = net_lwip2_get_ip6(adapter_index);
  728. }
  729. #endif
  730. if (!local_ip && prvlwip.socket[socket_id].is_tcp)
  731. {
  732. NET_DBG("netif no ip !!!!!!");
  733. net_lwip2_tcp_error(adapter_index, socket_id);
  734. break;
  735. }
  736. if (prvlwip.socket[socket_id].is_tcp)
  737. {
  738. error = tcp_bind(prvlwip.socket[socket_id].pcb.tcp, local_ip, 0);
  739. if (error) {
  740. NET_DBG("adapter %d socket %d tcp bind error %d", adapter_index, socket_id, error);
  741. net_lwip2_tcp_error(adapter_index, socket_id);
  742. return;
  743. }
  744. error = tcp_connect(prvlwip.socket[socket_id].pcb.tcp, p_ip, prvlwip.socket[socket_id].remote_port, net_lwip2_tcp_connected_cb);
  745. if (error)
  746. {
  747. NET_DBG("adapter %d socket %d connect error %d", adapter_index, socket_id, error);
  748. net_lwip2_tcp_error(adapter_index, socket_id);
  749. }
  750. else
  751. {
  752. prvlwip.socket_connect |= (1 << socket_id);
  753. }
  754. }
  755. else
  756. {
  757. // NET_DBG("udp bind %d", prvlwip.socket[socket_id].local_port);
  758. error = udp_bind(prvlwip.socket[socket_id].pcb.udp, local_ip, prvlwip.socket[socket_id].local_port);
  759. if (error) {
  760. NET_DBG("udp bind ret %d port %d", error, prvlwip.socket[socket_id].local_port);
  761. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  762. return;
  763. }
  764. error = udp_connect(prvlwip.socket[socket_id].pcb.udp, p_ip, prvlwip.socket[socket_id].remote_port);
  765. if (error)
  766. {
  767. NET_DBG("adapter %d socket %d connect error %d", adapter_index, socket_id, error);
  768. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  769. }
  770. else
  771. {
  772. if (!prvlwip.socket[socket_id].remote_port)
  773. {
  774. prvlwip.socket[socket_id].pcb.udp->flags &= ~UDP_FLAGS_CONNECTED;
  775. }
  776. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_CONNECT_OK, socket_id, 0, 0);
  777. }
  778. }
  779. break;
  780. case EV_LWIP_SOCKET_DNS:
  781. case EV_LWIP_SOCKET_DNS_IPV6:
  782. // LLOGD("event dns query");
  783. if (!prvlwip.dns_client[adapter_index]->is_run && prvlwip.dns_timer[adapter_index])
  784. {
  785. platform_start_timer(prvlwip.dns_timer[adapter_index], 1000, 1);
  786. }
  787. dns_require_ipv6(prvlwip.dns_client[adapter_index], event.Param1, event.Param2, event.Param3, (event.ID - EV_LWIP_SOCKET_DNS));
  788. // LLOGD("event dns query 2");
  789. net_lwip2_dns_tx_next(adapter_index, &tx_msg_buf);
  790. // LLOGD("event dns query 3");
  791. break;
  792. case EV_LWIP_SOCKET_LISTEN:
  793. if (!prvlwip.socket[socket_id].in_use || !prvlwip.socket[socket_id].pcb.ip)
  794. {
  795. NET_DBG("adapter %d socket %d cannot use! %d,%x", adapter_index, socket_id, prvlwip.socket[socket_id].in_use, prvlwip.socket[socket_id].pcb.ip);
  796. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_ERROR, socket_id, 0, 0);
  797. break;
  798. }
  799. error = tcp_bind(prvlwip.socket[socket_id].pcb.tcp, NULL, prvlwip.socket[socket_id].local_port);
  800. if (error) {
  801. LLOGE("tcp listen port %d ret %d", prvlwip.socket[socket_id].local_port, error);
  802. net_lwip2_tcp_error(adapter_index, socket_id);
  803. }
  804. IP_SET_TYPE_VAL(prvlwip.socket[socket_id].pcb.tcp->local_ip, IPADDR_TYPE_ANY);
  805. IP_SET_TYPE_VAL(prvlwip.socket[socket_id].pcb.tcp->remote_ip, IPADDR_TYPE_ANY);
  806. // prvlwip.socket[socket_id].pcb.tcp->sockid = -1;
  807. prvlwip.socket[socket_id].listen_tcp = tcp_listen_with_backlog(prvlwip.socket[socket_id].pcb.tcp, 1);
  808. if (!prvlwip.socket[socket_id].listen_tcp) {
  809. NET_DBG("socket %d listen failed");
  810. net_lwip2_tcp_error(adapter_index, socket_id);
  811. } else {
  812. PV_Union uPV;
  813. uPV.u16[0] = socket_id;
  814. uPV.u16[1] = adapter_index;
  815. prvlwip.socket[socket_id].listen_tcp->callback_arg = uPV.u32;
  816. prvlwip.socket[socket_id].listen_tcp->accept = net_lwip2_tcp_fast_accept_cb;
  817. prvlwip.socket[socket_id].pcb.tcp = NULL;
  818. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_SOCKET_LISTEN, socket_id, 0, 0);
  819. }
  820. break;
  821. // case EV_LWIP_SOCKET_ACCPET:
  822. //
  823. // break;
  824. case EV_LWIP_SOCKET_CLOSE:
  825. // LLOGD("event EV_LWIP_SOCKET_CLOSE 1");
  826. if (!prvlwip.socket[socket_id].in_use)
  827. {
  828. NET_DBG("socket %d no in use!,%x", socket_id);
  829. break;
  830. }
  831. // LLOGD("event EV_LWIP_SOCKET_CLOSE 2");
  832. if (prvlwip.socket[socket_id].listen_tcp)
  833. {
  834. tcp_close(prvlwip.socket[socket_id].listen_tcp);
  835. prvlwip.socket[socket_id].listen_tcp = NULL;
  836. if (prvlwip.socket[socket_id].pcb.tcp)
  837. {
  838. net_lwip2_close_tcp(socket_id);
  839. }
  840. net_lwip2_tcp_close_done(adapter_index, socket_id, event.Param2);
  841. break;
  842. }
  843. // LLOGD("event EV_LWIP_SOCKET_CLOSE 3");
  844. if (prvlwip.socket[socket_id].pcb.ip)
  845. {
  846. if (prvlwip.socket[socket_id].is_tcp)
  847. {
  848. net_lwip2_close_tcp(socket_id);
  849. }
  850. else
  851. {
  852. // LLOGD("event EV_LWIP_SOCKET_CLOSE 31");
  853. udp_remove(prvlwip.socket[socket_id].pcb.udp);
  854. // LLOGD("event EV_LWIP_SOCKET_CLOSE 32");
  855. }
  856. net_lwip2_tcp_close_done(adapter_index, socket_id, event.Param2);
  857. break;
  858. }
  859. // LLOGD("event EV_LWIP_SOCKET_CLOSE 4");
  860. if (prvlwip.socket[socket_id].remote_close)
  861. {
  862. net_lwip2_tcp_close_done(adapter_index, socket_id, event.Param2);
  863. break;
  864. }
  865. // LLOGD("event EV_LWIP_SOCKET_CLOSE DONE");
  866. break;
  867. case EV_LWIP_NETIF_LINK_STATE:
  868. net_lwip2_check_network_ready(event.Param3);
  869. break;
  870. case EV_LWIP_NETIF_SET_IP:
  871. ips = (ip_addr_t*)event.Param1;
  872. is_ipv6 = (uint32_t)event.Param2;
  873. if (is_ipv6) {
  874. LLOGE("当前不支持设置ipv6地址");
  875. luat_heap_free(ips);
  876. break;
  877. }
  878. // ipaddr_ntoa_r(&ips[0], ip_string, 64);
  879. // LLOGI("设置IP啊 %s", ip_string);
  880. // ipaddr_ntoa_r(&ips[1], ip_string, 64);
  881. // LLOGI("设置MARK啊 %s", ip_string);
  882. // ipaddr_ntoa_r(&ips[2], ip_string, 64);
  883. // LLOGI("设置GW啊 %s", ip_string);
  884. netif_set_addr(prvlwip.lwip_netif[adapter_index], &ips[0], &ips[1], &ips[2]);
  885. luat_heap_free(ips);
  886. net_lwip2_check_network_ready(adapter_index);
  887. break;
  888. #ifdef LUAT_USE_NETDRV_LWIP_ARP
  889. case EV_LWIP_ARP_TIMER:
  890. luat_netdrv_etharp_tmr();
  891. break;
  892. #endif
  893. default:
  894. NET_DBG("unknow event %x,%x", event.ID, event.Param1);
  895. break;
  896. }
  897. // LLOGD("End of lwip task");
  898. }
  899. static void platform_send_event(void *p, uint32_t id, uint32_t param1, uint32_t param2, uint32_t param3)
  900. {
  901. OS_EVENT *event = luat_heap_zalloc(sizeof(OS_EVENT));
  902. event->ID = id;
  903. event->Param1 = param1;
  904. event->Param2 = param2;
  905. event->Param3 = param3;
  906. #if NO_SYS
  907. net_lwip2_task(event);
  908. #else
  909. tcpip_callback_with_block(net_lwip2_task, event, 1);
  910. #endif
  911. }
  912. static void net_lwip2_check_network_ready(uint8_t adapter_index)
  913. {
  914. // luat_ip_addr_t addr = {0};
  915. dns_client_t *dns_client = prvlwip.dns_client[adapter_index];
  916. dhcp_client_info_t* dhcpc = prvlwip.dhcpc[adapter_index];
  917. // char ip_string[64] = {0};
  918. if (prvlwip.lwip_netif[adapter_index] == NULL)
  919. return;
  920. uint8_t active_flag = !ip_addr_isany(&prvlwip.lwip_netif[adapter_index]->ip_addr)
  921. && netif_is_link_up(prvlwip.lwip_netif[adapter_index])
  922. && netif_is_up(prvlwip.lwip_netif[adapter_index]);
  923. if (prvlwip.netif_network_ready[adapter_index] == active_flag) {
  924. // LLOGD("网络[%d]状态没有变化, 跳过检查", adapter_index);
  925. return;
  926. }
  927. prvlwip.netif_network_ready[adapter_index] = active_flag;
  928. if (!active_flag)
  929. {
  930. // TODO 如果没有活跃的netif了, 应该关闭dns客户端
  931. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_STATE, 0, 0, adapter_index);
  932. }
  933. else
  934. {
  935. NET_DBG("network ready %d", adapter_index);
  936. // uint32_t tmp = adapter_index;
  937. // luat_ip_addr_t addr = {0};
  938. uint8_t dns0_set = 0;
  939. uint8_t dns1_set = 0;
  940. // LLOGD("开始设置DNS服务器 %d static? %d %d %d %d", adapter_index, dns_client->is_static_dns[0], dns_client->is_static_dns[1], prvlwip.dhcpc[adapter_index] ? prvlwip.dhcpc[adapter_index]->dns_server[0] : 0, prvlwip.dhcpc[adapter_index] ? prvlwip.dhcpc[adapter_index]->dns_server[1] : 0);
  941. if (dns_client->is_static_dns[0] == 0) {
  942. if (dhcpc && dhcpc->dns_server[0]) {
  943. network_set_ip_ipv4(&dns_client->dns_server[0], dhcpc->dns_server[0]);
  944. dns0_set = 1;
  945. // LLOGD("使用DHCP分配的DNS服务器作为首选DNS服务器");
  946. }
  947. }
  948. else {
  949. dns0_set = 1; // 静态DNS服务器, 就不更新了
  950. }
  951. if (dns_client->is_static_dns[1] == 0) {
  952. if (dhcpc && dhcpc->dns_server[1]) {
  953. network_set_ip_ipv4(&dns_client->dns_server[1], dhcpc->dns_server[1]);
  954. dns1_set = 1;
  955. // LLOGD("使用DHCP分配的DNS服务器作为次选DNS服务器");
  956. }
  957. }
  958. else {
  959. dns1_set = 1; // 静态DNS服务器, 就不更新了
  960. }
  961. if (dns0_set == 0) {
  962. // LLOGD("使用网关作为首选DNS服务器");
  963. memcpy(&dns_client->dns_server[0], &prvlwip.lwip_netif[adapter_index]->gw, sizeof(luat_ip_addr_t));
  964. }
  965. else {
  966. // LLOGI("首选DNS服务器 %s", ipaddr_ntoa(&prvlwip.dns_client[adapter_index]->dns_server[0]));
  967. }
  968. if (dns1_set == 0) {
  969. network_set_ip_ipv4(&dns_client->dns_server[1], (114 << 24) | (114 << 16) | (114 << 8) | 114); // 默认DNS服务器
  970. }
  971. net_lwip2_callback_to_nw_task(adapter_index, EV_NW_STATE, 0, 1, adapter_index);
  972. }
  973. }
  974. static int net_lwip2_check_socket(void *user_data, int socket_id, uint64_t tag)
  975. {
  976. if ((uint32_t)user_data >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  977. if (socket_id >= MAX_SOCK_NUM) return -1;
  978. if (prvlwip.socket[socket_id].tag != tag) return -1;
  979. if (!prvlwip.socket[socket_id].in_use || prvlwip.socket[socket_id].state) return -1;
  980. return 0;
  981. }
  982. static int net_lwip2_socket_check(int socket_id, uint64_t tag, void *user_data)
  983. {
  984. return net_lwip2_check_socket(user_data, socket_id, tag);
  985. }
  986. static uint8_t net_lwip2_check_ready(void *user_data)
  987. {
  988. uint8_t adapter_index = (uint32_t)user_data;
  989. if ((uint32_t)user_data >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return 0;
  990. // LLOGD("lwip2查询网络就绪情况 %d", prvlwip.netif_network_ready[adapter_index]);
  991. if (prvlwip.lwip_netif[adapter_index] == NULL) {
  992. LLOGD("lwip netif is null %d", adapter_index);
  993. return 0;
  994. }
  995. if (!netif_is_up(prvlwip.lwip_netif[adapter_index])) {
  996. // LLOGD("netif is not up %d", adapter_index);
  997. return 0;
  998. }
  999. if (!netif_is_link_up(prvlwip.lwip_netif[adapter_index])) {
  1000. // LLOGD("netif is not link up %d", adapter_index);
  1001. return 0;
  1002. }
  1003. if (ip_addr_isany(&prvlwip.lwip_netif[adapter_index]->ip_addr)) {
  1004. // LLOGD("netif addr is 0.0.0.0 %d", adapter_index);
  1005. return 0;
  1006. }
  1007. return 1;
  1008. }
  1009. static void net_lwip2_create_socket_now(uint8_t adapter_index, uint8_t socket_id)
  1010. {
  1011. PV_Union uPV;
  1012. uPV.u16[0] = socket_id;
  1013. uPV.u16[1] = adapter_index;
  1014. if (socket_id >= MAX_SOCK_NUM)
  1015. return;
  1016. if (prvlwip.socket[socket_id].is_tcp)
  1017. {
  1018. prvlwip.socket[socket_id].pcb.tcp = tcp_new();
  1019. if (!prvlwip.socket[socket_id].pcb.tcp)
  1020. {
  1021. NET_DBG("try to abort fin wait 1 tcp");
  1022. struct tcp_pcb *pcb, *dpcb;
  1023. uint32_t low_time = (uint32_t)(luat_mcu_tick64_ms() / 1000);
  1024. dpcb = NULL;
  1025. for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next)
  1026. {
  1027. if (FIN_WAIT_1 == pcb->state)
  1028. {
  1029. if (((uint32_t)pcb->callback_arg) < low_time)
  1030. {
  1031. dpcb = pcb;
  1032. low_time = (uint32_t)pcb->callback_arg;
  1033. }
  1034. }
  1035. }
  1036. if (dpcb)
  1037. {
  1038. tcp_abort(dpcb);
  1039. }
  1040. prvlwip.socket[socket_id].pcb.tcp = tcp_new();
  1041. }
  1042. if (prvlwip.socket[socket_id].pcb.tcp)
  1043. {
  1044. // prvlwip.socket[socket_id].pcb.tcp->sockid = socket_id;
  1045. #if defined(CHIP_EC618) || defined(CHIP_EC718)|| defined(CHIP_EC716)
  1046. #else
  1047. tcp_bind_netif(prvlwip.socket[socket_id].pcb.tcp, prvlwip.lwip_netif[adapter_index]);
  1048. #endif
  1049. prvlwip.socket[socket_id].rx_wait_size = 0;
  1050. prvlwip.socket[socket_id].tx_wait_size = 0;
  1051. prvlwip.socket[socket_id].pcb.tcp->callback_arg = uPV.p;
  1052. prvlwip.socket[socket_id].pcb.tcp->recv = net_lwip2_tcp_recv_cb;
  1053. prvlwip.socket[socket_id].pcb.tcp->sent = net_lwip2_tcp_sent_cb;
  1054. prvlwip.socket[socket_id].pcb.tcp->errf = net_lwip2_tcp_err_cb;
  1055. prvlwip.socket[socket_id].pcb.tcp->so_options |= SOF_KEEPALIVE|SOF_REUSEADDR;
  1056. // tcp_set_flags(prvlwip.socket[socket_id].pcb.tcp, TCP_NODELAY);
  1057. #if LWIP_TCP_KEEPALIVE
  1058. if (adapter_index == NW_ADAPTER_INDEX_LWIP_WIFI_STA ||
  1059. adapter_index == NW_ADAPTER_INDEX_LWIP_WIFI_AP ||
  1060. adapter_index == NW_ADAPTER_INDEX_LWIP_ETH) {
  1061. prvlwip.socket[socket_id].pcb.tcp->keep_intvl = 5*1000;
  1062. prvlwip.socket[socket_id].pcb.tcp->keep_idle = 45*1000;
  1063. prvlwip.socket[socket_id].pcb.tcp->keep_cnt = 2;
  1064. }
  1065. #endif
  1066. }
  1067. else
  1068. {
  1069. NET_DBG("tcp pcb full!");
  1070. net_lwip2_tcp_error(adapter_index, socket_id);
  1071. }
  1072. }
  1073. else
  1074. {
  1075. // LLOGE("udp new in net_lwip2");
  1076. prvlwip.socket[socket_id].pcb.udp = udp_new();
  1077. if (prvlwip.socket[socket_id].pcb.udp)
  1078. {
  1079. prvlwip.socket[socket_id].pcb.udp->recv_arg = uPV.p;
  1080. prvlwip.socket[socket_id].pcb.udp->recv = net_lwip2_udp_recv_cb;
  1081. prvlwip.socket[socket_id].pcb.udp->so_options |= SOF_BROADCAST|SOF_REUSEADDR;
  1082. }
  1083. else
  1084. {
  1085. NET_DBG("udp pcb full!");
  1086. net_lwip2_tcp_error(adapter_index, socket_id);
  1087. }
  1088. }
  1089. }
  1090. static int net_lwip2_create_socket(uint8_t is_tcp, uint64_t *tag, void *param, uint8_t is_ipv6, void *user_data)
  1091. {
  1092. // uint8_t index = (uint32_t)user_data;
  1093. uint8_t adapter_index = (uint32_t)user_data;
  1094. if ((uint32_t)adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return 0;
  1095. int i, socket_id;
  1096. socket_id = -1;
  1097. // OS_LOCK;
  1098. if (!prvlwip.socket[prvlwip.next_socket_index].in_use)
  1099. {
  1100. socket_id = prvlwip.next_socket_index;
  1101. prvlwip.next_socket_index++;
  1102. }
  1103. else
  1104. {
  1105. for (i = 0; i < MAX_SOCK_NUM; i++)
  1106. {
  1107. if (!prvlwip.socket[i].in_use)
  1108. {
  1109. socket_id = i;
  1110. prvlwip.next_socket_index = i + 1;
  1111. break;
  1112. }
  1113. }
  1114. }
  1115. if (prvlwip.next_socket_index >= MAX_SOCK_NUM)
  1116. {
  1117. prvlwip.next_socket_index = 0;
  1118. }
  1119. if (socket_id >= 0)
  1120. {
  1121. LWIP_ASSERT("socket must free before create", !prvlwip.socket[socket_id].pcb.ip);
  1122. prvlwip.socket_busy &= ~(1 << socket_id);
  1123. prvlwip.socket_connect &= ~(1 << socket_id);
  1124. prvlwip.socket_tag++;
  1125. *tag = prvlwip.socket_tag;
  1126. prvlwip.socket[socket_id].in_use = 1;
  1127. prvlwip.socket[socket_id].tag = *tag;
  1128. prvlwip.socket[socket_id].param = param;
  1129. prvlwip.socket[socket_id].is_tcp = is_tcp;
  1130. llist_traversal(&prvlwip.socket[socket_id].wait_ack_head, net_lwip2_del_data_cache, NULL);
  1131. llist_traversal(&prvlwip.socket[socket_id].tx_head, net_lwip2_del_data_cache, NULL);
  1132. llist_traversal(&prvlwip.socket[socket_id].rx_head, net_lwip2_del_data_cache, NULL);
  1133. // OS_UNLOCK;
  1134. // if (platform_get_current_task() == prvlwip.task_handle)
  1135. // {
  1136. // net_lwip2_create_socket_now(index, socket_id);
  1137. // return socket_id;
  1138. // }
  1139. platform_send_event(NULL, EV_LWIP_SOCKET_CREATE, socket_id, 0, user_data);
  1140. }
  1141. else
  1142. {
  1143. // OS_UNLOCK;
  1144. }
  1145. return socket_id;
  1146. }
  1147. //作为client绑定一个port,并连接remote_ip和remote_port对应的server
  1148. static int net_lwip2_socket_connect(int socket_id, uint64_t tag, uint16_t local_port, luat_ip_addr_t *remote_ip, uint16_t remote_port, void *user_data)
  1149. {
  1150. uint8_t adapter_index = (uint32_t)user_data;
  1151. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1152. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1153. if (result) return result;
  1154. prvlwip.socket[socket_id].local_port = local_port;
  1155. prvlwip.socket[socket_id].remote_port = remote_port;
  1156. platform_send_event(NULL, EV_LWIP_SOCKET_CONNECT, socket_id, remote_ip, user_data);
  1157. return 0;
  1158. }
  1159. //作为server绑定一个port,开始监听
  1160. static int net_lwip2_socket_listen(int socket_id, uint64_t tag, uint16_t local_port, void *user_data)
  1161. {
  1162. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1163. if (result) return result;
  1164. uint8_t adapter_index = (uint32_t)user_data;
  1165. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1166. prvlwip.socket[socket_id].local_port = local_port;
  1167. platform_send_event(NULL, EV_LWIP_SOCKET_LISTEN, socket_id, local_port, user_data);
  1168. return 0;
  1169. }
  1170. //作为server接受一个client
  1171. static int net_lwip2_socket_accept(int socket_id, uint64_t tag, luat_ip_addr_t *remote_ip, uint16_t *remote_port, void *user_data)
  1172. {
  1173. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1174. if (result) return result;
  1175. uint8_t adapter_index = (uint32_t)user_data;
  1176. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1177. *remote_ip = prvlwip.socket[socket_id].pcb.tcp->remote_ip;
  1178. *remote_port = prvlwip.socket[socket_id].pcb.tcp->remote_port;
  1179. return 0;
  1180. }
  1181. //主动断开一个tcp连接,需要走完整个tcp流程,用户需要接收到close ok回调才能确认彻底断开
  1182. static int net_lwip2_socket_disconnect(int socket_id, uint64_t tag, void *user_data)
  1183. {
  1184. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1185. if (result) return result;
  1186. uint8_t adapter_index = (uint32_t)user_data;
  1187. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1188. prvlwip.socket[socket_id].state = 1;
  1189. platform_send_event(NULL, EV_LWIP_SOCKET_CLOSE, socket_id, 1, user_data);
  1190. return 0;
  1191. }
  1192. static int net_lwip2_socket_force_close(int socket_id, void *user_data)
  1193. {
  1194. if (socket_id >= MAX_SOCK_NUM) return -1;
  1195. uint8_t adapter_index = (uint32_t)user_data;
  1196. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1197. if (prvlwip.socket[socket_id].in_use && !prvlwip.socket[socket_id].state)
  1198. {
  1199. prvlwip.socket[socket_id].state = 1;
  1200. platform_send_event(NULL, EV_LWIP_SOCKET_CLOSE, socket_id, 0, user_data);
  1201. }
  1202. return 0;
  1203. }
  1204. static int net_lwip2_socket_close(int socket_id, uint64_t tag, void *user_data)
  1205. {
  1206. if (socket_id >= MAX_SOCK_NUM) return -1;
  1207. uint8_t adapter_index = (uint32_t)user_data;
  1208. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1209. if (prvlwip.socket[socket_id].tag != tag)
  1210. {
  1211. NET_DBG("socket %d used by other!", socket_id);
  1212. return -1;
  1213. }
  1214. if (!prvlwip.socket[socket_id].in_use) return 0;
  1215. net_lwip2_socket_force_close(socket_id, user_data);
  1216. return 0;
  1217. }
  1218. static uint32_t net_lwip2_socket_read_data(int socket_id, uint8_t *buf, uint32_t *read_len, uint32_t len, socket_data_t *p)
  1219. {
  1220. uint32_t dummy_len;
  1221. dummy_len = ((p->len - p->read_pos) > (len - *read_len))?(len - *read_len):(p->len - p->read_pos);
  1222. memcpy(buf, p->data + p->read_pos, dummy_len);
  1223. p->read_pos += dummy_len;
  1224. if (p->read_pos >= p->len)
  1225. {
  1226. if (prvlwip.socket[socket_id].is_tcp)
  1227. {
  1228. platform_send_event(NULL, EV_LWIP_SOCKET_RX_DONE, socket_id, p->len, 0);
  1229. }
  1230. llist_del(&p->node);
  1231. luat_heap_free(p->data);
  1232. luat_heap_free(p);
  1233. }
  1234. *read_len += dummy_len;
  1235. return dummy_len;
  1236. }
  1237. static int net_lwip2_socket_receive(int socket_id, uint64_t tag, uint8_t *buf, uint32_t len, int flags, luat_ip_addr_t *remote_ip, uint16_t *remote_port, void *user_data)
  1238. {
  1239. if (socket_id >= MAX_SOCK_NUM) return -1;
  1240. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1241. if (result) return result;
  1242. uint8_t adapter_index = (uint32_t)user_data;
  1243. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1244. uint32_t read_len = 0;
  1245. if (buf)
  1246. {
  1247. SOCKET_LOCK(socket_id);
  1248. socket_data_t *p = (socket_data_t *)llist_traversal(&prvlwip.socket[socket_id].rx_head, net_lwip2_next_data_cache, &prvlwip.socket[socket_id]);
  1249. if (prvlwip.socket[socket_id].is_tcp)
  1250. {
  1251. while((read_len < len) && p)
  1252. {
  1253. prvlwip.socket[socket_id].rx_wait_size -= net_lwip2_socket_read_data(socket_id, buf + read_len, &read_len, len, p);
  1254. p = (socket_data_t *)llist_traversal(&prvlwip.socket[socket_id].rx_head, net_lwip2_next_data_cache, &prvlwip.socket[socket_id]);
  1255. }
  1256. }
  1257. else
  1258. {
  1259. if (p)
  1260. {
  1261. if (remote_ip)
  1262. {
  1263. *remote_ip = p->ip;
  1264. }
  1265. if (remote_port)
  1266. {
  1267. *remote_port = p->port;
  1268. }
  1269. prvlwip.socket[socket_id].rx_wait_size -= net_lwip2_socket_read_data(socket_id, buf + read_len, &read_len, len, p);
  1270. }
  1271. }
  1272. if (llist_empty(&prvlwip.socket[socket_id].rx_head))
  1273. {
  1274. prvlwip.socket[socket_id].rx_wait_size = 0;
  1275. }
  1276. SOCKET_UNLOCK(socket_id);
  1277. }
  1278. else
  1279. {
  1280. read_len = prvlwip.socket[socket_id].rx_wait_size;
  1281. }
  1282. return read_len;
  1283. }
  1284. static int net_lwip2_socket_send(int socket_id, uint64_t tag, const uint8_t *buf, uint32_t len, int flags, luat_ip_addr_t *remote_ip, uint16_t remote_port, void *user_data)
  1285. {
  1286. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1287. if (result) return result;
  1288. uint8_t adapter_index = (uint32_t)user_data;
  1289. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1290. SOCKET_LOCK(socket_id);
  1291. uint32_t save_len = 0;
  1292. uint32_t dummy_len = 0;
  1293. socket_data_t *p;
  1294. if (prvlwip.socket[socket_id].is_tcp)
  1295. {
  1296. while(save_len < len)
  1297. {
  1298. dummy_len = ((len - save_len) > SOCKET_BUF_LEN)?SOCKET_BUF_LEN:(len - save_len);
  1299. p = net_lwip2_create_data_node(socket_id, &buf[save_len], dummy_len, remote_ip, remote_port);
  1300. if (p)
  1301. {
  1302. llist_add_tail(&p->node, &prvlwip.socket[socket_id].tx_head);
  1303. }
  1304. else
  1305. {
  1306. SOCKET_UNLOCK(socket_id);
  1307. return -1;
  1308. }
  1309. save_len += dummy_len;
  1310. }
  1311. }
  1312. else
  1313. {
  1314. p = net_lwip2_create_data_node(socket_id, buf, len, remote_ip, remote_port);
  1315. if (p)
  1316. {
  1317. llist_add_tail(&p->node, &prvlwip.socket[socket_id].tx_head);
  1318. }
  1319. else
  1320. {
  1321. SOCKET_UNLOCK(socket_id);
  1322. return -1;
  1323. }
  1324. }
  1325. SOCKET_UNLOCK(socket_id);
  1326. platform_send_event(NULL, EV_LWIP_SOCKET_TX, socket_id, 0, user_data);
  1327. result = len;
  1328. return result;
  1329. }
  1330. void net_lwip2_socket_clean(int *vaild_socket_list, uint32_t num, void *user_data)
  1331. {
  1332. uint8_t adapter_index = (uint32_t)user_data;
  1333. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return;
  1334. int socket_list[MAX_SOCK_NUM];
  1335. memset(socket_list, 0, sizeof(socket_list));
  1336. uint32_t i;
  1337. for(i = 0; i < num; i++)
  1338. {
  1339. if ( (vaild_socket_list[i] > 0) && (vaild_socket_list[i] < MAX_SOCK_NUM) )
  1340. {
  1341. socket_list[vaild_socket_list[i]] = 1;
  1342. }
  1343. NET_DBG("%d,%d",i,vaild_socket_list[i]);
  1344. }
  1345. for(i = 0; i < MAX_SOCK_NUM; i++)
  1346. {
  1347. NET_DBG("%d,%d",i,socket_list[i]);
  1348. if ( !socket_list[i] )
  1349. {
  1350. net_lwip2_socket_force_close(i, user_data);
  1351. }
  1352. }
  1353. }
  1354. static int net_lwip2_get_local_ip_info(luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway, void *user_data)
  1355. {
  1356. uint8_t adapter_index = (uint32_t)user_data;
  1357. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1358. if (!prvlwip.lwip_netif[adapter_index]) return -1;
  1359. *ip = prvlwip.lwip_netif[adapter_index]->ip_addr;
  1360. *submask = prvlwip.lwip_netif[adapter_index]->netmask;
  1361. *gateway = prvlwip.lwip_netif[adapter_index]->gw;
  1362. return 0;
  1363. }
  1364. static int net_lwip2_get_full_ip_info(luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway, luat_ip_addr_t *ipv6, void *user_data)
  1365. {
  1366. uint8_t adapter_index = (uint32_t)user_data;
  1367. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1368. if (!prvlwip.lwip_netif[adapter_index]) return -1;
  1369. *ip = prvlwip.lwip_netif[adapter_index]->ip_addr;
  1370. *submask = prvlwip.lwip_netif[adapter_index]->netmask;
  1371. *gateway = prvlwip.lwip_netif[adapter_index]->gw;
  1372. #if LWIP_IPV6
  1373. luat_ip_addr_t *local_ip = net_lwip2_get_ip6(adapter_index);
  1374. if (local_ip)
  1375. {
  1376. *ipv6 = *local_ip;
  1377. }
  1378. else
  1379. {
  1380. ipv6->type = 0xff;
  1381. }
  1382. #endif
  1383. return 0;
  1384. }
  1385. static int net_lwip2_user_cmd(int socket_id, uint64_t tag, uint32_t cmd, uint32_t value, void *user_data)
  1386. {
  1387. return 0;
  1388. }
  1389. static int net_lwip2_dns(const char *domain_name, uint32_t len, void *param, void *user_data)
  1390. {
  1391. if ((uint32_t)user_data >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1392. uint8_t adapter_index = (uint32_t)user_data;
  1393. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1394. char *prv_domain_name = (char *)zalloc(len + 1);
  1395. memcpy(prv_domain_name, domain_name, len);
  1396. platform_send_event(NULL, EV_LWIP_SOCKET_DNS, prv_domain_name, param, user_data);
  1397. return 0;
  1398. }
  1399. static int net_lwip2_dns_ipv6(const char *domain_name, uint32_t len, void *param, void *user_data)
  1400. {
  1401. if ((uint32_t)user_data >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1402. uint8_t adapter_index = (uint32_t)user_data;
  1403. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1404. char *prv_domain_name = (char *)zalloc(len + 1);
  1405. memcpy(prv_domain_name, domain_name, len);
  1406. // platform_send_event(prvlwip.task_handle, (prvlwip.ec618_ipv6.type != IPADDR_TYPE_V6)?EV_LWIP_SOCKET_DNS:EV_LWIP_SOCKET_DNS_IPV6, prv_domain_name, param, user_data);
  1407. platform_send_event(NULL, EV_LWIP_SOCKET_DNS_IPV6, prv_domain_name, param, user_data);
  1408. return 0;
  1409. }
  1410. static int net_lwip2_set_dns_server(uint8_t server_index, luat_ip_addr_t *ip, void *user_data)
  1411. {
  1412. uint8_t adapter_index = (uint32_t)user_data;
  1413. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1414. if (server_index >= MAX_DNS_SERVER) return -1;
  1415. if (prvlwip.dns_client[adapter_index] == NULL) return -1;
  1416. memcpy(&prvlwip.dns_client[adapter_index]->dns_server[server_index], ip, sizeof(luat_ip_addr_t));
  1417. prvlwip.dns_client[adapter_index]->is_static_dns[server_index] = 1;
  1418. char buff[64] = {0};
  1419. ipaddr_ntoa_r(ip, buff, 64);
  1420. NET_DBG("设置DNS服务器 id %d index %d ip %s", adapter_index, server_index, buff);
  1421. return 0;
  1422. }
  1423. static int net_lwip2_set_mac(uint8_t *mac, void *user_data)
  1424. {
  1425. // uint8_t index = (uint32_t)user_data;
  1426. // if (index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1427. // if (!prvlwip.lwip_netif) return -1;
  1428. // memcpy(prvlwip.lwip_netif->hwaddr, mac, 6);
  1429. return -1;
  1430. }
  1431. static int net_lwip2_set_static_ip(luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway, luat_ip_addr_t *ipv6, void *user_data)
  1432. {
  1433. uint8_t index = (uint32_t)user_data;
  1434. if (index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return -1;
  1435. if (!prvlwip.lwip_netif[index]) return -1;
  1436. luat_ip_addr_t *p_ip = luat_heap_zalloc(sizeof(luat_ip_addr_t) * 4);
  1437. if (p_ip == NULL) {
  1438. NET_ERR("net_lwip2_set_static_ip malloc fail");
  1439. return -1;
  1440. }
  1441. memset(p_ip, 0, sizeof(luat_ip_addr_t) * 4);
  1442. if (ip) {
  1443. memcpy(&p_ip[0], ip, sizeof(luat_ip_addr_t));
  1444. }
  1445. if (submask) {
  1446. memcpy(&p_ip[1], submask, sizeof(luat_ip_addr_t));
  1447. }
  1448. if (gateway) {
  1449. memcpy(&p_ip[2], gateway, sizeof(luat_ip_addr_t));
  1450. }
  1451. if (ipv6) {
  1452. memcpy(&p_ip[3], ipv6, sizeof(luat_ip_addr_t));
  1453. }
  1454. platform_send_event(prvlwip.task_handle, EV_LWIP_NETIF_SET_IP, p_ip, ipv6 != NULL, user_data);
  1455. return 0;
  1456. }
  1457. static int32_t net_lwip2_dummy_callback(void *pData, void *pParam)
  1458. {
  1459. return 0;
  1460. }
  1461. static void net_lwip2_socket_set_callback(CBFuncEx_t cb_fun, void *param, void *user_data)
  1462. {
  1463. uint8_t adapter_index = (uint32_t)user_data;
  1464. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) return;
  1465. prvlwip.socket_cb = cb_fun?cb_fun:net_lwip2_dummy_callback;
  1466. prvlwip.user_data = param;
  1467. }
  1468. int net_lwip2_getsockopt2(int socket_id, uint64_t tag, int level, int optname, void *optval, uint32_t *optlen, void *user_data) {
  1469. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1470. if (result) return result;
  1471. #if LWIP_SOCKET
  1472. return lwip_getsockopt(socket_id, level, optname, optval, optlen);
  1473. #else
  1474. return 0;
  1475. #endif
  1476. }
  1477. int net_lwip2_setsockopt2(int socket_id, uint64_t tag, int level, int optname, const void *optval, uint32_t optlen, void *user_data) {
  1478. int result = net_lwip2_check_socket(user_data, socket_id, tag);
  1479. if (result) return result;
  1480. #if LWIP_SOCKET
  1481. // return lwip_setsockopt(socket_id, level, optname, optval, optlen);
  1482. return 0;
  1483. #else
  1484. return 0;
  1485. #endif
  1486. }
  1487. static const network_adapter_info prv_net_lwip2_adapter =
  1488. {
  1489. .check_ready = net_lwip2_check_ready,
  1490. .create_soceket = net_lwip2_create_socket,
  1491. .socket_connect = net_lwip2_socket_connect,
  1492. .socket_listen = net_lwip2_socket_listen,
  1493. .socket_accept = net_lwip2_socket_accept,
  1494. .socket_disconnect = net_lwip2_socket_disconnect,
  1495. .socket_close = net_lwip2_socket_close,
  1496. .socket_force_close = net_lwip2_socket_force_close,
  1497. .socket_receive = net_lwip2_socket_receive,
  1498. .socket_send = net_lwip2_socket_send,
  1499. .socket_check = net_lwip2_socket_check,
  1500. .socket_clean = net_lwip2_socket_clean,
  1501. .getsockopt = net_lwip2_getsockopt2,
  1502. .setsockopt = net_lwip2_setsockopt2,
  1503. .user_cmd = net_lwip2_user_cmd,
  1504. .dns = net_lwip2_dns,
  1505. .set_dns_server = net_lwip2_set_dns_server,
  1506. // .dns = net_lwip2_dns,
  1507. .dns_ipv6 = net_lwip2_dns_ipv6,
  1508. .set_mac = net_lwip2_set_mac,
  1509. .set_static_ip = net_lwip2_set_static_ip,
  1510. .get_local_ip_info = net_lwip2_get_local_ip_info,
  1511. .get_full_ip_info = net_lwip2_get_full_ip_info,
  1512. .socket_set_callback = net_lwip2_socket_set_callback,
  1513. .name = "lwip",
  1514. .max_socket_num = MAX_SOCK_NUM,
  1515. .no_accept = 1,
  1516. .is_posix = 1,
  1517. .check_ack = net_lwip2_check_ack
  1518. };
  1519. void net_lwip2_register_adapter(uint8_t adapter_index)
  1520. {
  1521. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) {
  1522. return; // 超范围了
  1523. }
  1524. if ( (1 << adapter_index) & register_statue) {
  1525. return; // 注册过了
  1526. }
  1527. network_register_adapter(adapter_index, &prv_net_lwip2_adapter, adapter_index);
  1528. register_statue |= (1 << adapter_index);
  1529. }
  1530. static int net_lwip2_check_ack(uint8_t adapter_index, int socket_id) {
  1531. if (prvlwip.socket[socket_id].pcb.tcp == NULL)
  1532. return 0;
  1533. if (!llist_empty(&prvlwip.socket[socket_id].wait_ack_head))
  1534. {
  1535. NET_ERR("socekt %d not all ack", socket_id);
  1536. prvlwip.socket_busy |= (1 << socket_id);
  1537. return -1;
  1538. }
  1539. if (!llist_empty(&prvlwip.socket[socket_id].tx_head))
  1540. {
  1541. NET_ERR("socekt %d not all send", socket_id);
  1542. prvlwip.socket_busy |= (1 << socket_id);
  1543. return -1;
  1544. }
  1545. if (prvlwip.socket[socket_id].pcb.tcp->snd_buf != TCP_SND_BUF)
  1546. {
  1547. NET_ERR("socket %d send buf %ubytes, need %u",socket_id, prvlwip.socket[socket_id].pcb.tcp->snd_buf, TCP_SND_BUF);
  1548. prvlwip.socket_busy |= (1 << socket_id);
  1549. }
  1550. else
  1551. {
  1552. prvlwip.socket_busy &= ~(1 << socket_id);
  1553. }
  1554. return 0;
  1555. }
  1556. #if !defined(CHIP_EC718) && !defined(CHIP_EC618) && !defined(CHIP_EC716) && !defined(CONFIG_SOC_8910)
  1557. int net_lwip_check_all_ack(int socket_id)
  1558. {
  1559. return net_lwip2_check_ack(0, socket_id);
  1560. }
  1561. #endif
  1562. void net_lwip2_set_link_state(uint8_t adapter_index, uint8_t updown)
  1563. {
  1564. // LLOGD("net_lwip2_set_link_state %d %d", adapter_index, updown);
  1565. platform_send_event(NULL, EV_LWIP_NETIF_LINK_STATE, updown, 0, adapter_index);
  1566. }
  1567. struct netif * net_lwip2_get_netif(uint8_t adapter_index)
  1568. {
  1569. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY)
  1570. return NULL;
  1571. return prvlwip.lwip_netif[adapter_index];
  1572. }
  1573. static ip_addr_t *net_lwip2_get_ip6(uint8_t adapter_index)
  1574. {
  1575. #if LWIP_IPV6
  1576. int i;
  1577. for(i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++)
  1578. {
  1579. if (IP6_ADDR_PREFERRED == (prvlwip.lwip_netif[adapter_index]->ip6_addr_state[i] & IP6_ADDR_PREFERRED))
  1580. {
  1581. return &prvlwip.lwip_netif[adapter_index]->ip6_addr[i];
  1582. }
  1583. }
  1584. for(i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++)
  1585. {
  1586. if (prvlwip.lwip_netif[adapter_index]->ip6_addr_state[i] & IP6_ADDR_VALID)
  1587. {
  1588. return &prvlwip.lwip_netif[adapter_index]->ip6_addr[i];
  1589. }
  1590. }
  1591. #endif
  1592. return NULL;
  1593. }
  1594. void net_lwip2_set_dhcp_client(uint8_t adapter_index, dhcp_client_info_t *dhcp_client) {
  1595. if (adapter_index >= NW_ADAPTER_INDEX_LWIP_NETIF_QTY) {
  1596. return; // 超范围了
  1597. }
  1598. if (prvlwip.dhcpc[adapter_index]) {
  1599. return;
  1600. }
  1601. prvlwip.dhcpc[adapter_index] = dhcp_client;
  1602. }