Skip to content

Commit 7c20c57

Browse files
committed
Wire up viona for illumos#17032
1 parent bd7a8cf commit 7c20c57

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed

crates/viona-api/src/lib.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ impl VionaFd {
141141
| ioctls::VNA_IOC_RING_INTR_CLR
142142
| ioctls::VNA_IOC_VERSION
143143
| ioctls::VNA_IOC_SET_PROMISC
144+
| ioctls::VNA_IOC_GET_MTU
145+
| ioctls::VNA_IOC_SET_MTU
144146
)
145147
}
146148
}
@@ -178,6 +180,9 @@ unsafe fn ioctl(
178180
#[repr(u32)]
179181
#[derive(Copy, Clone)]
180182
pub enum ApiVersion {
183+
/// Add support for getting/setting MTU
184+
V4 = 4,
185+
181186
/// Adds support for interface parameters
182187
V3 = 3,
183188

@@ -189,7 +194,7 @@ pub enum ApiVersion {
189194
}
190195
impl ApiVersion {
191196
pub const fn current() -> Self {
192-
Self::V3
197+
Self::V4
193198
}
194199
}
195200
impl PartialEq<ApiVersion> for u32 {

crates/viona-api/sys/src/lib.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ pub mod ioctls {
2626
pub const VNA_IOC_SET_PROMISC: i32 = VNA_IOC | 0x24;
2727
pub const VNA_IOC_GET_PARAMS: i32 = VNA_IOC | 0x25;
2828
pub const VNA_IOC_SET_PARAMS: i32 = VNA_IOC | 0x26;
29+
pub const VNA_IOC_GET_MTU: i32 = VNA_IOC | 0x27;
30+
pub const VNA_IOC_SET_MTU: i32 = VNA_IOC | 0x28;
2931
}
3032

3133
pub const VIONA_VQ_MAX: u16 = 2;
@@ -84,11 +86,13 @@ mod structs {
8486
use libc::size_t;
8587
use std::ffi::c_void;
8688

89+
#[repr(C)]
8790
pub struct vioc_get_params {
8891
pub vgp_param: *mut c_void,
8992
pub vgp_param_sz: size_t,
9093
}
9194

95+
#[repr(C)]
9296
pub struct vioc_set_params {
9397
pub vsp_param: *mut c_void,
9498
pub vsp_param_sz: size_t,
@@ -100,7 +104,7 @@ mod structs {
100104
/// This is the viona interface version which viona_api expects to operate
101105
/// against. All constants and structs defined by the crate are done so in
102106
/// terms of that specific version.
103-
pub const VIONA_CURRENT_INTERFACE_VERSION: u32 = 3;
107+
pub const VIONA_CURRENT_INTERFACE_VERSION: u32 = 4;
104108

105109
/// Maximum size of packed nvlists used in viona parameter ioctls
106110
pub const VIONA_MAX_PARAM_NVLIST_SZ: usize = 4096;

lib/propolis/src/hw/virtio/viona.rs

+23
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,19 @@ impl PciVirtioViona {
184184
let msix_count = Some(3);
185185
let dev_features = hdl.get_avail_features()?;
186186

187+
// Do in-kernel configuration of device MTU
188+
if let Some(mtu) = info.mtu {
189+
if hdl.api_version().unwrap() >= viona_api::ApiVersion::V4 {
190+
hdl.set_mtu(mtu)?;
191+
} else if mtu != 1500 {
192+
// Squawk about MTUs not matching the default of 1500
193+
return Err(io::Error::new(
194+
ErrorKind::Unsupported,
195+
"viona device version is inadequate to set MTU",
196+
));
197+
}
198+
}
199+
187200
let queues =
188201
VirtQueues::new(NonZeroU16::new(queue_size).unwrap(), queue_count);
189202
let (virtio_state, pci_state) = PciVirtioState::create(
@@ -719,6 +732,16 @@ impl VionaHdl {
719732
self.0.instance_id()
720733
}
721734

735+
/// Set MTU for viona device
736+
fn set_mtu(&self, mtu: u16) -> io::Result<()> {
737+
self.0.ioctl_usize(viona_api::VNA_IOC_SET_MTU, mtu.into())?;
738+
Ok(())
739+
}
740+
741+
fn api_version(&self) -> io::Result<u32> {
742+
self.0.api_version()
743+
}
744+
722745
/// Set the desired promiscuity level on this interface.
723746
#[cfg(feature = "falcon")]
724747
fn set_promisc(&self, p: viona_api::viona_promisc_t) -> io::Result<()> {

0 commit comments

Comments
 (0)