pub trait MediaAccessControlAddressAndInternetProtocolAddressOverlap: Sized
{
const PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_10_0_0_0: [u8; MediaAccessControlAddress::OrganizationallyUniqueIdentifierSize] = [0x00, 0x00, 0x00];
const PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_172_16_0_0: [u8; MediaAccessControlAddress::OrganizationallyUniqueIdentifierSize] = [0x00, 0x00, 0x01];
const PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_192_168_0_0: [u8; MediaAccessControlAddress::OrganizationallyUniqueIdentifierSize] = [0x00, 0x00, 0x02];
#[inline(always)]
fn from_private_internet_protocol_version_4_host_address(internet_protocol_version_4_host_address: &InternetProtocolVersion4HostAddress) -> Result<Self, ()>;
#[inline(always)]
fn to_private_internet_protocol_version_4_host_address(&self) -> Result<InternetProtocolVersion4HostAddress, ()>;
#[inline(always)]
fn from_internet_protocol_version_6_host_address(internet_protocol_version_6_host_address: InternetProtocolVersion6HostAddress) -> Result<Self, ()>;
#[inline(always)]
fn to_link_local_internet_protocol_version_6_host_address(&self) -> InternetProtocolVersion6HostAddress
{
self.to_internet_protocol_version_6_host_address(&[0xFE, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
}
#[inline(always)]
fn to_internet_protocol_version_6_host_address(&self, internet_protocol_version_6_host_address_prefix: &[u8; 8]) -> InternetProtocolVersion6HostAddress;
}
impl MediaAccessControlAddressAndInternetProtocolAddressOverlap for MediaAccessControlAddress
{
#[inline(always)]
fn from_private_internet_protocol_version_4_host_address(internet_protocol_version_4_host_address: &InternetProtocolVersion4HostAddress) -> Result<Self, ()>
{
let internet_protocol_version_4_host_address = *internet_protocol_version_4_host_address;
let organizationally_unique_identifier = if InternetProtocolVersion4NetworkAddress::Private1.contains(internet_protocol_version_4_host_address)
{
Self::PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_10_0_0_0
}
else if InternetProtocolVersion4NetworkAddress::Private2.contains(internet_protocol_version_4_host_address)
{
Self::PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_172_16_0_0
}
else if InternetProtocolVersion4NetworkAddress::Private3.contains(internet_protocol_version_4_host_address)
{
Self::PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_192_168_0_0
}
else
{
return Err(())
};
let mut this: MediaAccessControlAddress = unsafe { uninitialized() };
{
let bytes = this.to_octets_mutable_reference();
unsafe { copy_nonoverlapping((&organizationally_unique_identifier[..]).as_ptr(), bytes.as_mut_ptr(), Self::OrganizationallyUniqueIdentifierSize) };
unsafe { copy_nonoverlapping((&internet_protocol_version_4_host_address.0[1..InternetProtocolVersion4HostAddress::Size]).as_ptr(), bytes.as_mut_ptr(), 3) };
}
Ok(this)
}
#[inline(always)]
fn to_private_internet_protocol_version_4_host_address(&self) -> Result<InternetProtocolVersion4HostAddress, ()>
{
let first_octet = match array_ref!(self.to_octets_reference(), 0, MediaAccessControlAddress::OrganizationallyUniqueIdentifierSize)
{
&Self::PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_10_0_0_0 => 10,
&Self::PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_172_16_0_0 => 172,
&Self::PrivateInternetProtocolVersion4AddressOrganizationallyUniqueIdentifier_192_168_0_0 => 192,
_ => return Err(()),
};
let mut internet_protocol_version_4_host_address: InternetProtocolVersion4HostAddress = unsafe { uninitialized() };
{
let octets = &mut internet_protocol_version_4_host_address.0;
*unsafe { octets.get_unchecked_mut(0) } = first_octet;
unsafe { copy_nonoverlapping((&self.to_octets_reference()[Self::OrganizationallyUniqueIdentifierSize..6]).as_ptr(), (&mut octets[1..]).as_mut_ptr(), Self::OrganizationallyUniqueIdentifierSize) };
}
Ok(internet_protocol_version_4_host_address)
}
#[inline(always)]
fn from_internet_protocol_version_6_host_address(internet_protocol_version_6_host_address: InternetProtocolVersion6HostAddress) -> Result<Self, ()>
{
let mut this: MediaAccessControlAddress = unsafe { uninitialized() };
{
let bytes = this.to_octets_mutable_reference();
let octets = &internet_protocol_version_6_host_address.0;
if octets[11] != 0xFF || octets[12] != 0xFE
{
return Err(())
}
bytes[0] = octets[8] ^ Self::LocallyAdministeredAddressBitFlag;
bytes[1] = octets[9];
bytes[2] = octets[10];
bytes[3] = octets[13];
bytes[4] = octets[14];
bytes[5] = octets[15];
}
Ok(this)
}
#[inline(always)]
fn to_internet_protocol_version_6_host_address(&self, internet_protocol_version_6_host_address_prefix: &[u8; 8]) -> InternetProtocolVersion6HostAddress
{
let mut internet_protocol_version_6_host_address = InternetProtocolVersion6HostAddress::from_octets(unsafe { uninitialized() });
{
let octets = &mut internet_protocol_version_6_host_address.0;
unsafe { *(octets.as_mut_ptr() as *mut u64) = *(internet_protocol_version_6_host_address_prefix.as_ptr() as *mut u64) };
let bytes = self.to_octets_reference();
octets[8] = bytes[0] ^ Self::LocallyAdministeredAddressBitFlag;
octets[9] = bytes[1];
octets[10] = bytes[2];
octets[11] = 0xFF;
octets[12] = 0xFE;
octets[13] = bytes[3];
octets[14] = bytes[4];
octets[15] = bytes[5];
}
internet_protocol_version_6_host_address
}
}