aboutsummaryrefslogtreecommitdiffstats
path: root/src/proxy_to_home.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/proxy_to_home.c')
-rw-r--r--src/proxy_to_home.c439
1 files changed, 439 insertions, 0 deletions
diff --git a/src/proxy_to_home.c b/src/proxy_to_home.c
new file mode 100644
index 0000000..19dd7fa
--- /dev/null
+++ b/src/proxy_to_home.c
@@ -0,0 +1,439 @@
+
+#include <osmocom/hlr/proxy_mm.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/core/fsm.h>
+#include <osmocom/core/tdef.h>
+
+enum proxy_to_home_fsm_state {
+ PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED,
+ PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT,
+ PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT,
+ PROXY_TO_HOME_ST_IDLE,
+ PROXY_TO_HOME_ST_CLEAR,
+};
+
+static const struct value_string proxy_to_home_fsm_event_names[] = {
+ OSMO_VALUE_STRING(PROXY_TO_HOME_EV_HOME_HLR_RESOLVED),
+ OSMO_VALUE_STRING(PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ),
+ OSMO_VALUE_STRING(PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT),
+ OSMO_VALUE_STRING(PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT),
+ OSMO_VALUE_STRING(PROXY_TO_HOME_EV_CHECK_TUPLES),
+ OSMO_VALUE_STRING(PROXY_TO_HOME_EV_CONFIRM_LU),
+ {}
+};
+
+static struct osmo_fsm proxy_to_home_fsm;
+
+struct osmo_tdef proxy_to_home_tdefs[] = {
+// FIXME
+ { .T=-1, .default_val=5, .desc="proxy_to_home wait_home_hlr_resolved timeout" },
+ { .T=-2, .default_val=5, .desc="proxy_to_home wait_update_location_result timeout" },
+ { .T=-3, .default_val=5, .desc="proxy_to_home wait_send_auth_info_result timeout" },
+ { .T=-4, .default_val=5, .desc="proxy_to_home idle timeout" },
+ { .T=-5, .default_val=5, .desc="proxy_to_home clear timeout" },
+ {}
+};
+
+#if 0
+static const struct osmo_tdef_state_timeout proxy_to_home_fsm_timeouts[32] = {
+// FIXME
+ [PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED] = { .T=-1 },
+ [PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT] = { .T=-2 },
+ [PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT] = { .T=-3 },
+ [PROXY_TO_HOME_ST_IDLE] = { .T=-4 },
+ [PROXY_TO_HOME_ST_CLEAR] = { .T=-5 },
+};
+#endif
+
+#define proxy_to_home_fsm_state_chg(state) \
+ osmo_tdef_fsm_inst_state_chg(fi, state, \
+ proxy_to_home_fsm_timeouts, \
+ proxy_to_home_tdefs, \
+ 5)
+
+void proxy_to_home_wait_home_hlr_resolved_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ // FIXME
+}
+
+static void proxy_to_home_wait_home_hlr_resolved_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+
+ switch (event) {
+
+ case PROXY_TO_HOME_EV_HOME_HLR_RESOLVED:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CHECK_TUPLES:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CONFIRM_LU:
+ // FIXME
+ break;
+
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+static int proxy_to_home_wait_home_hlr_resolved_timeout(struct osmo_fsm_inst *fi)
+{
+ /* Return 1 to terminate FSM instance, 0 to keep running */
+ return 1;
+}
+
+void proxy_to_home_wait_update_location_result_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ // FIXME
+}
+
+static void proxy_to_home_wait_update_location_result_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+
+ switch (event) {
+
+ case PROXY_TO_HOME_EV_HOME_HLR_RESOLVED:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CHECK_TUPLES:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CONFIRM_LU:
+ // FIXME
+ break;
+
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+static int proxy_to_home_wait_update_location_result_timeout(struct osmo_fsm_inst *fi)
+{
+ /* Return 1 to terminate FSM instance, 0 to keep running */
+ return 1;
+}
+
+void proxy_to_home_wait_send_auth_info_result_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ // FIXME
+}
+
+static void proxy_to_home_wait_send_auth_info_result_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+
+ switch (event) {
+
+ case PROXY_TO_HOME_EV_HOME_HLR_RESOLVED:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CHECK_TUPLES:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CONFIRM_LU:
+ // FIXME
+ break;
+
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+static int proxy_to_home_wait_send_auth_info_result_timeout(struct osmo_fsm_inst *fi)
+{
+ /* Return 1 to terminate FSM instance, 0 to keep running */
+ return 1;
+}
+
+void proxy_to_home_idle_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ // FIXME
+}
+
+static void proxy_to_home_idle_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+
+ switch (event) {
+
+ case PROXY_TO_HOME_EV_HOME_HLR_RESOLVED:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CHECK_TUPLES:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CONFIRM_LU:
+ // FIXME
+ break;
+
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+static int proxy_to_home_idle_timeout(struct osmo_fsm_inst *fi)
+{
+ /* Return 1 to terminate FSM instance, 0 to keep running */
+ return 1;
+}
+
+void proxy_to_home_clear_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ // FIXME
+}
+
+static void proxy_to_home_clear_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+
+ switch (event) {
+
+ case PROXY_TO_HOME_EV_HOME_HLR_RESOLVED:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CHECK_TUPLES:
+ // FIXME
+ break;
+
+ case PROXY_TO_HOME_EV_CONFIRM_LU:
+ // FIXME
+ break;
+
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+static int proxy_to_home_clear_timeout(struct osmo_fsm_inst *fi)
+{
+ /* Return 1 to terminate FSM instance, 0 to keep running */
+ return 1;
+}
+
+#define S(x) (1 << (x))
+
+static const struct osmo_fsm_state proxy_to_home_fsm_states[] = {
+ [PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED] = {
+ .name = "wait_home_hlr_resolved",
+ .in_event_mask = 0
+ | S(PROXY_TO_HOME_EV_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ)
+ | S(PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_EV_CHECK_TUPLES)
+ | S(PROXY_TO_HOME_EV_CONFIRM_LU)
+ ,
+ .out_state_mask = 0
+ | S(PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_ST_IDLE)
+ | S(PROXY_TO_HOME_ST_CLEAR)
+ ,
+ .onenter = proxy_to_home_wait_home_hlr_resolved_onenter,
+ .action = proxy_to_home_wait_home_hlr_resolved_action,
+ },
+ [PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT] = {
+ .name = "wait_update_location_result",
+ .in_event_mask = 0
+ | S(PROXY_TO_HOME_EV_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ)
+ | S(PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_EV_CHECK_TUPLES)
+ | S(PROXY_TO_HOME_EV_CONFIRM_LU)
+ ,
+ .out_state_mask = 0
+ | S(PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_ST_IDLE)
+ | S(PROXY_TO_HOME_ST_CLEAR)
+ ,
+ .onenter = proxy_to_home_wait_update_location_result_onenter,
+ .action = proxy_to_home_wait_update_location_result_action,
+ },
+ [PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT] = {
+ .name = "wait_send_auth_info_result",
+ .in_event_mask = 0
+ | S(PROXY_TO_HOME_EV_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ)
+ | S(PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_EV_CHECK_TUPLES)
+ | S(PROXY_TO_HOME_EV_CONFIRM_LU)
+ ,
+ .out_state_mask = 0
+ | S(PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_ST_IDLE)
+ | S(PROXY_TO_HOME_ST_CLEAR)
+ ,
+ .onenter = proxy_to_home_wait_send_auth_info_result_onenter,
+ .action = proxy_to_home_wait_send_auth_info_result_action,
+ },
+ [PROXY_TO_HOME_ST_IDLE] = {
+ .name = "idle",
+ .in_event_mask = 0
+ | S(PROXY_TO_HOME_EV_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ)
+ | S(PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_EV_CHECK_TUPLES)
+ | S(PROXY_TO_HOME_EV_CONFIRM_LU)
+ ,
+ .out_state_mask = 0
+ | S(PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_ST_IDLE)
+ | S(PROXY_TO_HOME_ST_CLEAR)
+ ,
+ .onenter = proxy_to_home_idle_onenter,
+ .action = proxy_to_home_idle_action,
+ },
+ [PROXY_TO_HOME_ST_CLEAR] = {
+ .name = "clear",
+ .in_event_mask = 0
+ | S(PROXY_TO_HOME_EV_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_EV_RX_INSERT_SUBSCRIBER_DATA_REQ)
+ | S(PROXY_TO_HOME_EV_RX_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_EV_RX_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_EV_CHECK_TUPLES)
+ | S(PROXY_TO_HOME_EV_CONFIRM_LU)
+ ,
+ .out_state_mask = 0
+ | S(PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED)
+ | S(PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT)
+ | S(PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT)
+ | S(PROXY_TO_HOME_ST_IDLE)
+ | S(PROXY_TO_HOME_ST_CLEAR)
+ ,
+ .onenter = proxy_to_home_clear_onenter,
+ .action = proxy_to_home_clear_action,
+ },
+};
+
+static int proxy_to_home_fsm_timer_cb(struct osmo_fsm_inst *fi)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ switch (fi->state) {
+
+ case PROXY_TO_HOME_ST_WAIT_HOME_HLR_RESOLVED:
+ return proxy_to_home_wait_home_hlr_resolved_timeout(fi);
+
+ case PROXY_TO_HOME_ST_WAIT_UPDATE_LOCATION_RESULT:
+ return proxy_to_home_wait_update_location_result_timeout(fi);
+
+ case PROXY_TO_HOME_ST_WAIT_SEND_AUTH_INFO_RESULT:
+ return proxy_to_home_wait_send_auth_info_result_timeout(fi);
+
+ case PROXY_TO_HOME_ST_IDLE:
+ return proxy_to_home_idle_timeout(fi);
+
+ case PROXY_TO_HOME_ST_CLEAR:
+ return proxy_to_home_clear_timeout(fi);
+
+ default:
+ /* Return 1 to terminate FSM instance, 0 to keep running */
+ return 1;
+ }
+}
+
+void proxy_to_home_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)
+{
+ //struct proxy_mm *proxy_mm = fi->priv;
+ // FIXME
+}
+
+static struct osmo_fsm proxy_to_home_fsm = {
+ .name = "proxy_to_home",
+ .states = proxy_to_home_fsm_states,
+ .num_states = ARRAY_SIZE(proxy_to_home_fsm_states),
+ .log_subsys = DLGLOBAL, // FIXME
+ .event_names = proxy_to_home_fsm_event_names,
+ .timer_cb = proxy_to_home_fsm_timer_cb,
+ .cleanup = proxy_to_home_fsm_cleanup,
+};
+
+static __attribute__((constructor)) void proxy_to_home_fsm_register(void)
+{
+ OSMO_ASSERT(osmo_fsm_register(&proxy_to_home_fsm) == 0);
+}