Skip to content

Commit 03ca6dd

Browse files
committed
link: Support specifying arbitrary LinkMessage for RTM_DELLINK
In order to support deleting bridge VLAN information, this patch introduced `LinkHandle::del_with_message()` allowing sending arbitrary LinkMessage for the `RTM_DELLINK` call. Example code updated with bridge VLAN deletion function. Signed-off-by: Gris Ge <[email protected]>
1 parent 1f8b7da commit 03ca6dd

3 files changed

Lines changed: 80 additions & 13 deletions

File tree

examples/set_bridge_vlan.rs

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -95,17 +95,9 @@ async fn set_bridge_vlan(
9595
Ok(())
9696
}
9797

98-
#[tokio::main]
99-
async fn main() -> Result<(), Box<dyn std::error::Error>> {
100-
let (connection, handle, _) = new_connection().unwrap();
101-
tokio::spawn(connection);
102-
103-
let bridge_index = create_bridge_and_get_index(&handle).await?;
104-
105-
let port_index =
106-
create_dummy_and_attach_to_bridge(&handle, bridge_index).await?;
107-
set_bridge_vlan(&handle, bridge_index, port_index).await?;
108-
98+
async fn dump_bridge_vlan(
99+
handle: &rtnetlink::Handle,
100+
) -> Result<(), rtnetlink::Error> {
109101
let mut dump_link = handle
110102
.link()
111103
.get()
@@ -138,3 +130,67 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
138130
}
139131
Ok(())
140132
}
133+
134+
async fn del_bridge_vlan(
135+
handle: &Handle,
136+
bridge_index: u32,
137+
port_index: u32,
138+
) -> Result<(), rtnetlink::Error> {
139+
let message = LinkBridgeVlan::new(port_index)
140+
.vlan(10, BridgeVlanInfoFlags::Pvid)
141+
.vlan_range_start(20, BridgeVlanInfoFlags::empty())
142+
.vlan_range_end(30, BridgeVlanInfoFlags::empty())
143+
.build();
144+
145+
handle.link().del_with_message(message).execute().await?;
146+
147+
let message = LinkBridgeVlan::new(bridge_index)
148+
.bridge_self()
149+
.vlan(40, BridgeVlanInfoFlags::Pvid)
150+
.vlan_range_start(50, BridgeVlanInfoFlags::empty())
151+
.vlan_range_end(60, BridgeVlanInfoFlags::empty())
152+
.build();
153+
154+
handle.link().del_with_message(message).execute().await?;
155+
156+
Ok(())
157+
}
158+
159+
async fn cleanup(
160+
handle: &Handle,
161+
bridge_index: u32,
162+
port_index: u32,
163+
) -> Result<(), rtnetlink::Error> {
164+
handle.link().del(bridge_index).execute().await?;
165+
handle.link().del(port_index).execute().await?;
166+
167+
Ok(())
168+
}
169+
170+
#[tokio::main]
171+
async fn main() -> Result<(), Box<dyn std::error::Error>> {
172+
let (connection, handle, _) = new_connection().unwrap();
173+
tokio::spawn(connection);
174+
175+
let bridge_index = create_bridge_and_get_index(&handle).await?;
176+
177+
let port_index =
178+
create_dummy_and_attach_to_bridge(&handle, bridge_index).await?;
179+
180+
println!("Setting Bridge VLAN");
181+
set_bridge_vlan(&handle, bridge_index, port_index).await?;
182+
183+
dump_bridge_vlan(&handle).await?;
184+
185+
println!("Removing Bridge VLAN");
186+
187+
del_bridge_vlan(&handle, bridge_index, port_index).await?;
188+
189+
dump_bridge_vlan(&handle).await?;
190+
191+
println!("Cleaning up");
192+
193+
cleanup(&handle, bridge_index, port_index).await?;
194+
195+
Ok(())
196+
}

src/link/del.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ impl LinkDelRequest {
1818
LinkDelRequest { handle, message }
1919
}
2020

21+
pub fn new_with_message(handle: Handle, message: LinkMessage) -> Self {
22+
LinkDelRequest { handle, message }
23+
}
24+
2125
/// Execute the request
2226
pub async fn execute(self) -> Result<(), Error> {
2327
let LinkDelRequest {

src/link/handle.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,19 @@ impl LinkHandle {
4343
LinkDelPropRequest::new(self.0.clone(), index)
4444
}
4545

46-
pub fn del(&mut self, index: u32) -> LinkDelRequest {
46+
pub fn del(&self, index: u32) -> LinkDelRequest {
4747
LinkDelRequest::new(self.0.clone(), index)
4848
}
4949

50+
/// Delete specified information from interface.
51+
/// For example: To delete bridge VLANs, it is required to include
52+
/// LinkMessage of VLAN information to delete.
53+
pub fn del_with_message(&self, message: LinkMessage) -> LinkDelRequest {
54+
LinkDelRequest::new_with_message(self.0.clone(), message)
55+
}
56+
5057
/// Retrieve the list of links (equivalent to `ip link show`)
51-
pub fn get(&mut self) -> LinkGetRequest {
58+
pub fn get(&self) -> LinkGetRequest {
5259
LinkGetRequest::new(self.0.clone())
5360
}
5461

0 commit comments

Comments
 (0)