TSCH burst mode: do not channel hop within burst

This commit is contained in:
Simon Duquennoy 2018-05-12 10:49:44 -07:00
parent 5607308eed
commit 2433860441

View File

@ -171,6 +171,8 @@ static struct tsch_neighbor *current_neighbor = NULL;
static int burst_link_scheduled = 0;
/* Counts the length of the current burst */
int tsch_current_burst_count = 0;
/* The physical channel of the current burst */
static uint16_t burst_current_channel = 0;
/* Protothread for association */
PT_THREAD(tsch_scan(struct pt *pt));
@ -954,8 +956,6 @@ PT_THREAD(tsch_slot_operation(struct rtimer *t, void *ptr))
/* Reset drift correction */
drift_correction = 0;
is_drift_correction_used = 0;
/* For the packet burst mechanism */
burst_link_scheduled = 0;
/* Get a packet ready to be sent */
current_packet = get_packet_and_neighbor_for_link(current_link, &current_neighbor);
/* There is no packet to send, and this link does not have Rx flag. Instead of doing
@ -966,8 +966,15 @@ PT_THREAD(tsch_slot_operation(struct rtimer *t, void *ptr))
}
is_active_slot = current_packet != NULL || (current_link->link_options & LINK_OPTION_RX);
if(is_active_slot) {
/* Hop channel */
current_channel = tsch_calculate_channel(&tsch_current_asn, current_link->channel_offset);
/* If we are in a burst, we stick to current channel instead of
* doing channel hopping, as per IEEE 802.15.4-2015 */
if(burst_link_scheduled) {
current_channel = burst_current_channel;
burst_link_scheduled = 0;
} else {
/* Hop channel */
current_channel = tsch_calculate_channel(&tsch_current_asn, current_link->channel_offset);
}
NETSTACK_RADIO.set_value(RADIO_PARAM_CHANNEL, current_channel);
/* Turn the radio on already here if configured so; necessary for radios with slow startup */
tsch_radio_on(TSCH_RADIO_CMD_ON_START_OF_TIMESLOT);
@ -986,6 +993,10 @@ PT_THREAD(tsch_slot_operation(struct rtimer *t, void *ptr))
static struct pt slot_rx_pt;
PT_SPAWN(&slot_operation_pt, &slot_rx_pt, tsch_rx_slot(&slot_rx_pt, t));
}
} else {
/* Make sure to end the burst in cast, for some reason, we were
* in a burst but now without any more packet to send. */
burst_link_scheduled = 0;
}
TSCH_DEBUG_SLOT_END();
}
@ -1023,6 +1034,7 @@ PT_THREAD(tsch_slot_operation(struct rtimer *t, void *ptr))
next time offset */
if(burst_link_scheduled) {
timeslot_diff = 1;
burst_current_channel = current_channel;
backup_link = NULL;
/* Keep track of the number of repetitions */
tsch_current_burst_count++;