web-dev-qa-db-ja.com

ethtoolが永続的なMACアドレスを取得すると、すべて0が返される

ネットワークアダプターの永続的な(焼き付けられた)MACアドレスを読み取る必要があります。 MACアドレスは簡単になりすまされる可能性があるため、EEPROMに書き込まれている実際のアドレスを読み取る必要があります。 LinuxでC++を使用する必要があります。

私は ethtool を使用してみました。ただし、一部のシステムでは、意図したとおりに機能しません。

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

質問です:この問題を更新(ドライバー、カーネルなど)で修正できますか?

さらに、C++でioctl関数を使用して同じethtool呼び出しを行います。コード内でこれを修正する方法はありますか?または、EEPROMから永続的なMACアドレスを取得する他の方法はありますか?

ローカルマシンがなりすましではないと信頼できる場合は、ifconfigip addrの両方からハードウェアのMACアドレスがわかります。

ローカルマシンを信頼しない場合、ethtool、ifconfig、ipのいずれも必要な情報を提供しません。 MACスプーフィングには非常に正当な理由(たとえば、イーサカードのホットフェイル)があるため、すべてのドライバは現在「仮想」のMACアドレスのみを報告します。アドレスをスプーフィングする必要がある場合、一部のツールではうまく機能しないためです。ファームウェアアドレスを報告するために、ソフトアドレスを報告するために他のもの。 ioctlがハードアドレスを提供することはできません。

ハードアドレスを取得するには、デバイスレジスタを直接読み取る必要があるため、完全にデバイス固有です。

cc_geth.cドライバー をざっと見てみると、MACアドレスの再割り当てがチップ自体でサポートされていることがわかります(これは、イーサからソフトアドレスに送信されたパケットを取り出すことができる必要があるため、理にかなっています) )。これは、ドライバーが自由に言うハードアドレスを確実に取得するために、非常に慎重になる必要があることを意味します。

/* For more details see the hardware spec.  */
6
msw

システム管理者を信頼している場合、ifconfigのMACアドレスはスプーフィングされません。これは、システム管理者がスプーフィングを行わないことを信頼しているためです。

システム管理者を信頼しない場合、マシンのMACアドレスを知る方法がありません。マシンは仮想である可能性があります。ネットワークインターフェイスがない可能性があります。あなたには知る方法がありません。おそらく必要な処理を行うシステムコールを見つけた場合でも、sysadminは、このシステムコールが異なる結果を返すようにプログラムを実行することを選択できます。