File indexing completed on 2024-05-12 17:00:16

0001 /*
0002  * SPDX-FileCopyrightText: 2020 David Redondo <kde@david-redondo.de>
0003  * SPDX-FileCopyrightText: 2021 Alessio Bonfiglio <alessio.bonfiglio@mail.polimi.it>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  */
0007 
0008 #pragma once
0009 
0010 #include "NetworkBackend.h"
0011 #include "NetworkDevice.h"
0012 
0013 #include <QElapsedTimer>
0014 
0015 #include <netlink/cache.h>
0016 #include <netlink/socket.h>
0017 
0018 struct rtnl_addr;
0019 struct rtnl_link;
0020 
0021 class RtNetlinkDevice : public NetworkDevice
0022 {
0023     Q_OBJECT
0024 public:
0025     RtNetlinkDevice(const QString &id);
0026     void update(rtnl_link *link, nl_cache *address_cache, nl_cache *route_cache, qint64 elapsedTime);
0027 Q_SIGNALS:
0028     void connected();
0029     void disconnected();
0030 
0031 private:
0032     bool m_connected = false;
0033 };
0034 
0035 class RtNetlinkBackend : public NetworkBackend
0036 {
0037 public:
0038     RtNetlinkBackend(QObject *parent);
0039     ~RtNetlinkBackend() override;
0040     bool isSupported() override;
0041     void start() override;
0042     void stop() override;
0043     void update() override;
0044 
0045 private:
0046     QHash<QByteArray, RtNetlinkDevice *> m_devices;
0047     std::unique_ptr<nl_sock, decltype(&nl_socket_free)> m_socket;
0048     QElapsedTimer m_updateTimer;
0049 };