diff options
Diffstat (limited to 'src/host')
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/primitives.h | 25 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/app_mobile.c | 6 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/primitives.c | 31 |
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; |