6LowPAN: check tx result, if fail then do not send subsequent

fragments. Serves to save energy and also as collision avoidance.
This commit is contained in:
Ivan Delamer 2012-03-26 15:37:17 -06:00
parent 436cbec844
commit f9d5d71fde
1 changed files with 22 additions and 1 deletions

View File

@ -211,6 +211,11 @@ static uint8_t rime_payload_len;
* is used this includes the UDP header in addition to the IP header).
*/
static uint8_t uncomp_hdr_len;
/**
* the result of the last transmitted fragment
*/
static int last_tx_status;
/** @} */
#if SICSLOWPAN_CONF_FRAG
@ -1308,6 +1313,7 @@ packet_sent(void *ptr, int status, int transmissions)
if(callback != NULL) {
callback->output_callback(status);
}
last_tx_status = status;
}
/*--------------------------------------------------------------------*/
/**
@ -1465,6 +1471,14 @@ output(uip_lladdr_t *localdest)
queuebuf_free(q);
q = NULL;
/* Check tx result. */
if((last_tx_status == MAC_TX_COLLISION) ||
(last_tx_status == MAC_TX_ERR) ||
(last_tx_status == MAC_TX_ERR_FATAL)) {
PRINTFO("error in fragment tx, dropping subsequent fragments.\n");
return 0;
}
/* set processed_ip_out_len to what we already sent from the IP payload*/
processed_ip_out_len = rime_payload_len + uncomp_hdr_len;
@ -1503,8 +1517,15 @@ output(uip_lladdr_t *localdest)
queuebuf_free(q);
q = NULL;
processed_ip_out_len += rime_payload_len;
/* Check tx result. */
if((last_tx_status == MAC_TX_COLLISION) ||
(last_tx_status == MAC_TX_ERR) ||
(last_tx_status == MAC_TX_ERR_FATAL)) {
PRINTFO("error in fragment tx, dropping subsequent fragments.\n");
return 0;
}
}
#else /* SICSLOWPAN_CONF_FRAG */
PRINTFO("sicslowpan output: Packet too large to be sent without fragmentation support; dropping packet\n");
return 0;