Skip to content

Commit edbecf3

Browse files
committed
wip: Fix examples
1 parent b3262b8 commit edbecf3

File tree

6 files changed

+113
-82
lines changed

6 files changed

+113
-82
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
[workspace]
22
resolver = "2"
33
members = ["nftnl-sys", "nftnl"]
4+
5+
[patch.crates-io]
6+
mnl = { path = "../mnl-rs/mnl" }
7+
mnl-sys = { path = "../mnl-rs/mnl-sys" }

nftnl/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,4 @@ nftnl-sys = { path = "../nftnl-sys", version = "0.6.2" }
4444

4545
[dev-dependencies]
4646
ipnetwork = "0.20.0"
47-
mnl = "0.2.2"
47+
mnl = "0.2.3"

nftnl/examples/add-ingress-rule.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,29 +121,23 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
121121
fn send_and_process(batch: &FinalizedBatch) -> io::Result<()> {
122122
// Create a netlink socket to netfilter.
123123
let socket = mnl::Socket::new(mnl::Bus::Netfilter)?;
124+
let portid = socket.portid();
125+
124126
// Send all the bytes in the batch.
125127
socket.send_all(batch)?;
126128

127-
// Try to parse the messages coming back from netfilter. This part is still very unclear.
128-
let portid = socket.portid();
129+
// TODO: this buffer must be aligned to nlmsghdr
129130
let mut buffer = vec![0; nftnl::nft_nlmsg_maxsize() as usize];
130-
let very_unclear_what_this_is_for = 2;
131-
while let Some(message) = socket_recv(&socket, &mut buffer[..])? {
132-
match mnl::cb_run(message, very_unclear_what_this_is_for, portid)? {
133-
mnl::CbResult::Stop => {
134-
break;
135-
}
136-
mnl::CbResult::Ok => (),
131+
let mut expected_seqs = batch.sequence_numbers().into_iter();
132+
133+
// Process acknowledgment messages from netfilter.
134+
while !expected_seqs.is_empty() {
135+
for message in socket.recv(&mut buffer[..])? {
136+
let message = message?;
137+
let expected_seq = expected_seqs.next().expect("Unexpected ACK");
138+
// Validate sequence number and check for error messages
139+
mnl::cb_run(message, expected_seq, portid)?;
137140
}
138141
}
139142
Ok(())
140143
}
141-
142-
fn socket_recv<'a>(socket: &mnl::Socket, buf: &'a mut [u8]) -> io::Result<Option<&'a [u8]>> {
143-
let ret = socket.recv(buf)?;
144-
if ret > 0 {
145-
Ok(Some(&buf[..ret]))
146-
} else {
147-
Ok(None)
148-
}
149-
}

nftnl/examples/add-rules.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -187,29 +187,23 @@ fn iface_index(name: &CStr) -> io::Result<libc::c_uint> {
187187
fn send_and_process(batch: &FinalizedBatch) -> io::Result<()> {
188188
// Create a netlink socket to netfilter.
189189
let socket = mnl::Socket::new(mnl::Bus::Netfilter)?;
190+
let portid = socket.portid();
191+
190192
// Send all the bytes in the batch.
191193
socket.send_all(batch)?;
192194

193-
// Try to parse the messages coming back from netfilter. This part is still very unclear.
194-
let portid = socket.portid();
195+
// TODO: this buffer must be aligned to nlmsghdr
195196
let mut buffer = vec![0; nftnl::nft_nlmsg_maxsize() as usize];
196-
let very_unclear_what_this_is_for = 2;
197-
while let Some(message) = socket_recv(&socket, &mut buffer[..])? {
198-
match mnl::cb_run(message, very_unclear_what_this_is_for, portid)? {
199-
mnl::CbResult::Stop => {
200-
break;
201-
}
202-
mnl::CbResult::Ok => (),
197+
let mut expected_seqs = batch.sequence_numbers().into_iter();
198+
199+
// Process acknowledgment messages from netfilter.
200+
while !expected_seqs.is_empty() {
201+
for message in socket.recv(&mut buffer[..])? {
202+
let message = message?;
203+
let expected_seq = expected_seqs.next().expect("Unexpected ACK");
204+
// Validate sequence number and check for error messages
205+
mnl::cb_run(message, expected_seq, portid)?;
203206
}
204207
}
205208
Ok(())
206209
}
207-
208-
fn socket_recv<'a>(socket: &mnl::Socket, buf: &'a mut [u8]) -> io::Result<Option<&'a [u8]>> {
209-
let ret = socket.recv(buf)?;
210-
if ret > 0 {
211-
Ok(Some(&buf[..ret]))
212-
} else {
213-
Ok(None)
214-
}
215-
}

nftnl/examples/filter-ethernet.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -91,29 +91,23 @@ fn main() -> io::Result<()> {
9191
fn send_and_process(batch: &FinalizedBatch) -> io::Result<()> {
9292
// Create a netlink socket to netfilter.
9393
let socket = mnl::Socket::new(mnl::Bus::Netfilter)?;
94+
let portid = socket.portid();
95+
9496
// Send all the bytes in the batch.
9597
socket.send_all(batch)?;
9698

97-
// Try to parse the messages coming back from netfilter. This part is still very unclear.
98-
let portid = socket.portid();
99+
// TODO: this buffer must be aligned to nlmsghdr
99100
let mut buffer = vec![0; nftnl::nft_nlmsg_maxsize() as usize];
100-
let very_unclear_what_this_is_for = 2;
101-
while let Some(message) = socket_recv(&socket, &mut buffer[..])? {
102-
match mnl::cb_run(message, very_unclear_what_this_is_for, portid)? {
103-
mnl::CbResult::Stop => {
104-
break;
105-
}
106-
mnl::CbResult::Ok => (),
101+
let mut expected_seqs = batch.sequence_numbers().into_iter();
102+
103+
// Process acknowledgment messages from netfilter.
104+
while !expected_seqs.is_empty() {
105+
for message in socket.recv(&mut buffer[..])? {
106+
let message = message?;
107+
let expected_seq = expected_seqs.next().expect("Unexpected ACK");
108+
// Validate sequence number and check for error messages
109+
mnl::cb_run(message, expected_seq, portid)?;
107110
}
108111
}
109112
Ok(())
110113
}
111-
112-
fn socket_recv<'a>(socket: &mnl::Socket, buf: &'a mut [u8]) -> io::Result<Option<&'a [u8]>> {
113-
let ret = socket.recv(buf)?;
114-
if ret > 0 {
115-
Ok(Some(&buf[..ret]))
116-
} else {
117-
Ok(None)
118-
}
119-
}

0 commit comments

Comments
 (0)