iPXE
Functions
lotest.h File Reference

Loopback testing. More...

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int loopback_test (struct net_device *sender, struct net_device *receiver, size_t mtu, int broadcast)
 Perform loopback test between two network devices. More...
 

Detailed Description

Loopback testing.

Definition in file lotest.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ loopback_test()

int loopback_test ( struct net_device sender,
struct net_device receiver,
size_t  mtu,
int  broadcast 
)

Perform loopback test between two network devices.

Parameters
senderSending network device
receiverReceived network device
mtuPacket size (excluding link-layer headers)
broadcastUse broadcast link-layer address
Return values
rcReturn status code

Definition at line 194 of file lotest.c.

195  {
196  uint8_t *buf;
197  uint32_t *seq;
198  struct io_buffer *iobuf;
199  const void *ll_dest;
200  unsigned int i;
201  unsigned int successes;
202  int rc;
203 
204  /* Open network devices */
205  if ( ( rc = ifopen ( sender ) ) != 0 )
206  return rc;
207  if ( ( rc = ifopen ( receiver ) ) != 0 )
208  return rc;
209 
210  /* Wait for link-up */
211  if ( ( rc = iflinkwait ( sender, 0 ) ) != 0 )
212  return rc;
213  if ( ( rc = iflinkwait ( receiver, 0 ) ) != 0 )
214  return rc;
215 
216  /* Allocate data buffer */
217  if ( mtu < sizeof ( *seq ) )
218  mtu = sizeof ( *seq );
219  buf = malloc ( mtu );
220  if ( ! buf )
221  return -ENOMEM;
222  seq = ( ( void * ) buf );
223 
224  /* Determine destination address */
225  ll_dest = ( broadcast ? sender->ll_broadcast : receiver->ll_addr );
226 
227  /* Print initial statistics */
228  printf ( "Performing %sloopback test from %s to %s with %zd byte MTU\n",
229  ( broadcast ? "broadcast " : "" ), sender->name,
230  receiver->name, mtu );
231  ifstat ( sender );
232  ifstat ( receiver );
233 
234  /* Start loopback test */
235  lotest_flush();
236  lotest_receiver = receiver;
237 
238  /* Perform loopback test */
239  for ( successes = 0 ; ; successes++ ) {
240 
241  /* Print running total */
242  printf ( "\r%d", successes );
243 
244  /* Generate random packet */
245  *seq = htonl ( successes );
246  for ( i = sizeof ( *seq ) ; i < mtu ; i++ )
247  buf[i] = random();
248  iobuf = alloc_iob ( MAX_LL_HEADER_LEN + mtu );
249  if ( ! iobuf ) {
250  printf ( "\nFailed to allocate I/O buffer" );
251  rc = -ENOMEM;
252  break;
253  }
254  iob_reserve ( iobuf, MAX_LL_HEADER_LEN );
255  memcpy ( iob_put ( iobuf, mtu ), buf, mtu );
256 
257  /* Transmit packet */
258  if ( ( rc = net_tx ( iob_disown ( iobuf ), sender,
259  &lotest_protocol, ll_dest,
260  sender->ll_addr ) ) != 0 ) {
261  printf ( "\nFailed to transmit packet: %s",
262  strerror ( rc ) );
263  break;
264  }
265 
266  /* Wait for received packet */
267  if ( ( rc = loopback_wait ( buf, mtu ) ) != 0 )
268  break;
269  }
270 
271  printf ( "\n");
272 
273  /* Stop loopback testing */
275  lotest_flush();
276 
277  /* Dump final statistics */
278  ifstat ( sender );
279  ifstat ( receiver );
280 
281  /* Free buffer */
282  free ( buf );
283 
284  return 0;
285 }
static struct net_device * lotest_receiver
Current loopback test receiver.
Definition: lotest.c:47
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:116
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
static void lotest_flush(void)
Discard all received loopback test packets.
Definition: lotest.c:124
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:128
#define htonl(value)
Definition: byteswap.h:133
u16 seq
802.11 Sequence Control field
Definition: ieee80211.h:19
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:208
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static int loopback_wait(void *data, size_t len)
Wait for packet to be received.
Definition: lotest.c:138
#define MAX_LL_HEADER_LEN
Maximum length of a link-layer header.
Definition: netdevice.h:45
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
Definition: random.c:30
unsigned char uint8_t
Definition: stdint.h:10
unsigned int uint32_t
Definition: stdint.h:12
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:583
struct stp_switch sender
Sender switch.
Definition: stp.h:30
int ifopen(struct net_device *netdev)
Open network device.
Definition: ifmgmt.c:65
#define iob_reserve(iobuf, len)
Definition: iobuf.h:63
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:358
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
int iflinkwait(struct net_device *netdev, unsigned long timeout)
Wait for link-up, with status indication.
Definition: ifmgmt.c:216
uint32_t mtu
Maximum MTU.
Definition: ena.h:28
void ifstat(struct net_device *netdev)
Print status of network device.
Definition: ifmgmt.c:110
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:381
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A persistent I/O buffer.
Definition: iobuf.h:32

References alloc_iob(), ENOMEM, free, htonl, iflinkwait(), ifopen(), ifstat(), iob_disown, iob_put, iob_reserve, net_device::ll_addr, loopback_wait(), lotest_flush(), lotest_receiver, malloc(), MAX_LL_HEADER_LEN, memcpy(), mtu, net_device::name, net_tx(), NULL, printf(), random(), rc, sender, seq, and strerror().

Referenced by lotest_exec().