summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2008-11-08 05:36:42 +0100
committerMichael Brown2008-11-08 05:36:42 +0100
commit43aa69d7b3035a1ed3897a0435dada96526be67b (patch)
tree6b58beb254c636f2ae933ebedca37a97dcd913ef
parent[settings] Ensure fetch_string_setting() returns a NUL-terminated string (diff)
downloadipxe-43aa69d7b3035a1ed3897a0435dada96526be67b.tar.gz
ipxe-43aa69d7b3035a1ed3897a0435dada96526be67b.tar.xz
ipxe-43aa69d7b3035a1ed3897a0435dada96526be67b.zip
[aoe] Start retry timer before potential temporary transmission failure
The retry timer needs to be running as soon as we know that we are trying to transmit a command. If transmission fails because of a temporary error condition, then the timer will allow us to retry the transmission later.
-rw-r--r--src/net/aoe.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/net/aoe.c b/src/net/aoe.c
index e3f84e5a..ec3814bf 100644
--- a/src/net/aoe.c
+++ b/src/net/aoe.c
@@ -94,6 +94,13 @@ static int aoe_send_command ( struct aoe_session *aoe ) {
return -ENETUNREACH;
}
+ /* If we are transmitting anything that requires a response,
+ * start the retransmission timer. Do this before attempting
+ * to allocate the I/O buffer, in case allocation itself
+ * fails.
+ */
+ start_timer ( &aoe->timer );
+
/* Calculate count and data_out_len for this subcommand */
count = command->cb.count.native;
if ( count > AOE_MAX_COUNT )
@@ -101,8 +108,8 @@ static int aoe_send_command ( struct aoe_session *aoe ) {
data_out_len = ( command->data_out ? ( count * ATA_SECTOR_SIZE ) : 0 );
/* Create outgoing I/O buffer */
- iobuf = alloc_iob ( ETH_HLEN + sizeof ( *aoehdr ) + sizeof ( *aoecmd ) +
- data_out_len );
+ iobuf = alloc_iob ( ETH_HLEN + sizeof ( *aoehdr ) +
+ sizeof ( *aoecmd ) + data_out_len );
if ( ! iobuf )
return -ENOMEM;
iob_reserve ( iobuf, ETH_HLEN );
@@ -133,7 +140,6 @@ static int aoe_send_command ( struct aoe_session *aoe ) {
aoe->command_offset, data_out_len );
/* Send packet */
- start_timer ( &aoe->timer );
return net_tx ( iobuf, aoe->netdev, &aoe_protocol, aoe->target );
}
@@ -231,7 +237,8 @@ static int aoe_rx_response ( struct aoe_session *aoe, struct aoehdr *aoehdr,
* @ret rc Return status code
*
*/
-static int aoe_rx ( struct io_buffer *iobuf, struct net_device *netdev __unused,
+static int aoe_rx ( struct io_buffer *iobuf,
+ struct net_device *netdev __unused,
const void *ll_source ) {
struct aoehdr *aoehdr = iobuf->data;
unsigned int len = iob_len ( iobuf );