int ni_ethtool_get_driver_info(const char *ifname, ni_ethtool_t *ethtool) { static const ni_ethtool_cmd_info_t NI_ETHTOOL_CMD_GDRVINFO = { ETHTOOL_GDRVINFO, "get driver-info" }; struct ethtool_drvinfo drv_info; ni_ethtool_driver_info_t *info; int ret; if (!ni_ethtool_supported(ethtool, NI_ETHTOOL_SUPP_GET_DRIVER_INFO)) return -EOPNOTSUPP; ni_ethtool_driver_info_free(ethtool->driver_info); ethtool->driver_info = NULL; memset(&drv_info, 0, sizeof(drv_info)); ret = ni_ethtool_call(ifname, &NI_ETHTOOL_CMD_GDRVINFO, &drv_info, NULL); ni_ethtool_set_supported(ethtool, NI_ETHTOOL_SUPP_GET_DRIVER_INFO, ret != -EOPNOTSUPP); if (ret < 0) return ret; if (!(info = ni_ethtool_driver_info_new())) return -ENOMEM; drv_info.driver[sizeof(drv_info.driver)-1] = '\0'; if (!ni_string_empty(drv_info.driver) && !ni_string_eq(drv_info.driver, "N/A")) ni_string_dup(&info->driver, drv_info.driver); drv_info.version[sizeof(drv_info.version)-1] = '\0'; if (!ni_string_empty(drv_info.version) && !ni_string_eq(drv_info.version, "N/A")) ni_string_dup(&info->version, drv_info.version); drv_info.fw_version[sizeof(drv_info.fw_version)-1] = '\0'; if (!ni_string_empty(drv_info.fw_version) && !ni_string_eq(drv_info.fw_version, "N/A")) ni_string_dup(&info->fw_version, drv_info.fw_version); drv_info.bus_info[sizeof(drv_info.bus_info)-1] = '\0'; if (!ni_string_empty(drv_info.bus_info) && !ni_string_eq(drv_info.bus_info, "N/A")) ni_string_dup(&info->bus_info, drv_info.bus_info); drv_info.erom_version[sizeof(drv_info.erom_version)-1] = '\0'; if (!ni_string_empty(drv_info.erom_version) && !ni_string_eq(drv_info.erom_version, "N/A")) ni_string_dup(&info->erom_version, drv_info.erom_version); if ((info->supports.n_priv_flags = drv_info.n_priv_flags)) info->supports.bitmap |= NI_BIT(NI_ETHTOOL_DRIVER_SUPP_PRIV_FLAGS); if ((info->supports.n_stats = drv_info.n_stats)) info->supports.bitmap |= NI_BIT(NI_ETHTOOL_DRIVER_SUPP_STATS); if ((info->supports.testinfo_len = drv_info.testinfo_len)) info->supports.bitmap |= NI_BIT(NI_ETHTOOL_DRIVER_SUPP_TEST); if ((info->supports.eedump_len = drv_info.eedump_len)) info->supports.bitmap |= NI_BIT(NI_ETHTOOL_DRIVER_SUPP_EEPROM); if ((info->supports.regdump_len = drv_info.regdump_len)) info->supports.bitmap |= NI_BIT(NI_ETHTOOL_DRIVER_SUPP_REGDUMP); ethtool->driver_info = info; return 0; }
/* * main netdev ethtool struct get/set helpers */ void ni_ethtool_free(ni_ethtool_t *ethtool) { if (ethtool) { ni_bitfield_destroy(ðtool->supported); ni_ethtool_driver_info_free(ethtool->driver_info); ni_ethtool_priv_flags_free(ethtool->priv_flags); free(ethtool); } }
static dbus_bool_t ni_objectmodel_ethtool_set_driver_info(ni_dbus_object_t *object, const ni_dbus_property_t *property, const ni_dbus_variant_t *argument, DBusError *error) { ni_ethtool_driver_info_t *info; ni_ethtool_t *ethtool; const char *str; if (!ni_dbus_variant_is_dict(argument)) return FALSE; if (!(ethtool = ni_objectmodel_ethtool_write_handle(object, error))) return FALSE; ni_ethtool_driver_info_free(ethtool->driver_info); if (!(ethtool->driver_info = ni_ethtool_driver_info_new())) return FALSE; info = ethtool->driver_info; if (ni_dbus_dict_get_string(argument, "driver", &str)) ni_string_dup(&info->driver, str); if (ni_dbus_dict_get_string(argument, "version", &str)) ni_string_dup(&info->version, str); if (ni_dbus_dict_get_string(argument, "bus-info", &str)) ni_string_dup(&info->bus_info, str); if (ni_dbus_dict_get_string(argument, "firmware-version", &str)) ni_string_dup(&info->fw_version, str); if (ni_dbus_dict_get_string(argument, "expansion-rom-version", &str)) ni_string_dup(&info->erom_version, str); ni_dbus_dict_get_uint32(argument, "supports", &info->supports.bitmap); return TRUE; }