Merge pull request #681 from simonduq/fix/tsch-cca

TSCH CCA
This commit is contained in:
George Oikonomou 2018-10-11 14:35:59 +01:00 committed by GitHub
commit b646b5161a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 7 deletions

View File

@ -365,18 +365,21 @@
/******** Configuration: CSMA *******/ /******** Configuration: CSMA *******/
/* TSCH CSMA-CA parameters, see IEEE 802.15.4e-2012 */ /* TSCH CSMA-CA parameters, see IEEE 802.15.4e-2012 */
/* Min backoff exponent */ /* Min backoff exponent */
#ifdef TSCH_CONF_MAC_MIN_BE #ifdef TSCH_CONF_MAC_MIN_BE
#define TSCH_MAC_MIN_BE TSCH_CONF_MAC_MIN_BE #define TSCH_MAC_MIN_BE TSCH_CONF_MAC_MIN_BE
#else #else
#define TSCH_MAC_MIN_BE 1 #define TSCH_MAC_MIN_BE 1
#endif #endif
/* Max backoff exponent */ /* Max backoff exponent */
#ifdef TSCH_CONF_MAC_MAX_BE #ifdef TSCH_CONF_MAC_MAX_BE
#define TSCH_MAC_MAX_BE TSCH_CONF_MAC_MAX_BE #define TSCH_MAC_MAX_BE TSCH_CONF_MAC_MAX_BE
#else #else
#define TSCH_MAC_MAX_BE 5 #define TSCH_MAC_MAX_BE 5
#endif #endif
/* Max number of re-transmissions */ /* Max number of re-transmissions */
#ifdef TSCH_CONF_MAC_MAX_FRAME_RETRIES #ifdef TSCH_CONF_MAC_MAX_FRAME_RETRIES
#define TSCH_MAC_MAX_FRAME_RETRIES TSCH_CONF_MAC_MAX_FRAME_RETRIES #define TSCH_MAC_MAX_FRAME_RETRIES TSCH_CONF_MAC_MAX_FRAME_RETRIES
@ -391,6 +394,13 @@
#define TSCH_PACKET_EACK_WITH_SRC_ADDR 0 #define TSCH_PACKET_EACK_WITH_SRC_ADDR 0
#endif #endif
/* Perform CCA before sending? */
#ifdef TSCH_CONF_CCA_ENABLED
#define TSCH_CCA_ENABLED TSCH_CONF_CCA_ENABLED
#else
#define TSCH_CCA_ENABLED 0
#endif
/* Include destination address in ACK? */ /* Include destination address in ACK? */
#ifdef TSCH_PACKET_CONF_EACK_WITH_DEST_ADDR #ifdef TSCH_PACKET_CONF_EACK_WITH_DEST_ADDR
#define TSCH_PACKET_EACK_WITH_DEST_ADDR TSCH_PACKET_CONF_EACK_WITH_DEST_ADDR #define TSCH_PACKET_EACK_WITH_DEST_ADDR TSCH_PACKET_CONF_EACK_WITH_DEST_ADDR

View File

@ -464,9 +464,9 @@ PT_THREAD(tsch_tx_slot(struct pt *pt, struct rtimer *t))
/* Did we set the frame pending bit to request an extra burst link? */ /* Did we set the frame pending bit to request an extra burst link? */
static int burst_link_requested; static int burst_link_requested;
#if CCA_ENABLED #if TSCH_CCA_ENABLED
static uint8_t cca_status; static uint8_t cca_status;
#endif #endif /* TSCH_CCA_ENABLED */
/* get payload */ /* get payload */
packet = queuebuf_dataptr(current_packet->qb); packet = queuebuf_dataptr(current_packet->qb);
@ -507,22 +507,22 @@ PT_THREAD(tsch_tx_slot(struct pt *pt, struct rtimer *t))
if(packet_ready && NETSTACK_RADIO.prepare(packet, packet_len) == 0) { /* 0 means success */ if(packet_ready && NETSTACK_RADIO.prepare(packet, packet_len) == 0) { /* 0 means success */
static rtimer_clock_t tx_duration; static rtimer_clock_t tx_duration;
#if CCA_ENABLED #if TSCH_CCA_ENABLED
cca_status = 1; cca_status = 1;
/* delay before CCA */ /* delay before CCA */
TSCH_SCHEDULE_AND_YIELD(pt, t, current_slot_start, TS_CCA_OFFSET, "cca"); TSCH_SCHEDULE_AND_YIELD(pt, t, current_slot_start, tsch_timing[tsch_ts_cca_offset], "cca");
TSCH_DEBUG_TX_EVENT(); TSCH_DEBUG_TX_EVENT();
tsch_radio_on(TSCH_RADIO_CMD_ON_WITHIN_TIMESLOT); tsch_radio_on(TSCH_RADIO_CMD_ON_WITHIN_TIMESLOT);
/* CCA */ /* CCA */
BUSYWAIT_UNTIL_ABS(!(cca_status |= NETSTACK_RADIO.channel_clear()), BUSYWAIT_UNTIL_ABS(!(cca_status &= NETSTACK_RADIO.channel_clear()),
current_slot_start, TS_CCA_OFFSET + TS_CCA); current_slot_start, tsch_timing[tsch_ts_cca_offset] + tsch_timing[tsch_ts_cca]);
TSCH_DEBUG_TX_EVENT(); TSCH_DEBUG_TX_EVENT();
/* there is not enough time to turn radio off */ /* there is not enough time to turn radio off */
/* NETSTACK_RADIO.off(); */ /* NETSTACK_RADIO.off(); */
if(cca_status == 0) { if(cca_status == 0) {
mac_tx_status = MAC_TX_COLLISION; mac_tx_status = MAC_TX_COLLISION;
} else } else
#endif /* CCA_ENABLED */ #endif /* TSCH_CCA_ENABLED */
{ {
/* delay before TX */ /* delay before TX */
TSCH_SCHEDULE_AND_YIELD(pt, t, current_slot_start, tsch_timing[tsch_ts_tx_offset] - RADIO_DELAY_BEFORE_TX, "TxBeforeTx"); TSCH_SCHEDULE_AND_YIELD(pt, t, current_slot_start, tsch_timing[tsch_ts_tx_offset] - RADIO_DELAY_BEFORE_TX, "TxBeforeTx");