/* * Copyright (c) 2018-2020, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace Kernel { class NetworkAdapter; class NetworkAdapter : public RefCounted { public: static void for_each(Function); static RefPtr from_ipv4_address(const IPv4Address&); static RefPtr lookup_by_name(const StringView&); virtual ~NetworkAdapter(); virtual const char* class_name() const = 0; const String& name() const { return m_name; } MACAddress mac_address() { return m_mac_address; } IPv4Address ipv4_address() const { return m_ipv4_address; } IPv4Address ipv4_netmask() const { return m_ipv4_netmask; } IPv4Address ipv4_gateway() const { return m_ipv4_gateway; } virtual bool link_up() { return false; } void set_ipv4_address(const IPv4Address&); void set_ipv4_netmask(const IPv4Address&); void set_ipv4_gateway(const IPv4Address&); void send(const MACAddress&, const ARPPacket&); KResult send_ipv4(const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl); KResult send_ipv4_fragmented(const MACAddress&, const IPv4Address&, IPv4Protocol, const UserOrKernelBuffer& payload, size_t payload_size, u8 ttl); size_t dequeue_packet(u8* buffer, size_t buffer_size, Time& packet_timestamp); bool has_queued_packets() const { return !m_packet_queue.is_empty(); } u32 mtu() const { return m_mtu; } void set_mtu(u32 mtu) { m_mtu = mtu; } u32 packets_in() const { return m_packets_in; } u32 bytes_in() const { return m_bytes_in; } u32 packets_out() const { return m_packets_out; } u32 bytes_out() const { return m_bytes_out; } Function on_receive; protected: NetworkAdapter(); void set_interface_name(const StringView& basename); void set_mac_address(const MACAddress& mac_address) { m_mac_address = mac_address; } virtual void send_raw(ReadonlyBytes) = 0; void did_receive(ReadonlyBytes); private: MACAddress m_mac_address; IPv4Address m_ipv4_address; IPv4Address m_ipv4_netmask; IPv4Address m_ipv4_gateway; struct PacketWithTimestamp { KBuffer packet; Time timestamp; }; SinglyLinkedList m_packet_queue; SinglyLinkedList m_unused_packet_buffers; size_t m_unused_packet_buffers_count { 0 }; String m_name; u32 m_packets_in { 0 }; u32 m_bytes_in { 0 }; u32 m_packets_out { 0 }; u32 m_bytes_out { 0 }; u32 m_mtu { 1500 }; }; }