arp (7) - Linux Manuals
arp: Linux ARP kernel module.
NAME
arp - Linux ARP kernel module.
DESCRIPTION
This kernel protocol module implements the Address Resolution Protocol defined in RFC 826. It is used to convert between Layer2 hardware addresses and IPv4 protocol addresses on directly connected networks. The user normally doesn't interact directly with this module except to configure it; instead it provides a service for other protocols in the kernel.A user process can receive ARP packets by using packet(7) sockets. There is also a mechanism for managing the ARP cache in user-space by using netlink(7) sockets. The ARP table can also be controlled via ioctl(2) on any AF_INET socket.
The ARP module maintains a cache of mappings between hardware addresses and protocol addresses. The cache has a limited size so old and less frequently used entries are garbage-collected. Entries which are marked as permanent are never deleted by the garbage-collector. The cache can be directly manipulated by the use of ioctls and its behavior can be tuned by the /proc interfaces described below.
When there is no positive feedback for an existing mapping after some time (see the /proc interfaces below), a neighbor cache entry is considered stale. Positive feedback can be gotten from a higher layer; for example from a successful TCP ACK. Other protocols can signal forward progress using the MSG_CONFIRM flag to sendmsg(2). When there is no forward progress, ARP tries to reprobe. It first tries to ask a local arp daemon app_solicit times for an updated MAC address. If that fails and an old MAC address is known, a unicast probe is sent ucast_solicit times. If that fails too, it will broadcast a new ARP request to the network. Requests are sent only when there is data queued for sending.
Linux will automatically add a nonpermanent proxy arp entry when it receives a request for an address it forwards to and proxy arp is enabled on the receiving interface. When there is a reject route for the target, no proxy arp entry is added.
Ioctls
Three ioctls are available on all AF_INET sockets. They take a pointer to a struct arpreq as their argument.
struct arpreq {
SIOCSARP, SIOCDARP and SIOCGARP
respectively set, delete and get an ARP mapping.
Setting and deleting ARP maps are privileged operations and may
be performed only by a process with the
CAP_NET_ADMIN
capability or an effective UID of 0.
arp_pa
must be an
AF_INET
address and
arp_ha
must have the same type as the device which is specified in
arp_dev.
arp_dev
is a zero-terminated string which names a device.
If the
ATF_NETMASK
flag is set, then
arp_netmask
should be valid.
Linux 2.2 does not support proxy network ARP entries, so this
should be set to 0xffffffff, or 0 to remove an existing proxy arp entry.
ATF_USETRAILERS
is obsolete and should not be used.
Support for proxy arp entries for networks (netmask not equal 0xffffffff)
was dropped in Linux 2.2.
It is replaced by automatic proxy arp setup by
the kernel for all reachable hosts on other interfaces (when
forwarding and proxy arp is enabled for the interface).
The
neigh/*
interfaces did not exist before Linux 2.2.
There is no way to signal positive feedback from user space.
This means connection-oriented protocols implemented in user space
will generate excessive ARP traffic, because ndisc will regularly
reprobe the MAC address.
The same problem applies for some kernel protocols (e.g., NFS over UDP).
This man page mashes together functionality that is IPv4-specific
with functionality that is shared between IPv4 and IPv6.
RFC 826 for a description of ARP.
RFC 2461 for a description of IPv6 neighbor discovery and the base
algorithms used.
Linux 2.2+ IPv4 ARP uses the IPv6 algorithms when applicable.
arp_flags flag meaning ATF_COM Lookup complete ATF_PERM Permanent entry ATF_PUBL Publish entry ATF_USETRAILERS Trailers requested ATF_NETMASK Use a netmask ATF_DONTPUB Don't answer /proc interfaces
ARP supports a range of
/proc
interfaces to configure parameters on a global or per-interface basis.
The interfaces can be accessed by reading or writing the
/proc/sys/net/ipv4/neigh/*/*
files.
Each interface in the system has its own directory in
/proc/sys/net/ipv4/neigh/.
The setting in the "default" directory is used for all newly created
devices.
Unless otherwise specified, time-related interfaces are specified
in seconds.
VERSIONS
The
struct arpreq
changed in Linux 2.0 to include the
arp_dev
member and the ioctl numbers changed at the same time.
Support for the old ioctls was dropped in Linux 2.2.
BUGS
Some timer settings are specified in jiffies, which is architecture-
and kernel version-dependent; see
time(7).
COLOPHON
This page is part of release 5.10 of the Linux
man-pages
project.
A description of the project,
information about reporting bugs,
and the latest version of this page,
can be found at
https://www.kernel.org/doc/man-pages/.
SEE ALSO
capabilities(7),
ip(7),
arpd(8)