iPXE
arp.c File Reference

Address Resolution Protocol. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <byteswap.h>
#include <errno.h>
#include <ipxe/if_ether.h>
#include <ipxe/if_arp.h>
#include <ipxe/iobuf.h>
#include <ipxe/netdevice.h>
#include <ipxe/neighbour.h>
#include <ipxe/arp.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
int arp_tx_request (struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *net_source)
 Transmit ARP request.
static struct arp_net_protocolarp_find_protocol (uint16_t net_proto)
 Identify ARP protocol.
static int arp_rx (struct io_buffer *iobuf, struct net_device *netdev, const void *ll_dest __unused, const void *ll_source __unused, unsigned int flags __unused)
 Process incoming ARP packets.
static const char * arp_ntoa (const void *net_addr __unused)
 Transcribe ARP address.

Variables

struct net_protocol arp_protocol __net_protocol
 ARP network protocol.
struct neighbour_discovery arp_discovery
 ARP neighbour discovery protocol.

Detailed Description

Address Resolution Protocol.

This file implements the address resolution protocol as defined in RFC826. The implementation is media-independent and protocol-independent; it is not limited to Ethernet or to IPv4.

Definition in file arp.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ arp_tx_request()

int arp_tx_request ( struct net_device * netdev,
struct net_protocol * net_protocol,
const void * net_dest,
const void * net_source )

Transmit ARP request.

Parameters
netdevNetwork device
net_protocolNetwork-layer protocol
net_destDestination network-layer address
net_sourceSource network-layer address
Return values
rcReturn status code

Definition at line 60 of file arp.c.

62 {
63 struct ll_protocol *ll_protocol = netdev->ll_protocol;
64 struct io_buffer *iobuf;
65 struct arphdr *arphdr;
66 int rc;
67
68 /* Allocate ARP packet */
69 iobuf = alloc_iob ( MAX_LL_HEADER_LEN + sizeof ( *arphdr ) +
70 ( 2 * ( MAX_LL_ADDR_LEN + MAX_NET_ADDR_LEN ) ) );
71 if ( ! iobuf )
72 return -ENOMEM;
74
75 /* Build up ARP request */
76 arphdr = iob_put ( iobuf, sizeof ( *arphdr ) );
83 netdev->ll_addr, ll_protocol->ll_addr_len );
85 net_source, net_protocol->net_addr_len );
89 net_dest, net_protocol->net_addr_len );
90
91 /* Transmit ARP request */
92 if ( ( rc = net_tx ( iobuf, netdev, &arp_protocol,
93 netdev->ll_broadcast, netdev->ll_addr ) ) != 0 ) {
94 DBGC ( netdev, "ARP %s %s %s could not transmit request: %s\n",
95 netdev->name, net_protocol->name,
96 net_protocol->ntoa ( net_dest ), strerror ( rc ) );
97 return rc;
98 }
99
100 return 0;
101}
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
static struct net_device * netdev
Definition gdbudp.c:53
#define DBGC(...)
Definition compiler.h:505
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ARPOP_REQUEST
ARP request.
Definition if_arp.h:33
#define htons(value)
Definition byteswap.h:136
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
#define iob_put(iobuf, len)
Definition iobuf.h:125
#define iob_reserve(iobuf, len)
Definition iobuf.h:72
int net_tx(struct io_buffer *iobuf, struct net_device *netdev, struct net_protocol *net_protocol, const void *ll_dest, const void *ll_source)
Transmit network-layer packet.
Definition netdevice.c:1074
#define MAX_LL_HEADER_LEN
Maximum length of a link-layer header.
Definition netdevice.h:46
#define MAX_NET_ADDR_LEN
Maximum length of a network-layer address.
Definition netdevice.h:49
#define MAX_LL_ADDR_LEN
Maximum length of a link-layer address.
Definition netdevice.h:37
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
An ARP header.
Definition if_arp.h:48
uint8_t ar_hln
Link-layer address length.
Definition if_arp.h:60
uint16_t ar_op
ARP opcode.
Definition if_arp.h:64
uint16_t ar_pro
Network-layer protocol.
Definition if_arp.h:58
uint8_t ar_pln
Network-layer address length.
Definition if_arp.h:62
uint16_t ar_hrd
Link-layer protocol.
Definition if_arp.h:53
A persistent I/O buffer.
Definition iobuf.h:38
A link-layer protocol.
Definition netdevice.h:115
uint8_t ll_addr_len
Link-layer address length.
Definition netdevice.h:199
uint16_t ll_proto
Link-layer protocol.
Definition netdevice.h:195
A network-layer protocol.
Definition netdevice.h:65
const char * name
Protocol name.
Definition netdevice.h:67
uint16_t net_proto
Network-layer protocol.
Definition netdevice.h:100
uint8_t net_addr_len
Network-layer address length.
Definition netdevice.h:102
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition netdevice.h:95

References alloc_iob(), arphdr::ar_hln, arphdr::ar_hrd, arphdr::ar_op, arphdr::ar_pln, arphdr::ar_pro, ARPOP_REQUEST, DBGC, ENOMEM, htons, iob_put, iob_reserve, ll_protocol::ll_addr_len, ll_protocol::ll_proto, MAX_LL_ADDR_LEN, MAX_LL_HEADER_LEN, MAX_NET_ADDR_LEN, memcpy(), memset(), net_protocol::name, net_protocol::net_addr_len, net_protocol::net_proto, net_tx(), netdev, net_protocol::ntoa, rc, and strerror().

Referenced by ipoib_transmit(), and ipv4_gratuitous_arp().

◆ arp_find_protocol()

struct arp_net_protocol * arp_find_protocol ( uint16_t net_proto)
static

Identify ARP protocol.

Parameters
net_protoNetwork-layer protocol, in network-endian order
Return values
arp_net_protocolARP protocol, or NULL

Definition at line 116 of file arp.c.

116 {
118
120 if ( arp_net_protocol->net_protocol->net_proto == net_proto )
121 return arp_net_protocol;
122 }
123 return NULL;
124}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define ARP_NET_PROTOCOLS
ARP protocol table.
Definition arp.h:32
A network-layer protocol that relies upon ARP.
Definition arp.h:18
struct net_protocol * net_protocol
Network-layer protocol.
Definition arp.h:20
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition tables.h:386

References ARP_NET_PROTOCOLS, for_each_table_entry, net_protocol::net_proto, arp_net_protocol::net_protocol, and NULL.

Referenced by arp_rx().

◆ arp_rx()

int arp_rx ( struct io_buffer * iobuf,
struct net_device * netdev,
const void *ll_dest __unused,
const void *ll_source __unused,
unsigned int flags __unused )
static

Process incoming ARP packets.

Parameters
iobufI/O buffer
netdevNetwork device
ll_sourceLink-layer source address
flagsPacket flags
Return values
rcReturn status code

Definition at line 135 of file arp.c.

138 {
139 struct arphdr *arphdr = iobuf->data;
142 struct ll_protocol *ll_protocol;
143 size_t len = iob_len ( iobuf );
144 int rc;
145
146 /* Sanity check */
147 if ( ( len < sizeof ( *arphdr ) ) || ( len < arp_len ( arphdr ) ) ) {
148 rc = -EINVAL;
149 goto done;
150 }
151
152 /* Identify network-layer and link-layer protocols */
154 if ( ! arp_net_protocol ) {
156 goto done;
157 }
159 ll_protocol = netdev->ll_protocol;
160
161 /* Sanity checks */
162 if ( ( arphdr->ar_hrd != ll_protocol->ll_proto ) ||
165 rc = -EINVAL;
166 goto done;
167 }
168
169 /* Update neighbour cache entry for this sender, if any */
171 arp_sender_ha ( arphdr ) );
172
173 /* If it's not a request, there's nothing more to do */
174 if ( arphdr->ar_op != htons ( ARPOP_REQUEST ) ) {
175 rc = 0;
176 goto done;
177 }
178
179 /* See if we own the target protocol address */
180 if ( arp_net_protocol->check ( netdev, arp_target_pa ( arphdr ) ) != 0){
181 rc = 0;
182 goto done;
183 }
184
185 /* Change request to a reply */
186 DBGC2 ( netdev, "ARP %s %s %s reply => %s %s\n",
187 netdev->name, net_protocol->name,
189 ll_protocol->name, ll_protocol->ntoa ( netdev->ll_addr ) );
193 memcpy ( arp_sender_ha ( arphdr ), netdev->ll_addr, arphdr->ar_hln );
194
195 /* Send reply */
196 if ( ( rc = net_tx ( iob_disown ( iobuf ), netdev, &arp_protocol,
198 netdev->ll_addr ) ) != 0 ) {
199 DBGC ( netdev, "ARP %s %s %s could not transmit reply: %s\n",
200 netdev->name, net_protocol->name,
202 strerror ( rc ) );
203 goto done;
204 }
205
206 /* Success */
207 rc = 0;
208
209 done:
210 free_iob ( iobuf );
211 return rc;
212}
static struct arp_net_protocol * arp_find_protocol(uint16_t net_proto)
Identify ARP protocol.
Definition arp.c:116
struct bofm_section_header done
Definition bofm_test.c:46
ring len
Length.
Definition dwmac.h:226
#define DBGC2(...)
Definition compiler.h:522
#define EINVAL
Invalid argument.
Definition errno.h:429
#define EPROTONOSUPPORT
Protocol not supported.
Definition errno.h:630
static void * arp_sender_pa(struct arphdr *arphdr)
ARP packet sender protocol address.
Definition if_arp.h:81
static void * arp_target_ha(struct arphdr *arphdr)
ARP packet target hardware address.
Definition if_arp.h:90
static void * arp_target_pa(struct arphdr *arphdr)
ARP packet target protocol address.
Definition if_arp.h:99
#define ARPOP_REPLY
ARP reply.
Definition if_arp.h:34
static size_t arp_len(struct arphdr *arphdr)
ARP packet length.
Definition if_arp.h:108
static void * arp_sender_ha(struct arphdr *arphdr)
ARP packet sender hardware address.
Definition if_arp.h:72
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition iobuf.h:217
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
int neighbour_update(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *ll_dest)
Update existing neighbour cache entry.
Definition neighbour.c:441
void * memswap(void *first, void *second, size_t len)
Swap memory regions.
Definition string.c:154
int(* check)(struct net_device *netdev, const void *net_addr)
Check existence of address.
Definition arp.h:27
void * data
Start of data.
Definition iobuf.h:53
const char * name
Protocol name.
Definition netdevice.h:117
const char *(* ntoa)(const void *ll_addr)
Transcribe link-layer address.
Definition netdevice.h:164

References __unused, arphdr::ar_hln, arphdr::ar_hrd, arphdr::ar_op, arphdr::ar_pln, arphdr::ar_pro, arp_find_protocol(), arp_len(), arp_sender_ha(), arp_sender_pa(), arp_target_ha(), arp_target_pa(), ARPOP_REPLY, ARPOP_REQUEST, arp_net_protocol::check, io_buffer::data, DBGC, DBGC2, done, EINVAL, EPROTONOSUPPORT, flags, free_iob(), htons, iob_disown, iob_len(), len, ll_protocol::ll_addr_len, ll_protocol::ll_proto, memcpy(), memswap(), ll_protocol::name, net_protocol::name, neighbour_update(), net_protocol::net_addr_len, arp_net_protocol::net_protocol, net_tx(), netdev, ll_protocol::ntoa, net_protocol::ntoa, rc, and strerror().

◆ arp_ntoa()

const char * arp_ntoa ( const void *net_addr __unused)
static

Transcribe ARP address.

Parameters
net_addrARP address
Return values
string"<ARP>"

This operation is meaningless for the ARP protocol.

Definition at line 222 of file arp.c.

222 {
223 return "<ARP>";
224}

References __unused.

Variable Documentation

◆ __net_protocol

struct net_protocol arp_protocol __net_protocol
Initial value:
= {
.name = "ARP",
.net_proto = htons ( ETH_P_ARP ),
.rx = arp_rx,
.ntoa = arp_ntoa,
}
static const char * arp_ntoa(const void *net_addr __unused)
Transcribe ARP address.
Definition arp.c:222
static int arp_rx(struct io_buffer *iobuf, struct net_device *netdev, const void *ll_dest __unused, const void *ll_source __unused, unsigned int flags __unused)
Process incoming ARP packets.
Definition arp.c:135
#define ETH_P_ARP
Definition if_ether.h:20

ARP network protocol.

AoE protocol.

Definition at line 49 of file arp.c.

◆ arp_discovery

struct neighbour_discovery arp_discovery
Initial value:
= {
.name = "ARP",
.tx_request = arp_tx_request,
}
int arp_tx_request(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *net_source)
Transmit ARP request.
Definition arp.c:60

ARP neighbour discovery protocol.

Definition at line 104 of file arp.c.

104 {
105 .name = "ARP",
106 .tx_request = arp_tx_request,
107};

Referenced by arp_tx().