#[derive(Default, Debug, Clone, Eq, PartialEq)]
#[derive(Deserialize, Serialize)]
#[serde(default, deny_unknown_fields)]
pub struct GlobalNetworkDeviceReceiveQueueConfiguration
{
#[serde(default)] pub receive_packet_steering_affinity: Option<HyperThreads>,
#[serde(default)] pub receive_flow_steering_table_count: Option<usize>,
}
impl GlobalNetworkDeviceReceiveQueueConfiguration
{
#[inline(always)]
pub fn configure(&self, sys_path: &SysPath, receive_sysfs_queue: &ReceiveSysfsQueue) -> Result<(), GlobalNetworkDeviceConfigurationError>
{
use self::GlobalNetworkDeviceConfigurationError::*;
if let Some(ref receive_packet_steering_affinity) = self.receive_packet_steering_affinity
{
receive_sysfs_queue.set_receive_packet_steering_affinity(sys_path, receive_packet_steering_affinity).map_err(CouldNotSetPerReceiveQueueReceivePacketSteeringAffinity)?
}
if let Some(receive_packet_steering_flow_table_count) = self.receive_flow_steering_table_count
{
receive_sysfs_queue.set_receive_packet_steering_flow_table_count(sys_path, receive_packet_steering_flow_table_count).map_err(CouldNotSetPerReceiveQueueReceivePacketSteeringAffinity)?
}
Ok(())
}
#[inline(always)]
pub(crate) fn use_receive_side_scaling_if_possible(receive_packet_steering_affinity: Option<HyperThread>, receive_flow_steering_table_count: usize) -> Self
{
Self
{
receive_packet_steering_affinity: receive_packet_steering_affinity.map(HyperThreads::for_one),
receive_flow_steering_table_count: Some(receive_flow_steering_table_count),
}
}
}