pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/libosmo-sigtran/+/39398?usp=email )
Change subject: Pass xua_msg down to xua_as_transmit_msg
......................................................................
Pass xua_msg down to xua_as_transmit_msg
This finally allows having access to msg values such as OPC and SLS at
the point in code where decision is taken to route the message to one
ASP inside the AS.
This will be needed to properly implemented ASP loadsharing within an
AS.
Change-Id: I70e5d33c7537dc0b72b5abced876e69018cc0829
---
M src/ipa.c
M src/m3ua.c
M src/sua.c
M src/xua_as_fsm.c
M src/xua_as_fsm.h
M src/xua_internal.h
M src/xua_msg.h
7 files changed, 60 insertions(+), 51 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran refs/changes/98/39398/1
diff --git a/src/ipa.c b/src/ipa.c
index ac0cf3a..27b752d 100644
--- a/src/ipa.c
+++ b/src/ipa.c
@@ -52,7 +52,7 @@
#include "ss7_internal.h"
#include "xua_asp_fsm.h"
-static struct msgb *ipa_to_msg(struct xua_msg *xua)
+struct msgb *ipa_to_msg(struct xua_msg *xua)
{
struct xua_msg_part *data_ie;
struct m3ua_data_hdr *data_hdr;
@@ -100,17 +100,9 @@
*/
int ipa_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua)
{
- struct msgb *msg;
OSMO_ASSERT(as->cfg.proto == OSMO_SS7_ASP_PROT_IPA);
- msg = ipa_to_msg(xua);
- xua_msg_free(xua);
- if (!msg) {
- LOGPAS(as, DLSS7, LOGL_ERROR, "Error encoding IPA Msg\n");
- return -1;
- }
-
- return xua_as_transmit_msg(as, msg);
+ return xua_as_transmit_msg(as, xua);
}
static int ipa_rx_msg_ccm(struct osmo_ss7_asp *asp, struct msgb *msg)
diff --git a/src/m3ua.c b/src/m3ua.c
index 69910fb..d0cf604 100644
--- a/src/m3ua.c
+++ b/src/m3ua.c
@@ -473,7 +473,7 @@
***********************************************************************/
/* Convert M3UA from xua_msg to msgb and set PPID/stream */
-static struct msgb *m3ua_to_msg(struct xua_msg *xua)
+struct msgb *m3ua_to_msg(struct xua_msg *xua)
{
struct msgb *msg = xua_to_msg(M3UA_VERSION, xua);
@@ -520,7 +520,6 @@
*/
int m3ua_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua)
{
- struct msgb *msg;
int rc;
OSMO_ASSERT(as->cfg.proto == OSMO_SS7_ASP_PROT_M3UA);
@@ -529,18 +528,11 @@
if (as->cfg.routing_key.context)
xua_msg_add_u32(xua, M3UA_IEI_ROUTE_CTX, as->cfg.routing_key.context);
- msg = m3ua_to_msg(xua);
- xua_msg_free(xua);
- if (!msg) {
- LOGPAS(as, DLM3UA, LOGL_ERROR, "Error encoding M3UA Msg\n");
- return -1;
- }
-
/* send the msg to the AS for transmission. The AS FSM might
* (depending on its state) enqueue it before transmission */
- rc = osmo_fsm_inst_dispatch(as->fi, XUA_AS_E_TRANSFER_REQ, msg);
+ rc = osmo_fsm_inst_dispatch(as->fi, XUA_AS_E_TRANSFER_REQ, xua);
if (rc < 0)
- msgb_free(msg);
+ xua_msg_free(xua);
return rc;
}
diff --git a/src/sua.c b/src/sua.c
index 79e8567..d6e52e9 100644
--- a/src/sua.c
+++ b/src/sua.c
@@ -310,7 +310,6 @@
* \return 0 on success; negative on error */
int sua_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua)
{
- struct msgb *msg;
int rc;
OSMO_ASSERT(as->cfg.proto == OSMO_SS7_ASP_PROT_SUA);
@@ -319,18 +318,11 @@
if (as->cfg.routing_key.context)
xua_msg_add_u32(xua, SUA_IEI_ROUTE_CTX, as->cfg.routing_key.context);
- msg = sua_to_msg(xua);
- xua_msg_free(xua);
- if (!msg) {
- LOGPAS(as, DLSUA, LOGL_ERROR, "Error encoding SUA Msg\n");
- return -1;
- }
-
/* send the msg to the AS for transmission. The AS FSM might
* (depending on its state) enqueue it before transmission */
- rc = osmo_fsm_inst_dispatch(as->fi, XUA_AS_E_TRANSFER_REQ, msg);
+ rc = osmo_fsm_inst_dispatch(as->fi, XUA_AS_E_TRANSFER_REQ, xua);
if (rc < 0)
- msgb_free(msg);
+ xua_msg_free(xua);
return rc;
}
diff --git a/src/xua_as_fsm.c b/src/xua_as_fsm.c
index 6517f73..5c2c5e0 100644
--- a/src/xua_as_fsm.c
+++ b/src/xua_as_fsm.c
@@ -99,13 +99,29 @@
return -1;
}
-int xua_as_transmit_msg_broadcast(struct osmo_ss7_as *as, struct msgb *msg)
+static struct msgb *xua_as_encode_msg(const struct osmo_ss7_as *as, struct xua_msg *xua)
+{
+ switch (as->cfg.proto) {
+ case OSMO_SS7_ASP_PROT_M3UA:
+ return m3ua_to_msg(xua);
+ case OSMO_SS7_ASP_PROT_IPA:
+ return ipa_to_msg(xua);
+ default:
+ OSMO_ASSERT(0);
+ }
+}
+
+int xua_as_transmit_msg_broadcast(struct osmo_ss7_as *as, struct xua_msg *xua)
{
struct osmo_ss7_asp *asp;
unsigned int i;
+ struct msgb *msg;
struct msgb *msg_cpy;
bool sent = false;
+ msg = xua_as_encode_msg(as, xua);
+ OSMO_ASSERT(msg);
+
for (i = 0; i < ARRAY_SIZE(as->cfg.asps); i++) {
asp = as->cfg.asps[i];
if (!asp || !osmo_ss7_asp_active(asp))
@@ -116,35 +132,41 @@
}
msgb_free(msg);
+ xua_msg_free(xua);
return sent ? 0 : -1;
}
/* actually transmit a message through this AS */
-int xua_as_transmit_msg(struct osmo_ss7_as *as, struct msgb *msg)
+int xua_as_transmit_msg(struct osmo_ss7_as *as, struct xua_msg *xua)
{
struct osmo_ss7_asp *asp = NULL;
+ struct msgb *msg;
switch (as->cfg.mode) {
case OSMO_SS7_AS_TMOD_OVERRIDE:
case OSMO_SS7_AS_TMOD_LOADSHARE:
/* TODO: OSMO_SS7_AS_TMOD_LOADSHARE: actually use the SLS value
- * to ensure same SLS goes through same ASP. Not strictly
- * required by M3UA RFC, but would fit the overall principle. */
+ * in xua->mtp.sls to ensure same SLS goes through same ASP. Not
+ * strictly required by M3UA RFC, but would fit the overall
+ * principle. */
case OSMO_SS7_AS_TMOD_ROUNDROBIN:
asp = osmo_ss7_as_select_asp(as);
break;
case OSMO_SS7_AS_TMOD_BCAST:
- return xua_as_transmit_msg_broadcast(as, msg);
+ return xua_as_transmit_msg_broadcast(as, xua);
case _NUM_OSMO_SS7_ASP_TMOD:
OSMO_ASSERT(false);
}
if (!asp) {
LOGPFSM(as->fi, "No ASP in AS, dropping message\n");
- msgb_free(msg);
+ xua_msg_free(xua);
return -1;
}
+ msg = xua_as_encode_msg(as, xua);
+ OSMO_ASSERT(msg);
+ xua_msg_free(xua);
return osmo_ss7_asp_send(asp, msg);
}
@@ -170,7 +192,7 @@
struct osmo_ss7_as *as;
struct {
struct osmo_timer_list t_r;
- struct llist_head queued_msgs;
+ struct llist_head queued_xua_msgs;
} recovery;
bool ipa_route_created;
};
@@ -424,7 +446,7 @@
{
struct xua_as_fsm_priv *xafp = (struct xua_as_fsm_priv *) fi->priv;
struct osmo_ss7_asp *asp;
- struct msgb *msg;
+ struct xua_msg *xua;
switch (event) {
case XUA_ASPAS_ASP_DOWN_IND:
@@ -449,8 +471,8 @@
break;
case XUA_AS_E_TRANSFER_REQ:
/* message for transmission */
- msg = data;
- xua_as_transmit_msg(xafp->as, msg);
+ xua = data;
+ xua_as_transmit_msg(xafp->as, xua);
break;
}
}
@@ -458,7 +480,7 @@
static void xua_as_fsm_pending(struct osmo_fsm_inst *fi, uint32_t event, void *data)
{
struct xua_as_fsm_priv *xafp = (struct xua_as_fsm_priv *) fi->priv;
- struct msgb *msg;
+ struct xua_msg *xua;
switch (event) {
case XUA_ASPAS_ASP_ACTIVE_IND:
@@ -466,8 +488,12 @@
osmo_timer_del(&xafp->recovery.t_r);
osmo_fsm_inst_state_chg(fi, XUA_AS_S_ACTIVE, 0, 0);
/* push out any pending queued messages */
- while ((msg = msgb_dequeue(&xafp->recovery.queued_msgs)))
- xua_as_transmit_msg(xafp->as, msg);
+ while (!llist_empty(&xafp->recovery.queued_xua_msgs)) {
+ struct xua_msg *xua;
+ xua = llist_first_entry(&xafp->recovery.queued_xua_msgs, struct xua_msg,
entry);
+ llist_del(&xua->entry);
+ xua_as_transmit_msg(xafp->as, xua);
+ }
break;
case XUA_ASPAS_ASP_INACTIVE_IND:
/* ignore */
@@ -477,8 +503,12 @@
break;
case XUA_AS_E_RECOVERY_EXPD:
LOGPFSM(fi, "T(r) expired; dropping queued messages\n");
- while ((msg = msgb_dequeue(&xafp->recovery.queued_msgs)))
- talloc_free(msg);
+ while (!llist_empty(&xafp->recovery.queued_xua_msgs)) {
+ struct xua_msg *xua;
+ xua = llist_first_entry(&xafp->recovery.queued_xua_msgs, struct xua_msg,
entry);
+ llist_del(&xua->entry);
+ xua_msg_free(xua);
+ }
if (check_any_other_asp_not_down(xafp->as, NULL))
osmo_fsm_inst_state_chg(fi, XUA_AS_S_INACTIVE, 0, 0);
else
@@ -486,8 +516,8 @@
break;
case XUA_AS_E_TRANSFER_REQ:
/* enqueue the to-be-transferred message */
- msg = data;
- msgb_enqueue(&xafp->recovery.queued_msgs, msg);
+ xua = data;
+ llist_add_tail(&xua->entry, &xafp->recovery.queued_xua_msgs);
break;
}
}
@@ -575,7 +605,7 @@
xafp->as = as;
xafp->recovery.t_r.cb = t_r_callback;
xafp->recovery.t_r.data = fi;
- INIT_LLIST_HEAD(&xafp->recovery.queued_msgs);
+ INIT_LLIST_HEAD(&xafp->recovery.queued_xua_msgs);
fi->priv = xafp;
diff --git a/src/xua_as_fsm.h b/src/xua_as_fsm.h
index 0e71350..6d7d762 100644
--- a/src/xua_as_fsm.h
+++ b/src/xua_as_fsm.h
@@ -14,7 +14,7 @@
XUA_ASPAS_ASP_DOWN_IND,
XUA_ASPAS_ASP_ACTIVE_IND,
XUA_AS_E_RECOVERY_EXPD,
- XUA_AS_E_TRANSFER_REQ,
+ XUA_AS_E_TRANSFER_REQ, /* param: struct xua_msg*, ownsership transferred. */
};
extern struct osmo_fsm xua_as_fsm;
diff --git a/src/xua_internal.h b/src/xua_internal.h
index 4f6e931..926c511 100644
--- a/src/xua_internal.h
+++ b/src/xua_internal.h
@@ -33,6 +33,7 @@
struct osmo_mtp_prim *m3ua_to_xfer_ind(struct xua_msg *xua);
int m3ua_hmdc_rx_from_l2(struct osmo_ss7_instance *inst, struct xua_msg *xua);
+struct msgb *m3ua_to_msg(struct xua_msg *xua);
int m3ua_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua);
void m3ua_tx_snm_available(struct osmo_ss7_asp *asp, const uint32_t *rctx, unsigned int
num_rctx,
const uint32_t *aff_pc, unsigned int num_aff_pc,
@@ -113,11 +114,12 @@
#define PC_STR "Point Code\n"
#define INST_STR "An instance of the SS7 stack\n"
-int xua_as_transmit_msg(struct osmo_ss7_as *as, struct msgb *msg);
+int xua_as_transmit_msg(struct osmo_ss7_as *as, struct xua_msg *xua);
int xua_find_as_for_asp(struct osmo_ss7_as **as, const struct osmo_ss7_asp *asp,
const struct xua_msg_part *rctx_ie);
+struct msgb *ipa_to_msg(struct xua_msg *xua);
int ipa_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua);
int ipa_rx_msg(struct osmo_ss7_asp *asp, struct msgb *msg, uint8_t sls);
struct osmo_ss7_as *ipa_find_as_for_asp(struct osmo_ss7_asp *asp);
diff --git a/src/xua_msg.h b/src/xua_msg.h
index 5f877ed..79af86f 100644
--- a/src/xua_msg.h
+++ b/src/xua_msg.h
@@ -29,6 +29,7 @@
struct osmo_sccp_gt;
struct xua_msg {
+ struct llist_head entry; /* Allows queueing a xua_msg into a llist */
struct xua_common_hdr hdr;
struct osmo_mtp_transfer_param mtp;
--
To view, visit
https://gerrit.osmocom.org/c/libosmo-sigtran/+/39398?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: I70e5d33c7537dc0b72b5abced876e69018cc0829
Gerrit-Change-Number: 39398
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>