summaryrefslogtreecommitdiff
path: root/cesar/cp2/fsm
diff options
context:
space:
mode:
authorschodet2008-06-13 12:57:00 +0000
committerschodet2008-06-13 12:57:00 +0000
commitafb68daa6a7ac8bdaf55f0bf9262ca4ef84c0377 (patch)
tree3c8a88ab7b90c24c4591291bf1a7024801d1a5c0 /cesar/cp2/fsm
parentbd78f94ed22354d407ac406cf83c89a4f616e73e (diff)
* cp2/fsm:
- implemented mme and beacon events. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@2323 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/cp2/fsm')
-rw-r--r--cesar/cp2/fsm/inc/context.h4
-rw-r--r--cesar/cp2/fsm/src/events.c85
2 files changed, 87 insertions, 2 deletions
diff --git a/cesar/cp2/fsm/inc/context.h b/cesar/cp2/fsm/inc/context.h
index da914c538d..1f8a9834e4 100644
--- a/cesar/cp2/fsm/inc/context.h
+++ b/cesar/cp2/fsm/inc/context.h
@@ -28,6 +28,10 @@ struct cp_fsm_t
cp_fsm_event_t *tail;
/** Slab cache for bare events. */
slab_cache_t event_bare_cache;
+ /** Slab cache for MME events. */
+ slab_cache_t event_mme_cache;
+ /** Slab cache for beacon events. */
+ slab_cache_t event_beacon_cache;
};
typedef struct cp_fsm_t cp_fsm_t;
diff --git a/cesar/cp2/fsm/src/events.c b/cesar/cp2/fsm/src/events.c
index 46985a3aed..95ebee6c3d 100644
--- a/cesar/cp2/fsm/src/events.c
+++ b/cesar/cp2/fsm/src/events.c
@@ -44,10 +44,77 @@ cp_fsm_event_bare_new (cp_t *ctx, cp_fsm_event_type_t type)
return e;
}
+/** MME event. */
+struct cp_fsm_event_mme_t
+{
+ /** Parent event. */
+ cp_fsm_event_t event;
+ /** Associated MME. */
+ cp_mme_rx_t *mme;
+};
+typedef struct cp_fsm_event_mme_t cp_fsm_event_mme_t;
+
+typedef void (*cp_fsm_event_mme_transition_t) (cp_t *ctx, cp_mme_rx_t *mme);
+
+void
+cp_fsm_event_mme_handler (cp_t *ctx, cp_fsm_event_t *event,
+ cp_fsm_transition_t transition)
+{
+ dbg_assert (ctx);
+ dbg_assert_ptr (event);
+ dbg_assert (transition);
+ cp_fsm_event_mme_transition_t t = transition;
+ cp_fsm_event_mme_t *event_mme =
+ PARENT_OF (cp_fsm_event_mme_t, event, event);
+ /* Call transition. */
+ t (ctx, event_mme->mme);
+}
+
cp_fsm_event_t *
cp_fsm_event_mme_new (cp_t *ctx, cp_fsm_event_type_t type, cp_mme_rx_t *mme)
{
- return NULL;
+ dbg_assert (ctx);
+ dbg_assert (type < CP_FSM_EVENT_TYPE_NB);
+ cp_fsm_event_mme_t *e;
+ e = slab_alloc (&ctx->fsm.event_mme_cache);
+ e->event.next = NULL;
+ e->event.type = type;
+ e->event.handler = cp_fsm_event_mme_handler;
+ e->mme = mme;
+ return &e->event;
+}
+
+/** Beacon event. */
+struct cp_fsm_event_beacon_t
+{
+ /** Parent event. */
+ cp_fsm_event_t event;
+ /** Associated beacon. */
+ cp_beacon_desc_t *beacon;
+ /** Associated net. */
+ cp_net_t *net;
+ /** Associated STA. */
+ cp_sta_t *sta;
+};
+typedef struct cp_fsm_event_beacon_t cp_fsm_event_beacon_t;
+
+typedef void (*cp_fsm_event_beacon_transition_t) (cp_t *ctx,
+ cp_beacon_desc_t *beacon,
+ cp_net_t *net,
+ cp_sta_t *sta);
+
+void
+cp_fsm_event_beacon_handler (cp_t *ctx, cp_fsm_event_t *event,
+ cp_fsm_transition_t transition)
+{
+ dbg_assert (ctx);
+ dbg_assert_ptr (event);
+ dbg_assert (transition);
+ cp_fsm_event_beacon_transition_t t = transition;
+ cp_fsm_event_beacon_t *event_beacon =
+ PARENT_OF (cp_fsm_event_beacon_t, event, event);
+ /* Call transition. */
+ t (ctx, event_beacon->beacon, event_beacon->net, event_beacon->sta);
}
cp_fsm_event_t *
@@ -55,7 +122,17 @@ cp_fsm_event_beacon_new (cp_t *ctx, cp_fsm_event_type_t type,
cp_beacon_desc_t *beacon, cp_net_t *net,
cp_sta_t *sta)
{
- return NULL;
+ dbg_assert (ctx);
+ dbg_assert (type < CP_FSM_EVENT_TYPE_NB);
+ cp_fsm_event_beacon_t *e;
+ e = slab_alloc (&ctx->fsm.event_beacon_cache);
+ e->event.next = NULL;
+ e->event.type = type;
+ e->event.handler = cp_fsm_event_beacon_handler;
+ e->beacon = beacon;
+ e->net = net;
+ e->sta = sta;
+ return &e->event;
}
void
@@ -64,5 +141,9 @@ cp_fsm_event_init (cp_t *ctx)
dbg_assert (ctx);
slab_cache_init (&ctx->fsm.event_bare_cache, "event_bare",
sizeof (cp_fsm_event_t), NULL);
+ slab_cache_init (&ctx->fsm.event_mme_cache, "event_mme",
+ sizeof (cp_fsm_event_mme_t), NULL);
+ slab_cache_init (&ctx->fsm.event_beacon_cache, "event_beacon",
+ sizeof (cp_fsm_event_beacon_t), NULL);
}