From 0743a0f8a5f818a66794959af00aa09bf4ad7b1c Mon Sep 17 00:00:00 2001 From: Enigamict Date: Fri, 28 Nov 2025 20:03:16 +0900 Subject: [PATCH] feat(virtio): support multicast Co-authored-by: Ryuta Kambe --- .../src/pcie/virtio/virtio_net.rs | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/awkernel_drivers/src/pcie/virtio/virtio_net.rs b/awkernel_drivers/src/pcie/virtio/virtio_net.rs index 53f39307..ac4ca54d 100644 --- a/awkernel_drivers/src/pcie/virtio/virtio_net.rs +++ b/awkernel_drivers/src/pcie/virtio/virtio_net.rs @@ -22,8 +22,12 @@ use awkernel_lib::{ barrier::{membar_consumer, membar_producer, membar_sync}, dma_pool::DMAPool, interrupt::IRQ, - net::net_device::{ - EtherFrameBuf, EtherFrameRef, LinkStatus, NetCapabilities, NetDevError, NetDevice, NetFlags, + net::{ + multicast::MulticastAddrs, + net_device::{ + EtherFrameBuf, EtherFrameRef, LinkStatus, NetCapabilities, NetDevError, NetDevice, + NetFlags, + }, }, paging::PAGESIZE, sync::{ @@ -637,6 +641,7 @@ struct VirtioNetInner { active_features: u64, flags: NetFlags, capabilities: NetCapabilities, + multicast_addrs: MulticastAddrs, virtqueues: Vec, ctrl_vq: Option>, irq_to_type: BTreeMap, @@ -656,6 +661,7 @@ impl VirtioNetInner { active_features: 0, flags: NetFlags::empty(), capabilities: NetCapabilities::empty(), + multicast_addrs: MulticastAddrs::new(), virtqueues: Vec::new(), ctrl_vq: None, irq_to_type: BTreeMap::new(), @@ -1425,12 +1431,18 @@ impl NetDevice for VirtioNet { None } - fn add_multicast_addr(&self, _addr: &[u8; 6]) -> Result<(), NetDevError> { - todo!() + fn add_multicast_addr(&self, addr: &[u8; 6]) -> Result<(), NetDevError> { + let mut inner = self.inner.write(); + inner.multicast_addrs.add_addr(*addr); + inner.vio_iff(); + Ok(()) } - fn remove_multicast_addr(&self, _addr: &[u8; 6]) -> Result<(), NetDevError> { - todo!() + fn remove_multicast_addr(&self, addr: &[u8; 6]) -> Result<(), NetDevError> { + let mut inner = self.inner.write(); + inner.multicast_addrs.remove_addr(addr); + inner.vio_iff(); + Ok(()) } fn poll_in_service(&self) -> Result<(), NetDevError> {