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
9257cd896e when converting code to use
osmo_io osmo_stream backend.

Change-Id: I579f4101a9e2874e310ff78e4571f38cfe8dfab0
Depends: libosmo-netif.git Change-Id I395c75ff1e9904757ce1d767a9ac2f779593c4c8
This commit is contained in:
Pau Espin 2024-04-16 19:24:58 +02:00
parent ef237e1876
commit da7bc78cb4
2 changed files with 60 additions and 15 deletions

View File

@ -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;
}

View File

@ -24,9 +24,9 @@ struct osmo_ss7_asp *ss7_asp_find_by_socket_addr(int fd, int trans_proto);
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);