use crate::{MergedNetworkState, NmstateError};
pub(crate) fn store_route_config(
merged_state: &mut MergedNetworkState,
) -> Result<(), NmstateError> {
if merged_state.routes.is_changed() {
let empty_rts = Vec::new();
for iface_name in merged_state.routes.route_changed_ifaces.as_slice() {
let rts =
if let Some(rts) = merged_state.routes.merged.get(iface_name) {
rts
} else {
&empty_rts
};
if let Some(iface) =
merged_state.interfaces.kernel_ifaces.get_mut(iface_name)
{
if !iface.is_changed() {
iface.mark_as_changed();
}
if let Some(apply_iface) = iface.for_apply.as_mut() {
if apply_iface.base_iface_mut().ipv4.is_none() {
apply_iface
.base_iface_mut()
.ipv4
.clone_from(&iface.merged.base_iface_mut().ipv4);
if let Some(addrs) = apply_iface
.base_iface_mut()
.ipv4
.as_mut()
.and_then(|i| i.addresses.as_mut())
{
addrs.retain(|addr| !addr.is_protocol_other());
}
}
if apply_iface.base_iface_mut().ipv6.is_none() {
apply_iface
.base_iface_mut()
.ipv6
.clone_from(&iface.merged.base_iface_mut().ipv6);
if let Some(addrs) = apply_iface
.base_iface_mut()
.ipv6
.as_mut()
.and_then(|i| i.addresses.as_mut())
{
addrs.retain(|addr| !addr.is_protocol_other());
}
}
apply_iface.base_iface_mut().routes = Some(rts.clone());
}
}
}
}
Ok(())
}