blob: 1c08d8061b3b922f13aab9be3790ca16c2a51dbd [file] [log] [blame]
// SPDX-License-Identifier: MIT
use std::net::{Ipv4Addr, Ipv6Addr};
use crate::{
link::LinkMessageBuilder,
packet_route::link::{
BondArpValidate, BondMode, InfoBond, InfoData, InfoKind,
},
};
///
/// Represent bond interface.
/// Example code on creating a bond interface
/// ```no_run
/// use rtnetlink::{new_connection, LinkBond, packet_route::link::BondMode};
///
/// #[tokio::main]
/// async fn main() -> Result<(), String> {
/// let (connection, handle, _) = new_connection().map_err(|e|
/// format!("{e}"))?;
/// tokio::spawn(connection);
///
/// let message = LinkBond::new("bond0")
/// .mode(BondMode::ActiveBackup)
/// .miimon(100)
/// .updelay(100)
/// .downdelay(100)
/// .min_links(2)
/// .up()
/// .build();
///
/// handle
/// .link()
/// .add(message)
/// .execute()
/// .await
/// .map_err(|e| format!("{e}"))
/// }
/// ```
///
/// Please check LinkMessageBuilder::<LinkBond> for more detail.
#[derive(Debug)]
pub struct LinkBond;
impl LinkBond {
/// Equal to `LinkMessageBuilder::<LinkBond>::new()`
pub fn new(name: &str) -> LinkMessageBuilder<Self> {
LinkMessageBuilder::<LinkBond>::new(name)
}
}
impl LinkMessageBuilder<LinkBond> {
/// Create [LinkMessageBuilder] for bond
pub fn new(name: &str) -> Self {
LinkMessageBuilder::<LinkBond>::new_with_info_kind(InfoKind::Bond)
.name(name.to_string())
}
pub fn append_info_data(self, info: InfoBond) -> Self {
let mut ret = self;
if let InfoData::Bond(infos) = ret
.info_data
.get_or_insert_with(|| InfoData::Bond(Vec::new()))
{
infos.push(info);
}
ret
}
/// Adds the `mode` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond mode MODE`.
pub fn mode(self, mode: BondMode) -> Self {
self.append_info_data(InfoBond::Mode(mode))
}
/// Adds the `active_port` attribute to the bond, where `active_port`
/// is the ifindex of an interface attached to the bond.
/// This is equivalent to `ip link add name NAME type bond active_slave
/// ACTIVE_PORT_NAME`.
pub fn active_port(self, active_port: u32) -> Self {
self.append_info_data(InfoBond::ActivePort(active_port))
}
/// Adds the `miimon` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond miimon MIIMON`.
pub fn miimon(self, miimon: u32) -> Self {
self.append_info_data(InfoBond::MiiMon(miimon))
}
/// Adds the `updelay` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond updelay UPDELAY`.
pub fn updelay(self, updelay: u32) -> Self {
self.append_info_data(InfoBond::UpDelay(updelay))
}
/// Adds the `downdelay` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond downdelay
/// DOWNDELAY`.
pub fn downdelay(self, downdelay: u32) -> Self {
self.append_info_data(InfoBond::DownDelay(downdelay))
}
/// Adds the `use_carrier` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond use_carrier
/// USE_CARRIER`.
pub fn use_carrier(self, use_carrier: u8) -> Self {
self.append_info_data(InfoBond::UseCarrier(use_carrier))
}
/// Adds the `arp_interval` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond arp_interval
/// ARP_INTERVAL`.
pub fn arp_interval(self, arp_interval: u32) -> Self {
self.append_info_data(InfoBond::ArpInterval(arp_interval))
}
/// Adds the `arp_validate` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond arp_validate
/// ARP_VALIDATE`.
pub fn arp_validate(self, arp_validate: BondArpValidate) -> Self {
self.append_info_data(InfoBond::ArpValidate(arp_validate))
}
/// Adds the `arp_all_targets` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond arp_all_targets
/// ARP_ALL_TARGETS`
pub fn arp_all_targets(self, arp_all_targets: u32) -> Self {
self.append_info_data(InfoBond::ArpAllTargets(arp_all_targets))
}
/// Adds the `primary` attribute to the bond, where `primary` is the ifindex
/// of an interface.
/// This is equivalent to `ip link add name NAME type bond primary
/// PRIMARY_NAME`
pub fn primary(self, primary: u32) -> Self {
self.append_info_data(InfoBond::Primary(primary))
}
/// Adds the `primary_reselect` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond primary_reselect
/// PRIMARY_RESELECT`.
pub fn primary_reselect(self, primary_reselect: u8) -> Self {
self.append_info_data(InfoBond::PrimaryReselect(primary_reselect))
}
/// Adds the `fail_over_mac` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond fail_over_mac
/// FAIL_OVER_MAC`.
pub fn fail_over_mac(self, fail_over_mac: u8) -> Self {
self.append_info_data(InfoBond::FailOverMac(fail_over_mac))
}
/// Adds the `xmit_hash_policy` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond xmit_hash_policy
/// XMIT_HASH_POLICY`.
pub fn xmit_hash_policy(self, xmit_hash_policy: u8) -> Self {
self.append_info_data(InfoBond::XmitHashPolicy(xmit_hash_policy))
}
/// Adds the `resend_igmp` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond resend_igmp
/// RESEND_IGMP`.
pub fn resend_igmp(self, resend_igmp: u32) -> Self {
self.append_info_data(InfoBond::ResendIgmp(resend_igmp))
}
/// Adds the `num_peer_notif` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond num_peer_notif
/// NUM_PEER_NOTIF`.
pub fn num_peer_notif(self, num_peer_notif: u8) -> Self {
self.append_info_data(InfoBond::NumPeerNotif(num_peer_notif))
}
/// Adds the `all_ports_active` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond all_slaves_active
/// ALL_PORTS_ACTIVE`.
pub fn all_ports_active(self, all_ports_active: u8) -> Self {
self.append_info_data(InfoBond::AllPortsActive(all_ports_active))
}
/// Adds the `min_links` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond min_links
/// MIN_LINKS`.
pub fn min_links(self, min_links: u32) -> Self {
self.append_info_data(InfoBond::MinLinks(min_links))
}
/// Adds the `lp_interval` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond lp_interval
/// LP_INTERVAL`.
pub fn lp_interval(self, lp_interval: u32) -> Self {
self.append_info_data(InfoBond::LpInterval(lp_interval))
}
/// Adds the `packets_per_port` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond packets_per_slave
/// PACKETS_PER_PORT`.
pub fn packets_per_port(self, packets_per_port: u32) -> Self {
self.append_info_data(InfoBond::PacketsPerPort(packets_per_port))
}
/// Adds the `ad_lacp_rate` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ad_lacp_rate
/// AD_LACP_RATE`.
pub fn ad_lacp_rate(self, ad_lacp_rate: u8) -> Self {
self.append_info_data(InfoBond::AdLacpRate(ad_lacp_rate))
}
/// Adds the `ad_select` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ad_select
/// AD_SELECT`.
pub fn ad_select(self, ad_select: u8) -> Self {
self.append_info_data(InfoBond::AdSelect(ad_select))
}
/// Adds the `ad_actor_sys_prio` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ad_actor_sys_prio
/// AD_ACTOR_SYS_PRIO`.
pub fn ad_actor_sys_prio(self, ad_actor_sys_prio: u16) -> Self {
self.append_info_data(InfoBond::AdActorSysPrio(ad_actor_sys_prio))
}
/// Adds the `ad_user_port_key` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ad_user_port_key
/// AD_USER_PORT_KEY`.
pub fn ad_user_port_key(self, ad_user_port_key: u16) -> Self {
self.append_info_data(InfoBond::AdUserPortKey(ad_user_port_key))
}
/// Adds the `ad_actor_system` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ad_actor_system
/// AD_ACTOR_SYSTEM`.
pub fn ad_actor_system(self, ad_actor_system: [u8; 6]) -> Self {
self.append_info_data(InfoBond::AdActorSystem(ad_actor_system))
}
/// Adds the `tlb_dynamic_lb` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond tlb_dynamic_lb
/// TLB_DYNAMIC_LB`.
pub fn tlb_dynamic_lb(self, tlb_dynamic_lb: u8) -> Self {
self.append_info_data(InfoBond::TlbDynamicLb(tlb_dynamic_lb))
}
/// Adds the `peer_notif_delay` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond peer_notif_delay
/// PEER_NOTIF_DELAY`.
pub fn peer_notif_delay(self, peer_notif_delay: u32) -> Self {
self.append_info_data(InfoBond::PeerNotifDelay(peer_notif_delay))
}
/// Adds the `ad_lacp_active` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ad_lacp_active
/// AD_LACP_ACTIVE`.
pub fn ad_lacp_active(self, ad_lacp_active: u8) -> Self {
self.append_info_data(InfoBond::AdLacpActive(ad_lacp_active))
}
/// Adds the `missed_max` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond missed_max
/// MISSED_MAX`.
pub fn missed_max(self, missed_max: u8) -> Self {
self.append_info_data(InfoBond::MissedMax(missed_max))
}
/// Adds the `arp_ip_target` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond arp_ip_target
/// LIST`.
pub fn arp_ip_target(self, arp_ip_target: Vec<Ipv4Addr>) -> Self {
self.append_info_data(InfoBond::ArpIpTarget(arp_ip_target))
}
/// Adds the `ns_ip6_target` attribute to the bond
/// This is equivalent to `ip link add name NAME type bond ns_ip6_target
/// LIST`.
pub fn ns_ip6_target(self, ns_ip6_target: Vec<Ipv6Addr>) -> Self {
self.append_info_data(InfoBond::NsIp6Target(ns_ip6_target))
}
}