diff --git a/Kernel/Net/IPv4Socket.cpp b/Kernel/Net/IPv4Socket.cpp index 2eb02b368c0..e888eae6aa6 100644 --- a/Kernel/Net/IPv4Socket.cpp +++ b/Kernel/Net/IPv4Socket.cpp @@ -377,6 +377,16 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, unsigned arg) ifr->ifr_addr.sa_family = AF_INET; ((sockaddr_in&)ifr->ifr_addr).sin_addr.s_addr = adapter->ipv4_address().to_u32(); return 0; + + case SIOCGIFHWADDR: + if (!current->process().validate_write_typed(ifr)) + return -EFAULT; + ifr->ifr_hwaddr.sa_family = AF_INET; + { + auto mac_address = adapter->mac_address(); + memcpy(ifr->ifr_hwaddr.sa_data, &mac_address, sizeof(MACAddress)); + } + return 0; } return -EINVAL; diff --git a/Kernel/UnixTypes.h b/Kernel/UnixTypes.h index 9f69f7ef555..e4a0c8ed4cc 100644 --- a/Kernel/UnixTypes.h +++ b/Kernel/UnixTypes.h @@ -414,6 +414,7 @@ struct ifreq { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; + struct sockaddr ifru_hwaddr; short ifru_flags; int ifru_metric; int64_t ifru_vnetid; @@ -435,4 +436,5 @@ struct ifreq { #define ifr_data ifr_ifru.ifru_data // for use by interface #define ifr_index ifr_ifru.ifru_index // interface index #define ifr_llprio ifr_ifru.ifru_metric // link layer priority +#define ifr_hwaddr ifr_ifru.ifru_hwaddr // MAC address }; diff --git a/Libraries/LibC/net/if.h b/Libraries/LibC/net/if.h index 9a5db281b9e..6cf8f9f4980 100644 --- a/Libraries/LibC/net/if.h +++ b/Libraries/LibC/net/if.h @@ -12,6 +12,7 @@ struct ifreq { struct sockaddr ifru_addr; struct sockaddr ifru_dstaddr; struct sockaddr ifru_broadaddr; + struct sockaddr ifru_hwaddr; short ifru_flags; int ifru_metric; int64_t ifru_vnetid; @@ -33,6 +34,7 @@ struct ifreq { #define ifr_data ifr_ifru.ifru_data // for use by interface #define ifr_index ifr_ifru.ifru_index // interface index #define ifr_llprio ifr_ifru.ifru_metric // link layer priority +#define ifr_hwaddr ifr_ifru.ifru_hwaddr // MAC address }; __END_DECLS diff --git a/Libraries/LibC/sys/ioctl_numbers.h b/Libraries/LibC/sys/ioctl_numbers.h index 2e0209adea0..b6fb6a07adf 100644 --- a/Libraries/LibC/sys/ioctl_numbers.h +++ b/Libraries/LibC/sys/ioctl_numbers.h @@ -35,4 +35,5 @@ enum IOCtlNumber { FB_IOCTL_SET_BUFFER, SIOCSIFADDR, SIOCGIFADDR, + SIOCGIFHWADDR, };