File indexing completed on 2024-04-21 04:00:03

0001 /*
0002     SPDX-FileCopyrightText: 2012-2013 Jan Grulich <jgrulich@redhat.com>
0003     SPDX-FileCopyrightText: 2013 Daniel Nicoletti <dantti12@gmail.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "ipv4setting.h"
0009 #include "ipv4setting_p.h"
0010 
0011 #include "generictypes.h"
0012 
0013 #include <arpa/inet.h>
0014 
0015 #include <QDebug>
0016 
0017 NetworkManager::Ipv4SettingPrivate::Ipv4SettingPrivate()
0018     : name(NMQT_SETTING_IP4_CONFIG_SETTING_NAME)
0019     , method(NetworkManager::Ipv4Setting::Automatic)
0020     , routeMetric(-1)
0021     , ignoreAutoRoutes(false)
0022     , ignoreAutoDns(false)
0023     , dhcpSendHostname(true)
0024     , neverDefault(false)
0025     , mayFail(true)
0026     , dadTimeout(-1)
0027     , dnsPriority(0)
0028 {
0029 }
0030 
0031 NetworkManager::Ipv4Setting::Ipv4Setting()
0032     : Setting(Setting::Ipv4)
0033     , d_ptr(new Ipv4SettingPrivate())
0034 {
0035 }
0036 
0037 NetworkManager::Ipv4Setting::Ipv4Setting(const Ptr &other)
0038     : Setting(other)
0039     , d_ptr(new Ipv4SettingPrivate())
0040 {
0041     setMethod(other->method());
0042     setDns(other->dns());
0043     setDnsSearch(other->dnsSearch());
0044     setAddresses(other->addresses());
0045     setRoutes(other->routes());
0046     setRouteMetric(other->routeMetric());
0047     setIgnoreAutoRoutes(other->ignoreAutoRoutes());
0048     setIgnoreAutoDns(other->ignoreAutoDns());
0049     setDhcpClientId(other->dhcpClientId());
0050     setDhcpSendHostname(other->dhcpSendHostname());
0051     setDhcpHostname(other->dhcpHostname());
0052     setNeverDefault(other->neverDefault());
0053     setMayFail(other->mayFail());
0054     setDadTimeout(other->dadTimeout());
0055     setDhcpFqdn(other->dhcpFqdn());
0056     setDnsOptions(other->dnsOptions());
0057     setDnsPriority(other->dnsPriority());
0058     setAddressData(other->addressData());
0059     setRouteData(other->routeData());
0060 }
0061 
0062 NetworkManager::Ipv4Setting::~Ipv4Setting()
0063 {
0064     delete d_ptr;
0065 }
0066 
0067 QString NetworkManager::Ipv4Setting::name() const
0068 {
0069     Q_D(const Ipv4Setting);
0070 
0071     return d->name;
0072 }
0073 
0074 void NetworkManager::Ipv4Setting::setMethod(NetworkManager::Ipv4Setting::ConfigMethod type)
0075 {
0076     Q_D(Ipv4Setting);
0077 
0078     d->method = type;
0079 }
0080 
0081 NetworkManager::Ipv4Setting::ConfigMethod NetworkManager::Ipv4Setting::method() const
0082 {
0083     Q_D(const Ipv4Setting);
0084 
0085     return d->method;
0086 }
0087 
0088 void NetworkManager::Ipv4Setting::setDns(const QList<QHostAddress> &dns)
0089 {
0090     Q_D(Ipv4Setting);
0091 
0092     d->dns = dns;
0093 }
0094 
0095 QList<QHostAddress> NetworkManager::Ipv4Setting::dns() const
0096 {
0097     Q_D(const Ipv4Setting);
0098 
0099     return d->dns;
0100 }
0101 
0102 void NetworkManager::Ipv4Setting::setDnsSearch(const QStringList &domains)
0103 {
0104     Q_D(Ipv4Setting);
0105 
0106     d->dnsSearch = domains;
0107 }
0108 
0109 QStringList NetworkManager::Ipv4Setting::dnsSearch() const
0110 {
0111     Q_D(const Ipv4Setting);
0112 
0113     return d->dnsSearch;
0114 }
0115 
0116 void NetworkManager::Ipv4Setting::setAddresses(const QList<IpAddress> &ipv4addresses)
0117 {
0118     Q_D(Ipv4Setting);
0119 
0120     d->addresses = ipv4addresses;
0121 }
0122 
0123 QList<NetworkManager::IpAddress> NetworkManager::Ipv4Setting::addresses() const
0124 {
0125     Q_D(const Ipv4Setting);
0126 
0127     return d->addresses;
0128 }
0129 
0130 void NetworkManager::Ipv4Setting::setRoutes(const QList<IpRoute> &ipv4routes)
0131 {
0132     Q_D(Ipv4Setting);
0133 
0134     d->routes = ipv4routes;
0135 }
0136 
0137 QList<NetworkManager::IpRoute> NetworkManager::Ipv4Setting::routes() const
0138 {
0139     Q_D(const Ipv4Setting);
0140 
0141     return d->routes;
0142 }
0143 
0144 void NetworkManager::Ipv4Setting::setRouteMetric(int metric)
0145 {
0146     Q_D(Ipv4Setting);
0147 
0148     d->routeMetric = metric;
0149 }
0150 
0151 int NetworkManager::Ipv4Setting::routeMetric() const
0152 {
0153     Q_D(const Ipv4Setting);
0154 
0155     return d->routeMetric;
0156 }
0157 
0158 void NetworkManager::Ipv4Setting::setIgnoreAutoRoutes(bool ignore)
0159 {
0160     Q_D(Ipv4Setting);
0161 
0162     d->ignoreAutoRoutes = ignore;
0163 }
0164 
0165 bool NetworkManager::Ipv4Setting::ignoreAutoRoutes() const
0166 {
0167     Q_D(const Ipv4Setting);
0168 
0169     return d->ignoreAutoRoutes;
0170 }
0171 
0172 void NetworkManager::Ipv4Setting::setIgnoreAutoDns(bool ignore)
0173 {
0174     Q_D(Ipv4Setting);
0175 
0176     d->ignoreAutoDns = ignore;
0177 }
0178 
0179 bool NetworkManager::Ipv4Setting::ignoreAutoDns() const
0180 {
0181     Q_D(const Ipv4Setting);
0182 
0183     return d->ignoreAutoDns;
0184 }
0185 
0186 void NetworkManager::Ipv4Setting::setDhcpClientId(const QString &id)
0187 {
0188     Q_D(Ipv4Setting);
0189 
0190     d->dhcpClientId = id;
0191 }
0192 
0193 QString NetworkManager::Ipv4Setting::dhcpClientId() const
0194 {
0195     Q_D(const Ipv4Setting);
0196 
0197     return d->dhcpClientId;
0198 }
0199 
0200 void NetworkManager::Ipv4Setting::setDhcpSendHostname(bool send)
0201 {
0202     Q_D(Ipv4Setting);
0203 
0204     d->dhcpSendHostname = send;
0205 }
0206 
0207 bool NetworkManager::Ipv4Setting::dhcpSendHostname() const
0208 {
0209     Q_D(const Ipv4Setting);
0210 
0211     return d->dhcpSendHostname;
0212 }
0213 
0214 void NetworkManager::Ipv4Setting::setDhcpHostname(const QString &hostname)
0215 {
0216     Q_D(Ipv4Setting);
0217 
0218     d->dhcpHostname = hostname;
0219 }
0220 
0221 QString NetworkManager::Ipv4Setting::dhcpHostname() const
0222 {
0223     Q_D(const Ipv4Setting);
0224 
0225     return d->dhcpHostname;
0226 }
0227 
0228 void NetworkManager::Ipv4Setting::setNeverDefault(bool neverDefault)
0229 {
0230     Q_D(Ipv4Setting);
0231 
0232     d->neverDefault = neverDefault;
0233 }
0234 
0235 bool NetworkManager::Ipv4Setting::neverDefault() const
0236 {
0237     Q_D(const Ipv4Setting);
0238 
0239     return d->neverDefault;
0240 }
0241 
0242 void NetworkManager::Ipv4Setting::setMayFail(bool mayFail)
0243 {
0244     Q_D(Ipv4Setting);
0245 
0246     d->mayFail = mayFail;
0247 }
0248 
0249 bool NetworkManager::Ipv4Setting::mayFail() const
0250 {
0251     Q_D(const Ipv4Setting);
0252 
0253     return d->mayFail;
0254 }
0255 
0256 void NetworkManager::Ipv4Setting::setDadTimeout(qint32 timeout)
0257 {
0258     Q_D(Ipv4Setting);
0259 
0260     d->dadTimeout = timeout;
0261 }
0262 
0263 qint32 NetworkManager::Ipv4Setting::dadTimeout() const
0264 {
0265     Q_D(const Ipv4Setting);
0266 
0267     return d->dadTimeout;
0268 }
0269 
0270 void NetworkManager::Ipv4Setting::setDhcpFqdn(const QString &fqdn)
0271 {
0272     Q_D(Ipv4Setting);
0273 
0274     d->dhcpFqdn = fqdn;
0275 }
0276 
0277 QString NetworkManager::Ipv4Setting::dhcpFqdn() const
0278 {
0279     Q_D(const Ipv4Setting);
0280 
0281     return d->dhcpFqdn;
0282 }
0283 
0284 void NetworkManager::Ipv4Setting::setDnsOptions(const QStringList &options)
0285 {
0286     Q_D(Ipv4Setting);
0287 
0288     d->dnsOptions = options;
0289 }
0290 
0291 QStringList NetworkManager::Ipv4Setting::dnsOptions() const
0292 {
0293     Q_D(const Ipv4Setting);
0294 
0295     return d->dnsOptions;
0296 }
0297 
0298 void NetworkManager::Ipv4Setting::setDnsPriority(qint32 priority)
0299 {
0300     Q_D(Ipv4Setting);
0301 
0302     d->dnsPriority = priority;
0303 }
0304 
0305 qint32 NetworkManager::Ipv4Setting::dnsPriority() const
0306 {
0307     Q_D(const Ipv4Setting);
0308 
0309     return d->dnsPriority;
0310 }
0311 
0312 void NetworkManager::Ipv4Setting::setGateway(const QString &gateway)
0313 {
0314     Q_D(Ipv4Setting);
0315 
0316     d->gateway = gateway;
0317 }
0318 
0319 QString NetworkManager::Ipv4Setting::gateway() const
0320 {
0321     Q_D(const Ipv4Setting);
0322 
0323     return d->gateway;
0324 }
0325 
0326 void NetworkManager::Ipv4Setting::setAddressData(const NMVariantMapList &addressData)
0327 {
0328     Q_D(Ipv4Setting);
0329 
0330     d->addressData = addressData;
0331 }
0332 
0333 NMVariantMapList NetworkManager::Ipv4Setting::addressData() const
0334 {
0335     Q_D(const Ipv4Setting);
0336 
0337     return d->addressData;
0338 }
0339 
0340 void NetworkManager::Ipv4Setting::setRouteData(const NMVariantMapList &routeData)
0341 {
0342     Q_D(Ipv4Setting);
0343 
0344     d->routeData = routeData;
0345 }
0346 
0347 NMVariantMapList NetworkManager::Ipv4Setting::routeData() const
0348 {
0349     Q_D(const Ipv4Setting);
0350 
0351     return d->routeData;
0352 }
0353 
0354 void NetworkManager::Ipv4Setting::fromMap(const QVariantMap &setting)
0355 {
0356     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD))) {
0357         const QString methodType = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD)).toString();
0358 
0359         if (methodType.toLower() == QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_AUTO)) {
0360             setMethod(Automatic);
0361         } else if (methodType.toLower() == QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL)) {
0362             setMethod(LinkLocal);
0363         } else if (methodType.toLower() == QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_MANUAL)) {
0364             setMethod(Manual);
0365         } else if (methodType.toLower() == QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_SHARED)) {
0366             setMethod(Shared);
0367         } else if (methodType.toLower() == QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_DISABLED)) {
0368             setMethod(Disabled);
0369         } else {
0370             setMethod(Automatic);
0371         }
0372     }
0373 
0374     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS))) {
0375         QList<QHostAddress> dbusDns;
0376         QList<uint> temp;
0377         if (setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS)).canConvert<QDBusArgument>()) {
0378             QDBusArgument dnsArg = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS)).value<QDBusArgument>();
0379             temp = qdbus_cast<QList<uint>>(dnsArg);
0380         } else {
0381             temp = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS)).value<QList<uint>>();
0382         }
0383 
0384         for (const uint utmp : std::as_const(temp)) {
0385             QHostAddress tmpHost(ntohl(utmp));
0386             dbusDns << tmpHost;
0387         }
0388 
0389         setDns(dbusDns);
0390     }
0391 
0392     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_SEARCH))) {
0393         setDnsSearch(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_SEARCH)).toStringList());
0394     }
0395 
0396     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESSES))) {
0397         QList<NetworkManager::IpAddress> addresses;
0398         QList<QList<uint>> temp;
0399         if (setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESSES)).canConvert<QDBusArgument>()) {
0400             QDBusArgument addressArg = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESSES)).value<QDBusArgument>();
0401             temp = qdbus_cast<QList<QList<uint>>>(addressArg);
0402         } else {
0403             temp = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESSES)).value<QList<QList<uint>>>();
0404         }
0405 
0406         for (const QList<uint> &uintList : std::as_const(temp)) {
0407             if (uintList.count() != 3) {
0408                 continue;
0409             }
0410 
0411             NetworkManager::IpAddress address;
0412             address.setIp(QHostAddress(ntohl(uintList.at(0))));
0413             address.setPrefixLength(uintList.at(1));
0414             address.setGateway(QHostAddress(ntohl(uintList.at(2))));
0415             if (!address.isValid()) {
0416                 continue;
0417             }
0418 
0419             addresses << address;
0420         }
0421 
0422         setAddresses(addresses);
0423     }
0424 
0425     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTES))) {
0426         QList<NetworkManager::IpRoute> routes;
0427         QList<QList<uint>> temp;
0428         if (setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTES)).canConvert<QDBusArgument>()) {
0429             QDBusArgument routeArg = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTES)).value<QDBusArgument>();
0430             temp = qdbus_cast<QList<QList<uint>>>(routeArg);
0431         } else {
0432             temp = setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTES)).value<QList<QList<uint>>>();
0433         }
0434 
0435         for (const QList<uint> &uintList : std::as_const(temp)) {
0436             if (uintList.count() != 4) {
0437                 continue;
0438             }
0439 
0440             NetworkManager::IpRoute route;
0441             route.setIp(QHostAddress(ntohl(uintList.at(0))));
0442             route.setPrefixLength(uintList.at(1));
0443             route.setNextHop(QHostAddress(ntohl(uintList.at(2))));
0444             route.setMetric((quint32)uintList.at(3));
0445             if (!route.isValid()) {
0446                 continue;
0447             }
0448             routes << route;
0449         }
0450 
0451         if (!routes.isEmpty()) {
0452             setRoutes(routes);
0453         }
0454     }
0455 
0456     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTE_METRIC))) {
0457         setRouteMetric(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTE_METRIC)).toInt());
0458     }
0459 
0460     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES))) {
0461         setIgnoreAutoRoutes(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES)).toBool());
0462     }
0463 
0464     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS))) {
0465         setIgnoreAutoDns(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS)).toBool());
0466     }
0467 
0468     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_CLIENT_ID))) {
0469         setDhcpClientId(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_CLIENT_ID)).toString());
0470     }
0471 
0472     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME))) {
0473         setDhcpSendHostname(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME)).toBool());
0474     }
0475 
0476     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_HOSTNAME))) {
0477         setDhcpHostname(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_HOSTNAME)).toString());
0478     }
0479 
0480     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_NEVER_DEFAULT))) {
0481         setNeverDefault(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_NEVER_DEFAULT)).toBool());
0482     }
0483 
0484     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_MAY_FAIL))) {
0485         setMayFail(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_MAY_FAIL)).toBool());
0486     }
0487 
0488     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DAD_TIMEOUT))) {
0489         setDadTimeout(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DAD_TIMEOUT)).toUInt());
0490     }
0491 
0492     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_FQDN))) {
0493         setDhcpFqdn(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_FQDN)).toString());
0494     }
0495 
0496     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_OPTIONS))) {
0497         setDnsOptions(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_OPTIONS)).toStringList());
0498     }
0499 
0500     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_PRIORITY))) {
0501         setDnsPriority(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_PRIORITY)).toInt());
0502     }
0503 
0504     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_GATEWAY))) {
0505         setGateway(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_GATEWAY)).toString());
0506     }
0507 
0508     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTE_DATA))) {
0509         setRouteData(qdbus_cast<NMVariantMapList>(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTE_DATA))));
0510     }
0511 
0512     if (setting.contains(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESS_DATA))) {
0513         setAddressData(qdbus_cast<NMVariantMapList>(setting.value(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESS_DATA))));
0514     }
0515 }
0516 
0517 QVariantMap NetworkManager::Ipv4Setting::toMap() const
0518 {
0519     QVariantMap setting;
0520 
0521     if (method() == Automatic) {
0522         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD), QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_AUTO));
0523     } else if (method() == LinkLocal) {
0524         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD), QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_LINK_LOCAL));
0525     } else if (method() == Manual) {
0526         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD), QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_MANUAL));
0527     } else if (method() == Shared) {
0528         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD), QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_SHARED));
0529     } else if (method() == Disabled) {
0530         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD), QLatin1String(NMQT_SETTING_IP4_CONFIG_METHOD_DISABLED));
0531     }
0532 
0533     if (!dns().isEmpty()) {
0534         QList<uint> dbusDns;
0535         const QList<QHostAddress> dnsList = dns();
0536         for (const QHostAddress &dns : dnsList) {
0537             dbusDns << htonl(dns.toIPv4Address());
0538         }
0539 
0540         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS), QVariant::fromValue(dbusDns));
0541     }
0542 
0543     if (!dnsSearch().isEmpty()) {
0544         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_SEARCH), dnsSearch());
0545     }
0546 
0547     if (!addresses().isEmpty()) {
0548         QList<QList<uint>> dbusAddresses;
0549         const auto addressesList = addresses();
0550         for (const NetworkManager::IpAddress &addr : addressesList) {
0551             QList<uint> dbusAddress;
0552             dbusAddress << htonl(addr.ip().toIPv4Address()) << addr.prefixLength() << htonl(addr.gateway().toIPv4Address());
0553             dbusAddresses << dbusAddress;
0554         }
0555 
0556         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESSES), QVariant::fromValue(dbusAddresses));
0557     }
0558 
0559     if (!routes().isEmpty()) {
0560         QList<QList<uint>> dbusRoutes;
0561         const auto routesList = routes();
0562         for (const NetworkManager::IpRoute &route : routesList) {
0563             QList<uint> dbusRoute;
0564             dbusRoute << htonl(route.ip().toIPv4Address()) << route.prefixLength() << htonl(route.nextHop().toIPv4Address()) << route.metric();
0565             dbusRoutes << dbusRoute;
0566         }
0567 
0568         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTES), QVariant::fromValue(dbusRoutes));
0569     }
0570 
0571     if (routeMetric() >= 0) {
0572         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTE_METRIC), routeMetric());
0573     }
0574 
0575     if (ignoreAutoRoutes()) {
0576         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES), ignoreAutoRoutes());
0577     }
0578 
0579     if (ignoreAutoDns()) {
0580         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS), ignoreAutoDns());
0581     }
0582 
0583     if (!dhcpClientId().isEmpty()) {
0584         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_CLIENT_ID), dhcpClientId());
0585     }
0586 
0587     if (!dhcpSendHostname()) {
0588         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME), dhcpSendHostname());
0589     }
0590 
0591     if (!dhcpHostname().isEmpty()) {
0592         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_HOSTNAME), dhcpHostname());
0593     }
0594 
0595     if (neverDefault()) {
0596         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_NEVER_DEFAULT), neverDefault());
0597     }
0598 
0599     if (!mayFail()) {
0600         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_MAY_FAIL), mayFail());
0601     }
0602 
0603     if (dadTimeout() >= 0) {
0604         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DAD_TIMEOUT), dadTimeout());
0605     }
0606 
0607     if (!dhcpFqdn().isEmpty()) {
0608         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DHCP_FQDN), dhcpFqdn());
0609     }
0610 
0611     if (!dnsOptions().isEmpty()) {
0612         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_OPTIONS), dnsOptions());
0613     }
0614 
0615     if (dnsPriority() != 0) {
0616         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_DNS_PRIORITY), dnsPriority());
0617     }
0618 
0619     if (!gateway().isEmpty()) {
0620         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_GATEWAY), gateway());
0621     }
0622 
0623     if (!addressData().empty()) {
0624         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_ADDRESS_DATA), QVariant::fromValue(addressData()));
0625     }
0626 
0627     if (!routeData().empty()) {
0628         setting.insert(QLatin1String(NMQT_SETTING_IP4_CONFIG_ROUTE_DATA), QVariant::fromValue(routeData()));
0629     }
0630 
0631     return setting;
0632 }
0633 
0634 QDebug NetworkManager::operator<<(QDebug dbg, const NetworkManager::Ipv4Setting &setting)
0635 {
0636     dbg.nospace() << "type: " << setting.typeAsString(setting.type()) << '\n';
0637     dbg.nospace() << "initialized: " << !setting.isNull() << '\n';
0638 
0639     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_METHOD << ": " << setting.method() << '\n';
0640     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DNS << ":\n";
0641     const QList<QHostAddress> dnsList = setting.dns();
0642     for (const QHostAddress &address : dnsList) {
0643         dbg.nospace() << address.toString() << '\n';
0644     }
0645     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DNS_SEARCH << ": " << setting.dnsSearch() << '\n';
0646     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_ADDRESSES << '\n';
0647     const auto addressesList = setting.addresses();
0648     for (const NetworkManager::IpAddress &address : addressesList) {
0649         dbg.nospace() << address.ip() << ": " << address.gateway() << ": " << address.netmask() << '\n';
0650     }
0651     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_ROUTES << '\n';
0652     const auto routesList = setting.routes();
0653     for (const NetworkManager::IpRoute &route : routesList) {
0654         dbg.nospace() << route.ip() << ": " << route.netmask() << ": " << route.nextHop() << ": " << route.metric() << '\n';
0655     }
0656     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_ROUTE_METRIC << ":" << setting.routeMetric() << '\n';
0657     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES << ": " << setting.ignoreAutoRoutes() << '\n';
0658     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS << ": " << setting.ignoreAutoDns() << '\n';
0659     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DHCP_CLIENT_ID << ": " << setting.dhcpClientId() << '\n';
0660     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DHCP_SEND_HOSTNAME << ": " << setting.dhcpSendHostname() << '\n';
0661     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DHCP_HOSTNAME << ": " << setting.dhcpHostname() << '\n';
0662     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_NEVER_DEFAULT << ": " << setting.neverDefault() << '\n';
0663     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_MAY_FAIL << ": " << setting.mayFail() << '\n';
0664     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DAD_TIMEOUT << ": " << setting.dadTimeout() << '\n';
0665     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DHCP_FQDN << ": " << setting.dhcpFqdn() << '\n';
0666     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DNS_OPTIONS << ": " << setting.dnsOptions() << '\n';
0667     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_DNS_PRIORITY << ": " << setting.dnsPriority() << '\n';
0668     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_GATEWAY << ": " << setting.gateway() << '\n';
0669     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_ADDRESS_DATA << ": " << '\n';
0670     const NMVariantMapList addDataList = setting.addressData();
0671     for (const QVariantMap &addressData : addDataList) {
0672         QVariantMap::const_iterator i = addressData.constBegin();
0673         while (i != addressData.constEnd()) {
0674             dbg.nospace() << i.key() << ": " << i.value() << '\n';
0675         }
0676     }
0677     dbg.nospace() << NMQT_SETTING_IP4_CONFIG_ROUTE_DATA << ": " << '\n';
0678     const NMVariantMapList routeDataList = setting.routeData();
0679     for (const QVariantMap &routeData : routeDataList) {
0680         QVariantMap::const_iterator i = routeData.constBegin();
0681         while (i != routeData.constEnd()) {
0682             dbg.nospace() << i.key() << ": " << i.value() << '\n';
0683         }
0684     }
0685 
0686     return dbg.maybeSpace();
0687 }