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]>