Raw和TCP Socket插入相同的Vlan会导致设备中的通信问题

问题描述

嗨,我有一个嵌入式设备,它是2个不同的端口。一个是与原始套接字通信另一台设备。其他端口正在使用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 = socket(AF_PACKET,SOCK_RAW,IPPROTO_RAW)更改了套接字初始化。这次没有收到任何数据包。我的原始数据包的etherytpe发送:0xcd03和接收:0xdd04。

通过这种方式,嵌入式设备具有Marvell 88E6097、8 FE + 3 GE可堆叠以太网交换机,电路内部具有QoS和802.1Q。 Raw和TCP套接字连接了此接口。

可能是什么问题?

非常感谢。

解决方法

我通过桥接方法解决了这个问题。这是添加linux设备的bridge命令。

brctl addbr br1 
brctl addif br1 eth3 
ifconfig br1 up

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...