Exemplo n.º 1
0
/*
 * get/set ethtool.eee
 */
static dbus_bool_t
ni_objectmodel_ethtool_eee_adv_into_dict(ni_dbus_variant_t *dict,
		const char *entry, const ni_bitfield_t *bitfield)
{
	ni_bitfield_t tmpfield = NI_BITFIELD_INIT;
	ni_dbus_variant_t *array;
	unsigned int bit, bits;
	char *hexstr = NULL;
	const char *name;

	if (!dict || !ni_bitfield_isset(bitfield))
		return FALSE;

	if (!(array = ni_dbus_dict_add(dict, entry)))
		return FALSE;

	ni_dbus_variant_init_string_array(array);

	/* known modes by name */
	bits = ni_bitfield_bits(bitfield);
	for (bit = 0; bit < bits; ++bit) {
		if (!ni_bitfield_testbit(bitfield, bit))
			continue;

		if (!(name = ni_ethtool_link_adv_speed_name(bit)))
			ni_bitfield_setbit(&tmpfield, bit);
		else
		if (!ni_dbus_variant_append_string_array(array, name))
			ni_bitfield_setbit(&tmpfield, bit);
	}

	/* unknown modes as hex */
	if (ni_bitfield_isset(&tmpfield)) {
		if (ni_bitfield_format(&tmpfield, &hexstr, TRUE) && hexstr)
			ni_dbus_variant_append_string_array(array, hexstr);
		ni_string_free(&hexstr);
	}

	ni_bitfield_destroy(&tmpfield);
	return TRUE;
}
Exemplo n.º 2
0
/*
 * link-settings
 */
static inline ni_bool_t
get_ethtool_link_adv_name_array(ni_string_array_t *array, ni_bitfield_t *bitfield,
				const char * (*bit_to_name)(unsigned int))
{
	unsigned int bit, bits, count;
	const char *name;

	count = array->count;
	bits = ni_bitfield_bits(bitfield);
	for (bit = 0; bit < bits; ++bit) {
		if (!ni_bitfield_testbit(bitfield, bit))
			continue;

		if (!(name = bit_to_name(bit)))
			continue;

		if (ni_string_array_append(array, name) == 0)
			ni_bitfield_clearbit(bitfield, bit);
	}
	return array->count > count;
}
Exemplo n.º 3
0
static dbus_bool_t
ni_objectmodel_ethtool_link_adv_bitfield_into_array(ni_string_array_t *array,
		ni_bitfield_t *bitfield, const char * (*bit_to_name)(unsigned int))
{
	/* we're using a temporary string array (instead
	 * of direct ni_dbus_variant_append_string_array)
	 * to omit empty dbus dict array entries... */
	unsigned int bit, bits;
	const char *name;

	bits = ni_bitfield_bits(bitfield);
	for (bit = 0; bit < bits; ++bit) {
		if (!ni_bitfield_testbit(bitfield, bit))
			continue;

		if (!(name = bit_to_name(bit)))
			continue;

		if (ni_string_array_append(array, name) == 0)
			ni_bitfield_clearbit(bitfield, bit);
	}
	return array->count > 0;
}
Exemplo n.º 4
0
static inline ni_bool_t
ni_ethtool_supported(const ni_ethtool_t *ethtool, unsigned int flag)
{
	return ethtool && ni_bitfield_testbit(&ethtool->supported, flag);
}