/* Flush a neighbor queue */ static void tsch_queue_flush_nbr_queue(struct tsch_neighbor *n) { while(!tsch_queue_is_empty(n)) { struct tsch_packet *p = tsch_queue_remove_packet_from_queue(n); if(p != NULL) { /* Set return status for packet_sent callback */ p->ret = MAC_TX_ERR; PRINTF("TSCH-queue:! flushing packet\n"); /* Call packet_sent callback */ mac_call_sent_callback(p->sent, p->ptr, p->ret, p->transmissions); /* Free packet queuebuf */ tsch_queue_free_packet(p); } } }
/* Pass sent packets to upper layer */ static void tsch_tx_process_pending() { int16_t dequeued_index; /* Loop on accessing (without removing) a pending input packet */ while((dequeued_index = ringbufindex_peek_get(&dequeued_ringbuf)) != -1) { struct tsch_packet *p = dequeued_array[dequeued_index]; /* Put packet into packetbuf for packet_sent callback */ queuebuf_to_packetbuf(p->qb); /* Call packet_sent callback */ mac_call_sent_callback(p->sent, p->ptr, p->ret, p->transmissions); /* Free packet queuebuf */ tsch_queue_free_packet(p); /* Free all unused neighbors */ tsch_queue_free_unused_neighbors(); /* Remove dequeued packet from ringbuf */ ringbufindex_get(&dequeued_ringbuf); } }