네트워크 어댑터의 영구(내장) 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
- 펌웨어 버전: 해당 없음
- 버스 정보: 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
시스템 관리자를 신뢰한다면, ifconfig
정의에 따라 시스템 관리자가 스푸핑하지 않을 것이라고 믿기 때문에 MAC 주소가 스푸핑되지 않습니다.
시스템 관리자를 신뢰하지 않으면 기기의 MAC 주소를 알 수 없습니다. 머신은 가상일 수 있습니다. 네트워크 인터페이스가 없을 수도 있습니다. 당신은 알 방법이 없습니다. 원하는 작업을 수행하는 시스템 호출을 찾았더라도 시스템 관리자는 시스템 호출이 다른 결과를 반환하는 방식으로 프로그램을 실행하도록 선택할 수 있습니다.