Can edit MAC rules
This commit is contained in:
@ -11,7 +11,10 @@ pub struct NetworkFilterRefXML {
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||
#[serde(rename = "all")]
|
||||
pub struct NetworkFilterRuleProtocolAll {}
|
||||
pub struct NetworkFilterRuleProtocolAllXML {
|
||||
#[serde(rename = "@comment", skip_serializing_if = "Option::is_none")]
|
||||
pub comment: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug)]
|
||||
#[serde(rename = "mac")]
|
||||
@ -128,7 +131,11 @@ pub struct NetworkFilterRuleXML {
|
||||
|
||||
/// Match all protocols
|
||||
#[serde(default, rename = "all", skip_serializing_if = "Vec::is_empty")]
|
||||
pub all_selectors: Vec<NetworkFilterRuleProtocolAll>,
|
||||
pub all_selectors: Vec<NetworkFilterRuleProtocolAllXML>,
|
||||
|
||||
/// Match all ipv6 protocols
|
||||
#[serde(default, rename = "all-ipv6", skip_serializing_if = "Vec::is_empty")]
|
||||
pub all_ipv6_selectors: Vec<NetworkFilterRuleProtocolAllXML>,
|
||||
|
||||
/// Match mac protocol
|
||||
#[serde(default, rename = "mac", skip_serializing_if = "Vec::is_empty")]
|
||||
|
@ -1,5 +1,5 @@
|
||||
use crate::libvirt_lib_structures::nwfilter::{
|
||||
NetworkFilterRefXML, NetworkFilterRuleProtocolAll, NetworkFilterRuleProtocolArpXML,
|
||||
NetworkFilterRefXML, NetworkFilterRuleProtocolAllXML, NetworkFilterRuleProtocolArpXML,
|
||||
NetworkFilterRuleProtocolIpvx, NetworkFilterRuleProtocolLayer4, NetworkFilterRuleProtocolMac,
|
||||
NetworkFilterRuleXML, NetworkFilterXML,
|
||||
};
|
||||
@ -308,6 +308,11 @@ impl Layer4State {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
|
||||
pub struct NetworkSelectorAll {
|
||||
comment: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
|
||||
pub struct NetworkSelectorMac {
|
||||
src_mac_addr: Option<NetworkFilterMacAddressOrVar>,
|
||||
@ -369,7 +374,7 @@ pub struct NetworkFilterSelectorLayer4<IPv> {
|
||||
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone)]
|
||||
#[serde(tag = "type", rename_all = "lowercase")]
|
||||
pub enum NetworkFilterSelector {
|
||||
All,
|
||||
All(NetworkSelectorAll),
|
||||
Mac(NetworkSelectorMac),
|
||||
Arp(NetworkSelectorARP),
|
||||
Rarp(NetworkSelectorARP),
|
||||
@ -379,6 +384,7 @@ pub enum NetworkFilterSelector {
|
||||
UDP(NetworkFilterSelectorLayer4<Ipv4Addr>),
|
||||
SCTP(NetworkFilterSelectorLayer4<Ipv4Addr>),
|
||||
ICMP(NetworkFilterSelectorLayer4<Ipv4Addr>),
|
||||
Allipv6(NetworkSelectorAll),
|
||||
TCPipv6(NetworkFilterSelectorLayer4<Ipv6Addr>),
|
||||
UDPipv6(NetworkFilterSelectorLayer4<Ipv6Addr>),
|
||||
SCTPipv6(NetworkFilterSelectorLayer4<Ipv6Addr>),
|
||||
@ -410,8 +416,10 @@ pub struct NetworkFilter {
|
||||
}
|
||||
|
||||
impl NetworkFilter {
|
||||
fn lib2rest_process_all_rule(_n: &NetworkFilterRuleProtocolAll) -> NetworkFilterSelector {
|
||||
NetworkFilterSelector::All
|
||||
fn lib2rest_process_all_rule(n: &NetworkFilterRuleProtocolAllXML) -> NetworkSelectorAll {
|
||||
NetworkSelectorAll {
|
||||
comment: n.comment.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
fn lib2rest_process_mac_rule(n: &NetworkFilterRuleProtocolMac) -> NetworkFilterSelector {
|
||||
@ -481,16 +489,24 @@ impl NetworkFilter {
|
||||
for rule in &xml.rules {
|
||||
let mut selectors = Vec::new();
|
||||
|
||||
// All selector
|
||||
// All selectors
|
||||
selectors.append(
|
||||
&mut rule
|
||||
.all_selectors
|
||||
.iter()
|
||||
.map(Self::lib2rest_process_all_rule)
|
||||
.map(|r| NetworkFilterSelector::All(Self::lib2rest_process_all_rule(r)))
|
||||
.collect(),
|
||||
);
|
||||
|
||||
// Mac rules
|
||||
selectors.append(
|
||||
&mut rule
|
||||
.all_ipv6_selectors
|
||||
.iter()
|
||||
.map(|r| NetworkFilterSelector::Allipv6(Self::lib2rest_process_all_rule(r)))
|
||||
.collect(),
|
||||
);
|
||||
|
||||
// Mac selectors
|
||||
selectors.append(
|
||||
&mut rule
|
||||
.mac_selectors
|
||||
@ -499,7 +515,7 @@ impl NetworkFilter {
|
||||
.collect(),
|
||||
);
|
||||
|
||||
// ARP - RARP rules
|
||||
// ARP - RARP selectors
|
||||
selectors.append(
|
||||
&mut rule
|
||||
.arp_selectors
|
||||
@ -515,7 +531,7 @@ impl NetworkFilter {
|
||||
.collect(),
|
||||
);
|
||||
|
||||
// IPv4 - IPv6 rules
|
||||
// IPv4 - IPv6 selectors
|
||||
selectors.append(
|
||||
&mut rule
|
||||
.ipv4_selectors
|
||||
@ -531,7 +547,7 @@ impl NetworkFilter {
|
||||
.collect(),
|
||||
);
|
||||
|
||||
// Layer 4 protocols
|
||||
// Layer 4 protocols selectors
|
||||
selectors.append(
|
||||
&mut rule
|
||||
.tcp_selectors
|
||||
@ -648,6 +664,14 @@ impl NetworkFilter {
|
||||
})
|
||||
}
|
||||
|
||||
fn rest2lib_process_all_selector(
|
||||
selector: &NetworkSelectorAll,
|
||||
) -> anyhow::Result<NetworkFilterRuleProtocolAllXML> {
|
||||
Ok(NetworkFilterRuleProtocolAllXML {
|
||||
comment: extract_nw_filter_comment(&selector.comment)?,
|
||||
})
|
||||
}
|
||||
|
||||
fn rest2lib_process_arp_selector(
|
||||
selector: &NetworkSelectorARP,
|
||||
) -> anyhow::Result<NetworkFilterRuleProtocolArpXML> {
|
||||
@ -714,8 +738,16 @@ impl NetworkFilter {
|
||||
|
||||
for sel in &rule.selectors {
|
||||
match sel {
|
||||
NetworkFilterSelector::All => {
|
||||
rule_xml.all_selectors.push(NetworkFilterRuleProtocolAll {});
|
||||
NetworkFilterSelector::All(all) => {
|
||||
rule_xml
|
||||
.all_selectors
|
||||
.push(Self::rest2lib_process_all_selector(all)?);
|
||||
}
|
||||
|
||||
NetworkFilterSelector::Allipv6(all) => {
|
||||
rule_xml
|
||||
.all_ipv6_selectors
|
||||
.push(Self::rest2lib_process_all_selector(all)?);
|
||||
}
|
||||
|
||||
NetworkFilterSelector::Mac(mac) => {
|
||||
|
Reference in New Issue
Block a user