pub struct StaticRoutingTable<NetworkAddress: InternetProtocolNetworkAddress>
{
longest_prefix_match: TreeBitmap<Route<NetworkAddress::HostAddress>>,
default_route_to_next_hop: EthernetDestination,
}
impl<NetworkAddress: InternetProtocolNetworkAddress> StaticRoutingTable<NetworkAddress>
{
#[inline(always)]
pub fn route_to_next_hop(&self, destination_internet_protocol_host_address: &NetworkAddress::HostAddress) -> EthernetDestination
{
let nibbles = destination_internet_protocol_host_address.nibbles_non_destructively();
match self.longest_prefix_match.longest_match_value(nibbles.as_ref())
{
None => self.default_route_to_next_hop,
Some(route) =>
{
let next_hop_internet_protocol_host_address = route.next_hop_internet_protocol_host_address(destination_internet_protocol_host_address);
match route.next_hop_media_access_control_address(next_hop_internet_protocol_host_address)
{
Err(()) => self.default_route_to_next_hop,
Ok(media_access_control_address) =>
{
EthernetDestination
{
media_access_control_address,
ethernet_frame_length: route.next_hop_ethernet_frame_length(),
}
}
}
}
}
}
}