From 81eae154b7ea960b87ea8bddab11feb901efbc2c Mon Sep 17 00:00:00 2001 From: sdomi Date: Sun, 25 Aug 2024 18:29:35 +0200 Subject: [PATCH] Kernel/Net: Add basic IPv6 address support to NetworkAdapter --- Kernel/Net/NetworkAdapter.cpp | 10 ++++++++++ Kernel/Net/NetworkAdapter.h | 13 +++++++++++++ Kernel/Net/NetworkingManagement.cpp | 13 +++++++++++++ Kernel/Net/NetworkingManagement.h | 1 + 4 files changed, 37 insertions(+) diff --git a/Kernel/Net/NetworkAdapter.cpp b/Kernel/Net/NetworkAdapter.cpp index 8b0692d98e4..e09e860cdd1 100644 --- a/Kernel/Net/NetworkAdapter.cpp +++ b/Kernel/Net/NetworkAdapter.cpp @@ -159,4 +159,14 @@ void NetworkAdapter::set_ipv4_netmask(IPv4Address const& netmask) m_ipv4_netmask = netmask; } +void NetworkAdapter::set_ipv6_address(IPv6Address const& address) +{ + m_ipv6_address = address; +} + +void NetworkAdapter::set_ipv6_netmask(IPv6Address const& netmask) +{ + m_ipv6_netmask = netmask; +} + } diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h index fedce017f8d..88e2a06d8e3 100644 --- a/Kernel/Net/NetworkAdapter.h +++ b/Kernel/Net/NetworkAdapter.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -65,6 +66,12 @@ public: IPv4Address ipv4_address() const { return m_ipv4_address; } IPv4Address ipv4_netmask() const { return m_ipv4_netmask; } IPv4Address ipv4_broadcast() const { return IPv4Address { (m_ipv4_address.to_u32() & m_ipv4_netmask.to_u32()) | ~m_ipv4_netmask.to_u32() }; } + + IPv6Address ipv6_address() const { return m_ipv6_address; } + IPv6Address ipv6_netmask() const { return m_ipv6_netmask; } + // TODO: implement other multicast addresses + IPv6Address ipv6_multicast() const { return IPv6Address({ 0xff, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }); } + virtual bool link_up() { return false; } virtual i32 link_speed() { @@ -76,6 +83,9 @@ public: void set_ipv4_address(IPv4Address const&); void set_ipv4_netmask(IPv4Address const&); + void set_ipv6_address(IPv6Address const&); + void set_ipv6_netmask(IPv6Address const&); + void send(MACAddress const&, ARPPacket const&); void fill_in_ipv4_header(PacketWithTimestamp&, IPv4Address const&, MACAddress const&, IPv4Address const&, IPv4Protocol, size_t, u8 type_of_service, u8 ttl); @@ -110,8 +120,11 @@ protected: private: MACAddress m_mac_address; + // FIXME: Allow for more than one IPv4/IPv6 address each. IPv4Address m_ipv4_address; IPv4Address m_ipv4_netmask; + IPv6Address m_ipv6_address; + IPv6Address m_ipv6_netmask; // FIXME: Make this configurable static constexpr size_t max_packet_buffers = 1024; diff --git a/Kernel/Net/NetworkingManagement.cpp b/Kernel/Net/NetworkingManagement.cpp index f81a036cdc3..c6f624964da 100644 --- a/Kernel/Net/NetworkingManagement.cpp +++ b/Kernel/Net/NetworkingManagement.cpp @@ -72,6 +72,19 @@ RefPtr NetworkingManagement::from_ipv4_address(IPv4Address const }); } +RefPtr NetworkingManagement::from_ipv6_address(IPv6Address const& address) const +{ + if (address.is_loopback()) + return m_loopback_adapter; + return m_adapters.with([&](auto& adapters) -> RefPtr { + for (auto& adapter : adapters) { + if (adapter->ipv6_address() == address || adapter->ipv6_multicast() == address) + return adapter; + } + return nullptr; + }); +} + RefPtr NetworkingManagement::lookup_by_name(StringView name) const { return m_adapters.with([&](auto& adapters) -> RefPtr { diff --git a/Kernel/Net/NetworkingManagement.h b/Kernel/Net/NetworkingManagement.h index 19cfdc9edaf..74574c31510 100644 --- a/Kernel/Net/NetworkingManagement.h +++ b/Kernel/Net/NetworkingManagement.h @@ -34,6 +34,7 @@ public: ErrorOr try_for_each(Function(NetworkAdapter&)>); RefPtr from_ipv4_address(IPv4Address const&) const; + RefPtr from_ipv6_address(IPv6Address const&) const; RefPtr lookup_by_name(StringView) const; NonnullRefPtr loopback_adapter() const;