如何解决用于将 IPv6 数据报定向到内核的原始套接字
我希望将用户空间中可用的 IPv6 数据报(并通过首先需要在用户空间中执行的一些解包的方案接收)注入合适的原始套接字,以供 Linux 内核进一步处理。使用以下代码对 IPv4 执行此操作相当简单:
int fd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
struct sockaddr_ll sa;
memset(sa,sizeof(sa));
// ip4h is the IPv4 datagram unwrapped in the user space and ready to be
// sent to the kernel
if (sendto(fd,iph,iplen,(struct sockaddr *)&sa,sizeof(sa)) != iplen) {
// Error processing.
}
上面注入了完整的 IPv4 数据包(包括 IPv4 标头),并且 Linux 堆栈适当地处理了 IPv4 有效负载。应如何修改上述内容以用于 IPv6 数据包?我尝试的以下调整不起作用:
int fd=socket(AF_PACKET,SOCK_DGRAM,htons(ETH_P_ALL));
sa.sll_family=AF_PACKET;
sa.sll_protocol=htons(ETH_P_IPV6);
sa.sll_halen=ETH_ALEN;
sa.sll_ifindex=2; // <index of eth0>
if (sendto(fd,sizeof(sa)) != iplen) {
// Error processing.
}
有没有想过为什么上述方法不适用于原始 IPv6 数据报? 'tcpdump ip6' 确实显示了我正在插入的 IPv6 数据包,这表明内核可以看到它们!它恰好也忽略了它们。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。