pespin has submitted this change. (
https://gerrit.osmocom.org/c/libosmo-sccp/+/36575?usp=email )
Change subject: ss7_asp: Update osmo_stream read_cb2 functions to accommodate for new API
param
......................................................................
ss7_asp: Update osmo_stream read_cb2 functions to accommodate for new API param
libosmo-netif (not yet released) stream_{cli,srv} osmo_io read_cb API was
updated to provide read result status. Hence, now API users (ss7_asp)
can account for lower layer errors and act properly, like it used to
do with the previous ofd backend.
This commit partially reverts some error code paths removed in
9257cd896e255403822bee6f87f5487a92fd3c11 when converting code to use
osmo_io osmo_stream backend.
Change-Id: I579f4101a9e2874e310ff78e4571f38cfe8dfab0
Depends: libosmo-netif.git Change-Id I395c75ff1e9904757ce1d767a9ac2f779593c4c8
---
M src/osmo_ss7_asp.c
M src/ss7_internal.h
2 files changed, 79 insertions(+), 15 deletions(-)
Approvals:
Jenkins Builder: Verified
fixeria: Looks good to me, approved
osmith: Looks good to me, but someone else must approve
jolly: Looks good to me, but someone else must approve
diff --git a/src/osmo_ss7_asp.c b/src/osmo_ss7_asp.c
index 1ce159a..9bb4b40 100644
--- a/src/osmo_ss7_asp.c
+++ b/src/osmo_ss7_asp.c
@@ -602,9 +602,9 @@
talloc_free(asp);
}
-static int xua_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg);
-static int ipa_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg);
-static int m3ua_tcp_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg);
+static int xua_cli_read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg);
+static int ipa_cli_read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg);
+static int m3ua_tcp_cli_read_cb(struct osmo_stream_cli *conn, int res, struct msgb
*msg);
static int xua_cli_connect_cb(struct osmo_stream_cli *cli);
static int xua_cli_close_and_reconnect(struct osmo_stream_cli *cli);
@@ -796,10 +796,20 @@
}
/* netif code tells us we can read something from the socket */
-int ss7_asp_ipa_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg)
+int ss7_asp_ipa_srv_conn_rx_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg)
{
struct osmo_ss7_asp *asp = osmo_stream_srv_get_data(conn);
+ if (res <= 0) {
+ if (res == -EAGAIN) {
+ msgb_free(msg);
+ return 0;
+ }
+ msgb_free(msg);
+ osmo_stream_srv_destroy(conn);
+ return res;
+ }
+
msg->dst = asp;
rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);
/* we simply use the lower 4 bits of the asp_id, which is initialized to a pseudo-random
value upon
@@ -808,7 +818,7 @@
}
/* netif code tells us we can read something from the socket */
-int ss7_asp_xua_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg)
+int ss7_asp_xua_srv_conn_rx_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg)
{
struct osmo_ss7_asp *asp = osmo_stream_srv_get_data(conn);
unsigned int ppid;
@@ -834,7 +844,13 @@
default:
break;
}
- goto out;
+ msgb_free(msg);
+ return 0;
+ }
+ if (res <= 0) {
+ msgb_free(msg);
+ osmo_stream_srv_destroy(conn);
+ return rc;
}
ppid = msgb_sctp_ppid(msg);
@@ -848,7 +864,6 @@
else
rc = ss7_asp_rx_unknown(asp, ppid, msg);
-out:
msgb_free(msg);
return rc;
}
@@ -868,12 +883,22 @@
}
/* netif code tells us we can read something from the socket */
-int ss7_asp_m3ua_tcp_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg)
+int ss7_asp_m3ua_tcp_srv_conn_rx_cb(struct osmo_stream_srv *conn, int res, struct msgb
*msg)
{
struct osmo_ss7_asp *asp = osmo_stream_srv_get_data(conn);
const struct xua_common_hdr *hdr;
int rc;
+ if (res <= 0) {
+ if (res == -EAGAIN) {
+ msgb_free(msg);
+ return 0;
+ }
+ msgb_free(msg);
+ osmo_stream_srv_destroy(conn);
+ return res;
+ }
+
msg->dst = asp;
rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);
@@ -953,11 +978,21 @@
}
/* read call-back for IPA/SCCPlite socket */
-static int ipa_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg)
+static int ipa_cli_read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg)
{
int fd = osmo_stream_cli_get_fd(conn);
struct osmo_ss7_asp *asp = osmo_stream_cli_get_data(conn);
+ if (res <= 0) {
+ if (res == -EAGAIN) {
+ msgb_free(msg);
+ return 0;
+ }
+ msgb_free(msg);
+ xua_cli_close_and_reconnect(conn);
+ return res;
+ }
+
msg->dst = asp;
rate_ctr_inc2(asp->ctrg, SS7_ASP_CTR_PKT_RX_TOTAL);
/* we can use the 'fd' return value of osmo_stream_srv_get_fd() here unverified
as all we do
@@ -966,7 +1001,7 @@
}
/* read call-back for M3UA-over-TCP socket */
-static int m3ua_tcp_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg)
+static int m3ua_tcp_cli_read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg)
{
const struct xua_common_hdr *hdr;
@@ -980,10 +1015,10 @@
else
msgb_sctp_stream(msg) = 0;
- return xua_cli_read_cb(conn, msg);
+ return xua_cli_read_cb(conn, res, msg);
}
-static int xua_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg)
+static int xua_cli_read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg)
{
struct osmo_ss7_asp *asp = osmo_stream_cli_get_data(conn);
unsigned int ppid;
@@ -1008,6 +1043,16 @@
default:
break;
}
+ if (res == 0)
+ xua_cli_close_and_reconnect(conn);
+ goto out;
+ }
+ if (res < 0) {
+ xua_cli_close_and_reconnect(conn);
+ goto out;
+ } else if (res == 0) {
+ xua_cli_close_and_reconnect(conn);
+
goto out;
}
diff --git a/src/ss7_internal.h b/src/ss7_internal.h
index 688495b..dcc2ef1 100644
--- a/src/ss7_internal.h
+++ b/src/ss7_internal.h
@@ -24,9 +24,9 @@
bool ss7_asp_protocol_check_trans_proto(enum osmo_ss7_asp_protocol proto, int
trans_proto);
int ss7_default_trans_proto_for_asp_proto(enum osmo_ss7_asp_protocol proto);
-int ss7_asp_ipa_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg);
-int ss7_asp_xua_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg);
-int ss7_asp_m3ua_tcp_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg);
+int ss7_asp_ipa_srv_conn_rx_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg);
+int ss7_asp_xua_srv_conn_rx_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg);
+int ss7_asp_m3ua_tcp_srv_conn_rx_cb(struct osmo_stream_srv *conn, int res, struct msgb
*msg);
int ss7_asp_xua_srv_conn_closed_cb(struct osmo_stream_srv *srv);
int ss7_asp_apply_peer_primary_address(const struct osmo_ss7_asp *asp);
int ss7_asp_apply_primary_address(const struct osmo_ss7_asp *asp);
--
To view, visit
https://gerrit.osmocom.org/c/libosmo-sccp/+/36575?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Change-Id: I579f4101a9e2874e310ff78e4571f38cfe8dfab0
Gerrit-Change-Number: 36575
Gerrit-PatchSet: 6
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: jolly <andreas(a)eversberg.eu>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged