luat_lib_network.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  1. /*
  2. @module network
  3. @summary 网络接口适配
  4. @version 1.0
  5. @date 2022.04.11
  6. */
  7. #include "luat_base.h"
  8. #ifdef LUAT_USE_NETWORK
  9. #include "luat_network_adapter.h"
  10. #include "luat_rtos.h"
  11. #include "luat_zbuff.h"
  12. #define LUAT_LOG_TAG "network"
  13. #include "luat_log.h"
  14. //static const char NW_TYPE[] = "NWA*";
  15. #define LUAT_NW_CTRL_TYPE "NWCTRL*"
  16. typedef struct
  17. {
  18. network_ctrl_t *netc;
  19. int cb_ref; //回调函数
  20. char *task_name;
  21. }luat_network_ctrl_t;
  22. static int32_t l_network_callback(lua_State *L, void* ptr)
  23. {
  24. rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
  25. luat_network_ctrl_t *l_ctrl =(luat_network_ctrl_t *)msg->ptr;
  26. if (l_ctrl->netc)
  27. {
  28. if (l_ctrl->cb_ref)
  29. {
  30. lua_geti(L, LUA_REGISTRYINDEX, l_ctrl->cb_ref);
  31. if (lua_isfunction(L, -1)) {
  32. lua_pushlightuserdata(L, l_ctrl);
  33. lua_pushinteger(L, msg->arg1);
  34. lua_pushinteger(L, msg->arg2);
  35. lua_call(L, 3, 0);
  36. }
  37. }
  38. else if (l_ctrl->task_name)
  39. {
  40. lua_getglobal(L, "sys_send");
  41. if (lua_isfunction(L, -1)) {
  42. lua_pushstring(L, l_ctrl->task_name);
  43. lua_pushinteger(L, msg->arg1);
  44. lua_pushinteger(L, msg->arg2);
  45. lua_call(L, 3, 0);
  46. }
  47. }
  48. else
  49. {
  50. lua_getglobal(L, "sys_pub");
  51. if (lua_isfunction(L, -1)) {
  52. lua_pushstring(L, LUAT_NW_CTRL_TYPE);
  53. lua_pushinteger(L, l_ctrl->netc->adapter_index);
  54. lua_pushinteger(L, l_ctrl->netc->socket_id);
  55. lua_pushinteger(L, msg->arg1);
  56. lua_pushinteger(L, msg->arg2);
  57. lua_call(L, 5, 0);
  58. }
  59. }
  60. }
  61. lua_pushinteger(L, 0);
  62. return 1;
  63. }
  64. static int32_t luat_lib_network_callback(void *data, void *param)
  65. {
  66. OS_EVENT *event = (OS_EVENT *)data;
  67. rtos_msg_t msg;
  68. msg.handler = l_network_callback;
  69. msg.ptr = param;
  70. msg.arg1 = event->ID & 0x0fffffff;
  71. msg.arg2 = event->Param1;
  72. luat_msgbus_put(&msg, 0);
  73. return 0;
  74. }
  75. static luat_network_ctrl_t * l_get_ctrl(lua_State *L, int index)
  76. {
  77. if (luaL_testudata(L, 1, LUAT_NW_CTRL_TYPE))
  78. {
  79. return ((luat_network_ctrl_t *)luaL_checkudata(L, 1, LUAT_NW_CTRL_TYPE));
  80. }
  81. else
  82. {
  83. return ((luat_network_ctrl_t *)lua_touserdata(L, 1));
  84. }
  85. }
  86. // __gc
  87. static int l_network_gc(lua_State *L)
  88. {
  89. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  90. if (l_ctrl->netc)
  91. {
  92. network_force_close_socket(l_ctrl->netc);
  93. network_release_ctrl(l_ctrl->netc);
  94. l_ctrl->netc = NULL;
  95. }
  96. if (l_ctrl->cb_ref)
  97. {
  98. luaL_unref(L, LUA_REGISTRYINDEX, l_ctrl->cb_ref);
  99. l_ctrl->cb_ref = 0;
  100. }
  101. if (l_ctrl->task_name)
  102. {
  103. luat_heap_free(l_ctrl->task_name);
  104. l_ctrl->task_name = 0;
  105. }
  106. return 0;
  107. }
  108. /*
  109. 在某个适配的网卡上申请一个network_ctrl
  110. @api network.create(adapter, cb)
  111. @int 适配器序号, 只能是network.ETH0,network.STA,network.AP,如果不填,会选择最后一个注册的适配器
  112. @string or function string为消息通知的taskName,function则为回调函数,如果固件没有内置sys_wait,则必须是function
  113. 当通过回调函数回调消息时,输入给function一共3个参数:
  114. param1为申请的network_ctrl
  115. param2为具体的消息,只能是network.RESET, network.LINK, network.ON_LINE, network.TX_OK, network.RX_NEW, network.CLOSE等等
  116. param3为消息对应的参数
  117. @return 成功返回network_ctrl,失败返回nil
  118. @usage
  119. local netc = network.create(network.ETH0, socket_cb_fun) --以太网网卡上申请一个network_ctrl,通过socket_cb_fun回调相关消息
  120. local netc = network.create(network.ETH0, "IOT_TASK") --以太网网卡上申请一个network_ctrl,通过sendMsg方式通知taskName为"IOT_TASK"回调相关消息
  121. */
  122. static int l_network_create(lua_State *L)
  123. {
  124. int adapter_index = luaL_optinteger(L, 1, network_get_last_register_adapter());
  125. if (adapter_index < 0 || adapter_index >= NW_ADAPTER_QTY)
  126. {
  127. lua_pushnil(L);
  128. return 1;
  129. }
  130. luat_network_ctrl_t *l_ctrl = (luat_network_ctrl_t *)lua_newuserdata(L, sizeof(luat_network_ctrl_t));
  131. if (!l_ctrl)
  132. {
  133. lua_pushnil(L);
  134. return 1;
  135. }
  136. l_ctrl->netc = network_alloc_ctrl(adapter_index);
  137. if (!l_ctrl->netc)
  138. {
  139. LLOGD("create fail");
  140. lua_pushnil(L);
  141. return 1;
  142. }
  143. network_init_ctrl(l_ctrl->netc, NULL, luat_lib_network_callback, l_ctrl);
  144. if (lua_isfunction(L, 2))
  145. {
  146. lua_pushvalue(L, 2);
  147. l_ctrl->cb_ref = luaL_ref(L, LUA_REGISTRYINDEX);
  148. l_ctrl->task_name = NULL;
  149. }
  150. else if (lua_isstring(L, 2))
  151. {
  152. l_ctrl->cb_ref = 0;
  153. size_t len;
  154. const char *buf;
  155. buf = lua_tolstring(L, 2, &len);//取出字符串数据
  156. l_ctrl->task_name = luat_heap_malloc(len + 1);
  157. memset(l_ctrl->task_name, 0, len + 1);
  158. memcpy(l_ctrl->task_name, buf, len);
  159. }
  160. luaL_setmetatable(L, LUAT_NW_CTRL_TYPE);
  161. return 1;
  162. }
  163. /*
  164. 配置是否打开debug信息
  165. @api network.debug(ctrl, onoff)
  166. @user_data network.create得到的ctrl
  167. @boolean true 打开debug开关
  168. @return nil 无返回值
  169. @usage network.debug(ctrl, true)
  170. */
  171. static int l_network_set_debug(lua_State *L)
  172. {
  173. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  174. if (lua_isboolean(L, 2))
  175. {
  176. l_ctrl->netc->is_debug = lua_toboolean(L, 2);
  177. }
  178. return 0;
  179. }
  180. /*
  181. 配置network一些信息,
  182. @api network.config(ctrl, local_port, is_udp, is_tls, keep_idle, keep_interval, keep_cnt, server_cert, client_cert, client_key, client_password)
  183. @user_data network.create得到的ctrl
  184. @int 本地端口号,小端格式,如果不写,则自动分配一个,如果用户填了端口号则需要小于60000, 默认不写
  185. @boolean 是否是UDP,默认false
  186. @boolean 是否是加密传输,默认false
  187. @int tcp keep live模式下的idle时间,如果留空则表示不启用,如果是不支持标准posix接口的网卡(比如W5500),则为心跳间隔
  188. @int tcp keep live模式下的探测间隔时间
  189. @int tcp keep live模式下的探测次数
  190. @string TCP模式下的服务器ca证书数据,UDP模式下的PSK,不需要加密传输写nil,后续参数也全部nil
  191. @string TCP模式下的客户端ca证书数据,UDP模式下的PSK-ID,TCP模式下如果不需要验证客户端证书时,忽略,一般不需要验证客户端证书
  192. @string TCP模式下的客户端私钥加密数据
  193. @string TCP模式下的客户端私钥口令数据
  194. @return nil 无返回值
  195. @usage network.config(ctrl) --最普通的TCP传输
  196. network.config(ctrl, nil, nil ,true) --最普通的加密TCP传输,证书都不用验证的那种
  197. */
  198. static int l_network_config(lua_State *L)
  199. {
  200. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  201. uint8_t is_udp = 0;
  202. uint8_t is_tls = 0;
  203. int param_pos = 1;
  204. uint32_t keep_idle, keep_interval, keep_cnt;
  205. const char *server_cert = NULL;
  206. const char *client_cert = NULL;
  207. const char *client_key = NULL;
  208. const char *client_password = NULL;
  209. size_t server_cert_len, client_cert_len, client_key_len, client_password_len;
  210. uint16_t local_port = luaL_optinteger(L, ++param_pos, 0);
  211. if (lua_isboolean(L, ++param_pos))
  212. {
  213. is_udp = lua_toboolean(L, param_pos);
  214. }
  215. if (lua_isboolean(L, ++param_pos))
  216. {
  217. is_tls = lua_toboolean(L, param_pos);
  218. }
  219. keep_idle = luaL_optinteger(L, ++param_pos, 0);
  220. keep_interval = luaL_optinteger(L, ++param_pos, 0);
  221. keep_cnt = luaL_optinteger(L, ++param_pos, 0);
  222. if (lua_isstring(L, ++param_pos))
  223. {
  224. server_cert_len = 0;
  225. server_cert = luaL_checklstring(L, param_pos, &server_cert_len);
  226. }
  227. if (lua_isstring(L, ++param_pos))
  228. {
  229. client_cert_len = 0;
  230. client_cert = luaL_checklstring(L, param_pos, &client_cert_len);
  231. }
  232. if (lua_isstring(L, ++param_pos))
  233. {
  234. client_key_len = 0;
  235. client_key = luaL_checklstring(L, param_pos, &client_key_len);
  236. }
  237. if (lua_isstring(L, ++param_pos))
  238. {
  239. client_password_len = 0;
  240. client_password = luaL_checklstring(L, param_pos, &client_password_len);
  241. }
  242. network_set_base_mode(l_ctrl->netc, !is_udp, 10000, keep_idle, keep_idle, keep_interval, keep_cnt);
  243. network_set_local_port(l_ctrl->netc, local_port);
  244. if (is_tls)
  245. {
  246. network_init_tls(l_ctrl->netc, (server_cert || client_cert)?2:0);
  247. if (is_udp)
  248. {
  249. network_set_psk_info(l_ctrl->netc, server_cert, server_cert_len, client_key, client_key_len);
  250. }
  251. else
  252. {
  253. if (server_cert)
  254. {
  255. network_set_server_cert(l_ctrl->netc, server_cert, server_cert_len);
  256. }
  257. if (client_cert)
  258. {
  259. network_set_client_cert(l_ctrl->netc, client_cert, client_cert_len,
  260. client_key, client_key_len,
  261. client_password, client_password_len);
  262. }
  263. }
  264. }
  265. else
  266. {
  267. network_deinit_tls(l_ctrl->netc);
  268. }
  269. return 0;
  270. }
  271. /*
  272. 等待网卡linkup
  273. @api network.linkup(ctrl)
  274. @user_data network.create得到的ctrl
  275. @return boolean true有异常发生,false没有异常,如果有error则不需要看下一个返回值了
  276. @return boolean true已经linkup,false没有linkup,之后需要接收network.LINK消息
  277. @usage local error, result = network.linkup(ctrl)
  278. */
  279. static int l_network_linkup(lua_State *L)
  280. {
  281. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  282. int result = network_wait_link_up(l_ctrl->netc, 0);
  283. lua_pushboolean(L, result < 0);
  284. lua_pushboolean(L, result == 0);
  285. return 2;
  286. }
  287. /*
  288. 作为客户端连接服务器
  289. @api network.connect(ctrl, ip, remote_port)
  290. @user_data network.create得到的ctrl
  291. @string or int ip或者域名,如果是IPV4,可以是大端格式的int值
  292. @int 服务器端口号,小端格式
  293. @return boolean true有异常发生,false没有异常,如果有error则不需要看下一个返回值了,如果有异常,后续要close
  294. @return boolean true已经connect,false没有connect,之后需要接收network.ON_LINE消息
  295. @usage local error, result = network.connect(ctrl, "xxx.xxx.xxx.xxx", xxxx)
  296. */
  297. static int l_network_connect(lua_State *L)
  298. {
  299. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  300. luat_ip_addr_t ip_addr;
  301. const char *ip;
  302. size_t ip_len;
  303. ip_addr.is_ipv6 = 0xff;
  304. if (lua_isinteger(L, 2))
  305. {
  306. ip_addr.is_ipv6 = 0;
  307. ip_addr.ipv4 = lua_tointeger(L, 2);
  308. ip = NULL;
  309. ip_len = 0;
  310. }
  311. else
  312. {
  313. ip_len = 0;
  314. ip = luaL_checklstring(L, 2, &ip_len);
  315. }
  316. uint16_t remote_port = luaL_checkinteger(L, 3);
  317. int result = network_connect(l_ctrl->netc, ip, ip_len, ip_addr.is_ipv6?NULL:&ip_addr, remote_port, 0);
  318. lua_pushboolean(L, result < 0);
  319. lua_pushboolean(L, result == 0);
  320. return 2;
  321. }
  322. /*
  323. 作为客户端断开连接
  324. @api network.discon(ctrl)
  325. @user_data network.create得到的ctrl
  326. @return
  327. boolean true有异常发生,false没有异常,如果有error则不需要看下一个返回值了
  328. boolean true已经断开,false没有断开,之后需要接收network.CLOSED消息
  329. @usage local error, result = network.discon(ctrl)
  330. */
  331. static int l_network_disconnect(lua_State *L)
  332. {
  333. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  334. int result = network_close(l_ctrl->netc, 0);
  335. lua_pushboolean(L, result < 0);
  336. lua_pushboolean(L, result == 0);
  337. return 2;
  338. }
  339. /*
  340. 强制关闭socket
  341. @api network.close(ctrl)
  342. @user_data network.create得到的ctrl
  343. @return 无
  344. */
  345. static int l_network_close(lua_State *L)
  346. {
  347. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  348. network_force_close_socket(l_ctrl->netc);
  349. return 0;
  350. }
  351. /*
  352. 发送数据给对端
  353. @api network.tx(ctrl, data, ip, port, flag)
  354. @user_data network.create得到的ctrl
  355. @string or user_data zbuff 要发送的数据
  356. @string or int 对端IP,如果是TCP应用则忽略,如果是UDP,如果留空则用connect时候的参数,如果是IPV4,可以是大端格式的int值
  357. @int 对端端口号,小端格式,如果是TCP应用则忽略,如果是UDP,如果留空则用connect时候的参数
  358. @int 发送参数,目前预留,不起作用
  359. @return boolean true有异常发生,false没有异常,如果有error则不需要看下一个返回值了,如果有异常,后续要close
  360. @return boolean true缓冲区满了,false没有异常,如果true,则需要等待一段时间或者等到network.TX_OK消息后再尝试发送,同时忽略下一个返回值
  361. @return boolean true已经收到应答,false没有收到应答,之后需要接收network.TX_OK消息, 也可以忽略继续发送,直到full==true
  362. @usage local error, full, result = network.tx(ctrl, "123456", "xxx.xxx.xxx.xxx", xxxx)
  363. */
  364. static int l_network_tx(lua_State *L)
  365. {
  366. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  367. luat_ip_addr_t ip_addr;
  368. luat_zbuff_t *buff = NULL;
  369. const char *ip;
  370. const char *data;
  371. size_t ip_len, data_len;
  372. ip_addr.is_ipv6 = 0xff;
  373. if (lua_isstring(L, 2))
  374. {
  375. data_len = 0;
  376. data = luaL_checklstring(L, 2, &data_len);
  377. }
  378. else
  379. {
  380. buff = ((luat_zbuff_t *)luaL_checkudata(L, 2, LUAT_ZBUFF_TYPE));
  381. data = buff->addr;
  382. data_len = buff->used;
  383. }
  384. if (lua_isstring(L, 3))
  385. {
  386. ip_len = 0;
  387. ip = luaL_checklstring(L, 3, &ip_len);
  388. if (network_string_is_ipv4(ip, ip_len))
  389. {
  390. ip_addr.is_ipv6 = 0;
  391. ip_addr.ipv4 = network_string_to_ipv4(ip, ip_len);
  392. }
  393. else
  394. {
  395. char *name = luat_heap_malloc(ip_len + 1);
  396. memcpy(name, ip, ip_len);
  397. name[ip_len] = 0;
  398. network_string_to_ipv6(name, &ip_addr);
  399. free(name);
  400. }
  401. }
  402. else if (lua_isinteger(L, 3))
  403. {
  404. ip_addr.is_ipv6 = 0;
  405. ip_addr.ipv4 = lua_tointeger(L, 3);
  406. }
  407. uint32_t tx_len;
  408. int result = network_tx(l_ctrl->netc, data, data_len, luaL_optinteger(L, 5, 0), (ip_addr.is_ipv6 != 0xff)?&ip_addr:NULL, luaL_optinteger(L, 4, 0), &tx_len, 0);
  409. lua_pushboolean(L, result < 0);
  410. lua_pushboolean(L, tx_len != data_len);
  411. lua_pushboolean(L, result == 0);
  412. return 3;
  413. }
  414. /*
  415. 接收对端发出的数据,注意数据已经缓存在底层,使用本函数只是提取出来,UDP模式下一次只会取出一个数据包
  416. @api network.rx(ctrl, buff, flag)
  417. @user_data network.create得到的ctrl
  418. @user_data zbuff 存放接收的数据,如果缓冲区不够大会自动扩容
  419. @int 接收参数,目前预留,不起作用
  420. @return boolean true有异常发生,false没有异常,如果有异常,后续要close
  421. @return int 本次接收到数据长度
  422. @return string 对端IP,只有UDP模式下才有意义,TCP模式返回nil,注意返回的格式,如果是IPV4,1byte 0x00 + 4byte地址 如果是IPV6,1byte 0x01 + 16byte地址
  423. @return int 对端port,只有UDP模式下才有意义,TCP模式返回0
  424. @usage local error, data_len, ip, port = network.rx(ctrl, buff)
  425. */
  426. static int l_network_rx(lua_State *L)
  427. {
  428. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  429. luat_zbuff_t *buff = ((luat_zbuff_t *)luaL_checkudata(L, 2, LUAT_ZBUFF_TYPE));
  430. luat_ip_addr_t ip_addr;
  431. uint8_t ip[17];
  432. uint16_t port;
  433. uint8_t new_flag = 0;
  434. int rx_len;
  435. int total_len;
  436. int result = network_rx(l_ctrl->netc, NULL, 0, 0, NULL, NULL, &total_len);
  437. if (result < 0)
  438. {
  439. lua_pushboolean(L, 1);
  440. lua_pushinteger(L, 0);
  441. lua_pushnil(L);
  442. lua_pushnil(L);
  443. }
  444. else if (!total_len)
  445. {
  446. lua_pushboolean(L, 0);
  447. lua_pushinteger(L, 0);
  448. lua_pushnil(L);
  449. lua_pushnil(L);
  450. }
  451. else
  452. {
  453. if ((buff->len - buff->used) < total_len)
  454. {
  455. __zbuff_resize(buff, total_len + buff->used);
  456. }
  457. result = network_rx(l_ctrl->netc, buff->addr + buff->used, total_len, 0, &ip_addr, &port, &rx_len);
  458. if (result < 0)
  459. {
  460. lua_pushboolean(L, 1);
  461. lua_pushinteger(L, 0);
  462. lua_pushnil(L);
  463. lua_pushnil(L);
  464. }
  465. else if (!rx_len)
  466. {
  467. lua_pushboolean(L, 0);
  468. lua_pushinteger(L, 0);
  469. lua_pushnil(L);
  470. lua_pushnil(L);
  471. }
  472. else
  473. {
  474. buff->used += rx_len;
  475. lua_pushboolean(L, 0);
  476. lua_pushinteger(L, rx_len);
  477. if (l_ctrl->netc->is_tcp)
  478. {
  479. lua_pushnil(L);
  480. lua_pushnil(L);
  481. }
  482. else
  483. {
  484. if (ip_addr.is_ipv6)
  485. {
  486. ip[0] = 0;
  487. memcpy(ip + 1, &ip_addr.ipv4, 4);
  488. lua_pushlstring(L, ip, 5);
  489. }
  490. else
  491. {
  492. ip[0] = 1;
  493. memcpy(ip + 1, &ip_addr.ipv6_u8_addr, 16);
  494. lua_pushlstring(L, ip, 17);
  495. }
  496. lua_pushinteger(L, port);
  497. }
  498. }
  499. }
  500. return 4;
  501. }
  502. /*
  503. 等待新的socket消息,在连接成功和发送数据成功后,使用一次将network状态转换到接收新数据
  504. @api network.wait(ctrl)
  505. @user_data network.create得到的ctrl
  506. @return boolean true有异常发生,false没有异常,如果有异常,后续要close
  507. @return boolean true有新的数据需要接收,false没有数据,之后需要接收network.EVENT消息
  508. @usage local error, result = network.wait(ctrl)
  509. */
  510. static int l_network_wait(lua_State *L)
  511. {
  512. luat_network_ctrl_t *l_ctrl = l_get_ctrl(L, 1);
  513. int result = network_wait_event(l_ctrl->netc, NULL, 0, NULL);
  514. lua_pushboolean(L, result < 0);
  515. lua_pushboolean(L, result == 0);
  516. return 2;
  517. }
  518. static int l_network_listen(lua_State *L)
  519. {
  520. }
  521. static int l_network_accept(lua_State *L)
  522. {
  523. }
  524. /*
  525. 主动释放掉network_ctrl
  526. @api network.release(ctrl)
  527. @user_data network.create得到的ctrl
  528. @return 无
  529. @usage network.release(ctrl)
  530. */
  531. static int l_network_release(lua_State *L)
  532. {
  533. return l_network_gc(L);
  534. }
  535. #include "rotable2.h"
  536. static const rotable_Reg_t reg_network_adapter[] =
  537. {
  538. {"create", ROREG_FUNC(l_network_create)},
  539. {"debug", ROREG_FUNC(l_network_set_debug)},
  540. {"config", ROREG_FUNC(l_network_config)},
  541. {"linkup", ROREG_FUNC(l_network_linkup)},
  542. {"connect", ROREG_FUNC(l_network_connect)},
  543. {"discon", ROREG_FUNC(l_network_disconnect)},
  544. {"close", ROREG_FUNC(l_network_close)},
  545. {"tx", ROREG_FUNC(l_network_tx)},
  546. {"rx", ROREG_FUNC(l_network_rx)},
  547. {"wait", ROREG_FUNC(l_network_wait)},
  548. {"listen", ROREG_FUNC(l_network_listen)},
  549. {"accept", ROREG_FUNC(l_network_accept)},
  550. {"release", ROREG_FUNC(l_network_release)},
  551. { "ETH0", ROREG_INT(NW_ADAPTER_INDEX_ETH0)},
  552. { "STA", ROREG_INT(NW_ADAPTER_INDEX_STA)},
  553. { "AP", ROREG_INT(NW_ADAPTER_INDEX_AP)},
  554. { "LINK", ROREG_INT(EV_NW_RESULT_LINK & 0x0fffffff)},
  555. { "ON_LINE", ROREG_INT(EV_NW_RESULT_CONNECT & 0x0fffffff)},
  556. { "EVENT", ROREG_INT(EV_NW_RESULT_EVENT & 0x0fffffff)},
  557. { "TX_OK", ROREG_INT(EV_NW_RESULT_TX & 0x0fffffff)},
  558. { "CLOSED", ROREG_INT(EV_NW_RESULT_CLOSE & 0x0fffffff)},
  559. { NULL, ROREG_INT(0)}
  560. };
  561. LUAMOD_API int luaopen_network_adapter( lua_State *L ) {
  562. luat_newlib2(L, reg_network_adapter);
  563. luaL_newmetatable(L, LUAT_NW_CTRL_TYPE); /* create metatable for file handles */
  564. lua_pushcfunction(L, l_network_gc);
  565. lua_setfield(L, -2, "__gc");
  566. lua_pop(L, 1); /* pop new metatable */
  567. return 1;
  568. }
  569. #endif