laforge has uploaded this change for review.

View Change

ipa: use LSBs of file descriptor as SLS in IPA->M3UA direction

when IPA/SCCPlite traffic traverses the osmo_ss7 stack, so far the
SLS of the MTP3 label was always set to 0 (default initialization).

However, in order to achieve a better distribution of signaling traffic
in SS7 networks that actually utilize the SLS to select any links (or
ASPs), it makes sense to use non-zero values.

Instead of introducing some kind of new, configurable attribute for
each ASP (IPA client connection), let's simply use the lower 4 bits of
the file descriptor integer. Those file descriptors should have a
roughly equal distribution, resulting in traffic (from multiple IPA
clients) to be spread across the 4-bit SLS number space.

Also, this mechanism ensures that traffic from one IPA client will
always get the same SLS and hence routed the same way in any underlying
CS7/SS7 network.

Change-Id: Ice7bab997b84cfed00c7d6d780c70f4e9fac6002
Related: SYS#6543
---
M src/ipa.c
M src/osmo_ss7.c
M src/xua_internal.h
3 files changed, 34 insertions(+), 6 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/64/34264/1
diff --git a/src/ipa.c b/src/ipa.c
index 8daa5e0..874879e 100644
--- a/src/ipa.c
+++ b/src/ipa.c
@@ -211,7 +211,7 @@
return sccp_msg_out;
}

-static int ipa_rx_msg_sccp(struct osmo_ss7_asp *asp, struct msgb *msg)
+static int ipa_rx_msg_sccp(struct osmo_ss7_asp *asp, struct msgb *msg, uint8_t sls)
{
int rc;
struct m3ua_data_hdr data_hdr;
@@ -276,6 +276,7 @@
data_hdr.si = MTP_SI_SCCP;
data_hdr.opc = osmo_htonl(opc);
data_hdr.dpc = osmo_htonl(dpc);
+ data_hdr.sls = sls;
data_hdr.ni = as->inst->cfg.network_indicator;
/* Create M3UA message in XUA structure */
xua = m3ua_xfer_from_data(&data_hdr, msgb_l2(msg), msgb_l2len(msg));
@@ -293,7 +294,7 @@
* \param[in] asp Application Server Process receiving \a msg
* \param[in] msg received message buffer. Callee takes ownership!
* \returns 0 on success; negative on error */
-int ipa_rx_msg(struct osmo_ss7_asp *asp, struct msgb *msg)
+int ipa_rx_msg(struct osmo_ss7_asp *asp, struct msgb *msg, uint8_t sls)
{
struct ipaccess_head *hh;
int rc;
@@ -309,7 +310,7 @@
rc = ipa_rx_msg_ccm(asp, msg);
break;
case IPAC_PROTO_SCCP:
- rc = ipa_rx_msg_sccp(asp, msg);
+ rc = ipa_rx_msg_sccp(asp, msg, sls);
break;
default:
rc = ss7_asp_rx_unknown(asp, hh->proto, msg);
diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index b8124d1..440014a 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -2046,7 +2046,7 @@
}
msg->dst = asp;

- return ipa_rx_msg(asp, msg);
+ return ipa_rx_msg(asp, msg, ofd->fd & 0xf);
}

/* netif code tells us we can read something from the socket */
@@ -2194,7 +2194,7 @@
}
msg->dst = asp;
rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);
- return ipa_rx_msg(asp, msg);
+ return ipa_rx_msg(asp, msg, ofd->fd & 0xf);
}

static int xua_cli_read_cb(struct osmo_stream_cli *conn)
diff --git a/src/xua_internal.h b/src/xua_internal.h
index 26cb3fc..93f6140 100644
--- a/src/xua_internal.h
+++ b/src/xua_internal.h
@@ -116,7 +116,7 @@
const struct xua_msg_part *rctx_ie);

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);
+int ipa_rx_msg(struct osmo_ss7_asp *asp, struct msgb *msg, uint8_t sls);

int osmo_isup_party_parse(char *out_digits, const uint8_t *in,
unsigned int in_num_bytes, bool odd);

To view, visit change 34264. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Change-Id: Ice7bab997b84cfed00c7d6d780c70f4e9fac6002
Gerrit-Change-Number: 34264
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge@osmocom.org>
Gerrit-MessageType: newchange