iPXE
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.

Detailed Description

Loopback testing.

Definition in file lotest.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

References mtu, and sender.

◆ loopback_test()

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

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 ) ) != 0 )
212 return rc;
213 if ( ( rc = iflinkwait ( receiver, 0, 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 }
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}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
unsigned int uint32_t
Definition stdint.h:12
unsigned char uint8_t
Definition stdint.h:10
uint32_t mtu
Maximum MTU.
Definition ena.h:17
#define ENOMEM
Not enough space.
Definition errno.h:535
u16 seq
802.11 Sequence Control field
Definition ieee80211.h:5
int ifopen(struct net_device *netdev)
Open network device.
Definition ifmgmt.c:66
int iflinkwait(struct net_device *netdev, unsigned long timeout, int verbose)
Wait for link-up, with status indication.
Definition ifmgmt.c:220
void ifstat(struct net_device *netdev)
Print status of network device.
Definition ifmgmt.c:111
#define htonl(value)
Definition byteswap.h:134
void * memcpy(void *dest, const void *src, 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_disown(iobuf)
Disown an I/O buffer.
Definition iobuf.h:217
#define iob_reserve(iobuf, len)
Definition iobuf.h:72
static int loopback_wait(void *data, size_t len)
Wait for packet to be received.
Definition lotest.c:138
static void lotest_flush(void)
Discard all received loopback test packets.
Definition lotest.c:124
static struct net_device * lotest_receiver
Current loopback test receiver.
Definition lotest.c:47
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621
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
long int random(void)
Generate a pseudo-random number between 0 and 2147483647L or 2147483562?
Definition random.c:32
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
struct stp_switch sender
Sender switch.
Definition stp.h:19
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
A persistent I/O buffer.
Definition iobuf.h:38
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition netdevice.h:363
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition netdevice.h:388
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition vsprintf.c:465

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().