aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo_ss7_asp.c
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2024-04-16 19:24:58 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2024-04-17 16:31:45 +0200
commitda7bc78cb48c5ba0604b8d26000e059ebdcab391 (patch)
treee804042a2dc95a3d4c1da285ccf398f0ee4b47fe /src/osmo_ss7_asp.c
parentef237e187682c87a4c92257dbecc6db43678c629 (diff)
ss7_asp: Update osmo_stream read_cb2 functions to accommodate for new API parampespin/stream
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
Diffstat (limited to 'src/osmo_ss7_asp.c')
-rw-r--r--src/osmo_ss7_asp.c69
1 files changed, 57 insertions, 12 deletions
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 @@ void osmo_ss7_asp_destroy(struct osmo_ss7_asp *asp)
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 @@ static void log_sctp_notification(struct osmo_ss7_asp *asp, const char *pfx,
}
/* 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 @@ int ss7_asp_ipa_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg)
}
/* 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 @@ int ss7_asp_xua_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg)
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 @@ int ss7_asp_xua_srv_conn_rx_cb(struct osmo_stream_srv *conn, struct msgb *msg)
else
rc = ss7_asp_rx_unknown(asp, ppid, msg);
-out:
msgb_free(msg);
return rc;
}
@@ -868,12 +883,22 @@ int xua_tcp_segmentation_cb(struct msgb *msg)
}
/* 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 @@ static int xua_cli_close_and_reconnect(struct osmo_stream_cli *cli)
}
/* 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 @@ static int ipa_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg)
}
/* 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 @@ static int m3ua_tcp_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg)
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 @@ static int xua_cli_read_cb(struct osmo_stream_cli *conn, struct msgb *msg)
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;
}