rtnetlink/link/
bridge_vlan.rs

1// SPDX-License-Identifier: MIT
2
3use 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    /// Append arbitrary [LinkAttribute::AfSpecBridge]
27    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    /// Helper function by adding [BridgeVlanInfoFlags::RangeBegin]
48    /// automatically to `flags`
49    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    /// Helper function by adding [BridgeVlanInfoFlags::RangeEnd]
58    /// automatically to `flags`
59    pub fn vlan_range_end(self, vid: u16, flags: BridgeVlanInfoFlags) -> Self {
60        self.vlan(vid, flags | BridgeVlanInfoFlags::RangeEnd)
61    }
62
63    /// Change VLAN of bridge itself
64    /// Equal to the `self` argument in `bridge vlan add dev br0 vid 11 self`
65    pub fn bridge_self(self) -> Self {
66        self.append_af_spec(AfSpecBridge::Flags(BridgeFlag::LowerDev))
67    }
68}