pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-sigtran/+/42055?usp=email )


Change subject: Refactor xua_layer_manager object
......................................................................

Refactor xua_layer_manager object

Several changes to improve separation of the LM object and its
lifecycle:
* Store in ss7_asp a pointer to a xua_layer_manager, which contains all
  implementation dependent information inside its priv pointer.
* Add a new free_func field to the xua_layer_manager struct in order to
  be able to free it without knowing how it was allocated.
* Get rid og the loglevel param, LOGL_DEBUG was always passed and that
  was actually an implementation specific detail of the default xua
  layer manager.
* Pass pointer to function to be called by LM to submit primitives to
  M3UA.
Change-Id: Ia96ebf40444f46ad718d61befbecb523f267fd6c

Change-Id: I5b101d3afa41712d895815b467eae58f52922476
---
M include/osmocom/sigtran/osmo_ss7.h
M src/ss7_asp.c
M src/ss7_asp.h
M src/xua_default_lm_fsm.c
4 files changed, 55 insertions(+), 47 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran 
refs/changes/55/42055/1

diff --git a/include/osmocom/sigtran/osmo_ss7.h 
b/include/osmocom/sigtran/osmo_ss7.h
index 9ea929f..162994e 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -295,7 +295,6 @@
 void osmo_ss7_asp_destroy(struct osmo_ss7_asp *asp);
 int osmo_ss7_asp_send(struct osmo_ss7_asp *asp, struct msgb *msg);
 int osmo_ss7_asp_restart(struct osmo_ss7_asp *asp);
-int osmo_ss7_asp_use_default_lm(struct osmo_ss7_asp *asp, int log_level);
 bool osmo_ss7_asp_active(const struct osmo_ss7_asp *asp);
 int osmo_ss7_asp_get_log_subsys(const struct osmo_ss7_asp *asp);
 const char *osmo_ss7_asp_get_name(const struct osmo_ss7_asp *asp);
diff --git a/src/ss7_asp.c b/src/ss7_asp.c
index ded2c67..6071317 100644
--- a/src/ss7_asp.c
+++ b/src/ss7_asp.c
@@ -758,7 +758,11 @@
                osmo_stream_cli_destroy(asp->client);
        if (asp->fi)
                osmo_fsm_inst_term(asp->fi, OSMO_FSM_TERM_REQUEST, NULL);
-       osmo_ss7_asp_remove_default_lm(asp);
+       if (asp->lm) {
+               if (asp->lm->free_func)
+                       asp->lm->free_func(asp->lm);
+               asp->lm = NULL;
+       }

        /* Unlink from all ASs we are part of.
         * Some RKM-dynamically allocated ASs may be freed as a result from 
this: */
@@ -907,14 +911,18 @@
                OSMO_ASSERT(!asp->fi);
        }

+       /* Remove existing LayerManager: */
+       if (asp->lm) {
+               if (asp->lm->free_func)
+                       asp->lm->free_func(asp->lm);
+               asp->lm = NULL;
+       }
+
        /* Apply default LM FSM for client ASP */
        if (asp->cfg.proto != OSMO_SS7_ASP_PROT_IPA &&
            asp->cfg.role == OSMO_SS7_ASP_ROLE_ASP &&
-           !asp->cfg.is_server) {
-               osmo_ss7_asp_use_default_lm(asp, LOGL_DEBUG);
-       } else {
-               osmo_ss7_asp_remove_default_lm(asp);
-       }
+           !asp->cfg.is_server)
+               asp->lm = xua_layer_manager_default_alloc(asp);

        if ((rc = xua_asp_fsm_start(asp, LOGL_DEBUG)) < 0)
                return rc;
diff --git a/src/ss7_asp.h b/src/ss7_asp.h
index 0e156f2..459163f 100644
--- a/src/ss7_asp.h
+++ b/src/ss7_asp.h
@@ -21,11 +21,15 @@
 struct osmo_ss7_instance;

 struct osmo_xua_layer_manager {
-       /* oph: {sap: XUA_SAP_LM, prim: enum osmo_xlm_prim_type},
+       /* Submit primitives M3UA -> LM:
+        * oph: {sap: XUA_SAP_LM, prim: enum osmo_xlm_prim_type},
         * cb_data: (struct osmo_ss7_asp *)
         */
        osmo_prim_cb prim_cb;
+       void (*free_func)(struct osmo_xua_layer_manager *lm);
+       void *priv;
 };
+struct osmo_xua_layer_manager *xua_layer_manager_default_alloc(struct 
osmo_ss7_asp *asp);

 enum ss7_asp_xua_timer {
        /* 0 kept unused on purpose since it's handled specially by osmo_fsm */
@@ -77,8 +81,7 @@
        bool remote_asp_id_present;

        /* Layer Manager to which we talk */
-       const struct osmo_xua_layer_manager *lm;
-       void *lm_priv;
+       struct osmo_xua_layer_manager *lm;

        /*! Were we dynamically allocated */
        bool dyn_allocated;
@@ -180,7 +183,6 @@
 int ss7_asp_apply_drop_local_address(const struct osmo_ss7_asp *asp, unsigned 
int loc_idx);

 void ss7_asp_restart_after_reconfigure(struct osmo_ss7_asp *asp);
-void osmo_ss7_asp_remove_default_lm(struct osmo_ss7_asp *asp);

 unsigned int ss7_asp_get_all_rctx(const struct osmo_ss7_asp *asp, uint32_t 
*rctx, unsigned int rctx_size,
                                  const struct osmo_ss7_as *excl_as);
diff --git a/src/xua_default_lm_fsm.c b/src/xua_default_lm_fsm.c
index 92a6ea2..aa60db2 100644
--- a/src/xua_default_lm_fsm.c
+++ b/src/xua_default_lm_fsm.c
@@ -116,14 +116,15 @@
        [S_ACTIVE]      = { },
 };

-struct lm_fsm_priv {
+struct xua_layer_manager_default_priv {
        struct osmo_ss7_asp *asp;
+       struct osmo_fsm_inst *fi;
 };

 #define lm_fsm_state_chg(fi, NEXT_STATE) \
        osmo_tdef_fsm_inst_state_chg(fi, NEXT_STATE, \
                                     lm_fsm_timeouts, \
-                                   ((struct lm_fsm_priv 
*)(fi->priv))->asp->cfg.T_defs_lm, \
+                                   ((struct xua_layer_manager_default_priv 
*)(fi->priv))->asp->cfg.T_defs_lm, \
                                     -1)
 
 static struct osmo_ss7_as *find_first_as_in_asp(struct osmo_ss7_asp *asp)
@@ -144,7 +145,7 @@
 /* handle an incoming RKM registration response */
 static int handle_reg_conf(struct osmo_fsm_inst *fi, uint32_t l_rk_id, 
uint32_t rctx)
 {
-       struct lm_fsm_priv *lmp = fi->priv;
+       struct xua_layer_manager_default_priv *lmp = fi->priv;
        struct osmo_ss7_asp *asp = lmp->asp;
        struct osmo_ss7_as *as;

@@ -162,7 +163,7 @@

 static void lm_idle(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
-       struct lm_fsm_priv *lmp = fi->priv;
+       struct xua_layer_manager_default_priv *lmp = fi->priv;

        switch (event) {
        case LM_E_SCTP_EST_IND:
@@ -187,7 +188,7 @@

 static int lm_timer_cb(struct osmo_fsm_inst *fi)
 {
-       struct lm_fsm_priv *lmp = fi->priv;
+       struct xua_layer_manager_default_priv *lmp = fi->priv;
        struct osmo_xlm_prim *prim;
        struct osmo_ss7_as *as;

@@ -238,7 +239,7 @@

 static void lm_wait_notify(struct osmo_fsm_inst *fi, uint32_t event, void 
*data)
 {
-       struct lm_fsm_priv *lmp = fi->priv;
+       struct xua_layer_manager_default_priv *lmp = fi->priv;
        struct osmo_xlm_prim *oxp = data;

        switch (event) {
@@ -271,7 +272,7 @@

 static void lm_rkm_reg(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
-       struct lm_fsm_priv *lmp = fi->priv;
+       struct xua_layer_manager_default_priv *lmp = fi->priv;
        struct osmo_xlm_prim *oxp;
        int rc;

@@ -298,7 +299,7 @@

 static void lm_active(struct osmo_fsm_inst *fi, uint32_t event, void *data)
 {
-       struct lm_fsm_priv *lmp = fi->priv;
+       struct xua_layer_manager_default_priv *lmp = fi->priv;
        struct osmo_xlm_prim *oxp;

        switch (event) {
@@ -396,7 +397,8 @@
 static int default_lm_prim_cb(struct osmo_prim_hdr *oph, void *_asp)
 {
        struct osmo_ss7_asp *asp = _asp;
-       struct osmo_fsm_inst *fi = asp->lm_priv;
+       struct xua_layer_manager_default_priv *lmp = asp->lm->priv;
+       struct osmo_fsm_inst *fi = lmp->fi;
        uint32_t event = osmo_event_for_prim(oph, lm_event_map);
        char *prim_name = osmo_xlm_prim_name(oph);

@@ -412,42 +414,39 @@
        return 0;
 }

-static const struct osmo_xua_layer_manager default_layer_manager = {
-       .prim_cb = default_lm_prim_cb,
-};
-
-void osmo_ss7_asp_remove_default_lm(struct osmo_ss7_asp *asp)
+void xua_layer_manager_default_free(struct osmo_xua_layer_manager *lm)
 {
-       if (!asp->lm_priv)
+       if (!lm)
                return;
-       osmo_fsm_inst_term(asp->lm_priv, OSMO_FSM_TERM_ERROR, NULL);
-       asp->lm_priv = NULL;
+       if (lm->priv) {
+               struct xua_layer_manager_default_priv *lmp = lm->priv;
+               osmo_fsm_inst_term(lmp->fi, OSMO_FSM_TERM_ERROR, NULL);
+               talloc_free(lmp);
+               lm->priv = NULL;
+       }
+       talloc_free(lm);
 }

-int osmo_ss7_asp_use_default_lm(struct osmo_ss7_asp *asp, int log_level)
+struct osmo_xua_layer_manager *xua_layer_manager_default_alloc(struct 
osmo_ss7_asp *asp)
 {
-       struct lm_fsm_priv *lmp;
-       struct osmo_fsm_inst *fi;
+       struct osmo_xua_layer_manager *lm;
+       struct xua_layer_manager_default_priv *lmp;

-       if (asp->lm_priv) {
-               osmo_fsm_inst_term(asp->lm_priv, OSMO_FSM_TERM_ERROR, NULL);
-               asp->lm_priv = NULL;
-       }
+       lm = talloc_zero(asp, struct osmo_xua_layer_manager);
+       OSMO_ASSERT(lm);

-       fi = osmo_fsm_inst_alloc(&xua_default_lm_fsm, asp, NULL, log_level, 
asp->cfg.name);
-       if (!fi)
-               return -EINVAL;
-
-       lmp = talloc_zero(fi, struct lm_fsm_priv);
-       if (!lmp) {
-               osmo_fsm_inst_term(fi, OSMO_FSM_TERM_ERROR, NULL);
-               return -ENOMEM;
-       }
+       lmp = talloc_zero(lm, struct xua_layer_manager_default_priv);
+       OSMO_ASSERT(lmp);
        lmp->asp = asp;
-       fi->priv = lmp;
+       lmp->fi = osmo_fsm_inst_alloc(&xua_default_lm_fsm, lmp, lmp, 
LOGL_DEBUG, asp->cfg.name);
+       if (!lmp->fi) {
+               talloc_free(lm);
+               return NULL;
+       }

-       asp->lm = &default_layer_manager;
-       asp->lm_priv = fi;
+       lm->prim_cb = default_lm_prim_cb;
+       lm->free_func = xua_layer_manager_default_free;
+       lm->priv = lmp;

        return 0;
 }

--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/42055?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: newchange
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I5b101d3afa41712d895815b467eae58f52922476
Gerrit-Change-Number: 42055
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>

Reply via email to