问题描述
嗨,我有一个嵌入式设备,它是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