我们通过spi总线创建一个网络设备驱动程序(eth2)来发送消息。当我们收到消息时,问题就开始了。 司机工作正常。我们知道消息的协议号是
htons(ETH_P_IPV6)
因为
skb->protocol=0x86dd
struct sk_buff *skb;
skb->protocol = eth_type_trans(skb, dev);
在设备1中,我们创建了一个发送消息的套接字:
sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
memset(&client, 0, sizeof(client));
client.sin6_family = AF_INET6;
client.sin6_addr = in6addr_any;
client.sin6_port = htons(20000);
client.sin6_scope_id=if_nametoindex("eth2");
memset(&from, 0, sizeof(from));
from.sin6_family = AF_INET6;
inet_pton(AF_INET6,"ff02::2",(void*)&from.sin6_addr.s6_addr);
from.sin6_port = htons(15118);
bind(sockEnvio,(struct sockaddr *)&client,sizeof(client));
sendto(sockEnvio, data, localIPLen, 0, (struct sockaddr *) &from, sizeof(from)) ;
在设备2中,我们创建一个套接字来接收消息
sock = socket(AF_INET6, SOCK_DGRAM, htons(ETH_P_IPV6))) < 0)
memset(&client, 0, sizeof(client));
client.sin6_family = AF_INET6;
client.sin6_addr = in6addr_any;
client.sin6_port = htons(20000);
client.sin6_scope_id=if_nametoindex("eth2");
bind(sockEnvio,(struct sockaddr *)&client,sizeof(client));
recvfrom(sockEnvio,buffer, BUFFER_SIZE , 0 , (struct sockaddr *) &from , &from_size);
当我们将套接字的类型更改为
时,我们收到消息socket(AF_PACKET , SOCK_RAW , htons(ETH_P_IPV6))) < 0);
我们错过了什么吗?你能帮助我们吗? 在此先感谢您的帮助。
答案 0 :(得分:0)
您似乎使用协议0发送,但使用协议 htons(ETH_P_IPV6)接收。
如果是SOCK_RAW,无论ETH标头中的协议字段如何,都可以从网络获取所有数据包。
您需要在发件人部分初始化套接字,如下所示:
sock = socket(AF_INET6, SOCK_DGRAM, htons(ETH_P_IPV6))) < 0)