static int get_ethtool_link_settings(const ni_netdev_ref_t *ref, ni_ethtool_t *ethtool, struct ethtool_args *args) { ni_ethtool_link_settings_t *link; const char *name; (void)args; if (ni_ethtool_get_link_settings(ref, ethtool) < 0 || !(link = ethtool->link_settings)) return -1; printf("link-settings:\n"); if (ni_tristate_is_set(link->autoneg)) printf("\tautoneg: %s\n", ni_format_boolean(link->autoneg)); if (link->speed != NI_ETHTOOL_SPEED_UNKNOWN) printf("\tspeed: %u\n", link->speed); if ((name = ni_ethtool_link_duplex_name(link->duplex))) printf("\tduplex: %s\n", name); if ((name = ni_ethtool_link_port_name(link->port))) printf("\tport: %s\n", name); if ((name = ni_ethtool_link_mdix_name(link->tp_mdix))) printf("\tmdix: %s\n", name); if ((name = ni_ethtool_link_mdio_name(link->mdio_support))) printf("\tmdio: %s\n", name); if (link->phy_address != NI_ETHTOOL_PHYAD_UNKNOWN) printf("\tphy-address: %u\n", link->phy_address); if (link->transceiver != NI_ETHTOOL_XCVR_UNKNOWN) printf("\ttransceiver: %u\n", link->transceiver); get_ethtool_link_advertising("supported", &link->supported); get_ethtool_link_advertising("advertising", &link->advertising); get_ethtool_link_advertising("lp-advertising", &link->lp_advertising); return 0; }
/* * link-detected */ static int get_ethtool_link_detected(const ni_netdev_ref_t *ref, ni_ethtool_t *ethtool, struct ethtool_args *args) { (void)args; if (ni_ethtool_get_link_detected(ref, ethtool) < 0 || !ni_tristate_is_set(ethtool->link_detected)) return -1; printf("link-detected: %s\n", ni_format_boolean(ethtool->link_detected)); return 0; }
int ni_system_ipv6_devinfo_set(ni_netdev_t *dev, const ni_ipv6_devconf_t *conf) { ni_ipv6_devinfo_t *ipv6; if (!conf || !(ipv6 = ni_netdev_get_ipv6(dev))) return -1; if (!ni_ipv6_supported()) { ipv6->conf.enabled = NI_TRISTATE_DISABLE; if (ni_tristate_is_enabled(conf->enabled)) { errno = EAFNOSUPPORT; return -1; } return 0; } if (ni_tristate_is_set(conf->enabled)) { if (__ni_system_ipv6_devinfo_change_int(dev->name, "disable_ipv6", ni_tristate_is_enabled(conf->enabled) ? 0 : 1) < 0) return -1; ni_tristate_set(&ipv6->conf.enabled, conf->enabled); } /* If we're disabling IPv6 on this interface, we're done! */ if (ni_tristate_is_disabled(conf->enabled)) { __ni_ipv6_ra_info_reset(&dev->ipv6->radv); return 0; } if (__ni_system_ipv6_devinfo_change_int(dev->name, "autoconf", conf->autoconf) == 0) ipv6->conf.autoconf = conf->autoconf; if (__ni_system_ipv6_devinfo_change_int(dev->name, "forwarding", conf->forwarding) == 0) ipv6->conf.forwarding = conf->forwarding; if (__ni_system_ipv6_devinfo_change_int(dev->name, "accept_redirects", conf->accept_redirects) == 0) ipv6->conf.accept_redirects = conf->accept_redirects; if (ipv6->conf.privacy != NI_TRISTATE_DEFAULT) { /* kernel is using -1 for loopback, ptp, ... */ if (__ni_system_ipv6_devinfo_change_int(dev->name, "use_tempaddr", conf->privacy) == 0) { ipv6->conf.privacy = conf->privacy; } } return 0; }
/* * Update the device's IPv6 settings */ static inline int __ni_system_ipv6_devinfo_change_int(const char *ifname, const char *attr, int value) { if (!ni_tristate_is_set(value)) return 1; if (ni_sysctl_ipv6_ifconfig_set_int(ifname, attr, value) < 0) { ni_warn("%s: cannot set ipv6 device attr %s=%u", ifname, attr, value); return -1; } return 0; }
/* * get/set ethtool.link_settings */ static dbus_bool_t ni_objectmodel_ethtool_get_link_detected(const ni_dbus_object_t *object, const ni_dbus_property_t *property, ni_dbus_variant_t *result, DBusError *error) { const ni_ethtool_t *ethtool; if (!(ethtool = ni_objectmodel_ethtool_read_handle(object, error))) return FALSE; if (!ni_tristate_is_set(ethtool->link_detected)) return FALSE; ni_dbus_variant_set_int32(result, ethtool->link_detected); return TRUE; }
static dbus_bool_t ni_objectmodel_ethtool_set_link_settings(ni_dbus_object_t *object, const ni_dbus_property_t *property, const ni_dbus_variant_t *argument, DBusError *error) { ni_ethtool_link_settings_t *link; const ni_dbus_variant_t *adv; uint32_t uv32; int32_t sv32; if (!(link = ni_objectmodel_ethtool_link_settings_write_handle(object, error))) return FALSE; if (ni_dbus_dict_get_int32(argument, "autoneg", &sv32) && ni_tristate_is_set(sv32)) ni_tristate_set(&link->autoneg, sv32); if (ni_dbus_dict_get_uint32(argument, "speed", &uv32) && uv32 <= INT_MAX) link->speed = uv32; if (ni_dbus_dict_get_uint32(argument, "duplex", &uv32) && uv32 < NI_ETHTOOL_DUPLEX_UNKNOWN) link->duplex = uv32; if (ni_dbus_dict_get_uint32(argument, "port", &uv32) && uv32 <= NI_ETHTOOL_PORT_OTHER) link->port = uv32; if (ni_dbus_dict_get_uint32(argument, "mdix", &uv32)) link->tp_mdix = uv32; if (ni_dbus_dict_get_uint32(argument, "mdio", &uv32)) link->mdio_support = uv32; if (ni_dbus_dict_get_uint32(argument, "phy-address", &uv32)) link->phy_address = uv32; if (ni_dbus_dict_get_uint32(argument, "transceiver", &uv32)) link->transceiver = uv32; if ((adv = ni_dbus_dict_get(argument, "advertise"))) { /* config */ ni_objectmodel_ethtool_link_adv_bitfield_from_array(adv, &link->advertising, ni_ethtool_link_adv_type); } else { /* states */ ni_objectmodel_ethtool_link_adv_from_dict(argument, "supported", &link->supported); ni_objectmodel_ethtool_link_adv_from_dict(argument, "advertising", &link->advertising); ni_objectmodel_ethtool_link_adv_from_dict(argument, "lp-advertising", &link->lp_advertising); } return TRUE; }
static dbus_bool_t ni_objectmodel_ethtool_get_link_settings(const ni_dbus_object_t *object, const ni_dbus_property_t *property, ni_dbus_variant_t *result, DBusError *error) { const ni_ethtool_link_settings_t *link; if (!(link = ni_objectmodel_ethtool_link_settings_read_handle(object, error))) return FALSE; ni_dbus_variant_init_dict(result); if (ni_tristate_is_set(link->autoneg)) ni_dbus_dict_add_int32(result, "autoneg", link->autoneg); if (link->speed != NI_ETHTOOL_SPEED_UNKNOWN) ni_dbus_dict_add_uint32(result, "speed", link->speed); if (link->duplex != NI_ETHTOOL_DUPLEX_UNKNOWN) ni_dbus_dict_add_uint32(result, "duplex", link->duplex); if (link->port != NI_ETHTOOL_PORT_DEFAULT) ni_dbus_dict_add_uint32(result, "port", link->port); if (link->port == NI_ETHTOOL_PORT_TP && link->tp_mdix) ni_dbus_dict_add_uint32(result, "mdix", link->tp_mdix); if (link->mdio_support != NI_ETHTOOL_MDI_INVALID) ni_dbus_dict_add_uint32(result, "mdio", link->mdio_support); if (link->phy_address != NI_ETHTOOL_PHYAD_UNKNOWN) ni_dbus_dict_add_uint32(result, "phy-address", link->phy_address); if (link->transceiver != NI_ETHTOOL_XCVR_UNKNOWN) ni_dbus_dict_add_uint32(result, "transceiver", link->transceiver); ni_objectmodel_ethtool_link_adv_into_dict(result, "supported", &link->supported); ni_objectmodel_ethtool_link_adv_into_dict(result, "advertising", &link->advertising); ni_objectmodel_ethtool_link_adv_into_dict(result, "lp-advertising", &link->lp_advertising); return TRUE; }