diff options
Diffstat (limited to 'src/host/layer23/src')
-rw-r--r-- | src/host/layer23/src/mobile/app_mobile.c | 6 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/primitives.c | 31 |
2 files changed, 37 insertions, 0 deletions
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; |