Skip to content

Commit

Permalink
adapt timeout to run based on evtimer.
Browse files Browse the repository at this point in the history
  • Loading branch information
Shuguo Zhuo committed Nov 6, 2016
1 parent 7881cbe commit 337b6ac
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 154 deletions.
12 changes: 5 additions & 7 deletions sys/include/net/gnrc/mac/timeout.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,15 @@ typedef struct {

void gnrc_mac_init_timeouts(gnrc_netdev2_t* netdev2);

void gnrc_mac_set_timeout(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type, uint32_t offset);
void gnrc_mac_set_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type, uint32_t offset);

void gnrc_mac_clear_timeout(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type);
void gnrc_mac_set_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type, uint32_t offset);

bool gnrc_mac_timeout_is_running(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type);
bool gnrc_mac_timeout_is_running(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type);

bool gnrc_mac_timeout_is_expired(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type);
bool gnrc_mac_timeout_is_expired(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type);

void gnrc_mac_reset_timeouts(gnrc_mac_t* gnrc_mac);

void gnrc_mac_timeout_make_expire(gnrc_mac_timeout_t* timeout);
void gnrc_mac_reset_timeouts(gnrc_netdev2_t* netdev2);

#ifdef __cplusplus
}
Expand Down
1 change: 1 addition & 0 deletions sys/include/net/gnrc/netdev2.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "net/netdev2.h"
#include "net/gnrc.h"
#include "net/gnrc/mac/types.h"
#include "net/gnrc/mac/timeout.h"

#ifdef __cplusplus
extern "C" {
Expand Down
184 changes: 37 additions & 147 deletions sys/net/gnrc/link_layer/gnrc_mac/timeout.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@

void gnrc_mac_init_timeouts(gnrc_netdev2_t* netdev2){

assert(netdev2);

for(int i=0;i<GNRC_MAC_TIMEOUT_COUNT;i++) {
netdev2->mac_timeout.timeouts.msg_event.event.next = NULL;
netdev2->mac_timeout.timeouts.type = TIMEOUT_DISABLED;
Expand All @@ -40,7 +42,7 @@ void gnrc_mac_init_timeouts(gnrc_netdev2_t* netdev2){


/* Return index >= 0 if found, -ENONENT if not found */
static int _gnrc_mac_find_timeout2(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
static int _gnrc_mac_find_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
{
assert(netdev2);

Expand All @@ -54,223 +56,111 @@ static int _gnrc_mac_find_timeout2(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_typ

/******************************************************************************/

inline bool gnrc_mac_timeout_is_running2(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
inline bool gnrc_mac_timeout_is_running(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
{
assert(netdev2);
return (_gnrc_mac_find_timeout(netdev2, type) >= 0);

/*
int i;
i = _gnrc_mac_find_timeout2(netdev2, type);

if(i >= 0) {
return evtimer_is_event_sched(netdev2->mac_timeout.evtimer, netdev2->mac_timeout.timeouts[i]);
}
return false;
*/
}

/******************************************************************************/
gnrc_mac_timeout_t* _gnrc_mac_acquire_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
gnrc_mac_timeout_event_t* _gnrc_mac_acquire_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
{
assert(netdev2);

if(gnrc_mac_timeout_is_running(gnrc_mac, type))
if(gnrc_mac_timeout_is_running(netdev2, type))
return NULL;

for(unsigned i = 0; i < GNRC_MAC_TIMEOUT_COUNT; i++)
{
if(gnrc_mac->timeouts[i].type == TIMEOUT_DISABLED)
if(netdev2->mac_timeout.timeouts[i].type == TIMEOUT_DISABLED)
{
gnrc_mac->timeouts[i].type = type;
return &gnrc_mac->timeouts[i];
netdev2->mac_timeout.timeouts[i].type = type;
return &netdev2->mac_timeout.timeouts[i];
}
}
return NULL;
}



/******************************************************************************/

static inline void _gnrc_mac_clear_timeout2(gnrc_mac_timeout_event_t* timeout)
static inline void _gnrc_mac_clear_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_event_t* timeout)
{
assert(timeout);

timeout->type = TIMEOUT_DISABLED;
evtimer_del(&netdev2->mac_timeout.evtimer, (evtimer_event_t *)&timeout->msg_event);
}





/******************************************************************************/
gnrc_priority_pktqueue_node_t* _alloc_node(gnrc_priority_pktqueue_node_t* buffer[], uint8_t size)
{

for (size_t i = 0; i < size; i++) {
if( (((priority_queue_node_t *)buffer[i])->data == 0) &&
(((priority_queue_node_t *)buffer[i])->next == NULL))
{
return buffer[i];
}
}
return NULL;
}


/******************************************************************************/



/******************************************************************************/

void gnrc_mac_set_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type, uint32_t offset)
{
assert(netdev2);

gnrc_mac_timeout_event_t* timeout_event;
if( (timeout_event = _gnrc_mac_acquire_timeout2(netdev2, type)) )
{
evtimer_add(&netdev2->mac_timeout.evtimer, (evtimer_event_t *)&msg_event);
}



gnrc_mac_timeout_t* timeout;
if( (timeout = _gnrc_mac_acquire_timeout(gnrc_mac, type)) )
if((timeout_event = _gnrc_mac_acquire_timeout(netdev2, type)))
{
DEBUG("[gnrc_mac] Set timeout %s in %"PRIu32" us\n",
gnrc_mac_timeout_names[type], offset);
timeout->expired = false;
timeout->msg.type = GNRC_MAC_EVENT_TIMEOUT_TYPE;
timeout->msg.content.ptr = (void*) timeout;
xtimer_set_msg(&(timeout->timer), offset,
&(timeout->msg), gnrc_mac->gnrc_netdev2->pid);
timeout_event->msg_event.msg.type = GNRC_MAC_EVENT_TIMEOUT_TYPE;
timeout_event->msg_event.msg.content.ptr = (void*) timeout_event;
timeout_event->msg_event.msg.sender_pid = netdev2->pid;
evtimer_add(&netdev2->mac_timeout.evtimer, (evtimer_event_t *)&timeout_event->msg_event);
} else {
DEBUG("[gnrc_mac] Cannot set timeout %s, too many concurrent timeouts\n",
gnrc_mac_timeout_names[type]);
}
}

/******************************************************************************/

static inline void _gnrc_mac_clear_timeout(gnrc_mac_timeout_t* timeout)
{
assert(timeout);

xtimer_remove(&(timeout->timer));
timeout->type = TIMEOUT_DISABLED;
}

/******************************************************************************/

/* Return index >= 0 if found, -ENONENT if not found */
static int _gnrc_mac_find_timeout(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type)
void gnrc_mac_clear_timeout(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
{
assert(gnrc_mac);

for(unsigned i = 0; i < GNRC_MAC_TIMEOUT_COUNT; i++)
{
if(gnrc_mac->timeouts[i].type == type)
return i;
}
return -ENOENT;
}

/******************************************************************************/
assert(netdev2);

inline bool gnrc_mac_timeout_is_running(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type)
{
assert(gnrc_mac);
return (_gnrc_mac_find_timeout(gnrc_mac, type) >= 0);
int index = _gnrc_mac_find_timeout(netdev2, type);
if(index >= 0)
_gnrc_mac_clear_timeout(&netdev2->mac_timeout.timeouts[index]);
}

/******************************************************************************/

bool gnrc_mac_timeout_is_expired(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type)
bool gnrc_mac_timeout_is_expired(gnrc_netdev2_t* netdev2, gnrc_mac_timeout_type_t type)
{
assert(gnrc_mac);
assert(netdev2);

int index = _gnrc_mac_find_timeout(gnrc_mac, type);
int index = _gnrc_mac_find_timeout(netdev2, type);
if(index >= 0) {
if(gnrc_mac->timeouts[index].expired)
_gnrc_mac_clear_timeout(&gnrc_mac->timeouts[index]);
return gnrc_mac->timeouts[index].expired;
}
return false;
}

/******************************************************************************/

gnrc_mac_timeout_t* _gnrc_mac_acquire_timeout(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type)
{
assert(gnrc_mac);

if(gnrc_mac_timeout_is_running(gnrc_mac, type))
return NULL;

for(unsigned i = 0; i < GNRC_MAC_TIMEOUT_COUNT; i++)
{
if(gnrc_mac->timeouts[i].type == TIMEOUT_DISABLED)
{
gnrc_mac->timeouts[i].type = type;
return &gnrc_mac->timeouts[i];
if(!evtimer_is_event_sched(&netdev2->mac_timeout.evtimer, &netdev2->mac_timeout.timeouts[index])){
netdev2->mac_timeout.timeouts[index].type = TIMEOUT_DISABLED;
//_gnrc_mac_clear_timeout2(&gnrc_mac->timeouts[index]);
return true;
}
return false;
}
return NULL;
}

/******************************************************************************/

void gnrc_mac_timeout_make_expire(gnrc_mac_timeout_t* timeout)
{
assert(timeout);

DEBUG("[gnrc_mac] Timeout %s expired\n", gnrc_mac_timeout_names[timeout->type]);
timeout->expired = true;
}

/******************************************************************************/

void gnrc_mac_clear_timeout(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type)
{
assert(gnrc_mac);

int index = _gnrc_mac_find_timeout(gnrc_mac, type);
if(index >= 0)
_gnrc_mac_clear_timeout(&gnrc_mac->timeouts[index]);
}

/******************************************************************************/

void gnrc_mac_set_timeout(gnrc_mac_t* gnrc_mac, gnrc_mac_timeout_type_t type, uint32_t offset)
{
assert(gnrc_mac);

gnrc_mac_timeout_t* timeout;
if( (timeout = _gnrc_mac_acquire_timeout(gnrc_mac, type)) )
{
DEBUG("[gnrc_mac] Set timeout %s in %"PRIu32" us\n",
gnrc_mac_timeout_names[type], offset);
timeout->expired = false;
timeout->msg.type = GNRC_MAC_EVENT_TIMEOUT_TYPE;
timeout->msg.content.ptr = (void*) timeout;
xtimer_set_msg(&(timeout->timer), offset,
&(timeout->msg), gnrc_mac->gnrc_netdev2->pid);
} else {
DEBUG("[gnrc_mac] Cannot set timeout %s, too many concurrent timeouts\n",
gnrc_mac_timeout_names[type]);
}
return false;
}

/******************************************************************************/

void gnrc_mac_reset_timeouts(gnrc_mac_t* gnrc_mac)
void gnrc_mac_reset_timeouts(gnrc_netdev2_t* netdev2)
{
assert(gnrc_mac);
assert(netdev2);

for(unsigned i = 0; i < GNRC_MAC_TIMEOUT_COUNT; i++)
{
if(gnrc_mac->timeouts[i].type != TIMEOUT_DISABLED)
_gnrc_mac_clear_timeout(&gnrc_mac->timeouts[i]);
if(netdev2->mac_timeout.timeouts[i].type != TIMEOUT_DISABLED)
_gnrc_mac_clear_timeout(netdev2, &netdev2->mac_timeout.timeouts[i]);
}
}

0 comments on commit 337b6ac

Please sign in to comment.