Эх сурвалжийг харах

add:luatos域名解析支持IPV6,但是要设置

alienwalker 3 жил өмнө
parent
commit
02a76911b3

+ 27 - 0
components/ethernet/common/dns_client.c

@@ -440,6 +440,33 @@ void dns_require_ex(dns_client_t *client, const char *domain_name, void *param,
 	llist_add_tail(&require->node, &client->require_head);
 	llist_add_tail(&require->node, &client->require_head);
 }
 }
 
 
+void dns_require_ipv6(dns_client_t *client, const char *domain_name, void *param, uint8_t adapter_index, uint8_t is_ipv6)
+{
+	luat_dns_require_t *require = zalloc(sizeof(luat_dns_require_t));
+	require->uri.Data = domain_name;
+	require->uri.Pos = strlen(domain_name);
+	require->uri.MaxLen = strlen(domain_name);
+	require->param = param;
+	require->adapter_index = adapter_index;
+	dns_process_t *process = llist_traversal(&client->process_head, dns_check_process, &require->uri);
+	// if no same proc
+	if (!process)
+	{
+		process = zalloc(sizeof(dns_process_t));
+		Buffer_StaticInit(&process->uri_buf, require->uri.Data, require->uri.Pos);
+		process->uri_buf.Pos = require->uri.Pos;
+		client->session_id++;
+		if (!client->session_id)
+		{
+			client->session_id++;
+		}
+		process->session_id = client->session_id;
+		process->is_ipv6 = is_ipv6;
+		llist_add_tail(&process->node, &client->process_head);
+	}
+	llist_add_tail(&require->node, &client->require_head);
+}
+
 static int32_t dns_clear_require(void *pData, void *pParam)
 static int32_t dns_clear_require(void *pData, void *pParam)
 {
 {
 	luat_dns_require_t *require = (luat_dns_require_t *)pData;
 	luat_dns_require_t *require = (luat_dns_require_t *)pData;

+ 1 - 0
components/ethernet/common/dns_def.h

@@ -36,6 +36,7 @@ void dns_init_client(dns_client_t *client);
 uint8_t dns_check_uri(const char *uri, uint32_t uri_len);
 uint8_t dns_check_uri(const char *uri, uint32_t uri_len);
 void dns_require(dns_client_t *client, const char *domain_name, uint32_t len, void *param);
 void dns_require(dns_client_t *client, const char *domain_name, uint32_t len, void *param);
 void dns_require_ex(dns_client_t *client, const char *domain_name, void *param, uint8_t adapter_index);
 void dns_require_ex(dns_client_t *client, const char *domain_name, void *param, uint8_t adapter_index);
+void dns_require_ipv6(dns_client_t *client, const char *domain_name, void *param, uint8_t adapter_index, uint8_t is_ipv6);
 void dns_clear(dns_client_t *client);
 void dns_clear(dns_client_t *client);
 void dns_run(dns_client_t *client, Buffer_Struct *in, Buffer_Struct *out, int *server_cnt);
 void dns_run(dns_client_t *client, Buffer_Struct *in, Buffer_Struct *out, int *server_cnt);
 #endif /* __ETHERNET_COMMON_DNS_DEF_H__ */
 #endif /* __ETHERNET_COMMON_DNS_DEF_H__ */

+ 12 - 0
components/network/adapter/luat_lib_socket.c

@@ -376,6 +376,7 @@ static int l_socket_linkup(lua_State *L)
 @api socket.connect(ctrl, ip, remote_port)
 @api socket.connect(ctrl, ip, remote_port)
 @user_data socket.create得到的ctrl
 @user_data socket.create得到的ctrl
 @string or int ip或者域名,如果是IPV4,可以是大端格式的int值
 @string or int ip或者域名,如果是IPV4,可以是大端格式的int值
+@boolean 域名解析是否要IPV6,true要,false不要,默认false不要,只有支持IPV6的协议栈才有效果
 @int 服务器端口号,小端格式
 @int 服务器端口号,小端格式
 @return boolean true没有异常发生,false失败了,如果false则不需要看下一个返回值了,如果有异常,后续要close
 @return boolean true没有异常发生,false失败了,如果false则不需要看下一个返回值了,如果有异常,后续要close
 @return boolean true已经connect,false没有connect,之后需要接收socket.ON_LINE消息
 @return boolean true已经connect,false没有connect,之后需要接收socket.ON_LINE消息
@@ -402,6 +403,17 @@ static int l_socket_connect(lua_State *L)
 	}
 	}
 	uint16_t remote_port = luaL_checkinteger(L, 3);
 	uint16_t remote_port = luaL_checkinteger(L, 3);
 	LLOGD("connect to %s,%d", ip, remote_port);
 	LLOGD("connect to %s,%d", ip, remote_port);
+	if (ip_addr.type != IPADDR_TYPE_V4)
+	{
+		if (LUA_TBOOLEAN == lua_type(L, 3))
+		{
+			network_connect_ipv6_domain(l_ctrl->netc, lua_toboolean(L, 3));
+		}
+		else
+		{
+			network_connect_ipv6_domain(l_ctrl->netc, 0);
+		}
+	}
 	int result = network_connect(l_ctrl->netc, ip, ip_len, (ip_addr.type != IPADDR_TYPE_V4)?NULL:&ip_addr, remote_port, 0);
 	int result = network_connect(l_ctrl->netc, ip, ip_len, (ip_addr.type != IPADDR_TYPE_V4)?NULL:&ip_addr, remote_port, 0);
 	lua_pushboolean(L, (result < 0)?0:1);
 	lua_pushboolean(L, (result < 0)?0:1);
 	lua_pushboolean(L, result == 0);
 	lua_pushboolean(L, result == 0);

+ 14 - 2
components/network/adapter/luat_network_adapter.c

@@ -1016,6 +1016,7 @@ network_ctrl_t *network_alloc_ctrl(uint8_t adapter_index)
 			adapter->ctrl_busy[i] = 1;
 			adapter->ctrl_busy[i] = 1;
 			ctrl = &adapter->ctrl_table[i];
 			ctrl = &adapter->ctrl_table[i];
 			ctrl->adapter_index = adapter_index;
 			ctrl->adapter_index = adapter_index;
+			ctrl->domain_ipv6 = 0;
 			break;
 			break;
 		}
 		}
 	}
 	}
@@ -1117,6 +1118,11 @@ void network_set_base_mode(network_ctrl_t *ctrl, uint8_t is_tcp, uint32_t tcp_ti
 	ctrl->tcp_timeout_ms = tcp_timeout_ms;
 	ctrl->tcp_timeout_ms = tcp_timeout_ms;
 }
 }
 
 
+void network_connect_ipv6_domain(network_ctrl_t *ctrl, uint8_t onoff)
+{
+	ctrl->domain_ipv6 = onoff;
+}
+
 int network_set_local_port(network_ctrl_t *ctrl, uint16_t local_port)
 int network_set_local_port(network_ctrl_t *ctrl, uint16_t local_port)
 {
 {
 	int i;
 	int i;
@@ -1292,8 +1298,14 @@ int network_user_cmd(network_ctrl_t *ctrl,  uint32_t cmd, uint32_t value)
 int network_dns(network_ctrl_t *ctrl)
 int network_dns(network_ctrl_t *ctrl)
 {
 {
 	network_adapter_t *adapter = &prv_adapter_table[ctrl->adapter_index];
 	network_adapter_t *adapter = &prv_adapter_table[ctrl->adapter_index];
-
-	return adapter->opt->dns(ctrl->domain_name, ctrl->domain_name_len, ctrl, adapter->user_data);
+	if (ctrl->domain_ipv6)
+	{
+		return adapter->opt->dns_ipv6(ctrl->domain_name, ctrl->domain_name_len, ctrl, adapter->user_data);
+	}
+	else
+	{
+		return adapter->opt->dns(ctrl->domain_name, ctrl->domain_name_len, ctrl, adapter->user_data);
+	}
 }
 }
 
 
 int network_set_mac(uint8_t adapter_index, uint8_t *mac)
 int network_set_mac(uint8_t adapter_index, uint8_t *mac)

+ 10 - 0
components/network/adapter/luat_network_adapter.h

@@ -192,6 +192,7 @@ typedef struct
     uint8_t wait_target_state;
     uint8_t wait_target_state;
     uint8_t state;
     uint8_t state;
     uint8_t is_debug;
     uint8_t is_debug;
+    uint8_t domain_ipv6;
 }network_ctrl_t;
 }network_ctrl_t;
 
 
 typedef struct
 typedef struct
@@ -270,6 +271,9 @@ typedef struct
 	int (*user_cmd)(int socket_id, uint64_t tag, uint32_t cmd, uint32_t value, void *user_data);
 	int (*user_cmd)(int socket_id, uint64_t tag, uint32_t cmd, uint32_t value, void *user_data);
 
 
 	int (*dns)(const char *domain_name, uint32_t len, void *param,  void *user_data);
 	int (*dns)(const char *domain_name, uint32_t len, void *param,  void *user_data);
+#ifdef LUAT_USE_LWIP
+	int (*dns_ipv6)(const char *domain_name, uint32_t len, void *param,  void *user_data);
+#endif
 	int (*set_dns_server)(uint8_t server_index, luat_ip_addr_t *ip, void *user_data);
 	int (*set_dns_server)(uint8_t server_index, luat_ip_addr_t *ip, void *user_data);
 #ifdef LUAT_USE_LWIP
 #ifdef LUAT_USE_LWIP
 	int (*set_mac)(uint8_t *mac, void *user_data);
 	int (*set_mac)(uint8_t *mac, void *user_data);
@@ -325,6 +329,12 @@ void network_init_ctrl(network_ctrl_t *ctrl, HANDLE task_handle, CBFuncEx_t call
  * 设置必须在socket处于close状态,在进行connect和tls初始之前
  * 设置必须在socket处于close状态,在进行connect和tls初始之前
  */
  */
 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);
 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);
+
+/**
+ * 使用域名时是否选择IPV6地址
+ */
+void network_connect_ipv6_domain(network_ctrl_t *ctrl, uint8_t onoff);
+
 /*
 /*
  * 检查网络是否已经连接,注意不是socket
  * 检查网络是否已经连接,注意不是socket
  * 返回非0是已连接,可以开始socket操作
  * 返回非0是已连接,可以开始socket操作