ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-11-20 15:00:58  阅读:1147  来源: 互联网

标签:sockets linux-kernel linux-device-driver c-3 linux


当使用协议类型为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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有