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:
parent
6f9b84a64a
commit
037744e62a
Notes:
sideshowbarker
2024-07-17 01:45:49 +09:00
Author: https://github.com/kuzux Commit: https://github.com/SerenityOS/serenity/commit/037744e62a Pull-request: https://github.com/SerenityOS/serenity/pull/16990 Reviewed-by: https://github.com/supercomputer7 ✅
5 changed files with 19 additions and 1 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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(); }
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue