原始和 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