Skip to content

Commit fbf1ed8

Browse files
authored
Proper socket handing for mnl (#280)
1 parent affd9b4 commit fbf1ed8

3 files changed

Lines changed: 52 additions & 59 deletions

File tree

Cargo.lock

Lines changed: 34 additions & 34 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/enterprise/firewall/nftables/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ impl FirewallApi {
218218
}
219219
}
220220

221-
apply_filter_rules(filter_rules, batch, &self.ifname)?;
221+
apply_filter_rules(&filter_rules, batch, &self.ifname)?;
222222

223223
debug!(
224224
"Applied firewall rules for Defguard ACL rule ID: {}",

src/enterprise/firewall/nftables/netfilter.rs

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ impl Chains {
822822
}
823823

824824
pub(super) fn apply_filter_rules(
825-
rules: Vec<FilterRule>,
825+
rules: &[FilterRule],
826826
batch: &mut Batch,
827827
ifname: &str,
828828
) -> Result<(), FirewallError> {
@@ -832,7 +832,7 @@ pub(super) fn apply_filter_rules(
832832
let forward_chain = Chains::Forward.to_chain(&table);
833833
batch.add(&forward_chain, MsgType::Add);
834834

835-
for rule in rules.iter() {
835+
for rule in rules {
836836
let chain_rule = rule.to_chain_rule(&forward_chain, batch)?;
837837
batch.add(&chain_rule, MsgType::Add);
838838
}
@@ -842,17 +842,26 @@ pub(super) fn apply_filter_rules(
842842

843843
pub(crate) fn send_batch(batch: &FinalizedBatch) -> Result<(), FirewallError> {
844844
let socket = mnl::Socket::new(mnl::Bus::Netfilter)
845-
.map_err(|e| FirewallError::NetlinkError(format!("Failed to create socket: {e:?}")))?;
846-
socket.send_all(batch).map_err(|e| {
847-
FirewallError::NetlinkError(format!("Failed to send batch through socket: {e:?}"))
845+
.map_err(|err| FirewallError::NetlinkError(format!("Failed to create socket: {err:?}")))?;
846+
socket.send_all(batch).map_err(|err| {
847+
FirewallError::NetlinkError(format!("Failed to send batch through socket: {err:?}"))
848848
})?;
849849

850850
let portid = socket.portid();
851851
let mut buffer = vec![0; nft_nlmsg_maxsize() as usize];
852852

853-
// TODO: Why is it supposed to be 2?
854-
let seq = 2;
855-
while let Some(message) = socket_recv(&socket, &mut buffer[..])? {
853+
let mut expected_seqs = batch.sequence_numbers();
854+
for message in socket.recv(&mut buffer).map_err(|err| {
855+
FirewallError::NetlinkError(format!("Failed reading message from socket: {err:?}"))
856+
})? {
857+
let Ok(message) = message else {
858+
warn!("Invalid netlink message");
859+
continue;
860+
};
861+
let Some(seq) = expected_seqs.next() else {
862+
warn!("Unexpected ACK in netlink messages");
863+
continue;
864+
};
856865
match mnl::cb_run(message, seq, portid) {
857866
Ok(mnl::CbResult::Stop) => {
858867
debug!("Received stop signal from netlink callback");
@@ -872,22 +881,6 @@ pub(crate) fn send_batch(batch: &FinalizedBatch) -> Result<(), FirewallError> {
872881
Ok(())
873882
}
874883

875-
fn socket_recv<'a>(
876-
socket: &mnl::Socket,
877-
buf: &'a mut [u8],
878-
) -> Result<Option<&'a [u8]>, FirewallError> {
879-
let ret = socket.recv_raw(buf).map_err(|err| {
880-
FirewallError::NetlinkError(format!(
881-
"Failed while reading a message from socket: {err:?}"
882-
))
883-
})?;
884-
if ret > 0 {
885-
Ok(Some(&buf[..ret]))
886-
} else {
887-
Ok(None)
888-
}
889-
}
890-
891884
fn new_anon_set<T>(table: &Table, family: ProtoFamily, interval_set: bool) -> Set<'_, T>
892885
where
893886
T: SetKey,

0 commit comments

Comments
 (0)