Change in libosmo-sccp[master]: M3UA: Reject ASP activation + RKM registration for incompatible traff...

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

laforge gerrit-no-reply at lists.osmocom.org
Tue Oct 29 07:32:21 UTC 2019


laforge has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-sccp/+/15885 )


Change subject: M3UA: Reject ASP activation + RKM registration for incompatible traffic-mode
......................................................................

M3UA: Reject ASP activation + RKM registration for incompatible traffic-mode

If the AS is e.g. configured as broadcast, then individual ASPs cannot
be activated in loadshare or override.  Everyone must agree.

Change-Id: Ic73410fbc88d50710202453f759fa132ce14db4c
---
M include/osmocom/sigtran/osmo_ss7.h
M src/osmo_ss7.c
M src/xua_asp_fsm.c
M src/xua_rkm.c
4 files changed, 44 insertions(+), 4 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/85/15885/1

diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h
index 1b5fc31..11eac81 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -525,6 +525,7 @@
 
 enum osmo_ss7_as_traffic_mode osmo_ss7_tmode_from_xua(uint32_t in);
 int osmo_ss7_tmode_to_xua(enum osmo_ss7_as_traffic_mode tmod);
+bool osmo_ss7_tmode_compatible_xua(enum osmo_ss7_as_traffic_mode tmt, uint32_t m3ua_tmt);
 
 /* VTY related */
 struct vty;
diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index efbceb8..0c1d2c5 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -2059,6 +2059,28 @@
 	}
 }
 
+bool osmo_ss7_tmode_compatible_xua(enum osmo_ss7_as_traffic_mode tmt, uint32_t m3ua_tmt)
+{
+	switch (m3ua_tmt) {
+	case M3UA_TMOD_OVERRIDE:
+		if (tmt == OSMO_SS7_AS_TMOD_OVERRIDE)
+			return true;
+		break;
+	case M3UA_TMOD_LOADSHARE:
+		if (tmt == OSMO_SS7_AS_TMOD_LOADSHARE ||
+		    tmt == OSMO_SS7_AS_TMOD_ROUNDROBIN)
+			return true;
+		break;
+	case M3UA_TMOD_BCAST:
+		if (tmt == OSMO_SS7_AS_TMOD_BCAST)
+			return true;
+		break;
+	default:
+		break;
+	}
+	return false;
+}
+
 static osmo_ss7_asp_rx_unknown_cb *g_osmo_ss7_asp_rx_unknown_cb;
 
 int ss7_asp_rx_unknown(struct osmo_ss7_asp *asp, int ppid_mux, struct msgb *msg)
diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c
index 890a6b5..011156a 100644
--- a/src/xua_asp_fsm.c
+++ b/src/xua_asp_fsm.c
@@ -416,9 +416,8 @@
 	struct xua_asp_fsm_priv *xafp = fi->priv;
 	struct osmo_ss7_asp *asp = xafp->asp;
 	struct xua_msg *xua_in;
-	uint32_t traf_mode;
+	uint32_t traf_mode = 0;
 	struct xua_msg_part *part;
-	uint32_t rctx;
 	int i;
 
 	check_stop_t_ack(fi, event);
@@ -462,11 +461,20 @@
 		}
 		if ((part = xua_msg_find_tag(xua_in, M3UA_IEI_ROUTE_CTX))) {
 			for (i = 0; i < part->len / sizeof(uint32_t); i++) {
-				rctx = osmo_load32be(&part->dat[i * sizeof(uint32_t)]);
-				if (!osmo_ss7_as_find_by_rctx(asp->inst, rctx)) {
+				uint32_t rctx = osmo_load32be(&part->dat[i * sizeof(uint32_t)]);
+				struct osmo_ss7_as *as = osmo_ss7_as_find_by_rctx(asp->inst, rctx);
+				if (!as) {
 					peer_send_error(fi, M3UA_ERR_INVAL_ROUT_CTX);
 					break;
 				}
+				if (traf_mode) { /* if the peer has specified a traffic mode at all */
+					/* Check if given AS(s) are configured for the respective
+					 * traffic mode type; send ERROR if not */
+					if (!osmo_ss7_tmode_compatible_xua(as->cfg.mode, traf_mode)) {
+						peer_send_error(fi, M3UA_ERR_UNSUPP_TRAF_MOD_TYP);
+						break;
+					}
+				}
 			}
 		}
 		/* send ACK */
diff --git a/src/xua_rkm.c b/src/xua_rkm.c
index b3c785f..208f8ae 100644
--- a/src/xua_rkm.c
+++ b/src/xua_rkm.c
@@ -219,6 +219,15 @@
 		}
 		if (!as->cfg.mode_set_by_vty && _tmode)
 			as->cfg.mode = osmo_ss7_tmode_from_xua(_tmode);
+		else if (_tmode) {
+			/* verify if existing AS has same traffic-mode as new request (if any) */
+			if (!osmo_ss7_tmode_compatible_xua(as->cfg.mode, _tmode)) {
+				LOGPASP(asp, DLSS7, LOGL_NOTICE, "RKM: Non-matching Traffic Mode %u\n",
+					_tmode);
+				msgb_append_reg_res(resp, rk_id, M3UA_RKM_REG_ERR_UNSUPP_TRAF_MODE, 0);
+				return -1;
+			}
+		}
 	} else if (asp->inst->cfg.permit_dyn_rkm_alloc) {
 		/* Create an AS for this routing key */
 		snprintf(namebuf, sizeof(namebuf), "as-rkm-%u", rctx);

-- 
To view, visit https://gerrit.osmocom.org/c/libosmo-sccp/+/15885
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Change-Id: Ic73410fbc88d50710202453f759fa132ce14db4c
Gerrit-Change-Number: 15885
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge at osmocom.org>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20191029/720cfa18/attachment.htm>


More information about the gerrit-log mailing list