Skip to content

Commit

Permalink
[lotest] Discard packets arriving on the incorrect network device
Browse files Browse the repository at this point in the history
Commit 24bbaf6 ("[lotest] Allow loopback testing on shared networks")
introduced a regression in which loopback testing packets would be
accepted from any network device.  This produces unexpected results,
such as VLAN loopback testing succeeding even when incorrectly using
the underlying trunk device as either transmitter or receiver.

Fix by discarding any loopback testing packets which arrive on a
network device other than the current loopback testing receiver.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Jul 29, 2014
1 parent ec30c85 commit 721a492
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions src/usr/lotest.c
Expand Up @@ -39,8 +39,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
*
*/

/** Loopback testing in progress flag */
static int lotest_active;
/** Current loopback test receiver */
static struct net_device *lotest_receiver;

/** Loopback testing received packets */
static LIST_HEAD ( lotest_queue );
Expand All @@ -56,13 +56,13 @@ static LIST_HEAD ( lotest_queue );
* @ret rc Return status code
*/
static int lotest_rx ( struct io_buffer *iobuf,
struct net_device *netdev __unused,
struct net_device *netdev,
const void *ll_dest __unused,
const void *ll_source __unused,
unsigned int flags __unused ) {

/* Add to received packet queue if currently performing a test */
if ( lotest_active ) {
if ( netdev == lotest_receiver ) {
list_add_tail ( &iobuf->list, &lotest_queue );
} else {
free_iob ( iobuf );
Expand Down Expand Up @@ -223,7 +223,7 @@ int loopback_test ( struct net_device *sender, struct net_device *receiver,

/* Start loopback test */
lotest_flush();
lotest_active = 1;
lotest_receiver = receiver;

/* Perform loopback test */
for ( successes = 0 ; ; successes++ ) {
Expand Down Expand Up @@ -261,7 +261,7 @@ int loopback_test ( struct net_device *sender, struct net_device *receiver,
printf ( "\n");

/* Stop loopback testing */
lotest_active = 0;
lotest_receiver = NULL;
lotest_flush();

/* Dump final statistics */
Expand Down

0 comments on commit 721a492

Please sign in to comment.