Struct netlink_packet_route::rtnl::route::RouteHeader
source · #[non_exhaustive]pub struct RouteHeader {
pub address_family: u8,
pub destination_prefix_length: u8,
pub source_prefix_length: u8,
pub tos: u8,
pub table: u8,
pub protocol: u8,
pub scope: u8,
pub kind: u8,
pub flags: RouteFlags,
}Expand description
High level representation of RTM_GETROUTE, RTM_ADDROUTE, RTM_DELROUTE
messages headers.
These headers have the following structure:
0 8 16 24 32
+----------------+----------------+----------------+----------------+
| address family | dest. length | source length | tos |
+----------------+----------------+----------------+----------------+
| table | protocol | scope | type (kind) |
+----------------+----------------+----------------+----------------+
| flags |
+----------------+----------------+----------------+----------------+
Example
extern crate netlink_packet_route;
use netlink_packet_route::{constants::*, RouteFlags, RouteHeader};
fn main() {
let mut hdr = RouteHeader::default();
assert_eq!(hdr.address_family, 0u8);
assert_eq!(hdr.destination_prefix_length, 0u8);
assert_eq!(hdr.source_prefix_length, 0u8);
assert_eq!(hdr.tos, 0u8);
assert_eq!(hdr.table, RT_TABLE_UNSPEC);
assert_eq!(hdr.protocol, RTPROT_UNSPEC);
assert_eq!(hdr.scope, RT_SCOPE_UNIVERSE);
assert_eq!(hdr.kind, RTN_UNSPEC);
assert_eq!(hdr.flags.bits(), 0u32);
// set some values
hdr.destination_prefix_length = 8;
hdr.table = RT_TABLE_MAIN;
hdr.protocol = RTPROT_KERNEL;
hdr.scope = RT_SCOPE_NOWHERE;
// ...
}Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.address_family: u8§destination_prefix_length: u8Prefix length of the destination subnet.
Note that setting
source_prefix_length: u8Prefix length of the source address.
There could be multiple addresses from which a certain network is reachable. To decide which source address to use to reach and address in that network, the kernel rely on the route’s source address for this destination.
For instance, interface if1 could have two addresses 10.0.0.1/24
and 10.0.0.128/24, and we could have the following routes:
10.0.0.10/32 dev if1 scope link src 10.0.0.1
10.0.0.11/32 dev if1 scope link src 10.0.0.1
10.0.0.12/32 dev if1 scope link src 10.0.0.1
10.0.0.0/24 dev if1 scope link src 10.0.0.128
It means that for 10.0.0.10, 10.0.0.11 and 10.0.0.12 the packets
will be sent with 10.0.0.1 as source address, while for the rest
of the 10.0.0.0/24 subnet, the source address will be
10.0.0.128
tos: u8TOS filter
table: u8Routing table ID. It can be one of the RT_TABLE_* constants or a
custom table number between 1 and 251 (included). Note that Linux
supports routing table with an ID greater than 255, in which case
this attribute will be set to RT_TABLE_COMPAT and an [Nla::Table]
netlink attribute will be present in the message.
protocol: u8Protocol from which the route was learnt. It should be set to one of
the RTPROT_* constants.
scope: u8The scope of the area where the addresses in the destination subnet are
valid. Predefined scope values are the RT_SCOPE_* constants.
kind: u8Route type. It should be set to one of the RTN_* constants.
flags: RouteFlagsFlags when querying the kernel with a RTM_GETROUTE message. See
RouteFlags.
Trait Implementations§
source§impl Clone for RouteHeader
impl Clone for RouteHeader
source§fn clone(&self) -> RouteHeader
fn clone(&self) -> RouteHeader
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moresource§impl Debug for RouteHeader
impl Debug for RouteHeader
source§impl Default for RouteHeader
impl Default for RouteHeader
source§fn default() -> RouteHeader
fn default() -> RouteHeader
source§impl Emitable for RouteHeader
impl Emitable for RouteHeader
source§impl Hash for RouteHeader
impl Hash for RouteHeader
source§impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<RouteMessageBuffer<&'a T>> for RouteHeader
impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<RouteMessageBuffer<&'a T>> for RouteHeader
source§fn parse(buf: &RouteMessageBuffer<&'a T>) -> Result<Self, DecodeError>
fn parse(buf: &RouteMessageBuffer<&'a T>) -> Result<Self, DecodeError>
source§impl PartialEq<RouteHeader> for RouteHeader
impl PartialEq<RouteHeader> for RouteHeader
source§fn eq(&self, other: &RouteHeader) -> bool
fn eq(&self, other: &RouteHeader) -> bool
self and other values to be equal, and is used
by ==.