diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index ca73443099f..1d43d8dde6a 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -740,7 +740,16 @@ ErrorOr IPv4Socket::ioctl(OpenFileDescription&, unsigned request, Userspac case SIOCGIFHWADDR: { auto mac_address = adapter->mac_address(); - ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; // FIXME: Query the underlying network interface for it's type + switch (adapter->adapter_type()) { + case NetworkAdapter::Type::Loopback: + ifr.ifr_hwaddr.sa_family = ARPHRD_LOOPBACK; + break; + case NetworkAdapter::Type::Ethernet: + ifr.ifr_hwaddr.sa_family = ARPHRD_ETHER; + break; + default: + VERIFY_NOT_REACHED(); + } mac_address.copy_to(Bytes { ifr.ifr_hwaddr.sa_data, sizeof(ifr.ifr_hwaddr.sa_data) }); return copy_to_user(user_ifr, &ifr); } diff --git a/Kernel/Net/Intel/E1000NetworkAdapter.h b/Kernel/Net/Intel/E1000NetworkAdapter.h index 5bc557059d5..e5b4e4a305d 100644 --- a/Kernel/Net/Intel/E1000NetworkAdapter.h +++ b/Kernel/Net/Intel/E1000NetworkAdapter.h @@ -33,6 +33,7 @@ public: virtual StringView purpose() const override { return class_name(); } virtual StringView device_name() const override { return "E1000"sv; } + virtual Type adapter_type() const override { return Type::Ethernet; } protected: static constexpr size_t rx_buffer_size = 8192; diff --git a/Kernel/Net/LoopbackAdapter.h b/Kernel/Net/LoopbackAdapter.h index 47365ee0994..af864250a62 100644 --- a/Kernel/Net/LoopbackAdapter.h +++ b/Kernel/Net/LoopbackAdapter.h @@ -22,6 +22,7 @@ public: virtual void send_raw(ReadonlyBytes) override; virtual StringView class_name() const override { return "LoopbackAdapter"sv; } + virtual Type adapter_type() const override { return Type::Loopback; } virtual bool link_up() override { return true; } virtual bool link_full_duplex() override { return true; } virtual int link_speed() override { return 1000; } diff --git a/Kernel/Net/NetworkAdapter.h b/Kernel/Net/NetworkAdapter.h index e3b0424df3e..bfc9314fd74 100644 --- a/Kernel/Net/NetworkAdapter.h +++ b/Kernel/Net/NetworkAdapter.h @@ -47,11 +47,17 @@ class NetworkAdapter : public AtomicRefCounted , public LockWeakable { public: + enum class Type { + Loopback, + Ethernet + }; + static constexpr i32 LINKSPEED_INVALID = -1; virtual ~NetworkAdapter(); virtual StringView class_name() const = 0; + virtual Type adapter_type() const = 0; virtual ErrorOr initialize(Badge) = 0; StringView name() const { return m_name->view(); } diff --git a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h index b7dc57f1d4c..f205f436eb4 100644 --- a/Kernel/Net/Realtek/RTL8168NetworkAdapter.h +++ b/Kernel/Net/Realtek/RTL8168NetworkAdapter.h @@ -35,6 +35,7 @@ public: virtual StringView purpose() const override { return class_name(); } virtual StringView device_name() const override { return class_name(); } + virtual Type adapter_type() const override { return Type::Ethernet; } private: // FIXME: should this be increased? (maximum allowed here is 1024) - memory usage vs packet loss chance tradeoff