/* * 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; }
/* * 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; }
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; }
static inline ni_bool_t ni_ethtool_supported(const ni_ethtool_t *ethtool, unsigned int flag) { return ethtool && ni_bitfield_testbit(ðtool->supported, flag); }