summaryrefslogtreecommitdiff
path: root/mac/ca/src
diff options
context:
space:
mode:
authorschodet2007-11-16 16:51:05 +0000
committerschodet2007-11-16 16:51:05 +0000
commit9613e5560f4a42e14ef0036100baef06cc65389b (patch)
tree023c255b57df322ec7cba422aeaf5aef86ce1773 /mac/ca/src
parent93c40166f388c3b34ccf1fa8c13134b1876a92f9 (diff)
* mac/ca:
- replaced ca_mfs_init and ca_mfs_uninit by ca_mfs_add and ca_mfs_remove. - added beacon MFS support. - added hold support for CFP MFS. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@1012 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'mac/ca/src')
-rw-r--r--mac/ca/src/access.c20
-rw-r--r--mac/ca/src/ca.c61
-rw-r--r--mac/ca/src/trace.c5
3 files changed, 69 insertions, 17 deletions
diff --git a/mac/ca/src/access.c b/mac/ca/src/access.c
index f56413e955..7cdec9a7b8 100644
--- a/mac/ca/src/access.c
+++ b/mac/ca/src/access.c
@@ -19,6 +19,7 @@
#include "mac/ca/inc/context.h"
#include "mac/ca/inc/alloc.h"
+#include "mac/ca/inc/mfs.h"
/**
* Choose a MFS TX for the given GLID.
@@ -279,6 +280,8 @@ ca_access_aifs (ca_t *ctx)
dbg_assert (bp_i != ctx->beacon_periods_tail);
alloc_i = 0;
access_date = ctx->beacon_periods[bp_i].start_date;
+ /* Prepare next beacon period. */
+ ca_mfs_next_beacon_period (ctx);
}
else
{
@@ -328,17 +331,24 @@ ca_access_choose_mfs_tx (ca_t *ctx, uint glid)
dbg_assert (glid >= MAC_GLID_MIN);
/* If GLID, this is a CFP allocation, else choose the MFS with the greater
* priority. */
- if (glid <= MAC_GLID_MAX)
+ if (!CA_ALLOC_IS_CSMA (glid))
{
+ dbg_assert (glid <= MAC_GLID_MAX
+ || glid == MAC_LID_SPC_CENTRAL
+ || glid == MAC_LID_DISCOVER);
mfs = mac_store_mfs_get_tx (ctx->store, false, false, glid, 0);
dbg_assert (!mfs || mfs->ca_state == CA_MFS_STATE_UNKNOWN
- || mfs->ca_state == CA_MFS_STATE_CFP_QUEUED);
+ || mfs->ca_state == CA_MFS_STATE_CFP_QUEUED
+ || mfs->ca_state == CA_MFS_STATE_CFP_HELD);
/* Reference is borrowed from the store. */
if (mfs)
blk_release (mfs);
- return mfs;
+ if (mfs && mfs->ca_state == CA_MFS_STATE_CFP_QUEUED)
+ return mfs;
+ else
+ return NULL;
}
- else if (CA_ALLOC_IS_CSMA (glid))
+ else
{
if (!heap_empty (&ctx->mfs_heap))
{
@@ -350,7 +360,5 @@ ca_access_choose_mfs_tx (ca_t *ctx, uint glid)
else
return NULL;
}
- else /* \todo support beacon TX. */
- return NULL;
}
diff --git a/mac/ca/src/ca.c b/mac/ca/src/ca.c
index 6f0d989d94..ed45413344 100644
--- a/mac/ca/src/ca.c
+++ b/mac/ca/src/ca.c
@@ -55,6 +55,7 @@ ca_init (phy_t *phy, mac_config_t *config, mac_store_t *store)
ctx->current_beacon_period = 0;
ctx->current_allocation_index = 0;
heap_init (&ctx->mfs_heap, ca_mfs_less);
+ list_init (&ctx->cfp_held);
CA_TRACE (INIT);
return ctx;
}
@@ -69,28 +70,35 @@ ca_uninit (ca_t *ctx)
}
void
-ca_mfs_init (ca_t *ctx, mfs_tx_t *mfs)
+ca_mfs_add (ca_t *ctx, mfs_tx_t *mfs)
{
dbg_assert (ctx);
dbg_assert (mfs);
- CA_TRACE (MFS_INIT, mfs);
- heap_node_init (&mfs->ca_prio_link);
- mfs->ca_state = CA_MFS_STATE_UNKNOWN;
+ CA_TRACE (MFS_ADD, mfs);
+ ca_mfs_update (ctx, mfs);
}
-void
-ca_mfs_uninit (ca_t *ctx, mfs_tx_t *mfs)
+bool
+ca_mfs_remove (ca_t *ctx, mfs_tx_t *mfs)
{
dbg_assert (ctx);
dbg_assert (mfs);
- CA_TRACE (MFS_UNINIT, mfs);
- if (mfs->ca_state == CA_MFS_STATE_PRIO_QUEUED)
+ CA_TRACE (MFS_REMOVE, mfs);
+ switch (mfs->ca_state)
{
+ case CA_MFS_STATE_PRIO_QUEUED:
heap_remove (&ctx->mfs_heap, &mfs->ca_prio_link);
+ break;
+ case CA_MFS_STATE_CFP_HELD:
+ list_remove (&ctx->cfp_held, &mfs->ca_cfp_held_link);
+ break;
+ default:
+ ;
}
mfs->ca_state = CA_MFS_STATE_UNKNOWN;
/* The current ACCESS may have changed. */
ca_access_update (ctx, phy_date (ctx->phy));
+ return true;
}
void
@@ -98,7 +106,7 @@ ca_mfs_update (ca_t *ctx, mfs_tx_t *mfs)
{
ca_mfs_state_t new_state;
dbg_assert (ctx);
- dbg_assert (mfs);
+ dbg_assert_ptr (mfs);
CA_TRACE (MFS_UPDATE, mfs);
/* Compute the new MFS state... */
if (mfs->seg_nb + mfs->pending_seg_nb != 0)
@@ -128,6 +136,41 @@ ca_mfs_update (ca_t *ctx, mfs_tx_t *mfs)
ca_access_update (ctx, phy_date (ctx->phy));
}
+void
+ca_mfs_hold (ca_t *ctx, mfs_tx_t *mfs)
+{
+ dbg_assert (ctx);
+ dbg_assert_ptr (mfs);
+ CA_TRACE (MFS_HOLD, mfs);
+ /* CFP MFS. */
+ if (mfs->cfp && (mfs->ca_state == CA_MFS_STATE_CFP_QUEUED
+ || mfs->ca_state == CA_MFS_STATE_UNKNOWN))
+ {
+ mfs->ca_state = CA_MFS_STATE_CFP_HELD;
+ list_push (&ctx->cfp_held, &mfs->ca_cfp_held_link);
+ }
+ else if (mfs->ca_state == CA_MFS_STATE_PRIO_QUEUED)
+ {
+ dbg_assert (0); // TODO
+ }
+ else
+ dbg_assert (0);
+ /* The current ACCESS may have changed. */
+ ca_access_update (ctx, phy_date (ctx->phy));
+}
+
+void
+ca_mfs_next_beacon_period (ca_t *ctx)
+{
+ /* Unhold CFP MFS. */
+ while (!list_empty (&ctx->cfp_held))
+ {
+ mfs_tx_t *mfs = PARENT_OF (mfs_tx_t, ca_cfp_held_link,
+ list_pop (&ctx->cfp_held));
+ ca_mfs_update (ctx, mfs);
+ }
+}
+
static bool
ca_mfs_less (heap_node_t *left, heap_node_t *right)
{
diff --git a/mac/ca/src/trace.c b/mac/ca/src/trace.c
index fa035af262..efed8ab5f2 100644
--- a/mac/ca/src/trace.c
+++ b/mac/ca/src/trace.c
@@ -22,9 +22,10 @@ ca_trace_init (ca_t *ctx)
{
TRACE_EVENT (CA_TRACE_INIT, "init"),
TRACE_EVENT (CA_TRACE_UNINIT, "uninit"),
- TRACE_EVENT (CA_TRACE_MFS_INIT, "mfs init %x"),
- TRACE_EVENT (CA_TRACE_MFS_UNINIT, "mfs uninit %x"),
+ TRACE_EVENT (CA_TRACE_MFS_ADD, "mfs add %x"),
+ TRACE_EVENT (CA_TRACE_MFS_REMOVE, "mfs remove %x"),
TRACE_EVENT (CA_TRACE_MFS_UPDATE, "mfs update %x"),
+ TRACE_EVENT (CA_TRACE_MFS_HOLD, "mfs hold %x"),
TRACE_EVENT (CA_TRACE_ALLOC_UPDATE_BEACON_PERIODS,
"alloc update beacon periods"),