rtnetlink/link/
bridge_vlan.rs1use crate::{
4 packet_route::{
5 link::{
6 AfSpecBridge, BridgeFlag, BridgeVlanInfo, BridgeVlanInfoFlags,
7 LinkAttribute,
8 },
9 AddressFamily,
10 },
11 LinkMessageBuilder,
12};
13
14#[derive(Debug)]
15pub struct LinkBridgeVlan;
16
17impl LinkBridgeVlan {
18 pub fn new(port_index: u32) -> LinkMessageBuilder<Self> {
19 LinkMessageBuilder::<LinkBridgeVlan>::default()
20 .index(port_index)
21 .interface_family(AddressFamily::Bridge)
22 }
23}
24
25impl LinkMessageBuilder<LinkBridgeVlan> {
26 pub fn append_af_spec(self, spec: AfSpecBridge) -> Self {
28 let mut ret = self;
29
30 for attr in ret.extra_attriutes.iter_mut() {
31 if let LinkAttribute::AfSpecBridge(specs) = attr {
32 specs.push(spec);
33 return ret;
34 }
35 }
36
37 ret.append_extra_attribute(LinkAttribute::AfSpecBridge(vec![spec]))
38 }
39
40 pub fn vlan(self, vid: u16, flags: BridgeVlanInfoFlags) -> Self {
41 self.append_af_spec(AfSpecBridge::VlanInfo(BridgeVlanInfo {
42 vid,
43 flags,
44 }))
45 }
46
47 pub fn vlan_range_start(
50 self,
51 vid: u16,
52 flags: BridgeVlanInfoFlags,
53 ) -> Self {
54 self.vlan(vid, flags | BridgeVlanInfoFlags::RangeBegin)
55 }
56
57 pub fn vlan_range_end(self, vid: u16, flags: BridgeVlanInfoFlags) -> Self {
60 self.vlan(vid, flags | BridgeVlanInfoFlags::RangeEnd)
61 }
62
63 pub fn bridge_self(self) -> Self {
66 self.append_af_spec(AfSpecBridge::Flags(BridgeFlag::LowerDev))
67 }
68}