原始和 TCP 套接字插入同一 Vlan 会导致设备出现通信问题
Raw and TCP Socket plug in Same Vlan Cause Communication Problem in Device
您好,我有一个嵌入式设备,它有两个不同的端口。一个是与另一个设备的原始套接字通信。其他端口使用 TCP/IP 数据包类型。当我将这两个端口插入同一 vlan 的交换机时,会导致网络问题。我的设备暂时无法连接 TCP/IP 套接字(~ 15 秒)我的原始套接字也无法与其他原始套接字设备通信(其他设备原始套接字也插入相同的开关)。下面显示了 WireShark 日志
wireshark pcap tcp packet drop
但是如果我管理不同Vlan的切换。我的意思是配置不同的 Tcp 端口和不同的 Vlan 原始端口。那么问题就解决了。
这是我的原始套接字源代码;
int createRawSocket( char* sznetwork_interface_name )
{
int i,ioctl_sock,ifindex,raw_sock=0;
ioctl_sock = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( ioctl_sock < 0 )
{
printf("\nFailed to create ioctl_sock socket\n");
return -1;
}
/*Create raw socket*/
raw_sock = socket ( AF_PACKET, SOCK_RAW, htons ( ETH_P_ALL ));
if ( raw_sock < 0 )
{
printf("\nFailed to create raw_sock socket\n");
return -1;
}
strncpy ( abc_config.ifr.ifr_name, sznetwork_interface_name, sizeof (abc_config.ifr.ifr_name ));
/*Get the interface index*/
if ( ioctl ( ioctl_sock, SIOCGIFINDEX, &abc_config.ifr ) != 0 )
{
printf ("\nFailed to call ioctl 3\n");
return -1;
}
ifindex = abc_config.ifr.ifr_ifindex;
printf("Successfully got RAW interface index: %i\n\r", ifindex);
/*
* prepare sockaddr_ll
*/
abc_config.socket_address.sll_family = AF_PACKET;
abc_config.socket_address.sll_ifindex = abc_config.ifr.ifr_ifindex;
/*Bind to the raw socket*/
if( bind(raw_sock, (struct sockaddr *)&abc_config.socket_address, sizeof(abc_config.socket_address)) < 0 )
{
printf("\nFailed to bind \n");
return -1;
}
/*
* retrieve corresponding MAC
*/
if (ioctl(raw_sock, SIOCGIFHWADDR, &abc_config.ifr) == -1) {
perror("SIOCGIFINDEX");
close(raw_sock);
return ERROR;
}
abc_config.abc_raw_socket = raw_sock;
abc_config.abc_raw_state = RAW_READY;
return raw_sock;}
首先我考虑 htons ( ETH_P_ALL ) 导致所有传入数据包允许。这导致流量增加,我认为无法建立连接然后我更改了使用 raw_sock = 套接字初始化的套接字(AF_PACKET、SOCK_RAW、IPPROTO_RAW);这次没有收到任何类型的数据包。我用于传输的原始数据包的以太类型:0xcd03 和接收:0xdd04.
顺便说一句,嵌入式设备有一个Marvell 88E6097,8 FE + 3 GE Stackable Ethernet Switch with QoS and 802.1Q inside circuit。原始和 TCP 套接字连接了这个开关。
可能是什么问题?
非常感谢。
我通过桥接方法解决了这个问题。这是添加 linux 设备的网桥命令。
brctl addbr br1
brctl addif br1 eth3
ifconfig br1 up
您好,我有一个嵌入式设备,它有两个不同的端口。一个是与另一个设备的原始套接字通信。其他端口使用 TCP/IP 数据包类型。当我将这两个端口插入同一 vlan 的交换机时,会导致网络问题。我的设备暂时无法连接 TCP/IP 套接字(~ 15 秒)我的原始套接字也无法与其他原始套接字设备通信(其他设备原始套接字也插入相同的开关)。下面显示了 WireShark 日志 wireshark pcap tcp packet drop
但是如果我管理不同Vlan的切换。我的意思是配置不同的 Tcp 端口和不同的 Vlan 原始端口。那么问题就解决了。
这是我的原始套接字源代码;
int createRawSocket( char* sznetwork_interface_name ) { int i,ioctl_sock,ifindex,raw_sock=0;
ioctl_sock = socket ( AF_INET, SOCK_DGRAM, 0 );
if ( ioctl_sock < 0 )
{
printf("\nFailed to create ioctl_sock socket\n");
return -1;
}
/*Create raw socket*/
raw_sock = socket ( AF_PACKET, SOCK_RAW, htons ( ETH_P_ALL ));
if ( raw_sock < 0 )
{
printf("\nFailed to create raw_sock socket\n");
return -1;
}
strncpy ( abc_config.ifr.ifr_name, sznetwork_interface_name, sizeof (abc_config.ifr.ifr_name ));
/*Get the interface index*/
if ( ioctl ( ioctl_sock, SIOCGIFINDEX, &abc_config.ifr ) != 0 )
{
printf ("\nFailed to call ioctl 3\n");
return -1;
}
ifindex = abc_config.ifr.ifr_ifindex;
printf("Successfully got RAW interface index: %i\n\r", ifindex);
/*
* prepare sockaddr_ll
*/
abc_config.socket_address.sll_family = AF_PACKET;
abc_config.socket_address.sll_ifindex = abc_config.ifr.ifr_ifindex;
/*Bind to the raw socket*/
if( bind(raw_sock, (struct sockaddr *)&abc_config.socket_address, sizeof(abc_config.socket_address)) < 0 )
{
printf("\nFailed to bind \n");
return -1;
}
/*
* retrieve corresponding MAC
*/
if (ioctl(raw_sock, SIOCGIFHWADDR, &abc_config.ifr) == -1) {
perror("SIOCGIFINDEX");
close(raw_sock);
return ERROR;
}
abc_config.abc_raw_socket = raw_sock;
abc_config.abc_raw_state = RAW_READY;
return raw_sock;}
首先我考虑 htons ( ETH_P_ALL ) 导致所有传入数据包允许。这导致流量增加,我认为无法建立连接然后我更改了使用 raw_sock = 套接字初始化的套接字(AF_PACKET、SOCK_RAW、IPPROTO_RAW);这次没有收到任何类型的数据包。我用于传输的原始数据包的以太类型:0xcd03 和接收:0xdd04.
顺便说一句,嵌入式设备有一个Marvell 88E6097,8 FE + 3 GE Stackable Ethernet Switch with QoS and 802.1Q inside circuit。原始和 TCP 套接字连接了这个开关。
可能是什么问题?
非常感谢。
我通过桥接方法解决了这个问题。这是添加 linux 设备的网桥命令。
brctl addbr br1
brctl addif br1 eth3
ifconfig br1 up