nmstate 2.2.60

Library for networking management in a declarative manner
Documentation
// SPDX-License-Identifier: Apache-2.0

use crate::{Interface, InterfaceIdentifier, nm::nm_dbus::NmConnection};

pub(crate) fn gen_nm_wired_setting(
    iface: &Interface,
    nm_conn: &mut NmConnection,
) {
    let mut nm_wired_set = nm_conn.wired.as_ref().cloned().unwrap_or_default();

    let mut flag_need_wired = false;

    let base_iface = iface.base_iface();

    if let Some(mac) = &base_iface.mac_address {
        if base_iface.identifier == Some(InterfaceIdentifier::MacAddress) {
            nm_wired_set.mac_address = Some(mac.to_string());
        } else {
            nm_wired_set.cloned_mac_address = Some(mac.to_string());
        }
        flag_need_wired = true;
    }
    if let Some(mtu) = &base_iface.mtu {
        nm_wired_set.mtu = Some(*mtu as u32);
        flag_need_wired = true;
    }

    if let Interface::Ethernet(eth_iface) = iface
        && let Some(eth_conf) = eth_iface.ethernet.as_ref()
    {
        match eth_conf.auto_neg {
            Some(true) => {
                flag_need_wired = true;
                nm_wired_set.auto_negotiate = Some(true);
                nm_wired_set.speed = None;
                nm_wired_set.duplex = None;
            }
            Some(false) => {
                flag_need_wired = true;
                nm_wired_set.auto_negotiate = Some(false);
                if let Some(v) = eth_conf.speed {
                    nm_wired_set.speed = Some(v);
                }
                if let Some(v) = eth_conf.duplex {
                    nm_wired_set.duplex = Some(format!("{v}"));
                }
            }
            None => (),
        }
    }

    if let Some(accept_all_mac_addresses) = &base_iface.accept_all_mac_addresses
    {
        nm_wired_set.accept_all_mac_addresses =
            Some(i32::from(*accept_all_mac_addresses));
        flag_need_wired = true;
    }

    if flag_need_wired {
        nm_conn.wired = Some(nm_wired_set);
    }
}