aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/netif/sctp.h21
-rw-r--r--src/sctp.c18
-rw-r--r--src/stream_srv.c4
3 files changed, 43 insertions, 0 deletions
diff --git a/include/osmocom/netif/sctp.h b/include/osmocom/netif/sctp.h
index f0c52cf..bb8acda 100644
--- a/include/osmocom/netif/sctp.h
+++ b/include/osmocom/netif/sctp.h
@@ -27,3 +27,24 @@ enum sctp_sn_error;
extern const struct value_string osmo_sctp_sn_error_strs[];
static inline const char *osmo_sctp_sn_error_str(enum sctp_sn_error val)
{ return get_value_string(osmo_sctp_sn_error_strs, val); }
+
+enum osmo_sctp_op_error {
+ OSMO_SCTP_OP_ERR_INVALID_STREAM_ID = 1,
+ OSMO_SCTP_OP_ERR_MISS_MAND_PARAM = 2,
+ OSMO_SCTP_OP_ERR_STALE_COOKIE = 3,
+ OSMO_SCTP_OP_ERR_NO_RESOURCES = 4,
+ OSMO_SCTP_OP_ERR_UNRESOLV_ADDR = 5,
+ OSMO_SCTP_OP_ERR_UNKN_CHUNK_TYPE = 6,
+ OSMO_SCTP_OP_ERR_INVALID_MAND_PARAM = 7,
+ OSMO_SCTP_OP_ERR_UNKN_PARAM = 8,
+ OSMO_SCTP_OP_ERR_NO_USER_DATA = 9,
+ OSMO_SCTP_OP_ERR_COOKIE_RX_WHILE_SHUTDOWN = 10,
+ OSMO_SCTP_OP_ERR_RESTART_ASSC_NEW_ADDR = 11,
+ OSMO_SCTP_OP_ERR_UNER_INITED_ABORT = 12,
+ OSMO_SCTP_OP_ERR_PROTO_VERSION = 13,
+};
+
+
+extern const struct value_string osmo_sctp_op_error_strs[];
+static inline const char *osmo_sctp_op_error_str(enum osmo_sctp_op_error val)
+{ return get_value_string(osmo_sctp_op_error_strs, val); }
diff --git a/src/sctp.c b/src/sctp.c
index c1b57db..7f4f54b 100644
--- a/src/sctp.c
+++ b/src/sctp.c
@@ -51,3 +51,21 @@ const struct value_string osmo_sctp_sn_error_strs[] = {
{ SCTP_PEER_FAULTY, "PEER_FAULTY" },
{ 0, NULL }
};
+
+/* rfc4960 section 3.3.10 "Operation Error", in host byte order */
+const struct value_string osmo_sctp_op_error_strs[] = {
+ { OSMO_SCTP_OP_ERR_INVALID_STREAM_ID, "Invalid Stream Identifier" },
+ { OSMO_SCTP_OP_ERR_MISS_MAND_PARAM, "Missing Mandatory Parameter" },
+ { OSMO_SCTP_OP_ERR_STALE_COOKIE, "Stale Cookie Error" },
+ { OSMO_SCTP_OP_ERR_NO_RESOURCES, "Out of Resource" },
+ { OSMO_SCTP_OP_ERR_UNRESOLV_ADDR, "Unresolvable Address" },
+ { OSMO_SCTP_OP_ERR_UNKN_CHUNK_TYPE, "Unrecognized Chunk Type" },
+ { OSMO_SCTP_OP_ERR_INVALID_MAND_PARAM, "Invalid Mandatory Parameter" },
+ { OSMO_SCTP_OP_ERR_UNKN_PARAM, "Unrecognized Parameters" },
+ { OSMO_SCTP_OP_ERR_NO_USER_DATA, "No User Data" },
+ { OSMO_SCTP_OP_ERR_COOKIE_RX_WHILE_SHUTDOWN, "Cookie Received While Shutting Down" },
+ { OSMO_SCTP_OP_ERR_RESTART_ASSC_NEW_ADDR, "Restart of an Association with New Addresses" },
+ { OSMO_SCTP_OP_ERR_UNER_INITED_ABORT, "User Initiated Abort" },
+ { OSMO_SCTP_OP_ERR_PROTO_VERSION, "Protocol Violation" },
+ { 0, NULL }
+};
diff --git a/src/stream_srv.c b/src/stream_srv.c
index 6c50a69..3625ffd 100644
--- a/src/stream_srv.c
+++ b/src/stream_srv.c
@@ -891,6 +891,10 @@ static int _sctp_recvmsg_wrapper(int fd, struct msgb *msg)
/* RFC6458 3.1.4: Any attempt to send more data will cause sendmsg()
* to return with an ESHUTDOWN error. */
break;
+ case SCTP_REMOTE_ERROR:
+ LOGP(DLINP, LOGL_DEBUG, "===> REMOTE ERROR: %s\n",
+ osmo_sctp_op_error_str(ntohs(notif->sn_remote_error.sre_error)));
+ break;
}
return -EAGAIN;
}