示例#1
0
文件: ethtool.c 项目: openSUSE/wicked
static int
set_ethtool_priv_flags(const ni_netdev_ref_t *ref, ni_ethtool_t *ethtool, struct ethtool_args *args)
{
	ni_ethtool_priv_flags_t *pflags;
	ni_bool_t enabled;
	char *key, *val;
	int ret = -1, n;

	if (!(pflags = ni_ethtool_priv_flags_new()))
		return ret;

	for (n = 0; n + 1 < args->argc && args->argv[n]; ++n) {
		key = args->argv[n++];
		val = args->argv[n];

		if (ni_parse_boolean(val, &enabled) ||
		    ni_string_array_append(&pflags->names, key))
			goto cleanup;

		if (enabled)
			pflags->bitmap |= NI_BIT(pflags->names.count - 1);
	}

	ret = ni_ethtool_set_priv_flags(ref, ethtool, pflags);

cleanup:
	ni_ethtool_priv_flags_free(pflags);
	return ret;
}
示例#2
0
int
ni_ethtool_get_priv_flags(const char *ifname, ni_ethtool_t *ethtool)
{
	int ret = 0;

	if (!ni_ethtool_supported(ethtool, NI_ETHTOOL_SUPP_GET_PRIV_FLAGS))
		return -EOPNOTSUPP;

	if (!ethtool->priv_flags) {
		if (!(ethtool->priv_flags = ni_ethtool_priv_flags_new()))
			return -ENOMEM;
	}

	ethtool->priv_flags->bitmap = 0;
	ret = ni_ethtool_get_priv_flags_bitmap(ifname, ethtool, &ethtool->priv_flags->bitmap);
	if (ret < 0) {
		ni_ethtool_set_supported(ethtool, NI_ETHTOOL_SUPP_GET_PRIV_FLAGS, ret != -EOPNOTSUPP);
		goto cleanup;
	}

	if (!ethtool->priv_flags->names.count) {
		ret = ni_ethtool_get_priv_flags_names(ifname, ethtool, &ethtool->priv_flags->names);
		if (ret < 0)
			goto cleanup;
	}

	return 0;

cleanup:
	ni_ethtool_priv_flags_free(ethtool->priv_flags);
	ethtool->priv_flags = NULL;
	return ret;
}
示例#3
0
/*
 * main netdev ethtool struct get/set helpers
 */
void
ni_ethtool_free(ni_ethtool_t *ethtool)
{
	if (ethtool) {
		ni_bitfield_destroy(&ethtool->supported);
		ni_ethtool_driver_info_free(ethtool->driver_info);
		ni_ethtool_priv_flags_free(ethtool->priv_flags);
		free(ethtool);
	}
}
示例#4
0
文件: ethtool.c 项目: openSUSE/wicked
static dbus_bool_t
ni_objectmodel_ethtool_set_priv_flags(ni_dbus_object_t *object,
		const ni_dbus_property_t *property,
		const ni_dbus_variant_t *argument,
		DBusError *error)
{
	const ni_dbus_variant_t *dict;
	ni_ethtool_t *ethtool;
	unsigned int i, len;
	dbus_bool_t enabled;
	ni_stringbuf_t buf;
	const char *name;

	if (!ni_dbus_variant_is_dict_array(argument))
		return FALSE;
	if (!(ethtool = ni_objectmodel_ethtool_write_handle(object, error)))
		return FALSE;

	ni_ethtool_priv_flags_free(ethtool->priv_flags);
	if (!(ethtool->priv_flags = ni_ethtool_priv_flags_new()))
		return FALSE;

	if ((len = argument->array.len) > 32)
		len = 32;

	ni_stringbuf_init(&buf);
	for (i = 0; i < argument->array.len; ++i) {
		dict = &argument->variant_array_value[i];
		if (!ni_dbus_variant_is_dict(dict))
			continue;

		if (!ni_dbus_dict_get_string(dict, "name", &name) ||
		    !ni_dbus_dict_get_bool(dict, "enabled", &enabled))
			continue;

		ni_stringbuf_put(&buf, name, ni_string_len(name));
		ni_stringbuf_trim_head(&buf, " \t\n");
		ni_stringbuf_trim_tail(&buf, " \t\n");
		if (ni_string_empty(buf.string))
			continue;

		if (ni_string_array_append(&ethtool->priv_flags->names, buf.string) == 0) {
			if (enabled)
				ethtool->priv_flags->bitmap |= NI_BIT(i);
		}
		ni_stringbuf_destroy(&buf);
	}
	return TRUE;
}