summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-11-16 08:17:34 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-12-03 12:58:52 +0000
commit88060f462cde2e3e6f4fc3cbf9c3708083e27dac (patch)
tree7401789e15255950ad7b73287384c2b08cad452e
parenta8726d977a67459e7bf314b4b69283f65e45cbf0 (diff)
mobile: Directly inform the primitive layer about an event
Forward started/shutdown changes to the primitive layer which will turn them into indications. The other option might be to use the signals but it seems primitives are a superset of the signals. The notify will be done per MS and then the right primitive instance will be searched and the indication be sent. The approach will be applied to other systems as well. The signal framework might be seen as a subset of the primitives A signal mostly being a different form of an indication. Change-Id: I5df20a4ab79c06b515780675b6df2929aa976f0d
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/primitives.h25
-rw-r--r--src/host/layer23/src/mobile/app_mobile.c6
-rw-r--r--src/host/layer23/src/mobile/primitives.c31
3 files changed, 61 insertions, 1 deletions
diff --git a/src/host/layer23/include/osmocom/bb/mobile/primitives.h b/src/host/layer23/include/osmocom/bb/mobile/primitives.h
index a3168b2e..4d81ba10 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/primitives.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/primitives.h
@@ -14,6 +14,8 @@ struct mobile_prim;
enum mobile_prims {
PRIM_MOB_TIMER,
PRIM_MOB_TIMER_CANCEL,
+ PRIM_MOB_STARTED,
+ PRIM_MOB_SHUTDOWN,
};
struct mobile_prim_intf {
@@ -21,6 +23,7 @@ struct mobile_prim_intf {
void (*indication)(struct mobile_prim_intf *, struct mobile_prim *prim);
/* Internal state */
+ struct llist_head entry;
struct llist_head timers;
};
@@ -33,16 +36,36 @@ struct mobile_timer_param {
int seconds; /*!< Seconds the timer should fire in */
};
+/**
+ * Primitive to indicate starting of the mobile.
+ */
+struct mobile_started_param {
+ bool started;
+};
+
+/**
+ * Primitive to indicate shutdown of the mobile. It will go through
+ * various states.
+ */
+struct mobile_shutdown_param {
+ int old_state;
+ int new_state;
+};
+
struct mobile_prim {
struct osmo_prim_hdr hdr; /*!< Primitive base class */
union {
struct mobile_timer_param timer;
+ struct mobile_started_param started;
+ struct mobile_shutdown_param shutdown;
} u;
};
-
struct mobile_prim_intf *mobile_prim_intf_alloc(struct osmocom_ms *ms);
int mobile_prim_intf_req(struct mobile_prim_intf *intf, struct mobile_prim *hdr);
void mobile_prim_intf_free(struct mobile_prim_intf *intf);
struct mobile_prim *mobile_prim_alloc(unsigned int primitive, enum osmo_prim_operation op);
+
+void mobile_prim_ntfy_started(struct osmocom_ms *ms, bool started);
+void mobile_prim_ntfy_shutdown(struct osmocom_ms *ms, int old_state, int new_state); \ No newline at end of file
diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c
index b2900ad5..6e1fffb8 100644
--- a/src/host/layer23/src/mobile/app_mobile.c
+++ b/src/host/layer23/src/mobile/app_mobile.c
@@ -37,6 +37,7 @@
#include <osmocom/bb/mobile/app_mobile.h>
#include <osmocom/bb/mobile/mncc.h>
#include <osmocom/bb/mobile/voice.h>
+#include <osmocom/bb/mobile/primitives.h>
#include <osmocom/bb/common/sap_interface.h>
#include <osmocom/vty/logging.h>
#include <osmocom/vty/telnet_interface.h>
@@ -492,9 +493,14 @@ int l23_app_init(int (*mncc_recv)(struct osmocom_ms *ms, int, void *),
void mobile_set_started(struct osmocom_ms *ms, bool state)
{
ms->started = state;
+
+ mobile_prim_ntfy_started(ms, state);
}
void mobile_set_shutdown(struct osmocom_ms *ms, int state)
{
+ int old_state = ms->shutdown;
ms->shutdown = state;
+
+ mobile_prim_ntfy_shutdown(ms, old_state, state);
}
diff --git a/src/host/layer23/src/mobile/primitives.c b/src/host/layer23/src/mobile/primitives.c
index efa7f3ff..dde34bcc 100644
--- a/src/host/layer23/src/mobile/primitives.c
+++ b/src/host/layer23/src/mobile/primitives.c
@@ -24,6 +24,8 @@
#include <osmocom/core/timer.h>
#include <osmocom/core/talloc.h>
+static LLIST_HEAD(s_prims);
+
struct timer_closure {
struct llist_head entry;
struct mobile_prim_intf *intf;
@@ -39,6 +41,7 @@ struct mobile_prim_intf *mobile_prim_intf_alloc(struct osmocom_ms *ms)
intf->ms = ms;
INIT_LLIST_HEAD(&intf->timers);
+ llist_add_tail(&intf->entry, &s_prims);
return intf;
}
@@ -51,6 +54,7 @@ void mobile_prim_intf_free(struct mobile_prim_intf *intf)
llist_del(&timer->entry);
talloc_free(timer);
}
+ llist_del(&intf->entry);
talloc_free(intf);
}
@@ -95,6 +99,33 @@ static int create_timer(struct mobile_prim_intf *intf, struct mobile_timer_param
return 0;
}
+static void dispatch(struct osmocom_ms *ms, struct mobile_prim *prim)
+{
+ struct mobile_prim_intf *intf, *tmp;
+
+ llist_for_each_entry_safe(intf, tmp, &s_prims, entry) {
+ if (intf->ms == ms)
+ intf->indication(intf, prim);
+ }
+}
+
+void mobile_prim_ntfy_started(struct osmocom_ms *ms, bool started)
+{
+ struct mobile_prim *prim = mobile_prim_alloc(PRIM_MOB_STARTED, PRIM_OP_INDICATION);
+
+ prim->u.started.started = started;
+ dispatch(ms, prim);
+}
+
+void mobile_prim_ntfy_shutdown(struct osmocom_ms *ms, int old_state, int new_state)
+{
+ struct mobile_prim *prim = mobile_prim_alloc(PRIM_MOB_SHUTDOWN, PRIM_OP_INDICATION);
+
+ prim->u.shutdown.old_state = old_state;
+ prim->u.shutdown.new_state = new_state;
+ dispatch(ms, prim);
+}
+
static int cancel_timer(struct mobile_prim_intf *intf, struct mobile_timer_param *param)
{
struct timer_closure *closure;