1use crate::{
4 packet_route::link::{
5 InfoData, InfoKind, InfoVlan, VlanFlags, VlanProtocol, VlanQosMapping,
6 },
7 LinkMessageBuilder,
8};
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq)]
13pub struct QosMapping {
14 pub from: u32,
15 pub to: u32,
16}
17
18impl From<QosMapping> for VlanQosMapping {
19 fn from(QosMapping { from, to }: QosMapping) -> Self {
20 Self::Mapping(from, to)
21 }
22}
23
24#[derive(Debug)]
48pub struct LinkVlan;
49
50impl LinkVlan {
51 pub fn new(
53 name: &str,
54 base_iface_index: u32,
55 vlan_id: u16,
56 ) -> LinkMessageBuilder<Self> {
57 LinkMessageBuilder::<LinkVlan>::new(name)
58 .id(vlan_id)
59 .link(base_iface_index)
60 }
61}
62
63impl LinkMessageBuilder<LinkVlan> {
64 pub fn new(name: &str) -> Self {
66 LinkMessageBuilder::<LinkVlan>::new_with_info_kind(InfoKind::Vlan)
67 .name(name.to_string())
68 }
69
70 pub fn append_info_data(mut self, info: InfoVlan) -> Self {
71 if let InfoData::Vlan(infos) = self
72 .info_data
73 .get_or_insert_with(|| InfoData::Vlan(Vec::new()))
74 {
75 infos.push(info);
76 }
77 self
78 }
79
80 pub fn id(self, vlan_id: u16) -> Self {
82 self.append_info_data(InfoVlan::Id(vlan_id))
83 }
84
85 pub fn protocol(self, protocol: VlanProtocol) -> Self {
87 self.append_info_data(InfoVlan::Protocol(protocol))
88 }
89
90 pub fn flags(self, flags: VlanFlags, mask: VlanFlags) -> Self {
92 self.append_info_data(InfoVlan::Flags((flags, mask)))
93 }
94
95 pub fn qos<I, E>(self, ingress_qos: I, egress_qos: E) -> Self
97 where
98 I: IntoIterator<Item = QosMapping>,
99 E: IntoIterator<Item = QosMapping>,
100 {
101 let mut ret = self;
102 let ingress: Vec<_> =
103 ingress_qos.into_iter().map(VlanQosMapping::from).collect();
104 if !ingress.is_empty() {
105 ret = ret.append_info_data(InfoVlan::IngressQos(ingress));
106 }
107
108 let egress: Vec<_> =
109 egress_qos.into_iter().map(VlanQosMapping::from).collect();
110
111 if !egress.is_empty() {
112 ret = ret.append_info_data(InfoVlan::EgressQos(egress));
113 }
114 ret
115 }
116}