Browse Source

01. 修复: rt_sockioctl接口强制转换导致指针地址截断进而导致虚拟网卡ip获取失败的问题。
02. 修复: rt_get_netcard_id_from_socket函数中ip转换处理问题。

EWen 3 months ago
parent
commit
044bc092cf
3 changed files with 20 additions and 14 deletions
  1. 5 1
      README.md
  2. 12 10
      app_public/fuxi_public/rt_lite/source/rt_socket.c
  3. 3 3
      dtu/dtu_main_t536/app/net_104.c

+ 5 - 1
README.md

@@ -72,4 +72,8 @@
 
 # 20251217
 01. 增加: dido增加电源板新增加的6个遥信的处理。
-02. 修改: qu16、qs16、qu08、qs08数据类型为int,以适配点表文件中对应数据类型的偏移是按32位的。
+02. 修改: qu16、qs16、qu08、qs08数据类型为int,以适配点表文件中对应数据类型的偏移是按32位的。
+
+# 20251218
+01. 修复: rt_sockioctl接口强制转换导致指针地址截断进而导致虚拟网卡ip获取失败的问题。
+02. 修复: rt_get_netcard_id_from_socket函数中ip转换处理问题。

+ 12 - 10
app_public/fuxi_public/rt_lite/source/rt_socket.c

@@ -177,7 +177,7 @@ int rt_setsockopt (SOCKET s, int level, int optname,  void *optval, unsigned int
 }
 
 
-int rt_sockioctl(SOCKET s, int cmd, uint32_t arg)
+int rt_sockioctl(SOCKET s, int cmd, uint64_t arg)
 {
 	return ioctl(s, cmd, arg);
 }
@@ -581,7 +581,7 @@ int rt_if_mac_get(int index, unsigned char *mac)
 	ifr.ifr_name[IFNAMSIZ   -   1]   =   0; 
 
 	//获取Mac地址
-	ret = ioctl(sock,SIOCGIFHWADDR,(uint32_t)&ifr);
+	ret = ioctl(sock,SIOCGIFHWADDR,(uint64_t)&ifr);
 	if( ret  <   0)   
 	{   
 	//	rt_printf("Not   setup   SIOCGIFHWADDR(ret=%d)\n",ret);   
@@ -678,7 +678,7 @@ int rt_if_ip_get(int index, unsigned char *ip)
 	memset(&ifr,0,sizeof(ifr));
 	strcpy(ifr.ifr_name,g_if_name[index]);
 		
-	if(rt_sockioctl(sock,SIOCGIFADDR,(uint32_t)&ifr) != 0)
+	if(rt_sockioctl(sock,SIOCGIFADDR,(uint64_t)&ifr) != 0)
 	{
 		rt_socket_close(sock);
 		return -1;
@@ -768,7 +768,7 @@ int rt_if_mask_get(int index, unsigned char *mask)
 	memset(&ifr,0,sizeof(ifr));
 	strcpy(ifr.ifr_name,g_if_name[index]);
 	
-	if(rt_sockioctl(sock,SIOCGIFNETMASK,(uint32_t)&ifr) != 0)
+	if(rt_sockioctl(sock,SIOCGIFNETMASK,(uint64_t)&ifr) != 0)
 	{
 		rt_socket_close(sock);
 		return -1;
@@ -838,7 +838,7 @@ int rt_route_add(int index,unsigned char * destination,unsigned char *gateway)
 	((struct sockaddr_in *) &rt.rt_genmask)->sin_family = AF_INET;
 	((struct sockaddr_in *) &rt.rt_genmask)->sin_addr.s_addr = 0 ;
 
-	if( -1 == ioctl(sock,SIOCADDRT,(uint32_t)&rt))
+	if( -1 == ioctl(sock,SIOCADDRT,(uint64_t)&rt))
 	{
 		rt_printf("rt_route_add fail");
 		close(sock);
@@ -905,7 +905,7 @@ int rt_route_del(int index,unsigned char * destination,unsigned char *gateway)
 	((struct sockaddr_in *) &rt.rt_genmask)->sin_family = AF_INET;
 	((struct sockaddr_in *) &rt.rt_genmask)->sin_addr.s_addr = 0 ;
 
-	if( -1 == ioctl(sock,SIOCDELRT,(uint32_t)&rt))
+	if( -1 == ioctl(sock,SIOCDELRT,(uint64_t)&rt))
 	{
 		rt_printf("rt_route_del fail");
 		close(sock);
@@ -1029,7 +1029,7 @@ int rt_get_net_linkstatus(int if_index)
 	/* Get the vitals from the interface. */  
 	strncpy(ifr.ifr_name, g_if_name[if_index], IFNAMSIZ);  
 
-	if (ioctl(skfd, SIOCGMIIPHY, (uint32_t)&ifr) < 0)
+	if (ioctl(skfd, SIOCGMIIPHY, (uint64_t)&ifr) < 0)
 	{  
 		rt_printf( "SIOCGMIIPHY on %s failed!\n",  ifr.ifr_name);  
 		close(skfd);
@@ -1040,7 +1040,7 @@ int rt_get_net_linkstatus(int if_index)
 	   phy_id = data[0];  
 	   data[1] = 1;  
   
-	if (ioctl(skfd, SIOCGMIIREG, (uint32_t)&ifr) < 0)
+	if (ioctl(skfd, SIOCGMIIREG, (uint64_t)&ifr) < 0)
 	{  
 		rt_printf( "SIOCGMIIREG on %s failed!\n", ifr.ifr_name);
 		close(skfd);
@@ -1067,7 +1067,9 @@ int rt_get_netcard_id_from_socket(SOCKET s)
 	
 	
 	rt_getsockname(s, (struct sockaddr *)&local_addr,  &len);		
-	
+	// 此处需转换,否则匹配不到对应ip
+	local_addr.sin_addr.s_addr = ntohl(local_addr.sin_addr.s_addr);
+
 	index = -1;
 	for(i=0;i<g_net_num;i++)
 	{
@@ -1235,7 +1237,7 @@ int rt_if_ip_get2(int eth_id, int index, unsigned char *ip)
 	memset(&ifr,0,sizeof(ifr));
 	strcpy(ifr.ifr_name,buf);
 		
-	if(rt_sockioctl(sock,SIOCGIFADDR,(uint32_t)&ifr) != 0)
+	if(rt_sockioctl(sock,SIOCGIFADDR,(uint64_t)&ifr) != 0)
 	{
 		rt_socket_close(sock);
 		return -1;

+ 3 - 3
dtu/dtu_main_t536/app/net_104.c

@@ -222,12 +222,12 @@ void Net_Init(void)
 		{
 		 #if defined(NET3_IP5) || defined(NET4_IP5)
 			 net_if_set2((int)tRunPara.tNetPara[i].ethid, ret+1, 0, ip, mask);
+			 tRunPara.tNetPara[i].index = ret+1;	
 		 #else
-			 net_if_set2((int)tRunPara.tNetPara[i].ethid, i+1, 0, ip, mask);	
+			 net_if_set2((int)tRunPara.tNetPara[i].ethid, i+1, 0, ip, mask);
+			 tRunPara.tNetPara[i].index = i+1;		
 		 #endif
 			 
-			 tRunPara.tNetPara[i].index = i+1;	
-			 
 			 //rt_printf_time("Xnet = %d,ip=%x, ethID = %d, ret = %d\r\n",tRunPara.tNetPara[i].index,ip[3],tRunPara.tNetPara[i].ethid,ret);
 		}