--- nono/vm/virtio_net.cpp 2026/04/29 17:05:33 1.1.1.3 +++ nono/vm/virtio_net.cpp 2026/04/29 17:05:37 1.1.1.4 @@ -93,13 +93,10 @@ VirtIONetDevice::Init() } // MAC アドレスを取得。 - macaddr_t macaddr; if (EthernetDevice::GetConfigMacAddr(0, &macaddr, false) == false) { // エラーメッセージ表示済み。 return false; } - // この先設定するタイミングがないのでここで設定する? - hostnet->SetMyAddr(macaddr); // 表示用。 macaddr_str = macaddr.ToString(':'); @@ -107,7 +104,7 @@ VirtIONetDevice::Init() VirtIONetConfigWriter cfg; SetDeviceFeatures(VIRTIO_NET_F_CSUM); SetDeviceFeatures(VIRTIO_NET_F_GUEST_CSUM); - SetDeviceFeatures(VIRTIO_NET_F_MTU), cfg.mac = macaddr; + SetDeviceFeatures(VIRTIO_NET_F_MTU), macaddr.ExportTo(&cfg.mac[0]); SetDeviceFeatures(VIRTIO_NET_F_MAC), cfg.mtu = 1500; SetDeviceFeatures(VIRTIO_NET_F_MRG_RXBUF); cfg.WriteTo(&device_config[0]); @@ -349,6 +346,22 @@ VirtIONetDevice::Rx(VirtQueue *q) Done(q); } +// この宛先アドレスを受信するかどうか。 +// これは HostNet スレッドで呼ばれる。 +int +VirtIONetDevice::HWAddrFilter(const MacAddr& dstaddr) const +{ + if (dstaddr.IsUnicast()) { + if (dstaddr != macaddr) { + return HPF_DROP_UNICAST; + } + } + // マルチキャストをホストデバイス側でフィルタする機構は + // CTRLQ 内にあるが、NetBSD のドライバは CTRLQ を実装していない。 + + return HPF_PASS; +} + const char * VirtIONetDevice::GetFeatureName(uint feature) const {