Kernel: Add SIOCGIFHWADDR ioctl to get the MAC address of an adapter

This commit is contained in:
Andreas Kling 2019-10-02 18:20:11 +02:00
parent 345086ab72
commit 3f2c1a2e3d
Notes: sideshowbarker 2024-07-19 11:51:22 +09:00
4 changed files with 15 additions and 0 deletions

View File

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

View File

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

View File

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

View File

@ -35,4 +35,5 @@ enum IOCtlNumber {
FB_IOCTL_SET_BUFFER,
SIOCSIFADDR,
SIOCGIFADDR,
SIOCGIFHWADDR,
};