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:
parent
f8c104aaaf
commit
8313d35749
4 changed files with 50 additions and 0 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue