/*---------------------------------------------------------------------------*/ static int select_packet(uint16_t *slotframe, uint16_t *timeslot) { /* Select EBs only */ if(packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE) == FRAME802154_BEACONFRAME) { if(slotframe != NULL) { *slotframe = slotframe_handle; } if(timeslot != NULL) { *timeslot = get_node_timeslot(&linkaddr_node_addr); } return 1; } return 0; }
/*---------------------------------------------------------------------------*/ static int select_packet(uint16_t *slotframe, uint16_t *timeslot) { /* Select data packets we have a unicast link to */ const linkaddr_t *dest = packetbuf_addr(PACKETBUF_ADDR_RECEIVER); if(packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE) == FRAME802154_DATAFRAME && !linkaddr_cmp(dest, &linkaddr_null)) { if(slotframe != NULL) { *slotframe = slotframe_handle; } if(timeslot != NULL) { *timeslot = get_node_timeslot(dest); } return 1; } return 0; }
/*---------------------------------------------------------------------------*/ static void init(uint16_t sf_handle) { int i; uint16_t rx_timeslot; slotframe_handle = sf_handle; channel_offset = sf_handle; /* Slotframe for unicast transmissions */ sf_unicast = tsch_schedule_add_slotframe(slotframe_handle, ORCHESTRA_UNICAST_PERIOD); rx_timeslot = get_node_timeslot(&linkaddr_node_addr); /* Add a Tx link at each available timeslot. Make the link Rx at our own timeslot. */ for(i = 0; i < ORCHESTRA_UNICAST_PERIOD; i++) { tsch_schedule_add_link(sf_unicast, LINK_OPTION_SHARED | LINK_OPTION_TX | ( i == rx_timeslot ? LINK_OPTION_RX : 0 ), LINK_TYPE_NORMAL, &tsch_broadcast_address, i, channel_offset); } }
if(packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE) == FRAME802154_BEACONFRAME) { if(slotframe != NULL) { *slotframe = slotframe_handle; } if(timeslot != NULL) { *timeslot = get_node_timeslot(&linkaddr_node_addr); } return 1; } return 0; } /*---------------------------------------------------------------------------*/ static void new_time_source(const struct tsch_neighbor *old, const struct tsch_neighbor *new) { uint16_t old_ts = get_node_timeslot(&old->addr); uint16_t new_ts = get_node_timeslot(&new->addr); if(new_ts == old_ts) { return; } if(old_ts != 0xffff) { /* Stop listening to the old time source's EBs */ tsch_schedule_remove_link_by_timeslot(sf_eb, old_ts); } if(new_ts != 0xffff) { /* Listen to the time source's EBs */ tsch_schedule_add_link(sf_eb, LINK_OPTION_RX, LINK_TYPE_ADVERTISING_ONLY, NULL,
if(packetbuf_attr(PACKETBUF_ATTR_FRAME_TYPE) == FRAME802154_BEACONFRAME) { if(slotframe != NULL) { *slotframe = slotframe_handle; } if(timeslot != NULL) { *timeslot = get_node_timeslot(&linkaddr_node_addr); } return 1; } return 0; } /*---------------------------------------------------------------------------*/ static void new_time_source(const struct tsch_neighbor *old, const struct tsch_neighbor *new) { uint16_t old_ts = old != NULL ? get_node_timeslot(&old->addr) : 0xffff; uint16_t new_ts = new != NULL ? get_node_timeslot(&new->addr) : 0xffff; if(new_ts == old_ts) { return; } if(old_ts != 0xffff) { /* Stop listening to the old time source's EBs */ if(old_ts == get_node_timeslot(&linkaddr_node_addr)) { /* This was the same timeslot as slot. Reset original link options */ tsch_schedule_add_link(sf_eb, LINK_OPTION_TX, LINK_TYPE_ADVERTISING_ONLY, &tsch_broadcast_address, old_ts, 0); } else { /* Remove slot */ tsch_schedule_remove_link_by_timeslot(sf_eb, old_ts);