]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[lotest] Discard packets arriving on the incorrect network device
authorMichael Brown <mcb30@ipxe.org>
Tue, 29 Jul 2014 14:15:28 +0000 (15:15 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 29 Jul 2014 14:20:49 +0000 (15:20 +0100)
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>
src/usr/lotest.c

index 9e2ac331cdfddf5cd8b18a593936ffb257294354..ad7a2fad730325d07c9471ff2b876dbf6fe4363a 100644 (file)
@@ -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 );
@@ -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 );
@@ -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++ ) {
@@ -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 */