我需要读取网络适配器的永久(内置)MAC 地址。由于MAC地址很容易被欺骗,所以我需要读取写在EEPROM上的真实地址。我需要在 Linux 上使用 C++ 来完成它。
我尝试使用以太网工具这非常好并且工作正常。然而,在某些系统上它不能按预期工作。
ethtool -P eth0
返回这个:
Permanent address: 00:00:00:00:00:00
和
ethtool -e eth0
返回这个:
Cannot get EEPROM data: Operation not supported
网络适配器有以下信息:
- 驱动程序:ucc_geth
- 版本:1.1
- 固件版本:N/A
- 总线信息:QUICC 引擎
Linux内核版本是:2.6.32.13
问题是:我可以通过任何更新(驱动程序、内核等)解决这个问题吗?
ioctl
此外,我使用C++ 中的函数进行相同的 ethtool 调用。有什么办法可以在代码中解决这个问题吗?或者有没有其他方法可以从EEPROM获取永久MAC地址?
答案1
如果您相信本地计算机不会被欺骗,则ifconfig
和ip addr
都会为您提供硬件的 MAC 地址。
如果您不信任本地计算机,则 ethtool、ifconfig 或 ip 都不会为您提供所需的信息。因为 MAC 欺骗有非常合理的原因(例如,以太网卡上的热故障),所以所有驱动程序仅报告当前的“虚拟”MAC 地址,因为如果您需要欺骗该地址,那么对于某些工具来说它效果不佳报告固件地址,其他报告软地址。没有 ioctl 可以也不应该为您提供硬地址。
要获取硬地址,需要直接读取设备寄存器,因此完全是设备特定的。
快速浏览一下ucc_geth.c 驱动程序似乎表明芯片本身支持 MAC 地址重新分配(这是有道理的,因为它需要能够从以太网中提取发送到其软地址的数据包)。这意味着您需要非常谨慎地确保您获得驱动程序慷慨地说的硬地址:
/* For more details see the hardware spec. */
答案2
如果您信任系统管理员,那么来自的 MAC 地址ifconfig
将不会被欺骗,因为根据定义,您信任系统管理员不会欺骗它。
如果你不信任系统管理员,你就没有办法知道机器的MAC地址。该机器可以是虚拟的。它可能没有网络接口。你没有办法知道。即使您发现一个系统调用应该可以执行您想要的操作,系统管理员也可以选择以该系统调用返回不同结果的方式运行您的程序。