nForceドライバforcedethが発生するランダムなEtherアドレス

  • nForceチップセットにはEtherネットインターフェースが含まれていて,Linux2.6カーネルでこれを駆動しているのはdrivers/net/forcedeth.c
  • nForceチップセットの中にはBIOSが正しくEtherアドレスを返答しないものや他と逆順で返答するものなどがあり,Etherアドレスの取得に失敗することがあるらしい.
    • ブート時にEtherアドレスの取得に失敗する場合やブート事には成功していてもスリープからの復帰時などにEtherアドレス取得に失敗することがあるらしい.
    • 物理的に一つのネットワークデバイスに複数のEtherアドレスが存在した状態になったり,Etherアドレスが切り替わってしまったりする場合があるらしい.
    • どのように振る舞うかはforcedeth.cのバージョンにも依存する.linux-2.6.22に含まれているのはver 0.60 (2007/1/20)
  • 失敗した場合00:00:6cで始まるEtherアドレスが使用される.後半はランダムに決定される.
       if (!is_valid_ether_addr(dev->perm_addr)) {
                /*
                 * Bad mac address. At least one bios sets the mac address
                 * to 01:23:45:67:89:ab
                 */
                printk(KERN_ERR "%s: Invalid Mac address detected: %02x:%02x:%02x:%02x:%02x:%02x\n",
                        pci_name(pci_dev),
                        dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
                        dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
                printk(KERN_ERR "Please complain to your hardware vendor. Switching to a random MAC.\n");
                dev->dev_addr[0] = 0x00;
                dev->dev_addr[1] = 0x00;
                dev->dev_addr[2] = 0x6c;
                get_random_bytes(&dev->dev_addr[3], 3);
        }
    • このコードにより次のようなカーネルメッセージが残される.
linux kernel: 0000:00:04.0: Invalid Mac address detected: 00:00:00:00:00:00 
linux kernel: Please complain to your hardware vendor. Switching to a random MAC.