iPXE
Macros | Functions | Variables
neighbour.c File Reference

Neighbour discovery. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ipxe/iobuf.h>
#include <ipxe/retry.h>
#include <ipxe/timer.h>
#include <ipxe/malloc.h>
#include <ipxe/neighbour.h>

Go to the source code of this file.

Macros

#define NEIGHBOUR_MIN_TIMEOUT   ( TICKS_PER_SEC / 8 )
 Neighbour discovery minimum timeout. More...
 
#define NEIGHBOUR_MAX_TIMEOUT   ( TICKS_PER_SEC * 3 )
 Neighbour discovery maximum timeout. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void neighbour_expired (struct retry_timer *timer, int fail)
 Handle neighbour timer expiry. More...
 
static void neighbour_free (struct refcnt *refcnt)
 Free neighbour cache entry. More...
 
static struct neighbourneighbour_create (struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
 Create neighbour cache entry. More...
 
static struct neighbourneighbour_find (struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
 Find neighbour cache entry. More...
 
static void neighbour_discover (struct neighbour *neighbour, struct neighbour_discovery *discovery, const void *net_source)
 Start neighbour discovery. More...
 
static void neighbour_discovered (struct neighbour *neighbour, const void *ll_dest)
 Complete neighbour discovery. More...
 
static void neighbour_destroy (struct neighbour *neighbour, int rc)
 Destroy neighbour cache entry. More...
 
int neighbour_tx (struct io_buffer *iobuf, struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, struct neighbour_discovery *discovery, const void *net_source, const void *ll_source)
 Transmit packet, determining link-layer address via neighbour discovery. More...
 
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. More...
 
int neighbour_define (struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *ll_dest)
 Define neighbour cache entry. More...
 
static void neighbour_flush (struct net_device *netdev)
 Update neighbour cache on network device state change or removal. More...
 
static unsigned int neighbour_discard (void)
 Discard some cached neighbour entries. More...
 
struct cache_discarder neighbour_discarder __cache_discarder (CACHE_EXPENSIVE)
 Neighbour cache discarder. More...
 

Variables

struct list_head neighbours = LIST_HEAD_INIT ( neighbours )
 The neighbour cache. More...
 
struct net_driver neighbour_net_driver __net_driver
 Neighbour driver (for net device notifications) More...
 

Detailed Description

Neighbour discovery.

This file implements the abstract functions of neighbour discovery, independent of the underlying network protocol (e.g. ARP or NDP).

Definition in file neighbour.c.

Macro Definition Documentation

◆ NEIGHBOUR_MIN_TIMEOUT

#define NEIGHBOUR_MIN_TIMEOUT   ( TICKS_PER_SEC / 8 )

Neighbour discovery minimum timeout.

Definition at line 46 of file neighbour.c.

◆ NEIGHBOUR_MAX_TIMEOUT

#define NEIGHBOUR_MAX_TIMEOUT   ( TICKS_PER_SEC * 3 )

Neighbour discovery maximum timeout.

Definition at line 49 of file neighbour.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ neighbour_expired()

static void neighbour_expired ( struct retry_timer timer,
int  fail 
)
static

Handle neighbour timer expiry.

Parameters
timerRetry timer
failFailure indicator

Definition at line 255 of file neighbour.c.

255  {
256  struct neighbour *neighbour =
257  container_of ( timer, struct neighbour, timer );
258  struct net_device *netdev = neighbour->netdev;
260  struct neighbour_discovery *discovery =
262  const void *net_dest = neighbour->net_dest;
263  const void *net_source = neighbour->net_source;
264  int rc;
265 
266  /* If we have failed, destroy the cache entry */
267  if ( fail ) {
269  return;
270  }
271 
272  /* Restart the timer */
274 
275  /* Transmit neighbour request */
276  if ( ( rc = discovery->tx_request ( netdev, net_protocol, net_dest,
277  net_source ) ) != 0 ) {
278  DBGC ( neighbour, "NEIGHBOUR %s %s %s could not transmit %s "
279  "request: %s\n", netdev->name, net_protocol->name,
282  /* Retransmit when timer expires */
283  return;
284  }
285 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Protocol name.
Definition: netdevice.h:66
const char * name
Name.
Definition: neighbour.h:21
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
struct net_protocol * net_protocol
Network-layer protocol.
Definition: neighbour.h:46
#define DBGC(...)
Definition: compiler.h:505
struct retry_timer timer
Retransmission timer.
Definition: neighbour.h:57
A neighbour discovery protocol.
Definition: neighbour.h:19
A timer.
Definition: timer.h:28
int(* tx_request)(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest, const void *net_source)
Transmit neighbour discovery request.
Definition: neighbour.h:31
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
struct neighbour_discovery * discovery
Neighbour discovery protocol (if any)
Definition: neighbour.h:53
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A network device.
Definition: netdevice.h:348
A neighbour cache entry.
Definition: neighbour.h:37
void start_timer(struct retry_timer *timer)
Start timer.
Definition: retry.c:93
A network-layer protocol.
Definition: netdevice.h:64
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
struct net_device * netdev
Network device.
Definition: neighbour.h:44
static void neighbour_destroy(struct neighbour *neighbour, int rc)
Destroy neighbour cache entry.
Definition: neighbour.c:219
#define ETIMEDOUT
Connection timed out.
Definition: errno.h:669
uint8_t net_source[MAX_NET_ADDR_LEN]
Network-layer source address (if any)
Definition: neighbour.h:55

References container_of, DBGC, neighbour::discovery, ETIMEDOUT, neighbour_discovery::name, net_protocol::name, net_device::name, neighbour_destroy(), neighbour::net_dest, neighbour::net_protocol, neighbour::net_source, neighbour::netdev, netdev, net_protocol::ntoa, rc, start_timer(), strerror(), neighbour::timer, and neighbour_discovery::tx_request.

Referenced by neighbour_create().

◆ neighbour_free()

static void neighbour_free ( struct refcnt refcnt)
static

Free neighbour cache entry.

Parameters
refcntReference count

Definition at line 61 of file neighbour.c.

61  {
62  struct neighbour *neighbour =
63  container_of ( refcnt, struct neighbour, refcnt );
64 
65  /* Sanity check */
67 
68  /* Drop reference to network device */
70 
71  /* Free neighbour */
72  free ( neighbour );
73 }
A reference counter.
Definition: refcnt.h:26
#define list_empty(list)
Test whether a list is empty.
Definition: list.h:136
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:555
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
struct list_head tx_queue
Pending I/O buffers.
Definition: neighbour.h:60
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
A neighbour cache entry.
Definition: neighbour.h:37
struct net_device * netdev
Network device.
Definition: neighbour.h:44

References assert(), container_of, free, list_empty, neighbour::netdev, netdev_put(), and neighbour::tx_queue.

Referenced by neighbour_create().

◆ neighbour_create()

static struct neighbour* neighbour_create ( struct net_device netdev,
struct net_protocol net_protocol,
const void *  net_dest 
)
static

Create neighbour cache entry.

Parameters
netdevNetwork device
net_protocolNetwork-layer protocol
net_destDestination network-layer address
Return values
neighbourNeighbour cache entry, or NULL if allocation failed

Definition at line 83 of file neighbour.c.

85  {
86  struct neighbour *neighbour;
87 
88  /* Allocate and initialise entry */
89  neighbour = zalloc ( sizeof ( *neighbour ) );
90  if ( ! neighbour )
91  return NULL;
97  timer_init ( &neighbour->timer, neighbour_expired, &neighbour->refcnt );
98  set_timer_limits ( &neighbour->timer, NEIGHBOUR_MIN_TIMEOUT,
101 
102  /* Transfer ownership to cache */
104 
105  DBGC ( neighbour, "NEIGHBOUR %s %s %s created\n", netdev->name,
107  return neighbour;
108 }
const char * name
Protocol name.
Definition: netdevice.h:66
#define NEIGHBOUR_MIN_TIMEOUT
Neighbour discovery minimum timeout.
Definition: neighbour.c:46
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:64
struct net_protocol * net_protocol
Network-layer protocol.
Definition: neighbour.h:46
#define DBGC(...)
Definition: compiler.h:505
struct list_head neighbours
The neighbour cache.
Definition: neighbour.c:52
struct retry_timer timer
Retransmission timer.
Definition: neighbour.h:57
struct refcnt refcnt
Reference count.
Definition: neighbour.h:39
struct list_head list
List of neighbour cache entries.
Definition: neighbour.h:41
void * memcpy(void *dest, const void *src, size_t len) __nonnull
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_queue
Pending I/O buffers.
Definition: neighbour.h:60
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
static struct net_device * netdev_get(struct net_device *netdev)
Get reference to network device.
Definition: netdevice.h:544
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:45
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
#define NEIGHBOUR_MAX_TIMEOUT
Neighbour discovery maximum timeout.
Definition: neighbour.c:49
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
static void neighbour_expired(struct retry_timer *timer, int over)
Handle neighbour timer expiry.
Definition: neighbour.c:255
struct net_device * netdev
Network device.
Definition: neighbour.h:44
static void neighbour_free(struct refcnt *refcnt)
Free neighbour cache entry.
Definition: neighbour.c:61
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References DBGC, INIT_LIST_HEAD, neighbour::list, list_add, memcpy(), net_protocol::name, net_device::name, neighbour_expired(), neighbour_free(), NEIGHBOUR_MAX_TIMEOUT, NEIGHBOUR_MIN_TIMEOUT, neighbours, net_protocol::net_addr_len, neighbour::net_dest, neighbour::net_protocol, neighbour::netdev, netdev, netdev_get(), net_protocol::ntoa, NULL, ref_init, neighbour::refcnt, neighbour::timer, neighbour::tx_queue, and zalloc().

Referenced by neighbour_define(), and neighbour_tx().

◆ neighbour_find()

static struct neighbour* neighbour_find ( struct net_device netdev,
struct net_protocol net_protocol,
const void *  net_dest 
)
static

Find neighbour cache entry.

Parameters
netdevNetwork device
net_protocolNetwork-layer protocol
net_destDestination network-layer address
Return values
neighbourNeighbour cache entry, or NULL if not found

Definition at line 118 of file neighbour.c.

120  {
121  struct neighbour *neighbour;
122 
124  if ( ( neighbour->netdev == netdev ) &&
127  net_protocol->net_addr_len ) == 0 ) ) {
128 
129  /* Move to start of cache */
130  list_del ( &neighbour->list );
132 
133  return neighbour;
134  }
135  }
136  return NULL;
137 }
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
struct net_protocol * net_protocol
Network-layer protocol.
Definition: neighbour.h:46
struct list_head neighbours
The neighbour cache.
Definition: neighbour.c:52
struct list_head list
List of neighbour cache entries.
Definition: neighbour.h:41
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:420
static struct net_device * netdev
Definition: gdbudp.c:52
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
struct net_device * netdev
Network device.
Definition: neighbour.h:44
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:98
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References neighbour::list, list_add, list_del, list_for_each_entry, memcmp(), neighbours, net_protocol::net_addr_len, neighbour::net_dest, neighbour::net_protocol, neighbour::netdev, netdev, and NULL.

Referenced by neighbour_define(), neighbour_tx(), and neighbour_update().

◆ neighbour_discover()

static void neighbour_discover ( struct neighbour neighbour,
struct neighbour_discovery discovery,
const void *  net_source 
)
static

Start neighbour discovery.

Parameters
neighbourNeighbour cache entry
discoveryNeighbour discovery protocol
net_sourceSource network-layer address

Definition at line 146 of file neighbour.c.

148  {
149  struct net_device *netdev = neighbour->netdev;
151 
152  /* Record discovery protocol and source network-layer address */
153  neighbour->discovery = discovery;
154  memcpy ( neighbour->net_source, net_source,
156 
157  /* Start timer to trigger neighbour discovery */
159 
160  DBGC ( neighbour, "NEIGHBOUR %s %s %s discovering via %s\n",
164 }
const char * name
Protocol name.
Definition: netdevice.h:66
const char * name
Name.
Definition: neighbour.h:21
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:99
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
struct net_protocol * net_protocol
Network-layer protocol.
Definition: neighbour.h:46
#define DBGC(...)
Definition: compiler.h:505
struct retry_timer timer
Retransmission timer.
Definition: neighbour.h:57
void * memcpy(void *dest, const void *src, size_t len) __nonnull
struct neighbour_discovery * discovery
Neighbour discovery protocol (if any)
Definition: neighbour.h:53
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:348
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
uint8_t net_addr_len
Network-layer address length.
Definition: netdevice.h:101
struct net_device * netdev
Network device.
Definition: neighbour.h:44
uint8_t net_source[MAX_NET_ADDR_LEN]
Network-layer source address (if any)
Definition: neighbour.h:55

References DBGC, neighbour::discovery, memcpy(), neighbour_discovery::name, net_protocol::name, net_device::name, net_protocol::net_addr_len, neighbour::net_dest, neighbour::net_protocol, neighbour::net_source, neighbour::netdev, netdev, net_protocol::ntoa, start_timer_nodelay(), and neighbour::timer.

Referenced by neighbour_tx().

◆ neighbour_discovered()

static void neighbour_discovered ( struct neighbour neighbour,
const void *  ll_dest 
)
static

Complete neighbour discovery.

Parameters
neighbourNeighbour cache entry
ll_destDestination link-layer address

Definition at line 172 of file neighbour.c.

173  {
174  struct net_device *netdev = neighbour->netdev;
177  struct io_buffer *iobuf;
178  int rc;
179 
180  /* Fill in link-layer address */
182  DBGC ( neighbour, "NEIGHBOUR %s %s %s is %s %s\n", netdev->name,
185 
186  /* Stop retransmission timer */
187  stop_timer ( &neighbour->timer );
188 
189  /* Transmit any packets in queue. Take out a temporary
190  * reference on the entry to prevent it from going out of
191  * scope during the call to net_tx().
192  */
193  ref_get ( &neighbour->refcnt );
194  while ( ( iobuf = list_first_entry ( &neighbour->tx_queue,
195  struct io_buffer, list )) != NULL){
196  DBGC2 ( neighbour, "NEIGHBOUR %s %s %s transmitting deferred "
197  "packet\n", netdev->name, net_protocol->name,
199  list_del ( &iobuf->list );
200  if ( ( rc = net_tx ( iobuf, netdev, net_protocol, ll_dest,
201  netdev->ll_addr ) ) != 0 ) {
202  DBGC ( neighbour, "NEIGHBOUR %s %s %s could not "
203  "transmit deferred packet: %s\n",
206  strerror ( rc ) );
207  /* Ignore error and continue */
208  }
209  }
210  ref_put ( &neighbour->refcnt );
211 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Protocol name.
Definition: netdevice.h:66
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:198
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
struct net_protocol * net_protocol
Network-layer protocol.
Definition: neighbour.h:46
#define DBGC(...)
Definition: compiler.h:505
struct retry_timer timer
Retransmission timer.
Definition: neighbour.h:57
A link-layer protocol.
Definition: netdevice.h:114
struct refcnt refcnt
Reference count.
Definition: neighbour.h:39
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
const char * name
Protocol name.
Definition: netdevice.h:116
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
void * memcpy(void *dest, const void *src, size_t len) __nonnull
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_queue
Pending I/O buffers.
Definition: neighbour.h:60
uint8_t ll_dest[MAX_LL_ADDR_LEN]
Link-layer destination address.
Definition: neighbour.h:50
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define ref_get(refcnt)
Get additional reference to object.
Definition: refcnt.h:92
A network device.
Definition: netdevice.h:348
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
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:999
#define DBGC2(...)
Definition: compiler.h:522
struct net_device * netdev
Network device.
Definition: neighbour.h:44
const char *(* ntoa)(const void *ll_addr)
Transcribe link-layer address.
Definition: netdevice.h:163
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:381
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:366
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
A persistent I/O buffer.
Definition: iobuf.h:32

References DBGC, DBGC2, io_buffer::list, list_del, list_first_entry, net_device::ll_addr, ll_protocol::ll_addr_len, neighbour::ll_dest, net_device::ll_protocol, memcpy(), net_protocol::name, ll_protocol::name, net_device::name, neighbour::net_dest, neighbour::net_protocol, net_tx(), neighbour::netdev, netdev, net_protocol::ntoa, ll_protocol::ntoa, NULL, rc, ref_get, ref_put, neighbour::refcnt, stop_timer(), strerror(), neighbour::timer, and neighbour::tx_queue.

Referenced by neighbour_define(), and neighbour_update().

◆ neighbour_destroy()

static void neighbour_destroy ( struct neighbour neighbour,
int  rc 
)
static

Destroy neighbour cache entry.

Parameters
neighbourNeighbour cache entry
rcReason for destruction

Definition at line 219 of file neighbour.c.

219  {
220  struct net_device *netdev = neighbour->netdev;
222  struct io_buffer *iobuf;
223 
224  /* Take ownership from cache */
225  list_del ( &neighbour->list );
226 
227  /* Stop timer */
228  stop_timer ( &neighbour->timer );
229 
230  /* Discard any outstanding I/O buffers */
231  while ( ( iobuf = list_first_entry ( &neighbour->tx_queue,
232  struct io_buffer, list )) != NULL){
233  DBGC2 ( neighbour, "NEIGHBOUR %s %s %s discarding deferred "
234  "packet: %s\n", netdev->name, net_protocol->name,
236  strerror ( rc ) );
237  list_del ( &iobuf->list );
238  netdev_tx_err ( neighbour->netdev, iobuf, rc );
239  }
240 
241  DBGC ( neighbour, "NEIGHBOUR %s %s %s destroyed: %s\n", netdev->name,
243  strerror ( rc ) );
244 
245  /* Drop remaining reference */
246  ref_put ( &neighbour->refcnt );
247 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Protocol name.
Definition: netdevice.h:66
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
void netdev_tx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard transmitted packet.
Definition: netdevice.c:369
struct net_protocol * net_protocol
Network-layer protocol.
Definition: neighbour.h:46
#define DBGC(...)
Definition: compiler.h:505
struct retry_timer timer
Retransmission timer.
Definition: neighbour.h:57
struct refcnt refcnt
Reference count.
Definition: neighbour.h:39
struct list_head list
List of neighbour cache entries.
Definition: neighbour.h:41
#define list_first_entry(list, type, member)
Get the container of the first entry in a list.
Definition: list.h:333
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_queue
Pending I/O buffers.
Definition: neighbour.h:60
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A network device.
Definition: netdevice.h:348
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:117
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
#define DBGC2(...)
Definition: compiler.h:522
struct net_device * netdev
Network device.
Definition: neighbour.h:44
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:106
A persistent I/O buffer.
Definition: iobuf.h:32

References DBGC, DBGC2, neighbour::list, io_buffer::list, list_del, list_first_entry, net_protocol::name, net_device::name, neighbour::net_dest, neighbour::net_protocol, neighbour::netdev, netdev, netdev_tx_err(), net_protocol::ntoa, NULL, rc, ref_put, neighbour::refcnt, stop_timer(), strerror(), neighbour::timer, and neighbour::tx_queue.

Referenced by neighbour_discard(), neighbour_expired(), and neighbour_flush().

◆ neighbour_tx()

int neighbour_tx ( struct io_buffer iobuf,
struct net_device netdev,
struct net_protocol net_protocol,
const void *  net_dest,
struct neighbour_discovery discovery,
const void *  net_source,
const void *  ll_source 
)

Transmit packet, determining link-layer address via neighbour discovery.

Parameters
iobufI/O buffer
netdevNetwork device
discoveryNeighbour discovery protocol
net_protocolNetwork-layer protocol
net_destDestination network-layer address
net_sourceSource network-layer address
ll_sourceSource link-layer address
Return values
rcReturn status code

Definition at line 299 of file neighbour.c.

302  {
303  struct neighbour *neighbour;
304 
305  /* Find or create neighbour cache entry */
307  if ( ! neighbour ) {
309  if ( ! neighbour )
310  return -ENOMEM;
312  }
313 
314  /* If a link-layer address is available then transmit
315  * immediately, otherwise queue for later transmission.
316  */
317  if ( neighbour_has_ll_dest ( neighbour ) ) {
318  return net_tx ( iobuf, netdev, net_protocol, neighbour->ll_dest,
319  ll_source );
320  } else {
321  DBGC2 ( neighbour, "NEIGHBOUR %s %s %s deferring packet\n",
323  net_protocol->ntoa ( net_dest ) );
324  list_add_tail ( &iobuf->list, &neighbour->tx_queue );
325  return 0;
326  }
327 }
const char * name
Protocol name.
Definition: netdevice.h:66
static struct neighbour * neighbour_find(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
Find neighbour cache entry.
Definition: neighbour.c:118
static struct neighbour * neighbour_create(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
Create neighbour cache entry.
Definition: neighbour.c:83
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
#define ENOMEM
Not enough space.
Definition: errno.h:534
struct neighbour_discovery * discovery
Neighbour discovery protocol (if any)
Definition: neighbour.h:53
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
const char *(* ntoa)(const void *net_addr)
Transcribe network-layer address.
Definition: netdevice.h:94
static struct net_device * netdev
Definition: gdbudp.c:52
struct list_head tx_queue
Pending I/O buffers.
Definition: neighbour.h:60
uint8_t ll_dest[MAX_LL_ADDR_LEN]
Link-layer destination address.
Definition: neighbour.h:50
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
struct list_head list
List of which this buffer is a member.
Definition: iobuf.h:39
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:999
#define DBGC2(...)
Definition: compiler.h:522
uint8_t net_source[MAX_NET_ADDR_LEN]
Network-layer source address (if any)
Definition: neighbour.h:55
static int neighbour_has_ll_dest(struct neighbour *neighbour)
Test if neighbour cache entry has a valid link-layer address.
Definition: neighbour.h:70
static void neighbour_discover(struct neighbour *neighbour, struct neighbour_discovery *discovery, const void *net_source)
Start neighbour discovery.
Definition: neighbour.c:146

References DBGC2, neighbour::discovery, ENOMEM, io_buffer::list, list_add_tail, neighbour::ll_dest, net_protocol::name, net_device::name, neighbour_create(), neighbour_discover(), neighbour_find(), neighbour_has_ll_dest(), neighbour::net_dest, neighbour::net_source, net_tx(), netdev, net_protocol::ntoa, and neighbour::tx_queue.

Referenced by arp_tx(), and ndp_tx().

◆ neighbour_update()

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.

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

Definition at line 338 of file neighbour.c.

340  {
341  struct neighbour *neighbour;
342 
343  /* Find neighbour cache entry */
345  if ( ! neighbour )
346  return -ENOENT;
347 
348  /* Set destination address */
350 
351  return 0;
352 }
static struct neighbour * neighbour_find(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
Find neighbour cache entry.
Definition: neighbour.c:118
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
#define ENOENT
No such file or directory.
Definition: errno.h:514
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t ll_dest[MAX_LL_ADDR_LEN]
Link-layer destination address.
Definition: neighbour.h:50
static void neighbour_discovered(struct neighbour *neighbour, const void *ll_dest)
Complete neighbour discovery.
Definition: neighbour.c:172
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64

References ENOENT, neighbour::ll_dest, neighbour_discovered(), neighbour_find(), neighbour::net_dest, and netdev.

Referenced by arp_rx(), and ndp_rx_neighbour_advertisement_ll_target().

◆ neighbour_define()

int neighbour_define ( struct net_device netdev,
struct net_protocol net_protocol,
const void *  net_dest,
const void *  ll_dest 
)

Define neighbour cache entry.

Parameters
netdevNetwork device
net_protocolNetwork-layer protocol
net_destDestination network-layer address
ll_destDestination link-layer address, if known
Return values
rcReturn status code

Definition at line 363 of file neighbour.c.

365  {
366  struct neighbour *neighbour;
367 
368  /* Find or create neighbour cache entry */
370  if ( ! neighbour ) {
372  if ( ! neighbour )
373  return -ENOMEM;
374  }
375 
376  /* Set destination address */
378 
379  return 0;
380 }
static struct neighbour * neighbour_find(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
Find neighbour cache entry.
Definition: neighbour.c:118
static struct neighbour * neighbour_create(struct net_device *netdev, struct net_protocol *net_protocol, const void *net_dest)
Create neighbour cache entry.
Definition: neighbour.c:83
uint8_t net_dest[MAX_NET_ADDR_LEN]
Network-layer destination address.
Definition: neighbour.h:48
#define ENOMEM
Not enough space.
Definition: errno.h:534
static struct net_device * netdev
Definition: gdbudp.c:52
uint8_t ll_dest[MAX_LL_ADDR_LEN]
Link-layer destination address.
Definition: neighbour.h:50
static void neighbour_discovered(struct neighbour *neighbour, const void *ll_dest)
Complete neighbour discovery.
Definition: neighbour.c:172
A neighbour cache entry.
Definition: neighbour.h:37
A network-layer protocol.
Definition: netdevice.h:64

References ENOMEM, neighbour::ll_dest, neighbour_create(), neighbour_discovered(), neighbour_find(), neighbour::net_dest, and netdev.

Referenced by ndp_rx_neighbour_solicitation_ll_source(), and ndp_rx_router_advertisement_ll_source().

◆ neighbour_flush()

static void neighbour_flush ( struct net_device netdev)
static

Update neighbour cache on network device state change or removal.

Parameters
netdevNetwork device

Definition at line 387 of file neighbour.c.

387  {
388  struct neighbour *neighbour;
389  struct neighbour *tmp;
390 
391  /* Remove all neighbour cache entries when a network device is closed */
392  if ( ! netdev_is_open ( netdev ) ) {
395  }
396 }
struct list_head neighbours
The neighbour cache.
Definition: neighbour.c:52
struct list_head list
List of neighbour cache entries.
Definition: neighbour.h:41
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:652
static struct net_device * netdev
Definition: gdbudp.c:52
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:447
uint8_t * tmp
Definition: entropy.h:156
#define ENODEV
No such device.
Definition: errno.h:509
A neighbour cache entry.
Definition: neighbour.h:37
static void neighbour_destroy(struct neighbour *neighbour, int rc)
Destroy neighbour cache entry.
Definition: neighbour.c:219

References ENODEV, neighbour::list, list_for_each_entry_safe, neighbour_destroy(), neighbours, netdev, netdev_is_open(), and tmp.

◆ neighbour_discard()

static unsigned int neighbour_discard ( void  )
static

Discard some cached neighbour entries.

Return values
discardedNumber of cached items discarded

Definition at line 410 of file neighbour.c.

410  {
411  struct neighbour *neighbour;
412 
413  /* Drop oldest cache entry, if any */
415  if ( neighbour ) {
417  return 1;
418  } else {
419  return 0;
420  }
421 }
struct list_head neighbours
The neighbour cache.
Definition: neighbour.c:52
#define list_last_entry(list, type, member)
Get the container of the last entry in a list.
Definition: list.h:346
struct list_head list
List of neighbour cache entries.
Definition: neighbour.h:41
A neighbour cache entry.
Definition: neighbour.h:37
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
static void neighbour_destroy(struct neighbour *neighbour, int rc)
Destroy neighbour cache entry.
Definition: neighbour.c:219

References ENOBUFS, neighbour::list, list_last_entry, neighbour_destroy(), and neighbours.

◆ __cache_discarder()

struct cache_discarder neighbour_discarder __cache_discarder ( CACHE_EXPENSIVE  )

Neighbour cache discarder.

Neighbour cache entries are deemed to have a high replacement cost, since flushing an active neighbour cache entry midway through a TCP transfer will cause substantial disruption.

Variable Documentation

◆ neighbours

struct list_head neighbours = LIST_HEAD_INIT ( neighbours )

The neighbour cache.

Definition at line 52 of file neighbour.c.

Referenced by neighbour_create(), neighbour_discard(), neighbour_find(), neighbour_flush(), and nstat().

◆ __net_driver

struct net_driver neighbour_net_driver __net_driver
Initial value:
= {
.name = "Neighbour",
.notify = neighbour_flush,
.remove = neighbour_flush,
}
static void neighbour_flush(struct net_device *netdev)
Update neighbour cache on network device state change or removal.
Definition: neighbour.c:387

Neighbour driver (for net device notifications)

Definition at line 399 of file neighbour.c.