其他分享
首页 > 其他分享> > 使用PF_PACKET类型的套接字时,PACKET_ADD_MEMBERSHIP是什么?

使用PF_PACKET类型的套接字时,PACKET_ADD_MEMBERSHIP是什么?

作者:互联网

当使用协议类型为ETH_P_IP的PF_PACKET类型的套接字时,man packet文档将讨论多播的套接字选项.套接字选项是PACKET_ADD_MEMBERSHIP.

假设您在PF_PACKET套接字上正确使用了PACKET_ADD_MEMBERSHIP套接字选项,那么此套接字选项有哪些功能,好处和用例?

现在,我收到所有传入的IP数据包,因此我查看每个数据包以查看其是否具有正确的IP dst地址和UDP dst端口,并且跳过了所有其他数据包.使用PACKET_ADD_MEMBERSHIP套接字选项是否意味着我不需要做自己的过滤器,因为内核或驱动程序会为我过滤?

我深入研究了linux-kernel的源代码,并追溯了一点代码.我发现您通过setsockopt()传递的ethernet-mac-address已添加到ethernet-mac-addresses列表中.然后将该列表发送到网络设备硬件以执行某项操作…但是我找不到任何权威的文档可以告诉我接下来会发生什么.

我的有根据的猜测是,硬件使用ethernet-mac-address列表过滤第2层以太网协议(即,硬件仅接受具有目标以太网地址与列表中的一个匹配的数据包).如果有一些好的文档,我将对此表示欢迎.

(我对TCP / UDP套接字更加熟悉,因此它看起来与AF_INET type of socket的IP_ADD_MEMBERSHIP套接字选项非常相似…因此,我期望生成IGMP报告,该报告将从路由器启动多播流量…但是我通过实验发现了使用此套接字选项时不会生成IGMP报告.)

解决方法:

你的猜测是正确的. PACKET_ADD_MEMBERSHIP应该将地址添加到NIC的硬件过滤器.如您所料,它旨在允许您接收许多不同地址的多播,而不会产生完全混杂模式的load(*).

(*使用现代的全双工以太网,除非虚拟化环境中,否则通常不会有很多流量会一直不希望接收到NIC.)

请注意,还有一个单独的PACKET_MR_UNICAST,它没有出现在packet(7)手册页中,但是工作类似.我将对要过滤的地址类型使用适当的地址(单播或多播),因为可以想到(尽管不太可能)驱动程序会拒绝将单播地址放入多播过滤表中.

话虽如此,您仍然需要保持软件过滤作为备份.有些较旧的驱动程序根本不实施MAC过滤(特别是对于多个单播地址).如果该功能不可用,则核心内核或驱动程序可以通过简单地启用混杂模式来处理此问题.

至于与IP_ADD_MEMBERSHIP的关系,IP_ADD_MEMBERSHIP代码将自动构造适当的多播MAC地址并将其添加到接口.请参阅ip_mc_filter_add.

标签:sockets,linux-kernel,linux-device-driver,c-3,linux
来源: https://codeday.me/bug/20191120/2044839.html