]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[lotest] Add option to use broadcast packets for loopback testing
authorMichael Brown <mcb30@ipxe.org>
Fri, 20 May 2016 19:57:18 +0000 (20:57 +0100)
committerMichael Brown <mcb30@ipxe.org>
Mon, 23 May 2016 13:17:47 +0000 (14:17 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/hci/commands/lotest_cmd.c
src/include/usr/lotest.h
src/usr/lotest.c

index a989932d4fc3f54f3f7628ed9e743768dcdb9aad..393b3c36e7ce2c86427ac69f726c052a8cfbff2c 100644 (file)
@@ -43,12 +43,16 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 struct lotest_options {
        /** MTU */
        unsigned int mtu;
+       /** Broadcast */
+       int broadcast;
 };
 
 /** "lotest" option list */
 static struct option_descriptor lotest_opts[] = {
        OPTION_DESC ( "mtu", 'm', required_argument,
                      struct lotest_options, mtu, parse_integer ),
+       OPTION_DESC ( "broadcast", 'b', no_argument,
+                     struct lotest_options, broadcast, parse_flag ),
 };
 
 /** "lotest" command descriptor */
@@ -86,7 +90,8 @@ static int lotest_exec ( int argc, char **argv ) {
                opts.mtu = ETH_MAX_MTU;
 
        /* Perform loopback test */
-       if ( ( rc = loopback_test ( sender, receiver, opts.mtu ) ) != 0 ) {
+       if ( ( rc = loopback_test ( sender, receiver, opts.mtu,
+                                   opts.broadcast ) ) != 0 ) {
                printf ( "Test failed: %s\n", strerror ( rc ) );
                return rc;
        }
index ce0fe5edace21e20d23aa86a52bf3a515990e973..bd66f4a448c8394e4f3cda11e5ca9503d9d57750 100644 (file)
@@ -10,6 +10,7 @@
 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 extern int loopback_test ( struct net_device *sender,
-                          struct net_device *receiver, size_t mtu );
+                          struct net_device *receiver,
+                          size_t mtu, int broadcast );
 
 #endif /* _USR_LOTEST_H */
index 6b328713c7e369688a0e52f4843cb82f9354e2dd..6b75b5048af81d63b0d652efbba0a4b950b28752 100644 (file)
@@ -188,13 +188,15 @@ static int loopback_wait ( void *data, size_t len ) {
  * @v sender           Sending network device
  * @v receiver         Received network device
  * @v mtu              Packet size (excluding link-layer headers)
+ * @v broadcast                Use broadcast link-layer address
  * @ret rc             Return status code
  */
 int loopback_test ( struct net_device *sender, struct net_device *receiver,
-                   size_t mtu ) {
+                   size_t mtu, int broadcast ) {
        uint8_t *buf;
        uint32_t *seq;
        struct io_buffer *iobuf;
+       const void *ll_dest;
        unsigned int i;
        unsigned int successes;
        int rc;
@@ -219,9 +221,13 @@ int loopback_test ( struct net_device *sender, struct net_device *receiver,
                return -ENOMEM;
        seq = ( ( void * ) buf );
 
+       /* Determine destination address */
+       ll_dest = ( broadcast ? sender->ll_broadcast : receiver->ll_addr );
+
        /* Print initial statistics */
-       printf ( "Performing loopback test from %s to %s with %zd byte MTU\n",
-                sender->name, receiver->name, mtu );
+       printf ( "Performing %sloopback test from %s to %s with %zd byte MTU\n",
+                ( broadcast ? "broadcast " : "" ), sender->name,
+                receiver->name, mtu );
        ifstat ( sender );
        ifstat ( receiver );
 
@@ -250,7 +256,7 @@ int loopback_test ( struct net_device *sender, struct net_device *receiver,
 
                /* Transmit packet */
                if ( ( rc = net_tx ( iob_disown ( iobuf ), sender,
-                                    &lotest_protocol, receiver->ll_addr,
+                                    &lotest_protocol, ll_dest,
                                     sender->ll_addr ) ) != 0 ) {
                        printf ( "\nFailed to transmit packet: %s",
                                 strerror ( rc ) );