Qt ui: set timeout on all dbus interfaces in wifiManager (#20090)

* set timeout on all dbus interfaces in network

* fix hardcoded timeout

* lower timeout in thermald
old-commit-hash: cf3cd54b68
commatwo_master
Willem Melching 4 years ago committed by GitHub
parent d81d069480
commit 946b669ec5
  1. 2
      selfdrive/hardware/tici/hardware.py
  2. 83
      selfdrive/ui/qt/offroad/wifiManager.cc

@ -18,7 +18,7 @@ MM_SIM = MM + ".Sim"
MM_MODEM_STATE_CONNECTED = 11 MM_MODEM_STATE_CONNECTED = 11
TIMEOUT = 10 TIMEOUT = 0.1
NetworkType = log.ThermalData.NetworkType NetworkType = log.ThermalData.NetworkType
NetworkStrength = log.ThermalData.NetworkStrength NetworkStrength = log.ThermalData.NetworkStrength

@ -22,25 +22,25 @@ const int NM_802_11_AP_SEC_GROUP_WEP104 = 0x00000020;
const int NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100; const int NM_802_11_AP_SEC_KEY_MGMT_PSK = 0x00000100;
const int NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200; const int NM_802_11_AP_SEC_KEY_MGMT_802_1X = 0x00000200;
const QString nm_path = "/org/freedesktop/NetworkManager";
const QString nm_settings_path = "/org/freedesktop/NetworkManager/Settings";
QString nm_path = "/org/freedesktop/NetworkManager"; const QString nm_iface = "org.freedesktop.NetworkManager";
QString nm_settings_path = "/org/freedesktop/NetworkManager/Settings"; const QString props_iface = "org.freedesktop.DBus.Properties";
const QString nm_settings_iface = "org.freedesktop.NetworkManager.Settings";
const QString nm_settings_conn_iface = "org.freedesktop.NetworkManager.Settings.Connection";
const QString device_iface = "org.freedesktop.NetworkManager.Device";
const QString wireless_device_iface = "org.freedesktop.NetworkManager.Device.Wireless";
const QString ap_iface = "org.freedesktop.NetworkManager.AccessPoint";
const QString connection_iface = "org.freedesktop.NetworkManager.Connection.Active";
const QString ipv4config_iface = "org.freedesktop.NetworkManager.IP4Config";
QString nm_iface = "org.freedesktop.NetworkManager"; const QString nm_service = "org.freedesktop.NetworkManager";
QString props_iface = "org.freedesktop.DBus.Properties";
QString nm_settings_iface = "org.freedesktop.NetworkManager.Settings";
QString nm_settings_conn_iface = "org.freedesktop.NetworkManager.Settings.Connection";
QString device_iface = "org.freedesktop.NetworkManager.Device";
QString wireless_device_iface = "org.freedesktop.NetworkManager.Device.Wireless";
QString ap_iface = "org.freedesktop.NetworkManager.AccessPoint";
QString connection_iface = "org.freedesktop.NetworkManager.Connection.Active";
QString ipv4config_iface = "org.freedesktop.NetworkManager.IP4Config";
QString nm_service = "org.freedesktop.NetworkManager";
const int state_connected = 100; const int state_connected = 100;
const int state_need_auth = 60; const int state_need_auth = 60;
const int reason_wrong_password = 8; const int reason_wrong_password = 8;
const int dbus_timeout = 100;
template <typename T> template <typename T>
T get_response(QDBusMessage response) { T get_response(QDBusMessage response) {
@ -63,7 +63,6 @@ bool compare_by_strength(const Network &a, const Network &b) {
return a.strength > b.strength; return a.strength > b.strength;
} }
WifiManager::WifiManager(QWidget* parent) { WifiManager::WifiManager(QWidget* parent) {
qDBusRegisterMetaType<Connection>(); qDBusRegisterMetaType<Connection>();
qDBusRegisterMetaType<IpConfig>(); qDBusRegisterMetaType<IpConfig>();
@ -72,27 +71,32 @@ WifiManager::WifiManager(QWidget* parent) {
bool has_adapter = adapter != ""; bool has_adapter = adapter != "";
if (!has_adapter){ if (!has_adapter){
throw std::runtime_error("Error connecting to panda"); throw std::runtime_error("Error connecting to NetworkManager");
} }
QDBusInterface nm(nm_service, adapter, device_iface, bus); QDBusInterface nm(nm_service, adapter, device_iface, bus);
bus.connect(nm_service, adapter, device_iface, "StateChanged", this, SLOT(change(unsigned int, unsigned int, unsigned int))); bus.connect(nm_service, adapter, device_iface, "StateChanged", this, SLOT(change(unsigned int, unsigned int, unsigned int)));
QDBusInterface device_props(nm_service, adapter, props_iface, bus); QDBusInterface device_props(nm_service, adapter, props_iface, bus);
device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", device_iface, "State"); QDBusMessage response = device_props.call("Get", device_iface, "State");
raw_adapter_state = get_response<uint>(response); raw_adapter_state = get_response<uint>(response);
change(raw_adapter_state, 0, 0); change(raw_adapter_state, 0, 0);
// Compute tethering ssid as "Weedle" + first 4 characters of a dongle id // Set tethering ssid as "weedle" + first 4 characters of a dongle id
tethering_ssid = "weedle"; tethering_ssid = "weedle";
std::string bytes = Params().get("DongleId"); std::string bytes = Params().get("DongleId");
if (bytes.length() >= 4) { if (bytes.length() >= 4) {
tethering_ssid+="-"+QString::fromStdString(bytes.substr(0,4)); tethering_ssid+="-"+QString::fromStdString(bytes.substr(0,4));
} }
// Create dbus interface for tethering button. This populates the introspection cache,
// making sure all future creations are non-blocking
// https://bugreports.qt.io/browse/QTBUG-14485
QDBusInterface(nm_service, nm_settings_path, nm_settings_iface, bus);
} }
void WifiManager::refreshNetworks() { void WifiManager::refreshNetworks() {
bus = QDBusConnection::systemBus();
seen_networks.clear(); seen_networks.clear();
seen_ssids.clear(); seen_ssids.clear();
ipv4_address = get_ipv4_address(); ipv4_address = get_ipv4_address();
@ -114,6 +118,8 @@ QString WifiManager::get_ipv4_address(){
for (auto &p : conns){ for (auto &p : conns){
QString active_connection = p.path(); QString active_connection = p.path();
QDBusInterface nm(nm_service, active_connection, props_iface, bus); QDBusInterface nm(nm_service, active_connection, props_iface, bus);
nm.setTimeout(dbus_timeout);
QDBusObjectPath pth = get_response<QDBusObjectPath>(nm.call("Get", connection_iface, "Ip4Config")); QDBusObjectPath pth = get_response<QDBusObjectPath>(nm.call("Get", connection_iface, "Ip4Config"));
QString ip4config = pth.path(); QString ip4config = pth.path();
@ -121,6 +127,8 @@ QString WifiManager::get_ipv4_address(){
if (type == "802-11-wireless") { if (type == "802-11-wireless") {
QDBusInterface nm2(nm_service, ip4config, props_iface, bus); QDBusInterface nm2(nm_service, ip4config, props_iface, bus);
nm2.setTimeout(dbus_timeout);
const QDBusArgument &arr = get_response<QDBusArgument>(nm2.call("Get", ipv4config_iface, "AddressData")); const QDBusArgument &arr = get_response<QDBusArgument>(nm2.call("Get", ipv4config_iface, "AddressData"));
QMap<QString, QVariant> pth2; QMap<QString, QVariant> pth2;
arr.beginArray(); arr.beginArray();
@ -128,7 +136,7 @@ QString WifiManager::get_ipv4_address(){
arr >> pth2; arr >> pth2;
QString ipv4 = pth2.value("address").value<QString>(); QString ipv4 = pth2.value("address").value<QString>();
arr.endArray(); arr.endArray();
return ipv4; return ipv4;
} }
arr.endArray(); arr.endArray();
} }
@ -139,6 +147,8 @@ QString WifiManager::get_ipv4_address(){
QList<Network> WifiManager::get_networks() { QList<Network> WifiManager::get_networks() {
QList<Network> r; QList<Network> r;
QDBusInterface nm(nm_service, adapter, wireless_device_iface, bus); QDBusInterface nm(nm_service, adapter, wireless_device_iface, bus);
nm.setTimeout(dbus_timeout);
QDBusMessage response = nm.call("GetAllAccessPoints"); QDBusMessage response = nm.call("GetAllAccessPoints");
QVariant first = response.arguments().at(0); QVariant first = response.arguments().at(0);
@ -227,6 +237,8 @@ void WifiManager::connect(QByteArray ssid, QString username, QString password, S
connection["ipv6"]["method"] = "ignore"; connection["ipv6"]["method"] = "ignore";
QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus); QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus);
nm_settings.setTimeout(dbus_timeout);
nm_settings.call("AddConnection", QVariant::fromValue(connection)); nm_settings.call("AddConnection", QVariant::fromValue(connection));
activate_wifi_connection(QString(ssid)); activate_wifi_connection(QString(ssid));
} }
@ -235,11 +247,14 @@ void WifiManager::deactivate_connections(QString ssid) {
for (QDBusObjectPath active_connection_raw : get_active_connections()) { for (QDBusObjectPath active_connection_raw : get_active_connections()) {
QString active_connection = active_connection_raw.path(); QString active_connection = active_connection_raw.path();
QDBusInterface nm(nm_service, active_connection, props_iface, bus); QDBusInterface nm(nm_service, active_connection, props_iface, bus);
nm.setTimeout(dbus_timeout);
QDBusObjectPath pth = get_response<QDBusObjectPath>(nm.call("Get", connection_iface, "SpecificObject")); QDBusObjectPath pth = get_response<QDBusObjectPath>(nm.call("Get", connection_iface, "SpecificObject"));
if (pth.path() != "" && pth.path() != "/") { if (pth.path() != "" && pth.path() != "/") {
QString Ssid = get_property(pth.path(), "Ssid"); QString Ssid = get_property(pth.path(), "Ssid");
if (Ssid == ssid) { if (Ssid == ssid) {
QDBusInterface nm2(nm_service, nm_path, nm_iface, bus); QDBusInterface nm2(nm_service, nm_path, nm_iface, bus);
nm2.setTimeout(dbus_timeout);
nm2.call("DeactivateConnection", QVariant::fromValue(active_connection_raw));// TODO change to disconnect nm2.call("DeactivateConnection", QVariant::fromValue(active_connection_raw));// TODO change to disconnect
} }
} }
@ -248,6 +263,8 @@ void WifiManager::deactivate_connections(QString ssid) {
QVector<QDBusObjectPath> WifiManager::get_active_connections() { QVector<QDBusObjectPath> WifiManager::get_active_connections() {
QDBusInterface nm(nm_service, nm_path, props_iface, bus); QDBusInterface nm(nm_service, nm_path, props_iface, bus);
nm.setTimeout(dbus_timeout);
QDBusMessage response = nm.call("Get", nm_iface, "ActiveConnections"); QDBusMessage response = nm.call("Get", nm_iface, "ActiveConnections");
const QDBusArgument &arr = get_response<QDBusArgument>(response); const QDBusArgument &arr = get_response<QDBusArgument>(response);
QVector<QDBusObjectPath> conns; QVector<QDBusObjectPath> conns;
@ -265,6 +282,8 @@ QVector<QDBusObjectPath> WifiManager::get_active_connections() {
void WifiManager::clear_connections(QString ssid) { void WifiManager::clear_connections(QString ssid) {
for(QDBusObjectPath path : list_connections()){ for(QDBusObjectPath path : list_connections()){
QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus);
nm2.setTimeout(dbus_timeout);
QDBusMessage response = nm2.call("GetSettings"); QDBusMessage response = nm2.call("GetSettings");
const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>(); const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>();
@ -286,11 +305,14 @@ void WifiManager::clear_connections(QString ssid) {
void WifiManager::request_scan() { void WifiManager::request_scan() {
QDBusInterface nm(nm_service, adapter, wireless_device_iface, bus); QDBusInterface nm(nm_service, adapter, wireless_device_iface, bus);
nm.setTimeout(dbus_timeout);
nm.call("RequestScan", QVariantMap()); nm.call("RequestScan", QVariantMap());
} }
uint WifiManager::get_wifi_device_state() { uint WifiManager::get_wifi_device_state() {
QDBusInterface device_props(nm_service, adapter, props_iface, bus); QDBusInterface device_props(nm_service, adapter, props_iface, bus);
device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", device_iface, "State"); QDBusMessage response = device_props.call("Get", device_iface, "State");
uint resp = get_response<uint>(response); uint resp = get_response<uint>(response);
return resp; return resp;
@ -298,6 +320,8 @@ uint WifiManager::get_wifi_device_state() {
QString WifiManager::get_active_ap() { QString WifiManager::get_active_ap() {
QDBusInterface device_props(nm_service, adapter, props_iface, bus); QDBusInterface device_props(nm_service, adapter, props_iface, bus);
device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", wireless_device_iface, "ActiveAccessPoint"); QDBusMessage response = device_props.call("Get", wireless_device_iface, "ActiveAccessPoint");
QDBusObjectPath r = get_response<QDBusObjectPath>(response); QDBusObjectPath r = get_response<QDBusObjectPath>(response);
return r.path(); return r.path();
@ -305,19 +329,24 @@ QString WifiManager::get_active_ap() {
QByteArray WifiManager::get_property(QString network_path ,QString property) { QByteArray WifiManager::get_property(QString network_path ,QString property) {
QDBusInterface device_props(nm_service, network_path, props_iface, bus); QDBusInterface device_props(nm_service, network_path, props_iface, bus);
device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", ap_iface, property); QDBusMessage response = device_props.call("Get", ap_iface, property);
return get_response<QByteArray>(response); return get_response<QByteArray>(response);
} }
unsigned int WifiManager::get_ap_strength(QString network_path) { unsigned int WifiManager::get_ap_strength(QString network_path) {
QDBusInterface device_props(nm_service, network_path, props_iface, bus); QDBusInterface device_props(nm_service, network_path, props_iface, bus);
device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", ap_iface, "Strength"); QDBusMessage response = device_props.call("Get", ap_iface, "Strength");
return get_response<unsigned int>(response); return get_response<unsigned int>(response);
} }
QString WifiManager::get_adapter() { QString WifiManager::get_adapter() {
QDBusInterface nm(nm_service, nm_path, nm_iface, bus); QDBusInterface nm(nm_service, nm_path, nm_iface, bus);
nm.setTimeout(dbus_timeout);
QDBusMessage response = nm.call("GetDevices"); QDBusMessage response = nm.call("GetDevices");
QVariant first = response.arguments().at(0); QVariant first = response.arguments().at(0);
@ -331,6 +360,8 @@ QString WifiManager::get_adapter() {
// Get device type // Get device type
QDBusInterface device_props(nm_service, path.path(), props_iface, bus); QDBusInterface device_props(nm_service, path.path(), props_iface, bus);
device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", device_iface, "DeviceType"); QDBusMessage response = device_props.call("Get", device_iface, "DeviceType");
uint device_type = get_response<uint>(response); uint device_type = get_response<uint>(response);
@ -362,8 +393,12 @@ void WifiManager::disconnect() {
} }
QVector<QDBusObjectPath> WifiManager::list_connections(){ QVector<QDBusObjectPath> WifiManager::list_connections(){
qDebug() << "list connections";
QVector<QDBusObjectPath> connections; QVector<QDBusObjectPath> connections;
QDBusInterface nm(nm_service, nm_settings_path, nm_settings_iface, bus); QDBusInterface nm(nm_service, nm_settings_path, nm_settings_iface, bus);
qDebug() << "here";
nm.setTimeout(dbus_timeout);
QDBusMessage response = nm.call("ListConnections"); QDBusMessage response = nm.call("ListConnections");
QVariant first = response.arguments().at(0); QVariant first = response.arguments().at(0);
const QDBusArgument &args = first.value<QDBusArgument>(); const QDBusArgument &args = first.value<QDBusArgument>();
@ -375,11 +410,14 @@ QVector<QDBusObjectPath> WifiManager::list_connections(){
} }
return connections; return connections;
} }
bool WifiManager::activate_wifi_connection(QString ssid){ bool WifiManager::activate_wifi_connection(QString ssid){
QString devicePath = get_adapter(); QString devicePath = get_adapter();
for(QDBusObjectPath path : list_connections()){ for(QDBusObjectPath path : list_connections()){
QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus);
nm2.setTimeout(dbus_timeout);
QDBusMessage response = nm2.call("GetSettings"); QDBusMessage response = nm2.call("GetSettings");
const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>(); const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>();
@ -391,6 +429,7 @@ bool WifiManager::activate_wifi_connection(QString ssid){
if (key == "ssid") { if (key == "ssid") {
if (val == ssid) { if (val == ssid) {
QDBusInterface nm3(nm_service, nm_path, nm_iface, bus); QDBusInterface nm3(nm_service, nm_path, nm_iface, bus);
nm3.setTimeout(dbus_timeout);
nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/"))); nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/")));
return true; return true;
} }
@ -406,6 +445,8 @@ bool WifiManager::activate_tethering_connection(){
for(QDBusObjectPath path : list_connections()){ for(QDBusObjectPath path : list_connections()){
QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus); QDBusInterface nm2(nm_service, path.path(), nm_settings_conn_iface, bus);
nm2.setTimeout(dbus_timeout);
QDBusMessage response = nm2.call("GetSettings"); QDBusMessage response = nm2.call("GetSettings");
const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>(); const QDBusArgument &dbusArg = response.arguments().at(0).value<QDBusArgument>();
@ -417,6 +458,7 @@ bool WifiManager::activate_tethering_connection(){
if (key == "ssid") { if (key == "ssid") {
if (val == tethering_ssid.toUtf8()) { if (val == tethering_ssid.toUtf8()) {
QDBusInterface nm3(nm_service, nm_path, nm_iface, bus); QDBusInterface nm3(nm_service, nm_path, nm_iface, bus);
nm3.setTimeout(dbus_timeout);
nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/"))); nm3.call("ActivateConnection", QVariant::fromValue(path), QVariant::fromValue(QDBusObjectPath(devicePath)), QVariant::fromValue(QDBusObjectPath("/")));
return true; return true;
} }
@ -453,6 +495,7 @@ void WifiManager::addTetheringConnection(){
connection["ipv6"]["method"] = "ignore"; connection["ipv6"]["method"] = "ignore";
QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus); QDBusInterface nm_settings(nm_service, nm_settings_path, nm_settings_iface, bus);
nm_settings.setTimeout(dbus_timeout);
nm_settings.call("AddConnection", QVariant::fromValue(connection)); nm_settings.call("AddConnection", QVariant::fromValue(connection));
} }
@ -477,4 +520,4 @@ void WifiManager::changeTetheringPassword(QString newPassword){
tetheringPassword = newPassword; tetheringPassword = newPassword;
clear_connections(tethering_ssid.toUtf8()); clear_connections(tethering_ssid.toUtf8());
addTetheringConnection(); addTetheringConnection();
} }

Loading…
Cancel
Save