[kext] Resolve verdict of pending conn on shutdown

This commit is contained in:
Vladimir Stoilov
2025-06-09 20:11:26 +03:00
parent 45565fa34f
commit 10f2ef426e
2 changed files with 25 additions and 3 deletions

View File

@@ -296,9 +296,21 @@ impl Device {
}
}
pub fn shutdown(&self) {
pub fn shutdown(&mut self) {
// End blocking operations from the queue. This will end pending read requests.
self.event_queue.rundown();
// Resolve all pending packets. This is important for proper driver unload.
let pending_packets = self.packet_cache.pop_all();
for el in pending_packets {
let key = el.value.0;
let packet = el.value.1;
// Set any verdict. Driver will unload after that and the filter will not be active.
_ = self
.connection_cache
.update_connection(key, crate::connection::Verdict::PermanentBlock);
_ = self.inject_packet(packet, true); // Blocked must be set, so it only handles the ALE layer.
}
}
pub fn inject_packet(&mut self, packet: Packet, blocked: bool) -> Result<(), String> {

View File

@@ -1,3 +1,5 @@
use core::mem;
use alloc::collections::VecDeque;
use protocol::info::Info;
use smoltcp::wire::{IpAddress, IpProtocol};
@@ -5,8 +7,8 @@ use wdk::rw_spin_lock::RwSpinLock;
use crate::{connection::Direction, connection_map::Key, device::Packet};
struct Entry<T> {
value: T,
pub struct Entry<T> {
pub value: T,
id: u64,
}
@@ -54,6 +56,14 @@ impl IdCache {
let _guard = self.lock.read_lock();
return self.values.len();
}
pub fn pop_all(&mut self) -> VecDeque<Entry<(Key, Packet)>> {
let mut values = VecDeque::with_capacity(1);
let _guard = self.lock.write_lock();
mem::swap(&mut self.values, &mut values);
return values;
}
}
fn get_payload(packet: &Packet) -> Option<&[u8]> {