in src/devices/src/virtio/net/event_handler.rs [54:96]
fn process(&mut self, event: Events, ops: &mut EventOps) {
let source = event.fd();
let event_set = event.event_set();
// TODO: also check for errors. Pending high level discussions on how we want
// to handle errors in devices.
let supported_events = EventSet::IN;
if !supported_events.contains(event_set) {
warn!(
"Received unknown event: {:?} from source: {:?}",
event_set, source
);
return;
}
if self.is_activated() {
let virtq_rx_ev_fd = self.queue_evts[RX_INDEX].as_raw_fd();
let virtq_tx_ev_fd = self.queue_evts[TX_INDEX].as_raw_fd();
let rx_rate_limiter_fd = self.rx_rate_limiter.as_raw_fd();
let tx_rate_limiter_fd = self.tx_rate_limiter.as_raw_fd();
let tap_fd = self.tap.as_raw_fd();
let activate_fd = self.activate_evt.as_raw_fd();
// Looks better than C style if/else if/else.
match source {
_ if source == virtq_rx_ev_fd => self.process_rx_queue_event(),
_ if source == tap_fd => self.process_tap_rx_event(),
_ if source == virtq_tx_ev_fd => self.process_tx_queue_event(),
_ if source == rx_rate_limiter_fd => self.process_rx_rate_limiter_event(),
_ if source == tx_rate_limiter_fd => self.process_tx_rate_limiter_event(),
_ if activate_fd == source => self.process_activate_event(ops),
_ => {
warn!("Net: Spurious event received: {:?}", source);
METRICS.net.event_fails.inc();
}
}
} else {
warn!(
"Net: The device is not yet activated. Spurious event received: {:?}",
source
);
}
}