1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 14:28:12 +00:00

Kernel: Support ioctl SIOCSARP and SIOCDARP

Creates ioctl calls necessary to set/delete an entry from the ARP table
This commit is contained in:
brapru 2021-07-24 20:04:11 -04:00 committed by Andreas Kling
parent f8c104aaaf
commit 8313d35749
4 changed files with 50 additions and 0 deletions

View file

@ -604,6 +604,32 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
return -EINVAL;
};
auto ioctl_arp = [request, arg]() {
arpreq arp_req;
if (!copy_from_user(&arp_req, (arpreq*)arg))
return -EFAULT;
switch (request) {
case SIOCSARP:
if (!Process::current()->is_superuser())
return -EPERM;
if (arp_req.arp_pa.sa_family != AF_INET)
return -EAFNOSUPPORT;
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateArp::Set);
return 0;
case SIOCDARP:
if (!Process::current()->is_superuser())
return -EPERM;
if (arp_req.arp_pa.sa_family != AF_INET)
return -EAFNOSUPPORT;
update_arp_table(IPv4Address(((sockaddr_in&)arp_req.arp_pa).sin_addr.s_addr), *(MACAddress*)&arp_req.arp_ha.sa_data[0], UpdateArp::Delete);
return 0;
}
return -EINVAL;
};
auto ioctl_interface = [request, arg]() {
ifreq* user_ifr = (ifreq*)arg;
ifreq ifr;
@ -730,6 +756,10 @@ int IPv4Socket::ioctl(FileDescription&, unsigned request, FlatPtr arg)
case SIOCADDRT:
case SIOCDELRT:
return ioctl_route();
case SIOCSARP:
case SIOCDARP:
return ioctl_arp();
}
return -EINVAL;