Kernel/Net: Get the correct interface type in SIOCGIFHWADDR ioctl

When calling ioctl on a socket with SIOCGIFHWADDR, return the correct
physical interface type. This value was previously hardcoded to
ARPHRD_ETHER (Ethernet), and now can also return ARPHRD_LOOPBACK for the
loopback adapter.
This commit is contained in:
Arda Cinar 2023-01-13 11:46:31 +03:00 committed by Jelle Raaijmakers
parent 6f9b84a64a
commit 037744e62a
Notes: sideshowbarker 2024-07-17 01:45:49 +09:00
5 changed files with 19 additions and 1 deletions

View file

@ -740,7 +740,16 @@ ErrorOr<void> 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);
}

View file

@ -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;

View file

@ -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; }

View file

@ -47,11 +47,17 @@ class NetworkAdapter
: public AtomicRefCounted<NetworkAdapter>
, public LockWeakable<NetworkAdapter> {
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<void> initialize(Badge<NetworkingManagement>) = 0;
StringView name() const { return m_name->view(); }

View file

@ -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