#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub(crate) struct GetAddressProcessingMessageStateUnicastCommon<IPA: InternetProtocolAddress>
{
pub(crate) common: GetAddressProcessingMessageStateCommon,
pub(crate) local_address: Option<IPA>,
pub(crate) address: Option<IPA>,
pub(crate) route_priority: Option<NonZeroU32>,
pub(crate) extended_interface_flags: Option<ExtendedInterfaceFlags>,
}
#[allow(missing_docs)]
impl<IPA: InternetProtocolAddress> GetAddressProcessingMessageStateUnicastCommon<IPA>
{
#[inline(always)]
pub(crate) fn new(message_header: &ifaddrmsg) -> Result<Self, String>
{
Ok
(
Self
{
common: GetAddressProcessingMessageStateCommon::new::<IPA>(message_header)?,
local_address: None,
address: None,
route_priority: None,
extended_interface_flags: None,
}
)
}
#[inline(always)]
pub(crate) fn to_processed_message(self) -> Result<GetAddressMessageDataUnicastCommon<IPA>, String>
{
let common = self.common;
let interface_flags = common.interface_flags;
let common = common.to_processed_message::<IPA>()?;
let source_address_and_point_to_point_peer_destination_address = match (self.address, self.local_address)
{
(None, None) => None,
(Some(address), None) => Some((address, None)),
(None, Some(local_address)) => Some((local_address, None)),
(Some(address), Some(local_address)) => Some((local_address, Some(address))),
};
Ok
(
GetAddressMessageDataUnicastCommon
{
common,
source_address_and_point_to_point_peer_destination_address,
route_priority: self.route_priority,
extended_interface_flags:
{
let extended_interface_flags = self.extended_interface_flags.ok_or(format!("Linux kernel bug - missing extended_interface_flags"))?;
if likely!(extended_interface_flags.contains(ExtendedInterfaceFlags::from(interface_flags)))
{
extended_interface_flags
}
else
{
return Err(format!("Linux kernel bug - missing interface_flags is not a subset of extended_interface_flags"))
}
},
}
)
}
}