pespin has submitted this change. (
https://gerrit.osmocom.org/c/libosmo-sigtran/+/42529?usp=email )
Change subject: xua: Split traffic mode readonly validation from internal state
update
......................................................................
xua: Split traffic mode readonly validation from internal state update
First validate the whole message, then once evyerthing is fine, act on
the message updating internal state.
Change-Id: I05ba891e774ebe341229b968c92e0383b6899bd6
---
M src/xua_asp_fsm.c
M src/xua_rkm.c
2 files changed, 31 insertions(+), 16 deletions(-)
Approvals:
laforge: Looks good to me, but someone else must approve
Jenkins Builder: Verified
osmith: Looks good to me, but someone else must approve
pespin: Looks good to me, approved
diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c
index 913f0e8..5cb28fc 100644
--- a/src/xua_asp_fsm.c
+++ b/src/xua_asp_fsm.c
@@ -641,6 +641,7 @@
struct xua_asp_fsm_priv *xafp = fi->priv;
struct osmo_ss7_asp *asp = xafp->asp;
struct osmo_ss7_as *as;
+ struct ss7_as_asp_assoc *assoc;
struct xua_msg_part *asp_id_ie;
struct xua_msg *xua_in;
uint32_t traf_mode = 0;
@@ -715,8 +716,16 @@
}
if (traf_mode) { /* if the peer has specified a traffic mode at
all */
+ /* First validate peer not trying to establish an
incompatible traffic mode: */
+ llist_for_each_entry(assoc, &asp->assoc_as_list,
asp_entry) {
+ if
(!osmo_ss7_as_tmode_compatible_xua(assoc->as, traf_mode)) {
+ peer_send_error(fi,
M3UA_ERR_UNSUPP_TRAF_MOD_TYP);
+ return;
+ }
+ }
+
+ /* Update traffic mode in all AS associated with the
ASP: */
enum osmo_ss7_as_traffic_mode tmode =
osmo_ss7_tmode_from_xua(traf_mode);
- struct ss7_as_asp_assoc *assoc;
llist_for_each_entry(assoc, &asp->assoc_as_list,
asp_entry) {
as = assoc->as;
if (!as->cfg.mode_set_by_peer &&
!as->cfg.mode_set_by_vty) {
@@ -724,9 +733,6 @@
LOGPAS(as, DLSS7, LOGL_INFO,
"ASPAC: Traffic mode set
dynamically by peer to %s\n",
osmo_ss7_as_traffic_mode_name(as->cfg.mode));
- } else if
(!osmo_ss7_as_tmode_compatible_xua(as, traf_mode)) {
- peer_send_error(fi,
M3UA_ERR_UNSUPP_TRAF_MOD_TYP);
- return;
}
as->cfg.mode_set_by_peer = true;
}
diff --git a/src/xua_rkm.c b/src/xua_rkm.c
index 22bcafe..d6dfa51 100644
--- a/src/xua_rkm.c
+++ b/src/xua_rkm.c
@@ -172,6 +172,7 @@
uint32_t rk_id, rctx, _tmode, dpc;
enum osmo_ss7_as_traffic_mode tmode;
struct osmo_ss7_as *as;
+ struct ss7_as_asp_assoc *assoc;
struct osmo_ss7_route *rt;
char namebuf[32];
bool as_already_in_array;
@@ -264,19 +265,27 @@
}
if (_tmode) { /* if the peer has specified a traffic mode at
all */
tmode = osmo_ss7_tmode_from_xua(_tmode);
- if (!as->cfg.mode_set_by_peer &&
!as->cfg.mode_set_by_vty) {
- as->cfg.mode = tmode;
- LOGPAS(as, DLSS7, LOGL_INFO,
- "RKM: Traffic mode set dynamically by
peer to %s\n",
-
osmo_ss7_as_traffic_mode_name(as->cfg.mode));
- /* verify if existing AS has same traffic-mode as new
request (if any) */
- } else if (!osmo_ss7_as_tmode_compatible_xua(as,
_tmode)) {
- LOGPASP(asp, DLSS7, LOGL_NOTICE, "RKM:
Non-matching Traffic Mode %s\n",
- osmo_ss7_as_traffic_mode_name(tmode));
- msgb_append_reg_res(resp, rk_id,
M3UA_RKM_REG_ERR_UNSUPP_TRAF_MODE, 0);
- return -1;
+ /* First validate peer not trying to establish an
incompatible traffic mode: */
+ llist_for_each_entry(assoc, &asp->assoc_as_list,
asp_entry) {
+ if
(!osmo_ss7_as_tmode_compatible_xua(assoc->as, _tmode)) {
+ LOGPASP(asp, DLSS7, LOGL_NOTICE, "RKM:
Non-matching Traffic Mode %s\n",
+
osmo_ss7_as_traffic_mode_name(tmode));
+ msgb_append_reg_res(resp, rk_id,
M3UA_RKM_REG_ERR_UNSUPP_TRAF_MODE, 0);
+ return -1;
+ }
}
- as->cfg.mode_set_by_peer = true;
+
+ /* Update traffic mode in all AS associated with the
ASP: */
+ llist_for_each_entry(assoc, &asp->assoc_as_list,
asp_entry) {
+ as = assoc->as;
+ if (!as->cfg.mode_set_by_peer &&
!as->cfg.mode_set_by_vty) {
+ as->cfg.mode = tmode;
+ LOGPAS(as, DLSS7, LOGL_INFO,
+ "RKM: Traffic mode set
dynamically by peer to %s\n",
+
osmo_ss7_as_traffic_mode_name(as->cfg.mode));
+ }
+ as->cfg.mode_set_by_peer = true;
+ }
}
} else {
/* Create an AS for this routing key */
--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/42529?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I05ba891e774ebe341229b968c92e0383b6899bd6
Gerrit-Change-Number: 42529
Gerrit-PatchSet: 2
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>