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

0001 /*
0002     SPDX-FileCopyrightText: 2012-2013 Jan Grulich <jgrulich@redhat.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "wiredsetting.h"
0008 #include "manager.h"
0009 #include "wiredsetting_p.h"
0010 
0011 #include <QDebug>
0012 
0013 #define NM_SETTING_WIRED_ASSIGNED_MAC_ADDRESS "assigned-mac-address"
0014 
0015 NetworkManager::WiredSettingPrivate::WiredSettingPrivate()
0016     : name(NM_SETTING_WIRED_SETTING_NAME)
0017     , port(NetworkManager::WiredSetting::UnknownPort)
0018     , speed(0)
0019     , duplex(NetworkManager::WiredSetting::UnknownDuplexType)
0020     , mtu(0)
0021     , s390NetType(NetworkManager::WiredSetting::Undefined)
0022     , wakeOnLan(NetworkManager::WiredSetting::WakeOnLanDefault)
0023 {
0024     if (NetworkManager::checkVersion(1, 6, 0)) {
0025         autoNegotiate = false;
0026     } else {
0027         autoNegotiate = true;
0028     }
0029 }
0030 
0031 NetworkManager::WiredSetting::WiredSetting()
0032     : Setting(Setting::Wired)
0033     , d_ptr(new WiredSettingPrivate())
0034 {
0035 }
0036 
0037 NetworkManager::WiredSetting::WiredSetting(const WiredSetting::Ptr &other)
0038     : Setting(other)
0039     , d_ptr(new WiredSettingPrivate())
0040 {
0041     setPort(other->port());
0042     setSpeed(other->speed());
0043     setDuplexType(other->duplexType());
0044     setAutoNegotiate(other->autoNegotiate());
0045     setGenerateMacAddressMask(other->generateMacAddressMask());
0046     setMacAddress(other->macAddress());
0047     setClonedMacAddress(other->clonedMacAddress());
0048     setMacAddressBlacklist(other->macAddressBlacklist());
0049     setMtu(other->mtu());
0050     setS390Subchannels(other->s390Subchannels());
0051     setS390NetType(other->s390NetType());
0052     setS390Options(other->s390Options());
0053     setWakeOnLan(other->wakeOnLan());
0054     setWakeOnLanPassword(other->wakeOnLanPassword());
0055     setAssignedMacAddress(other->assignedMacAddress());
0056 }
0057 
0058 NetworkManager::WiredSetting::~WiredSetting()
0059 {
0060     delete d_ptr;
0061 }
0062 
0063 QString NetworkManager::WiredSetting::name() const
0064 {
0065     Q_D(const WiredSetting);
0066 
0067     return d->name;
0068 }
0069 
0070 void NetworkManager::WiredSetting::setPort(NetworkManager::WiredSetting::PortType port)
0071 {
0072     Q_D(WiredSetting);
0073 
0074     d->port = port;
0075 }
0076 
0077 NetworkManager::WiredSetting::PortType NetworkManager::WiredSetting::port() const
0078 {
0079     Q_D(const WiredSetting);
0080 
0081     return d->port;
0082 }
0083 
0084 void NetworkManager::WiredSetting::setSpeed(quint32 speed)
0085 {
0086     Q_D(WiredSetting);
0087 
0088     d->speed = speed;
0089 }
0090 
0091 quint32 NetworkManager::WiredSetting::speed() const
0092 {
0093     Q_D(const WiredSetting);
0094 
0095     return d->speed;
0096 }
0097 
0098 void NetworkManager::WiredSetting::setDuplexType(NetworkManager::WiredSetting::DuplexType type)
0099 {
0100     Q_D(WiredSetting);
0101 
0102     d->duplex = type;
0103 }
0104 
0105 NetworkManager::WiredSetting::DuplexType NetworkManager::WiredSetting::duplexType() const
0106 {
0107     Q_D(const WiredSetting);
0108 
0109     return d->duplex;
0110 }
0111 
0112 void NetworkManager::WiredSetting::setAutoNegotiate(bool autoNegotiate)
0113 {
0114     Q_D(WiredSetting);
0115 
0116     d->autoNegotiate = autoNegotiate;
0117 }
0118 
0119 bool NetworkManager::WiredSetting::autoNegotiate() const
0120 {
0121     Q_D(const WiredSetting);
0122 
0123     return d->autoNegotiate;
0124 }
0125 
0126 QString NetworkManager::WiredSetting::generateMacAddressMask() const
0127 {
0128     Q_D(const WiredSetting);
0129 
0130     return d->generateMacAddressMask;
0131 }
0132 
0133 void NetworkManager::WiredSetting::setGenerateMacAddressMask(const QString &mask)
0134 {
0135     Q_D(WiredSetting);
0136 
0137     d->generateMacAddressMask = mask;
0138 }
0139 
0140 void NetworkManager::WiredSetting::setMacAddress(const QByteArray &address)
0141 {
0142     Q_D(WiredSetting);
0143 
0144     d->macAddress = address;
0145 }
0146 
0147 QByteArray NetworkManager::WiredSetting::macAddress() const
0148 {
0149     Q_D(const WiredSetting);
0150 
0151     return d->macAddress;
0152 }
0153 
0154 void NetworkManager::WiredSetting::setClonedMacAddress(const QByteArray &address)
0155 {
0156     Q_D(WiredSetting);
0157 
0158     d->clonedMacAddress = address;
0159 }
0160 
0161 QByteArray NetworkManager::WiredSetting::clonedMacAddress() const
0162 {
0163     Q_D(const WiredSetting);
0164 
0165     return d->clonedMacAddress;
0166 }
0167 
0168 void NetworkManager::WiredSetting::setMacAddressBlacklist(const QStringList &list)
0169 {
0170     Q_D(WiredSetting);
0171 
0172     d->macAddressBlacklist = list;
0173 }
0174 
0175 QStringList NetworkManager::WiredSetting::macAddressBlacklist() const
0176 {
0177     Q_D(const WiredSetting);
0178 
0179     return d->macAddressBlacklist;
0180 }
0181 
0182 void NetworkManager::WiredSetting::setMtu(quint32 mtu)
0183 {
0184     Q_D(WiredSetting);
0185 
0186     d->mtu = mtu;
0187 }
0188 
0189 quint32 NetworkManager::WiredSetting::mtu() const
0190 {
0191     Q_D(const WiredSetting);
0192 
0193     return d->mtu;
0194 }
0195 
0196 void NetworkManager::WiredSetting::setS390Subchannels(const QStringList &channels)
0197 {
0198     Q_D(WiredSetting);
0199 
0200     d->s390Subchannels = channels;
0201 }
0202 
0203 QStringList NetworkManager::WiredSetting::s390Subchannels() const
0204 {
0205     Q_D(const WiredSetting);
0206 
0207     return d->s390Subchannels;
0208 }
0209 
0210 void NetworkManager::WiredSetting::setS390NetType(NetworkManager::WiredSetting::S390Nettype type)
0211 {
0212     Q_D(WiredSetting);
0213 
0214     d->s390NetType = type;
0215 }
0216 
0217 NetworkManager::WiredSetting::S390Nettype NetworkManager::WiredSetting::s390NetType() const
0218 {
0219     Q_D(const WiredSetting);
0220 
0221     return d->s390NetType;
0222 }
0223 
0224 void NetworkManager::WiredSetting::setS390Options(const QMap<QString, QString> &options)
0225 {
0226     Q_D(WiredSetting);
0227 
0228     d->s390Options = options;
0229 }
0230 
0231 QMap<QString, QString> NetworkManager::WiredSetting::s390Options() const
0232 {
0233     Q_D(const WiredSetting);
0234 
0235     return d->s390Options;
0236 }
0237 
0238 NetworkManager::WiredSetting::WakeOnLanFlags NetworkManager::WiredSetting::wakeOnLan() const
0239 {
0240     Q_D(const WiredSetting);
0241 
0242     return d->wakeOnLan;
0243 }
0244 
0245 void NetworkManager::WiredSetting::setWakeOnLan(NetworkManager::WiredSetting::WakeOnLanFlags wol)
0246 {
0247     Q_D(WiredSetting);
0248 
0249     d->wakeOnLan = wol;
0250 }
0251 
0252 QString NetworkManager::WiredSetting::wakeOnLanPassword() const
0253 {
0254     Q_D(const WiredSetting);
0255 
0256     return d->wakeOnLanPassword;
0257 }
0258 
0259 void NetworkManager::WiredSetting::setWakeOnLanPassword(const QString &password)
0260 {
0261     Q_D(WiredSetting);
0262 
0263     d->wakeOnLanPassword = password;
0264 }
0265 
0266 void NetworkManager::WiredSetting::setAssignedMacAddress(const QString &assignedMacAddress)
0267 {
0268     Q_D(WiredSetting);
0269 
0270     d->assignedMacAddress = assignedMacAddress;
0271 }
0272 
0273 QString NetworkManager::WiredSetting::assignedMacAddress() const
0274 {
0275     Q_D(const WiredSetting);
0276 
0277     return d->assignedMacAddress;
0278 }
0279 
0280 void NetworkManager::WiredSetting::fromMap(const QVariantMap &setting)
0281 {
0282     if (setting.contains(QLatin1String(NM_SETTING_WIRED_PORT))) {
0283         const QString port = setting.value(QLatin1String(NM_SETTING_WIRED_PORT)).toString();
0284 
0285         if (port == "tp") {
0286             setPort(Tp);
0287         } else if (port == "aui") {
0288             setPort(Aui);
0289         } else if (port == "bnc") {
0290             setPort(Bnc);
0291         } else if (port == "mii") {
0292             setPort(Mii);
0293         }
0294     }
0295 
0296     if (setting.contains(QLatin1String(NM_SETTING_WIRED_SPEED))) {
0297         setSpeed(setting.value(QLatin1String(NM_SETTING_WIRED_SPEED)).toUInt());
0298     }
0299 
0300     if (setting.contains(QLatin1String(NM_SETTING_WIRED_DUPLEX))) {
0301         const QString duplex = setting.value(QLatin1String(NM_SETTING_WIRED_DUPLEX)).toString();
0302 
0303         if (duplex == "half") {
0304             setDuplexType(Half);
0305         } else if (duplex == "full") {
0306             setDuplexType(Full);
0307         }
0308     }
0309 
0310     if (setting.contains(QLatin1String(NM_SETTING_WIRED_AUTO_NEGOTIATE))) {
0311         setAutoNegotiate(setting.value(QLatin1String(NM_SETTING_WIRED_AUTO_NEGOTIATE)).toBool());
0312     }
0313 
0314     if (setting.contains(QLatin1String(NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK))) {
0315         setGenerateMacAddressMask(setting.value(QLatin1String(NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK)).toString());
0316     }
0317 
0318     if (setting.contains(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS))) {
0319         setMacAddress(setting.value(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS)).toByteArray());
0320     }
0321 
0322     if (setting.contains(QLatin1String(NM_SETTING_WIRED_CLONED_MAC_ADDRESS))) {
0323         setClonedMacAddress(setting.value(QLatin1String(NM_SETTING_WIRED_CLONED_MAC_ADDRESS)).toByteArray());
0324     }
0325 
0326     if (setting.contains(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST))) {
0327         setMacAddressBlacklist(setting.value(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST)).toStringList());
0328     }
0329 
0330     if (setting.contains(QLatin1String(NM_SETTING_WIRED_MTU))) {
0331         setMtu(setting.value(QLatin1String(NM_SETTING_WIRED_MTU)).toUInt());
0332     }
0333 
0334     if (setting.contains(QLatin1String(NM_SETTING_WIRED_S390_SUBCHANNELS))) {
0335         setS390Subchannels(setting.value(QLatin1String(NM_SETTING_WIRED_S390_SUBCHANNELS)).toStringList());
0336     }
0337 
0338     if (setting.contains(QLatin1String(NM_SETTING_WIRED_S390_NETTYPE))) {
0339         const QString nettype = setting.value(QLatin1String(NM_SETTING_WIRED_S390_NETTYPE)).toString();
0340 
0341         if (nettype == "qeth") {
0342             setS390NetType(Qeth);
0343         } else if (nettype == "lcs") {
0344             setS390NetType(Lcs);
0345         } else if (nettype == "ctc") {
0346             setS390NetType(Ctc);
0347         }
0348     }
0349 
0350     if (setting.contains(QLatin1String(NM_SETTING_WIRED_S390_OPTIONS))) {
0351         QMap<QString, QString> tmp;
0352         if (setting.value(QLatin1String(NM_SETTING_WIRED_S390_OPTIONS)).canConvert<QDBusArgument>()) {
0353             QDBusArgument arg = setting.value(QLatin1String(NM_SETTING_WIRED_S390_OPTIONS)).value<QDBusArgument>();
0354             tmp = qdbus_cast<NMStringMap>(arg);
0355         } else {
0356             tmp = setting.value(QLatin1String(NM_SETTING_WIRED_S390_OPTIONS)).value<NMStringMap>();
0357         }
0358         setS390Options(tmp);
0359     }
0360 
0361     if (setting.contains(QLatin1String(NM_SETTING_WIRED_WAKE_ON_LAN))) {
0362         setWakeOnLan((NetworkManager::WiredSetting::WakeOnLanFlags)setting.value(QLatin1String(NM_SETTING_WIRED_WAKE_ON_LAN)).toUInt());
0363     }
0364 
0365     if (setting.contains(QLatin1String(NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD))) {
0366         setWakeOnLanPassword(setting.value(QLatin1String(NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD)).toString());
0367     }
0368 
0369     if (setting.contains(QLatin1String(NM_SETTING_WIRED_ASSIGNED_MAC_ADDRESS))) {
0370         setAssignedMacAddress(setting.value(QLatin1String(NM_SETTING_WIRED_ASSIGNED_MAC_ADDRESS)).toString());
0371     }
0372 }
0373 
0374 QVariantMap NetworkManager::WiredSetting::toMap() const
0375 {
0376     QVariantMap setting;
0377 
0378     switch (port()) {
0379     case Tp:
0380         setting.insert(QLatin1String(NM_SETTING_WIRED_PORT), "tp");
0381         break;
0382     case Aui:
0383         setting.insert(QLatin1String(NM_SETTING_WIRED_PORT), "aui");
0384         break;
0385     case Bnc:
0386         setting.insert(QLatin1String(NM_SETTING_WIRED_PORT), "bnc");
0387         break;
0388     case Mii:
0389         setting.insert(QLatin1String(NM_SETTING_WIRED_PORT), "mii");
0390         break;
0391     case UnknownPort: // Make GCC hapy
0392         break;
0393     }
0394 
0395     // When autonegotiation is set we have to avoid setting speed and duplex, while
0396     // when autonegotiation is disabled, we have to specify both
0397     if (autoNegotiate()) {
0398         setting.insert(QLatin1String(NM_SETTING_WIRED_AUTO_NEGOTIATE), autoNegotiate());
0399     } else {
0400         setting.insert(QLatin1String(NM_SETTING_WIRED_AUTO_NEGOTIATE), autoNegotiate());
0401         setting.insert(QLatin1String(NM_SETTING_WIRED_SPEED), speed());
0402 
0403         switch (duplexType()) {
0404         case Half:
0405             setting.insert(QLatin1String(NM_SETTING_WIRED_DUPLEX), "half");
0406             break;
0407         case Full:
0408             setting.insert(QLatin1String(NM_SETTING_WIRED_DUPLEX), "full");
0409             break;
0410         case UnknownDuplexType:
0411             break;
0412         }
0413     }
0414 
0415     if (!generateMacAddressMask().isEmpty()) {
0416         setting.insert(QLatin1String(NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK), generateMacAddressMask());
0417     }
0418 
0419     if (!macAddress().isEmpty()) {
0420         setting.insert(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS), macAddress());
0421     }
0422     if (!clonedMacAddress().isEmpty()) {
0423         setting.insert(QLatin1String(NM_SETTING_WIRED_CLONED_MAC_ADDRESS), clonedMacAddress());
0424     }
0425     if (!macAddressBlacklist().isEmpty()) {
0426         setting.insert(QLatin1String(NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST), macAddressBlacklist());
0427     }
0428     if (mtu()) {
0429         setting.insert(QLatin1String(NM_SETTING_WIRED_MTU), mtu());
0430     }
0431     if (!s390Subchannels().isEmpty()) {
0432         setting.insert(QLatin1String(NM_SETTING_WIRED_S390_SUBCHANNELS), s390Subchannels());
0433     }
0434 
0435     switch (s390NetType()) {
0436     case Qeth:
0437         setting.insert(QLatin1String(NM_SETTING_WIRED_S390_NETTYPE), "qeth");
0438         break;
0439     case Lcs:
0440         setting.insert(QLatin1String(NM_SETTING_WIRED_S390_NETTYPE), "lcs");
0441         break;
0442     case Ctc:
0443         setting.insert(QLatin1String(NM_SETTING_WIRED_S390_NETTYPE), "ctc");
0444         break;
0445     case Undefined:
0446         break;
0447     }
0448 
0449     if (!s390Options().isEmpty()) {
0450         setting.insert(QLatin1String(NM_SETTING_WIRED_S390_OPTIONS), QVariant::fromValue(s390Options()));
0451     }
0452 
0453     setting.insert(QLatin1String(NM_SETTING_WIRED_WAKE_ON_LAN), (uint)wakeOnLan());
0454 
0455     if (!wakeOnLanPassword().isEmpty()) {
0456         setting.insert(QLatin1String(NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD), wakeOnLanPassword());
0457     }
0458 
0459     if (!assignedMacAddress().isEmpty()) {
0460         setting.insert(QLatin1String(NM_SETTING_WIRED_ASSIGNED_MAC_ADDRESS), assignedMacAddress());
0461     }
0462 
0463     return setting;
0464 }
0465 
0466 QDebug NetworkManager::operator<<(QDebug dbg, const NetworkManager::WiredSetting &setting)
0467 {
0468     dbg.nospace() << "type: " << setting.typeAsString(setting.type()) << '\n';
0469     dbg.nospace() << "initialized: " << !setting.isNull() << '\n';
0470 
0471     dbg.nospace() << NM_SETTING_WIRED_PORT << ": " << setting.port() << '\n';
0472     dbg.nospace() << NM_SETTING_WIRED_SPEED << ": " << setting.speed() << '\n';
0473     dbg.nospace() << NM_SETTING_WIRED_DUPLEX << ": " << setting.duplexType() << '\n';
0474     dbg.nospace() << NM_SETTING_WIRED_AUTO_NEGOTIATE << ": " << setting.autoNegotiate() << '\n';
0475     dbg.nospace() << NM_SETTING_WIRED_GENERATE_MAC_ADDRESS_MASK << ": " << setting.generateMacAddressMask() << '\n';
0476     dbg.nospace() << NM_SETTING_WIRED_MAC_ADDRESS << ": " << setting.macAddress() << '\n';
0477     dbg.nospace() << NM_SETTING_WIRED_CLONED_MAC_ADDRESS << ": " << setting.clonedMacAddress() << '\n';
0478     dbg.nospace() << NM_SETTING_WIRED_MAC_ADDRESS_BLACKLIST << ": " << setting.macAddressBlacklist() << '\n';
0479     dbg.nospace() << NM_SETTING_WIRED_MTU << ": " << setting.mtu() << '\n';
0480     dbg.nospace() << NM_SETTING_WIRED_S390_SUBCHANNELS << ": " << setting.s390Subchannels() << '\n';
0481     dbg.nospace() << NM_SETTING_WIRED_S390_NETTYPE << ": " << setting.s390NetType() << '\n';
0482     dbg.nospace() << NM_SETTING_WIRED_S390_OPTIONS << ": " << setting.s390Options() << '\n';
0483     dbg.nospace() << NM_SETTING_WIRED_WAKE_ON_LAN << ": " << setting.wakeOnLan() << '\n';
0484     dbg.nospace() << NM_SETTING_WIRED_WAKE_ON_LAN_PASSWORD << ": " << setting.wakeOnLanPassword() << '\n';
0485     dbg.nospace() << NM_SETTING_WIRED_ASSIGNED_MAC_ADDRESS << ": " << setting.assignedMacAddress() << '\n';    
0486 
0487     return dbg.maybeSpace();
0488 }