Added bursts support in CSMA/ContikiMAC, and CFS-swapping in

queuebuf. Exemplified in examples/udp-stream.
This commit is contained in:
simonduq 2011-09-27 16:05:30 +02:00
parent 5b1d9617c4
commit dd8576830e
19 changed files with 1197 additions and 285 deletions

View file

@ -52,6 +52,7 @@ struct phase_queueitem {
mac_callback_t mac_callback;
void *mac_callback_ptr;
struct queuebuf *q;
struct rdc_buf_list *buf_list;
};
#define PHASE_DEFER_THRESHOLD 1
@ -150,17 +151,23 @@ send_packet(void *ptr)
{
struct phase_queueitem *p = ptr;
queuebuf_to_packetbuf(p->q);
queuebuf_free(p->q);
if(p->buf_list == NULL) {
queuebuf_to_packetbuf(p->q);
queuebuf_free(p->q);
NETSTACK_RDC.send(p->mac_callback, p->mac_callback_ptr);
} else {
NETSTACK_RDC.send_list(p->mac_callback, p->mac_callback_ptr, p->buf_list);
}
memb_free(&queued_packets_memb, p);
NETSTACK_RDC.send(p->mac_callback, p->mac_callback_ptr);
}
/*---------------------------------------------------------------------------*/
phase_status_t
phase_wait(struct phase_list *list,
const rimeaddr_t *neighbor, rtimer_clock_t cycle_time,
rtimer_clock_t guard_time,
mac_callback_t mac_callback, void *mac_callback_ptr)
mac_callback_t mac_callback, void *mac_callback_ptr,
struct rdc_buf_list *buf_list, int extra_deferment)
{
struct phase *e;
// const rimeaddr_t *neighbor = packetbuf_addr(PACKETBUF_ADDR_RECEIVER);
@ -169,8 +176,8 @@ phase_wait(struct phase_list *list,
time for the next expected phase and setup a ctimer to switch on
the radio just before the phase. */
e = find_neighbor(list, neighbor);
if(e != NULL) {
rtimer_clock_t wait, now, expected;
if((e != NULL) | extra_deferment) {
rtimer_clock_t wait, now, expected, sync;
clock_time_t ctimewait;
/* We expect phases to happen every CYCLE_TIME time
@ -188,31 +195,38 @@ phase_wait(struct phase_list *list,
}*/
now = RTIMER_NOW();
wait = (rtimer_clock_t)((e->time - now) &
sync = (e == NULL) ? now : e->time;
wait = (rtimer_clock_t)((sync - now) &
(cycle_time - 1));
if(wait < guard_time) {
wait += cycle_time;
}
if(extra_deferment) {
wait += extra_deferment * cycle_time;
}
ctimewait = (CLOCK_SECOND * (wait - guard_time)) / RTIMER_ARCH_SECOND;
if(ctimewait > PHASE_DEFER_THRESHOLD) {
if((ctimewait > PHASE_DEFER_THRESHOLD) | extra_deferment) {
struct phase_queueitem *p;
p = memb_alloc(&queued_packets_memb);
if(p != NULL) {
p->q = queuebuf_new_from_packetbuf();
if(p->q != NULL) {
p->mac_callback = mac_callback;
p->mac_callback_ptr = mac_callback_ptr;
ctimer_set(&p->timer, ctimewait, send_packet, p);
return PHASE_DEFERRED;
} else {
memb_free(&queued_packets_memb, p);
if(buf_list == NULL) {
p->q = queuebuf_new_from_packetbuf();
}
p->mac_callback = mac_callback;
p->mac_callback_ptr = mac_callback_ptr;
p->buf_list = buf_list;
ctimer_set(&p->timer, ctimewait, send_packet, p);
return PHASE_DEFERRED;
} else {
memb_free(&queued_packets_memb, p);
}
}
expected = now + wait - guard_time;
if(!RTIMER_CLOCK_LT(expected, now)) {
/* Wait until the receiver is expected to be awake */