Linux网卡驱动中对于组播MAC地址的获取

对于2.6的内核,net_device内部存在一个结构体指针,

struct dev_mc_list *dev->mc_list通过对它的访问,可以循环获取所有的组播MAC地址。

但是,在新的内核中(至少在3.10中)发生了变化,取而代之的是

struct netdev_hw_addr_list mc;

我们可以通过直接对mc进行访问来获取相应的数据,也可以利用Linux内核提供的宏。

netdev_mc_count(dev)这个宏可以获取当前一共存在多少个组播MAC地址,具体的宏定义见下:

#define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc)

netdev_for_each_mc_addr提供了一个循环的方式来获取所有的组播MAC

具体的宏定义如下:

#define netdev_for_each_mc_addr(ha, dev)netdev_hw_addr_list_for_each(ha, &(dev)->mc)

ha是一个netdev_hw_addr的结构体,内部有一个unsigned char addr[MAX_ADDR_LEN];的数组用来存储MAC地址

下面是其中的一部分代码

 struct netdev_hw_addr {
       struct list_head        list;
       unsigned char           addr[MAX_ADDR_LEN];
      unsigned char           type;
}

list_head是Linux在内核实现的一个双向链表,而netdev_hw_addr_list_for_each就是对这样一个链表的访问。

我们可以具体的看一下netdev_hw_addr_list_for_each

 #define netdev_hw_addr_list_for_each(ha, l) list_for_each_entry(ha, &(l)->list, list)

list_for_each_entry

#define list_for_each_entry(pos, list, member) \

for (pos = list_head(list, typeof(*pos), member); \

&pos->member != (list); \

pos = list_next(pos, member))

所以说netdev_for_each_mc_addr的本质就是一个for循环。

时间: 2024-11-08 19:58:10

Linux网卡驱动中对于组播MAC地址的获取的相关文章

组播IP转换为组播MAC地址【转载】

链接:https://www.zhihu.com/question/36730567/answer/83083851来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 组播IP转换为组播MAC地址是一种32:1的映射关系.组播IP地址:IANA将D类地址空间分配给IP组播地址.该空间的地址用二进制表示并且第一个八位组的前4位用1110表示, 因此IP组播地址的范围从224.0.0.0到239.255.255.255 . 组播MAC地址:IEEE MAC地址规定了第一个

组播MAC地址_转

转自:组播MAC地址 MAC地址是以太网二层使用的一个48bit(6字节十六进制数)的地址,用来标识设备位置.MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique identifier),后24位由厂商自行分配. MAC地址有单播.组播.广播之分.单播地址(unicast address)表示单一设备.节点,多播地址或者组播地址(multicast address.group address)表示一组设备.节点,广播地址(broadcast a

组播IP地址

组播IP地址组播IP地址用于标识一个IP组播组.IANA(internet assigned number authority)把D类地址空间分配给IP组播,其范围是从224.0.0.0到239.255.255.255.如下图所示(二进制表示),IP组播地址前四位均为1110XXXX XXXXXXXX XXXXXXXX XXXXXXXX组播组可以是永久的也可以是临时的.组播组地址中,有一部分由官方分配的,称为永久组播组.永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化.永久组播组中

Linux 网卡驱动学习之(八)(基于 MAC 地址转发数据)

1.构建MAC地址表 交换机技术在转发数据前必须知道它的每一个端口所连接的主机的MAC地址,构建出一个MAC地址表.当交换机从某个端口收到数据帧后,读取数据帧中封装的目的地MAC地址信息,然后查阅事先构建的MAC地址表,找出和目的地地址相对应的端口,从该端口把数据转发出去,其他端口则不受影响,这样避免了与其它端口上的数据发生碰撞.因此构建MAC地址表是交换机的首要工作.下面举例说明交换机建立地址表的过程. [分析]假设主机A向主机C发送一个数据帧(每一个数据帧中都包含有源MAC地址和目的MAC地

Linux 网卡驱动学习(net_device 等数据结构)

[摘要]前文对网络驱动例子进行一个简单的梳理总结,本文贴出 net_device 的数据结构以及一些驱动中常用的数据结构. 1.网络设备驱动结构 下图摘自http://blog.chinaunix.net/uid-20672257-id-3147768.html 1).网络协议接口层向网络层协议提供提供统一的数据包收发接口,不论上层协议为ARP还是IP,都通过dev_queue_xmit()函数发送数据,并通过netif_rx()函数接受数据.这一层的存在使得上层协议独立于具体的设备. 2).网

获得Unix/Linux系统中的IP、MAC地址等信息

获得Unix/Linux系统中的IP.MAC地址等信息 中高级  |  2010-07-13 16:03  |  分类:①C语言. Unix/Linux. 网络编程 ②手册  |  4,471 次阅读 作者:diaoyf  |  文章来源:http://programmerdigest.cn 实际环境和特殊需求往往会将简单问题复杂化,比如计算机IP地址,对于一个连接中socket,可以直接获得本端和对端的IP.端口信息.但在一些特殊场合我们可能需要更多的信息,比如系统中有几块网卡,他们的Mac地

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

linux设备驱动中的并发控制

并发指的是多个执行单元同时.并行被执行,而并发的执行单元对共享资源的访问则很容易导致竞态 linux内核中主要竞态1.多对称处理器的多个CPU  2.单CPU内进程与抢占它的进程 3.中断(硬中断.软中断.Tasklet.下半部)与进程之间访问共享内存资源的代码区称为“临界区”,临界区需要被以某种互斥机制加以保护,中断屏蔽.原子操作.自旋锁和信号量等是linux设备驱动中可采用的互斥途径. 这几个互斥的介绍: 1.中断屏蔽,这个主要用于单CPU,中断屏蔽将使得中断和进程之间的并发不再发生.使用方

深入浅出~Linux设备驱动中的阻塞和非阻塞I/O

今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合起来写的,,总之这又给了额外的动力,让自己继续前进,,希望和大家能够分享一些自己的经验,,在最需要奋斗的年级以及在技术的领域踽踽独行的过程中有共同的伙伴继续前进~ 今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的