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