/* * Copyright (c) 2023, Kirill Nikolaev * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Kernel { class VirtIONetworkAdapter : public VirtIO::Device , public NetworkAdapter { public: static ErrorOr probe(PCI::DeviceIdentifier const&); static ErrorOr> create(PCI::DeviceIdentifier const&); virtual ~VirtIONetworkAdapter() override = default; // VirtIO::Device virtual ErrorOr initialize_virtio_resources() override; // NetworkAdapter virtual StringView class_name() const override { return "VirtIONetworkAdapter"sv; } virtual Type adapter_type() const override { return Type::Ethernet; } virtual ErrorOr initialize(Badge) override; virtual bool link_up() override { return m_link_up; } virtual bool link_full_duplex() override { return m_link_duplex; } virtual i32 link_speed() override { return m_link_speed; } private: explicit VirtIONetworkAdapter(StringView interface_name, NonnullOwnPtr); // VirtIO::Device virtual ErrorOr handle_device_config_change() override; virtual void handle_queue_update(u16 queue_index) override; // NetworkAdapter virtual void send_raw(ReadonlyBytes) override; private: VirtIO::Configuration const* m_device_config { nullptr }; // FIXME: Make atomic as they are read without sync. // Note that VirtIO::NetworkAdapter may also have the same defect. bool m_link_up { false }; i32 m_link_speed { LINKSPEED_INVALID }; bool m_link_duplex { false }; OwnPtr m_rx_buffers; OwnPtr m_tx_buffers; }; }