luat_network_adapter.h 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  1. #ifndef __LUAT_NW_ADAPTER_H__
  2. #define __LUAT_NW_ADAPTER_H__
  3. #include "luat_base.h"
  4. // #ifdef LUAT_USE_NETWORK
  5. #if defined(__SOC_BSP__) || defined(LUAT_EC7XX_CSDK) || defined(CHIP_EC618) || defined(__AIR105_BSP__) || defined(CONFIG_SOC_8910) || defined(CONFIG_SOC_8850)
  6. #include "bsp_common.h"
  7. #endif
  8. #include "luat_rtos.h"
  9. #ifndef __BSP_COMMON_H__
  10. #include "c_common.h"
  11. #endif
  12. #ifdef LUAT_USE_TLS
  13. #include "mbedtls/ssl.h"
  14. #include "mbedtls/platform.h"
  15. #include "mbedtls/debug.h"
  16. #include "mbedtls/x509_crt.h"
  17. #include "mbedtls/base64.h"
  18. #include "mbedtls/ctr_drbg.h"
  19. #include "mbedtls/entropy.h"
  20. #include "mbedtls/sha1.h"
  21. #endif
  22. #ifdef LUAT_USE_LWIP
  23. #include "lwip/opt.h"
  24. #include "lwip/netif.h"
  25. #include "lwip/timeouts.h"
  26. #include "lwip/priv/tcp_priv.h"
  27. #include "lwip/def.h"
  28. #include "lwip/memp.h"
  29. #include "lwip/priv/tcpip_priv.h"
  30. #include "lwip/ip4_frag.h"
  31. #include "lwip/etharp.h"
  32. #include "lwip/dhcp.h"
  33. #include "lwip/prot/dhcp.h"
  34. #include "lwip/autoip.h"
  35. #include "lwip/igmp.h"
  36. #include "lwip/dns.h"
  37. #include "lwip/nd6.h"
  38. #include "lwip/ip6_frag.h"
  39. #include "lwip/mld6.h"
  40. #include "lwip/dhcp6.h"
  41. #include "lwip/sys.h"
  42. #include "lwip/pbuf.h"
  43. #include "lwip/inet.h"
  44. #endif
  45. #define MAX_DNS_IP (4) //每个URL最多保留4个IP
  46. enum
  47. {
  48. EV_NW_RESET = USER_EVENT_ID_START + 0x1000000,
  49. EV_NW_STATE,
  50. EV_NW_TIMEOUT,
  51. EV_NW_DNS_RESULT,
  52. EV_NW_SOCKET_TX_OK,
  53. EV_NW_SOCKET_RX_NEW,
  54. EV_NW_SOCKET_RX_FULL,
  55. EV_NW_SOCKET_CLOSE_OK,
  56. EV_NW_SOCKET_REMOTE_CLOSE,
  57. EV_NW_SOCKET_CONNECT_OK,
  58. EV_NW_SOCKET_ERROR,
  59. EV_NW_SOCKET_LISTEN,
  60. EV_NW_SOCKET_NEW_CONNECT, //作为server接收到新的connect,只有允许accept操作的才有,否则直接上报CONNECT_OK
  61. EV_NW_BREAK_WAIT,
  62. EV_NW_END,
  63. NW_STATE_LINK_OFF = 0,
  64. NW_STATE_OFF_LINE,
  65. NW_STATE_WAIT_DNS,
  66. NW_STATE_CONNECTING,
  67. NW_STATE_SHAKEHAND,
  68. NW_STATE_ONLINE,
  69. NW_STATE_LISTEN,
  70. NW_STATE_DISCONNECTING,
  71. NW_WAIT_NONE = 0,
  72. NW_WAIT_LINK_UP,
  73. NW_WAIT_ON_LINE,
  74. NW_WAIT_TX_OK,
  75. NW_WAIT_OFF_LINE,
  76. NW_WAIT_EVENT,
  77. //一旦使用高级API,回调会改为下面的,param1 = 0成功,其他失败
  78. EV_NW_RESULT_BASE = EV_NW_END + 1,
  79. EV_NW_RESULT_LINK = EV_NW_RESULT_BASE + NW_WAIT_LINK_UP,
  80. EV_NW_RESULT_CONNECT = EV_NW_RESULT_BASE + NW_WAIT_ON_LINE,
  81. EV_NW_RESULT_CLOSE = EV_NW_RESULT_BASE + NW_WAIT_OFF_LINE,
  82. EV_NW_RESULT_TX = EV_NW_RESULT_BASE + NW_WAIT_TX_OK,
  83. EV_NW_RESULT_EVENT = EV_NW_RESULT_BASE + NW_WAIT_EVENT,
  84. NW_ADAPTER_INDEX_LWIP_NONE = 0,
  85. NW_ADAPTER_INDEX_LWIP_GPRS, //蜂窝网络模块
  86. NW_ADAPTER_INDEX_LWIP_WIFI_STA, //WIFI SOC
  87. NW_ADAPTER_INDEX_LWIP_WIFI_AP, //WIFI SOC
  88. NW_ADAPTER_INDEX_LWIP_ETH, //自带以太网控制器的SOC
  89. NW_ADAPTER_INDEX_LWIP_SPI, // SPI协议的网卡,无MAC,纯IP包
  90. NW_ADAPTER_INDEX_LWIP_UART, // UART协议的网卡,无MAC,纯IP包
  91. NW_ADAPTER_INDEX_LWIP_USER0,
  92. NW_ADAPTER_INDEX_LWIP_USER1,
  93. NW_ADAPTER_INDEX_LWIP_USER2,
  94. NW_ADAPTER_INDEX_LWIP_USER3,
  95. NW_ADAPTER_INDEX_LWIP_USER4,
  96. NW_ADAPTER_INDEX_LWIP_USER5,
  97. NW_ADAPTER_INDEX_LWIP_USER6,
  98. NW_ADAPTER_INDEX_LWIP_USER7,
  99. NW_ADAPTER_INDEX_LWIP_GP_GW,
  100. NW_ADAPTER_INDEX_LWIP_NETIF_QTY,
  101. NW_ADAPTER_INDEX_HW_PS_DEVICE = NW_ADAPTER_INDEX_LWIP_NETIF_QTY,
  102. NW_ADAPTER_INDEX_ETH0 = NW_ADAPTER_INDEX_HW_PS_DEVICE, //外挂以太网+硬件协议栈
  103. NW_ADAPTER_INDEX_USB, //USB网卡
  104. NW_ADAPTER_INDEX_POSIX, // 对接POSIX
  105. NW_ADAPTER_INDEX_LUAPROXY, // 代理到Lua层
  106. NW_ADAPTER_INDEX_CUSTOM, // 对接到自定义适配器
  107. NW_ADAPTER_QTY,
  108. NW_CMD_AUTO_HEART_TIME = 0,
  109. };
  110. #ifdef LUAT_USE_LWIP
  111. #define luat_ip_addr_t ip_addr_t
  112. #else
  113. typedef struct
  114. {
  115. union
  116. {
  117. uint32_t ipv4;
  118. uint32_t ipv6_u32_addr[4];
  119. uint8_t ipv6_u8_addr[16];
  120. };
  121. uint8_t is_ipv6;
  122. }luat_ip_addr_t;
  123. uint8_t network_string_is_ipv4(const char *string, uint32_t len);
  124. uint32_t network_string_to_ipv4(const char *string, uint32_t len);
  125. int network_string_to_ipv6(const char *string, luat_ip_addr_t *ip_addr);
  126. #endif
  127. typedef struct
  128. {
  129. uint64_t tag;
  130. void *param;
  131. }luat_network_cb_param_t;
  132. typedef struct
  133. {
  134. uint32_t ttl_end;
  135. luat_ip_addr_t ip;
  136. }luat_dns_ip_result;
  137. typedef struct
  138. {
  139. /* data */
  140. llist_head node;
  141. Buffer_Struct uri;
  142. luat_dns_ip_result result[MAX_DNS_IP];
  143. uint8_t ip_nums;
  144. }luat_dns_cache_t;
  145. typedef struct
  146. {
  147. uint64_t tx_size;
  148. uint64_t ack_size;
  149. uint64_t tag;
  150. #ifdef LUAT_USE_TLS
  151. //SSL相关数据均为动态生成的,需要在close的时候释放
  152. mbedtls_ssl_context *ssl; /**< mbed TLS control context. */
  153. mbedtls_ssl_config *config; /**< mbed TLS configuration context. */
  154. mbedtls_x509_crt *ca_cert;
  155. #endif
  156. CBFuncEx_t user_callback;
  157. void *user_data; //传递给user_callback的pParam
  158. void *socket_param; //一般用来存放network_ctrl本身,用于快速查找
  159. HANDLE task_handle;
  160. HANDLE timer;
  161. HANDLE tls_short_timer;
  162. HANDLE tls_long_timer;
  163. HANDLE mutex;
  164. uint32_t tcp_keep_idle;
  165. int socket_id;
  166. char *domain_name; //动态生成的,需要在close的时候释放
  167. uint32_t domain_name_len;
  168. luat_ip_addr_t remote_ip;
  169. luat_dns_ip_result *dns_ip; //动态生成的,需要在close的时候释放
  170. luat_ip_addr_t online_ip; //指向某个ip,无需释放
  171. uint16_t remote_port;
  172. uint16_t local_port;
  173. uint8_t *cache_data; //动态生成的,需要在close的时候释放
  174. uint32_t cache_len;
  175. int tls_timer_state;
  176. uint32_t tcp_timeout_ms;
  177. uint8_t tls_mode;
  178. uint8_t tls_need_reshakehand;
  179. uint8_t need_close;
  180. uint8_t new_rx_flag;
  181. uint8_t dns_ip_cnt;
  182. uint8_t dns_ip_nums;
  183. uint8_t tcp_keep_alive;
  184. uint8_t tcp_keep_interval;
  185. uint8_t tcp_keep_cnt;
  186. uint8_t adapter_index;
  187. uint8_t is_tcp;
  188. uint8_t is_server_mode;
  189. uint8_t auto_mode;
  190. uint8_t wait_target_state;
  191. uint8_t state;
  192. uint8_t is_debug;
  193. uint8_t domain_ipv6;
  194. uint8_t max_wait_accept; // 作为server时,最多支持多少个等待accept的客户端
  195. }network_ctrl_t;
  196. typedef struct
  197. {
  198. uint64_t tag;
  199. #ifdef LUAT_USE_LWIP
  200. llist_head wait_ack_head;
  201. #endif
  202. llist_head tx_head;
  203. llist_head rx_head;
  204. uint32_t rx_wait_size;
  205. uint32_t tx_wait_size;
  206. #ifdef LUAT_USE_LWIP
  207. union {
  208. struct ip_pcb *ip;
  209. struct tcp_pcb *tcp;
  210. struct udp_pcb *udp;
  211. struct raw_pcb *raw;
  212. } pcb;
  213. struct tcp_pcb_listen *listen_tcp;
  214. HANDLE mutex;
  215. uint16_t local_port;
  216. uint16_t remote_port;
  217. #endif
  218. void *param;
  219. uint8_t state;
  220. uint8_t is_tcp;
  221. uint8_t is_ipv6;
  222. uint8_t in_use;
  223. uint8_t rx_waiting;
  224. uint8_t remote_close;
  225. uint8_t fast_rx_ack; //TCP快速应答
  226. }socket_ctrl_t; //推荐底层协议栈适配用的socket状态结构
  227. /*
  228. * info内的api必须全部是非阻塞的及任务的,并且对socket_id和tag做合法性检查
  229. * 目前只支持tcp和udp,不支持raw
  230. * 如果没有特殊说明,成功返回=0,失败返回<0
  231. */
  232. typedef struct
  233. {
  234. //检查网络是否准备好,返回非0准备好,user_data是注册时的user_data,传入给底层api
  235. uint8_t (*check_ready)(void *user_data);
  236. //创建一个socket,并设置成非阻塞模式,user_data传入对应适配器, tag作为socket的合法依据,给check_socket_vaild比对用
  237. //成功返回socketid,失败 < 0
  238. int (*create_soceket)(uint8_t is_tcp, uint64_t *tag, void *param, uint8_t is_ipv6, void *user_data);
  239. //作为client绑定一个port,并连接remote_ip和remote_port对应的server
  240. //成功返回0,失败 < 0
  241. int (*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);
  242. //作为server绑定一个port,开始监听
  243. //成功返回0,失败 < 0
  244. int (*socket_listen)(int socket_id, uint64_t tag, uint16_t local_port, void *user_data);
  245. //作为server接受一个client
  246. //成功返回0,失败 < 0
  247. int (*socket_accept)(int socket_id, uint64_t tag, luat_ip_addr_t *remote_ip, uint16_t *remote_port, void *user_data);
  248. //主动断开一个tcp连接,需要走完整个tcp流程,用户需要接收到close ok回调才能确认彻底断开
  249. //成功返回0,失败 < 0
  250. int (*socket_disconnect)(int socket_id, uint64_t tag, void *user_data);
  251. //释放掉socket的控制权,除了tag异常外,必须立刻生效
  252. //成功返回0,失败 < 0
  253. int (*socket_close)(int socket_id, uint64_t tag, void *user_data);
  254. //强行释放掉socket的控制权,必须立刻生效
  255. //成功返回0,失败 < 0
  256. int (*socket_force_close)(int socket_id, void *user_data);
  257. //tcp时,不需要remote_ip和remote_port,如果buf为NULL,则返回当前缓存区的数据量,当返回值小于len时说明已经读完了
  258. //udp时,只返回1个block数据,需要多次读直到没有数据为止
  259. //成功返回实际读取的值,失败 < 0
  260. int (*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);
  261. //tcp时,不需要remote_ip和remote_port
  262. //成功返回>0的len,缓冲区满了=0,失败 < 0,如果发送了len=0的空包,也是返回0,注意判断
  263. int (*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);
  264. //检查socket合法性,成功返回0,失败 < 0
  265. int (*socket_check)(int socket_id, uint64_t tag, void *user_data);
  266. //保留有效的socket,将无效的socket关闭
  267. void (*socket_clean)(int *vaild_socket_list, uint32_t num, void *user_data);
  268. int (*getsockopt)(int socket_id, uint64_t tag, int level, int optname, void *optval, uint32_t *optlen, void *user_data);
  269. int (*setsockopt)(int socket_id, uint64_t tag, int level, int optname, const void *optval, uint32_t optlen, void *user_data);
  270. //非posix的socket,用这个根据实际硬件设置参数
  271. int (*user_cmd)(int socket_id, uint64_t tag, uint32_t cmd, uint32_t value, void *user_data);
  272. int (*dns)(const char *domain_name, uint32_t len, void *param, void *user_data);
  273. int (*dns_ipv6)(const char *domain_name, uint32_t len, void *param, void *user_data);
  274. int (*set_dns_server)(uint8_t server_index, luat_ip_addr_t *ip, void *user_data);
  275. int (*set_mac)(uint8_t *mac, void *user_data);
  276. int (*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);
  277. int (*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);
  278. int (*get_local_ip_info)(luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway, void *user_data);
  279. //所有网络消息都是通过cb_fun回调
  280. //cb_fun回调时第一个参数为OS_EVENT,包含了socket的必要信息,第二个是luat_network_cb_param_t,其中的param是这里传入的param(就是适配器序号)
  281. //OS_EVENT ID为EV_NW_XXX,param1是socket id param2是各自参数 param3是create_soceket传入的socket_param(就是network_ctrl *)
  282. //dns结果是特别的,ID为EV_NW_SOCKET_DNS_RESULT,param1是获取到的IP数据量,0就是失败了,param2是ip组,动态分配的, param3是dns传入的param(就是network_ctrl *)
  283. void (*socket_set_callback)(CBFuncEx_t cb_fun, void *param, void *user_data);
  284. int (*check_ack)(uint8_t adapter_index, int socket_id); // 2024.4.11新增
  285. char *name;
  286. int max_socket_num;//最大socket数量,也是最大network_ctrl申请数量的基础值
  287. uint8_t no_accept;
  288. uint8_t is_posix;
  289. }network_adapter_info;
  290. /*
  291. * api有可能涉及到任务安全要求,不可以在中断里运行,只能在task中运行
  292. */
  293. /**
  294. * 获取最后一个注册的网卡适配器序号
  295. * @return 注册的网卡适配器序号 NW_ADAPTER_INDEX_XXX
  296. */
  297. int network_get_last_register_adapter(void);
  298. /****************************以下是通用基础api********************************************************/
  299. /**
  300. * 注册网卡适配器相关的协议栈接口
  301. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  302. * @param info 协议栈接口
  303. * @param user_data 用户数据
  304. * @return 0成功,其他失败
  305. */
  306. int network_register_adapter(uint8_t adapter_index, network_adapter_info *info, void *user_data);
  307. /**
  308. * 将某个网卡适配器配置成默认适配器
  309. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  310. */
  311. void network_register_set_default(uint8_t adapter_index);
  312. /**
  313. * 获取默认适配器
  314. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  315. */
  316. int network_register_get_default(void);
  317. /**
  318. * 设置某个网卡适配器的DNS服务器地址
  319. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  320. * @param server_index DNS服务器序号
  321. * @param ip DNS服务器地址
  322. */
  323. void network_set_dns_server(uint8_t adapter_index, uint8_t server_index, luat_ip_addr_t *ip);
  324. /**
  325. * 在某个网卡适配器上申请一个网络资源
  326. * @param adapter_index 适配器序号 NW_ADAPTER_INDEX_XXX
  327. * @return 网络资源,network_ctrl_t结构类型
  328. */
  329. network_ctrl_t *network_alloc_ctrl(uint8_t adapter_index);
  330. /**
  331. * 归还一个网络资源
  332. * @param ctrl 网络资源
  333. */
  334. void network_release_ctrl(network_ctrl_t *ctrl);
  335. /**
  336. * 初始化网络资源
  337. * lua调用c时,必须使用非阻塞接口,task_handle不需要
  338. * 在纯c调用时,如果不需要则塞应用,必须有callback和param
  339. * 在纯c调用时,如果需要阻塞应用,则必须有task_handle,建议有callback,param,可以等待消息时,同时在callback中处理其他类型的消息
  340. * @param ctrl 网络资源
  341. * @param task_handle socket阻塞应用时所在的task,可以是空的
  342. * @param callback socket非阻塞应用时回调函数
  343. * @param param socket非阻塞应用时回调时的用户自定义参数
  344. */
  345. void network_init_ctrl(network_ctrl_t *ctrl, HANDLE task_handle, CBFuncEx_t callback, void *param);
  346. /**
  347. * 网络资源基本配置
  348. * 设置是tcp还是udp模式及TCP自动保活相关参数,也可以直接改network_ctrl_t中的is_tcp参数
  349. * 设置必须在socket处于close状态,在进行connect和tls初始之前
  350. * @param ctrl 网络资源
  351. * @param is_tcp 0UDP 其他TCP,默认是UDP
  352. * @param tcp_timeout_ms tcp超时时间,目前未启用
  353. * @param keep_alive tcp自动保活是否启用,0不启用,其他启用
  354. * @param keep_idle tcp自动保活空闲时间,单位秒
  355. * @param keep_interval tcp自动保活启动时,tcp探针发送时间间隔,单位秒
  356. * @param keep_cnt tcp自动保活启动时,tcp探针发送总次数
  357. */
  358. void network_set_base_mode(network_ctrl_t *ctrl, uint8_t is_tcp, uint32_t tcp_timeout_ms, uint8_t keep_alive, uint32_t keep_idle, uint8_t keep_interval, uint8_t keep_cnt);
  359. /**
  360. * 是否开启debug功能
  361. * @param ctrl 网络资源
  362. * @param on_off 0关,其他开,默认是关
  363. */
  364. void network_set_debug_onoff(network_ctrl_t *ctrl, uint8_t on_off);
  365. /**
  366. * 使用域名时是否选择IPV6地址
  367. * @param ctrl 网络资源
  368. * @param onoff 0关,其他开,默认是关
  369. */
  370. void network_connect_ipv6_domain(network_ctrl_t *ctrl, uint8_t onoff);
  371. /**
  372. * 检测某个网卡是否能上网
  373. * 具体哪个网卡,看socket或者适配器序号
  374. * @param ctrl 网络资源,如果为NULL,则看下面的适配器序号
  375. * @param adapter_index 适配器序号 NW_ADAPTER_INDEX_XXX
  376. * @return 0不能上网 其他能
  377. */
  378. uint8_t network_check_ready(network_ctrl_t *ctrl, uint8_t adapter_index);
  379. /**
  380. * 设置本地port,注意不要用60000及以上,如果local_port为0,系统从60000开始随机抽一个
  381. * 默认就是0,一般不需要配置,由系统去分配
  382. * @param ctrl 网络资源
  383. * @param local_port 本地端口号
  384. * @return local_port不为0,且重复了,则返回-1,其他返回0
  385. */
  386. int network_set_local_port(network_ctrl_t *ctrl, uint16_t local_port);
  387. /**
  388. * 创建一个socket
  389. * @param ctrl 网络资源
  390. * @param is_ipv6 是否是IPV6,0否 1是,默认是0
  391. * @return 成功返回0,失败 < 0
  392. */
  393. int network_create_socket(network_ctrl_t *ctrl, uint8_t is_ipv6);
  394. /**
  395. * 连接服务器,在连接前,需要配置好网络资源中的remote_port
  396. * @param ctrl 网络资源
  397. * @param remote_ip 服务器地址
  398. * @return 成功返回0,失败 < 0
  399. */
  400. int network_socket_connect(network_ctrl_t *ctrl, luat_ip_addr_t *remote_ip);
  401. /**
  402. * 作为服务器监听
  403. * @param ctrl 网络资源 用于监听的网络资源
  404. * @return 成功返回0,失败 < 0
  405. */
  406. int network_socket_listen(network_ctrl_t *ctrl);
  407. /**
  408. * 查询网络资源对应的网卡是否有服务器功能
  409. * @param ctrl 网络资源 用于监听的网络资源
  410. * @return 1有 0无
  411. */
  412. uint8_t network_accept_enable(network_ctrl_t *ctrl);
  413. /**
  414. * 作为服务器接受一个客户端的接入请求
  415. * @param ctrl 网络资源 用于监听的网络资源
  416. * @param accept_ctrl 用于和客户端通讯的网络资源
  417. * @return 成功返回0,失败 < 0
  418. */
  419. int network_socket_accept(network_ctrl_t *ctrl, network_ctrl_t *accept_ctrl);
  420. /**
  421. * 主动断开一个tcp连接,需要走完整个tcp挥手流程,用户需要接收到close ok回调才能确认彻底断开
  422. * @param ctrl 网络资源
  423. * @return 均为0
  424. */
  425. int network_socket_disconnect(network_ctrl_t *ctrl);
  426. /**
  427. * 释放掉socket的控制权
  428. * @param ctrl 网络资源
  429. * @return 均为0
  430. */
  431. int network_socket_close(network_ctrl_t *ctrl);
  432. /**
  433. * 强行释放掉socket的控制权
  434. * @param ctrl 网络资源
  435. * @return 均为0
  436. */
  437. int network_socket_force_close(network_ctrl_t *ctrl);
  438. /**
  439. * 读取对端发送过来的数据
  440. * tcp时,不需要remote_ip和remote_port,如果buf为NULL,则返回当前缓存区的数据量,当返回值小于len时说明已经读完了
  441. * udp时,只返回1个block数据,需要多次读直到没有数据为止
  442. * @param ctrl 网络资源
  443. * @param buf 数据读取后缓存的地址
  444. * @param len 期望读取的长度
  445. * @param flags 读取时的标志,一般为0
  446. * @param remote_ip 存放对端IP,UDP才有
  447. * @param remote_port 存放对端端口,UDP才有
  448. * @return 成功返回实际读取的值,失败 < 0
  449. */
  450. int network_socket_receive(network_ctrl_t *ctrl,uint8_t *buf, uint32_t len, int flags, luat_ip_addr_t *remote_ip, uint16_t *remote_port);
  451. /**
  452. * 缓存发送数据,准备发送给对端
  453. * tcp时,不需要remote_ip和remote_port
  454. * @param ctrl 网络资源
  455. * @param buf 缓存发送数据的地址
  456. * @param len 发送长度
  457. * @param flags 发送标志,一般为0
  458. * @param remote_ip 对端IP,UDP才有
  459. * @param remote_port 对端端口,UDP才有
  460. * @return 存入发送缓存返回0,失败 < 0
  461. */
  462. int network_socket_send(network_ctrl_t *ctrl,const uint8_t *buf, uint32_t len, int flags, luat_ip_addr_t *remote_ip, uint16_t remote_port);
  463. /**
  464. * 获取socket一个配置,和POSIX socket一致,非POSIX的网卡(比如w5500的硬件协议栈)不支持
  465. * @param ctrl 网络资源
  466. * @param level 配置参数级别
  467. * @param optname 参数名称
  468. * @param optval 参数指针
  469. * @param optlen 参数长度
  470. * @return 成功返回0,其他失败
  471. */
  472. int network_getsockopt(network_ctrl_t *ctrl, int level, int optname, void *optval, uint32_t *optlen);
  473. /**
  474. * 设置socket一个配置,和POSIX socket一致,非POSIX的网卡(比如w5500的硬件协议栈)不支持
  475. * @param ctrl 网络资源
  476. * @param level 配置参数级别
  477. * @param optname 参数名称
  478. * @param optval 参数指针
  479. * @param optlen 参数长度
  480. * @return 成功返回0,其他失败
  481. */
  482. int network_setsockopt(network_ctrl_t *ctrl, int level, int optname, const void *optval, uint32_t optlen);
  483. /**
  484. * 设置socket一个配置,仅支持非POSIX的网卡(比如w5500的硬件协议栈)
  485. * @param ctrl 网络资源
  486. * @param cmd 配置命令
  487. * @param value 配置值
  488. * @return 成功返回0,其他失败
  489. */
  490. int network_user_cmd(network_ctrl_t *ctrl, uint32_t cmd, uint32_t value);
  491. #ifdef LUAT_USE_LWIP
  492. /**
  493. * 设置网卡的MAC
  494. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  495. * @param mac MAC地址
  496. * @return 成功返回0,其他失败
  497. */
  498. int network_set_mac(uint8_t adapter_index, uint8_t *mac);
  499. /**
  500. * 设置网卡的静态地址
  501. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  502. * @param ip IPV4地址
  503. * @param submask 子网掩码
  504. * @param gateway 网关
  505. * @param ipv6 IPV6地址
  506. * @return 成功返回0,其他失败
  507. */
  508. int network_set_static_ip_info(uint8_t adapter_index, luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway, luat_ip_addr_t *ipv6);
  509. #endif
  510. /**
  511. * 获取网卡的地址信息
  512. * @param ctrl 网络资源
  513. * @param ip IPV4地址
  514. * @param submask 子网掩码
  515. * @param gateway 网关
  516. * @return 成功返回0,其他失败
  517. */
  518. int network_get_local_ip_info(network_ctrl_t *ctrl, luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway);
  519. /**
  520. * 强制释放socket资源,同时也释放部分网络资源
  521. * @param ctrl 网络资源
  522. */
  523. void network_force_close_socket(network_ctrl_t *ctrl);
  524. /**
  525. * 启动DNS解析,启动前,需要设置好domain_name和domain_name_len
  526. * domain_name已经是ip形式了,返回1,并且填充remote_ip
  527. * @param ctrl 网络资源
  528. * @return domain_name已经是ip形式了返回1, DNS开始返回0,失败 < 0
  529. */
  530. int network_dns(network_ctrl_t *ctrl);
  531. /**
  532. * 查询网卡下所有网络资源是否需要释放,需要释放的立刻释放掉
  533. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  534. */
  535. void network_clean_invaild_socket(uint8_t adapter_index);
  536. //下列API仅内部调试使用,用户不用
  537. const char *network_ctrl_state_string(uint8_t state);
  538. const char *network_ctrl_wait_state_string(uint8_t state);
  539. const char *network_ctrl_callback_event_string(uint32_t event);
  540. /****************************通用基础api结束********************************************************/
  541. /****************************tls相关api************************************************************/
  542. /**
  543. * 给DTLS设置PSK,给UDP加密传输时用的
  544. * @param ctrl 网络资源
  545. * @param psk psk数据
  546. * @param psk_len psk数据长度
  547. * @param psk_identity psk_identity数据
  548. * @param psk_identity_len psk_identity数据长度
  549. * @return 成功返回0,其他失败
  550. */
  551. int network_set_psk_info(network_ctrl_t *ctrl,
  552. const unsigned char *psk, size_t psk_len,
  553. const unsigned char *psk_identity, size_t psk_identity_len);
  554. /**
  555. * TLS设置验证服务器的证书,可以不用
  556. * @param ctrl 网络资源
  557. * @param cert 服务器证书数据
  558. * @param cert_len 服务器证书数据长度
  559. * @return 成功返回0,其他失败
  560. */
  561. int network_set_server_cert(network_ctrl_t *ctrl, const unsigned char *cert, size_t cert_len);
  562. /**
  563. * TLS设置验证客户端的证书,只有双向认证才需要,而且一般只有金融领域才需要
  564. * @param ctrl 网络资源
  565. * @param cert 客户端证书数据
  566. * @param certLen客户端证书数据长度
  567. * @param key 客户端证书私钥数据
  568. * @param keylen 客户端证书私钥数据长度
  569. * @param pwd 客户端证书私钥的密码数据
  570. * @param pwdlen 客户端证书私钥的密码数据长度
  571. * @return 成功返回0,其他失败
  572. */
  573. int network_set_client_cert(network_ctrl_t *ctrl,
  574. const unsigned char *cert, size_t certLen,
  575. const unsigned char *key, size_t keylen,
  576. const unsigned char *pwd, size_t pwdlen);
  577. /**
  578. * 获取证书验证结果
  579. * @param ctrl 网络资源
  580. * @return 成功返回0,其他失败
  581. */
  582. int network_cert_verify_result(network_ctrl_t *ctrl);
  583. /**
  584. * 初始化加密传输
  585. * @param ctrl 网络资源
  586. * @param verify_mode 参考MBEDTLS_SSL_VERIFY_XXX
  587. * @return 成功返回0,其他失败
  588. */
  589. int network_init_tls(network_ctrl_t *ctrl, int verify_mode);
  590. /**
  591. * 结束加密传输模式,恢复成正常模式,必须在socket关闭情况下才可以修改
  592. * @param ctrl 网络资源
  593. */
  594. void network_deinit_tls(network_ctrl_t *ctrl);
  595. /*
  596. * 加密传输其他非阻塞api和通用api共用,阻塞api和rtos环境相关阻塞api通用,均由api内部做相关处理
  597. */
  598. /****************************tls相关api结束************************************************************/
  599. /****************************高级api,用于实现一个完整功能***********************/
  600. //一旦使用下面的api,将由network内部自动判断状态并进行下一步操作,中间处理过程除了主动强制关闭socket,其他用户不能干预,直到达到目标状态,即使非阻塞回调也只回调最终结果。
  601. //所有阻塞状态接口,一旦收到link down,socket close, error之类的消息就会返回错误,如果是timeout,只有wait event会返回成功,其他返回失败
  602. //以下api是阻塞和非则塞均可,当network_ctrl中设置了task_handle 而且 timeout_ms > 0时为阻塞接口,timeout_ms = 0xffffffff 为永远等待
  603. /**
  604. * 等待网络环境准备好
  605. * @param ctrl 网络资源
  606. * @param timeout_ms 超时时间
  607. * @return 成功返回0,失败 < 0,非阻塞需要等待返回1
  608. */
  609. int network_wait_link_up(network_ctrl_t *ctrl, uint32_t timeout_ms);
  610. /**
  611. * 作为客户端去连接服务器
  612. * 域名或者IP至少写1个,如果写了有效IP,则不会去连接域名
  613. * 会自动等待网络环境准备好,无需network_wait_link_up
  614. * 如果是加密模式,自动进行握手
  615. * 使用前必须确保是在close状态,建议先用network_close
  616. * @param ctrl 网络资源
  617. * @param domain_name 服务器域名
  618. * @param domain_name_len 服务器域名长度
  619. * @param remote_ip 服务器IP
  620. * @param remote_port 服务器端口
  621. * @param timeout_ms 超时时间
  622. * @return 成功返回0,失败 < 0,非阻塞需要等待返回1
  623. */
  624. int network_connect(network_ctrl_t *ctrl, const char *domain_name, uint32_t domain_name_len, luat_ip_addr_t *remote_ip, uint16_t remote_port, uint32_t timeout_ms);
  625. /**
  626. * 作为服务器监听
  627. * @param ctrl 网络资源
  628. * @param timeout_ms 超时时间
  629. * @return 成功返回0,失败 < 0,非阻塞需要等待返回1
  630. */
  631. int network_listen(network_ctrl_t *ctrl, uint32_t timeout_ms);
  632. /**
  633. * 关闭连接
  634. * @param ctrl 网络资源
  635. * @param timeout_ms 超时时间
  636. * @return 成功返回0,失败 < 0,非阻塞需要等待返回1
  637. */
  638. int network_close(network_ctrl_t *ctrl, uint32_t timeout_ms);
  639. /**
  640. * 发送数据给对端
  641. * UDP的时候,remote_ip和remote_port和connect不一致的时候才需要remote_ip和remote_port
  642. * TCP不看remote_ip和remote_port
  643. * 阻塞模式,*tx_len不需要看,非阻塞模式需要看*tx_len的实际长度是不是和len一致
  644. * @param ctrl 网络资源
  645. * @param data 需要发送的数据
  646. * @param len 需要发送的数据长度
  647. * @param flags 发送标志,一般写0
  648. * @param remote_ip 对端IP
  649. * @param remote_port 对端端口
  650. * @param tx_len 实际存入缓存区的长度
  651. * @param timeout_ms 超时时间
  652. * @return 成功返回0,失败 < 0,非阻塞需要等待返回1
  653. */
  654. int network_tx(network_ctrl_t *ctrl, const uint8_t *data, uint32_t len, int flags, luat_ip_addr_t *remote_ip, uint16_t remote_port, uint32_t *tx_len, uint32_t timeout_ms);
  655. /**
  656. * 读取接收到的数据
  657. * 实际读到的数据量在read_len里,如果是UDP模式且为server时,需要看remote_ip和remote_port
  658. * @param ctrl 网络资源
  659. * @param data 存放读取数据的地址
  660. * @param len 期望读取的长度
  661. * @param flags 接收标志,一般写0
  662. * @param remote_ip 对端IP
  663. * @param remote_port 对端端口
  664. * @param rx_len 实际读出的长度
  665. * @return 成功返回0,失败或者socket已经断开 < 0
  666. */
  667. int network_rx(network_ctrl_t *ctrl, uint8_t *data, uint32_t len, int flags, luat_ip_addr_t *remote_ip, uint16_t *remote_port, uint32_t *rx_len);
  668. /**
  669. * 等待网络状态变化
  670. * 接收到socket异常消息均会返回
  671. * 如果为阻塞接口,out_event保存消息(拷贝,非引用),is_timeout保存是否超时
  672. * 返回0表示有数据接收或者超时返回,返回1表示切换到非阻塞等待,其他为网络异常
  673. * @param ctrl 网络资源
  674. * @param out_event 网络消息
  675. * @param timeout_ms 超时时间
  676. * @param is_timeout 是否超时
  677. * @return 成功返回0,失败 < 0,非阻塞需要等待返回1
  678. */
  679. int network_wait_event(network_ctrl_t *ctrl, OS_EVENT *out_event, uint32_t timeout_ms, uint8_t *is_timeout);
  680. /*
  681. */
  682. /**
  683. * 等待有数据接收
  684. * 接收到socket异常,用户发送EV_NW_BREAK_WAIT,或者有新数据都会退出,如果是其他消息,通过network_init_ctrl里输入的回调函数使用,如果没有回调函数,就直接抛弃了
  685. * timeout_ms=0时,依然为阻塞接口,而且是永远等待
  686. * 返回0表示有数据接收,用户打断或者超时返回,其他为网络异常
  687. * 用户打断,is_break = 1,超时 is_timeout = 1
  688. * @param ctrl 网络资源
  689. * @param timeout_ms 超时时间
  690. * @param is_break 是否是用户打断
  691. * @param is_timeout 是否超时
  692. * @return 成功返回0,失败 < 0
  693. */
  694. int network_wait_rx(network_ctrl_t *ctrl, uint32_t timeout_ms, uint8_t *is_break, uint8_t *is_timeout);
  695. /****************************高级api结束********************************************************************/
  696. /**
  697. * 获取网卡完整的地址信息
  698. * @param ctrl 网络资源,如果写NULL,则看下面的adapter_index
  699. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  700. * @param ip IPV4地址
  701. * @param submask 子网掩码
  702. * @param gateway 网关
  703. * @param ipv6 IPV6地址
  704. * @return 成功返回0,其他失败
  705. */
  706. int network_get_full_local_ip_info(network_ctrl_t *ctrl, uint8_t adapter_index, luat_ip_addr_t *ip, luat_ip_addr_t *submask, luat_ip_addr_t *gateway, luat_ip_addr_t *ipv6);
  707. /**
  708. * 将IP设置成无效状态
  709. * @param ip
  710. */
  711. void network_set_ip_invaild(luat_ip_addr_t *ip);
  712. /**
  713. * 检测IP是不是无效的
  714. * @param ip
  715. * @return 无效返回0,其他有效
  716. */
  717. uint8_t network_ip_is_vaild(luat_ip_addr_t *ip);
  718. /**
  719. * 检测IP是不是IPV6类型
  720. * @param ip
  721. * @return 不是返回0
  722. */
  723. uint8_t network_ip_is_ipv6(luat_ip_addr_t *ip);
  724. /**
  725. * 检测IP是不是有效的IPV4类型
  726. * @param ip
  727. * @return 不是返回0
  728. */
  729. uint8_t network_ip_is_vaild_ipv4(luat_ip_addr_t *ip);
  730. /**
  731. * 将IP设置成IPV4
  732. * @param 需要设置的ip地址
  733. * @param ipv4 ipv4
  734. */
  735. void network_set_ip_ipv4(luat_ip_addr_t *ip, uint32_t ipv4);
  736. network_adapter_info* network_adapter_fetch(int id, void** userdata);
  737. // 获取真正的最后一个注册的网卡适配器序号, network_get_last_register_adapter用的地方太多了,已经改不了
  738. int network_get_last_register_adapter_real(void);
  739. /**
  740. * 断开指定网卡的所有数据链接(实验性支持)
  741. * @param adapter_index 网卡适配器序号 NW_ADAPTER_INDEX_XXX
  742. * @param timeout_ms 超时时间
  743. * @return 成功返回0,其他失败
  744. */
  745. int network_close_all_ctrl_by_adapter(uint8_t adapter_index, uint32_t timeout_ms);
  746. #endif
  747. // #endif