aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/stream.c94
1 files changed, 51 insertions, 43 deletions
diff --git a/src/stream.c b/src/stream.c
index e4fb668..309aafe 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -1290,6 +1290,56 @@ void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg)
osmo_fd_write_enable(&conn->ofd);
}
+#ifdef HAVE_LIBSCTP
+static int _sctp_recvmsg_wrapper(int fd, struct msgb *msg)
+{
+ struct sctp_sndrcvinfo sinfo;
+ int flags = 0;
+ int ret;
+
+ ret = sctp_recvmsg(fd, msgb_data(msg), msgb_tailroom(msg),
+ NULL, NULL, &sinfo, &flags);
+ if (flags & MSG_NOTIFICATION) {
+ union sctp_notification *notif = (union sctp_notification *)msgb_data(msg);
+ LOGP(DLINP, LOGL_DEBUG, "NOTIFICATION %u flags=0x%x\n", notif->sn_header.sn_type, notif->sn_header.sn_flags);
+ switch (notif->sn_header.sn_type) {
+ case SCTP_ASSOC_CHANGE:
+ LOGP(DLINP, LOGL_DEBUG, "===> ASSOC CHANGE:");
+ switch (notif->sn_assoc_change.sac_state) {
+ case SCTP_COMM_UP:
+ LOGPC(DLINP, LOGL_DEBUG, " UP\n");
+ break;
+ case SCTP_COMM_LOST:
+ LOGPC(DLINP, LOGL_DEBUG, " LOST\n");
+ break;
+ case SCTP_RESTART:
+ LOGPC(DLINP, LOGL_DEBUG, " RESTART\n");
+ break;
+ case SCTP_SHUTDOWN_COMP:
+ LOGPC(DLINP, LOGL_DEBUG, " SHUTDOWN COMP\n");
+ break;
+ case SCTP_CANT_STR_ASSOC:
+ LOGPC(DLINP, LOGL_DEBUG, " CANT STR ASSOC\n");
+ break;
+ }
+ break;
+ case SCTP_PEER_ADDR_CHANGE:
+ LOGP(DLINP, LOGL_DEBUG, "===> PEER ADDR CHANGE\n");
+ break;
+ case SCTP_SHUTDOWN_EVENT:
+ LOGP(DLINP, LOGL_DEBUG, "===> SHUTDOWN EVT\n");
+ /* Handle this like a regular disconnect */
+ return 0;
+ break;
+ }
+ return -EAGAIN;
+ }
+ msgb_sctp_ppid(msg) = ntohl(sinfo.sinfo_ppid);
+ msgb_sctp_stream(msg) = sinfo.sinfo_stream;
+ return ret;
+}
+#endif
+
/*! \brief Receive data via Osmocom stream server
* \param[in] conn Stream Server from which to receive
* \param msg pre-allocate message buffer to which received data is appended
@@ -1297,10 +1347,6 @@ void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg)
*/
int osmo_stream_srv_recv(struct osmo_stream_srv *conn, struct msgb *msg)
{
-#ifdef HAVE_LIBSCTP
- struct sctp_sndrcvinfo sinfo;
- int flags = 0;
-#endif
int ret;
if (!msg)
@@ -1309,45 +1355,7 @@ int osmo_stream_srv_recv(struct osmo_stream_srv *conn, struct msgb *msg)
switch (conn->srv->proto) {
#ifdef HAVE_LIBSCTP
case IPPROTO_SCTP:
- ret = sctp_recvmsg(conn->ofd.fd, msgb_data(msg), msgb_tailroom(msg),
- NULL, NULL, &sinfo, &flags);
- if (flags & MSG_NOTIFICATION) {
- union sctp_notification *notif = (union sctp_notification *) msgb_data(msg);
- LOGP(DLINP, LOGL_DEBUG, "NOTIFICATION %u flags=0x%x\n", notif->sn_header.sn_type, notif->sn_header.sn_flags);
- switch (notif->sn_header.sn_type) {
- case SCTP_ASSOC_CHANGE:
- LOGP(DLINP, LOGL_DEBUG, "===> ASSOC CHANGE:");
- switch (notif->sn_assoc_change.sac_state) {
- case SCTP_COMM_UP:
- LOGPC(DLINP, LOGL_DEBUG, " UP\n");
- break;
- case SCTP_COMM_LOST:
- LOGPC(DLINP, LOGL_DEBUG, " LOST\n");
- break;
- case SCTP_RESTART:
- LOGPC(DLINP, LOGL_DEBUG, " RESTART\n");
- break;
- case SCTP_SHUTDOWN_COMP:
- LOGPC(DLINP, LOGL_DEBUG, " SHUTDOWN COMP\n");
- break;
- case SCTP_CANT_STR_ASSOC:
- LOGPC(DLINP, LOGL_DEBUG, " CANT STR ASSOC\n");
- break;
- }
- break;
- case SCTP_PEER_ADDR_CHANGE:
- LOGP(DLINP, LOGL_DEBUG, "===> PEER ADDR CHANGE\n");
- break;
- case SCTP_SHUTDOWN_EVENT:
- LOGP(DLINP, LOGL_DEBUG, "===> SHUTDOWN EVT\n");
- /* Handle this like a regular disconnect */
- return 0;
- break;
- }
- return -EAGAIN;
- }
- msgb_sctp_ppid(msg) = ntohl(sinfo.sinfo_ppid);
- msgb_sctp_stream(msg) = sinfo.sinfo_stream;
+ ret = _sctp_recvmsg_wrapper(conn->ofd.fd, msg);
break;
#endif
case IPPROTO_TCP: