Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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;
}
Пример #4
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;
}
Пример #5
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;
}
Пример #6
0
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;
}
Пример #7
0
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;
}