This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.orgHarald Welte has submitted this change and it was merged. Change subject: Start to log + handle SCTP notifications ...................................................................... Start to log + handle SCTP notifications Change-Id: Ie00c4fc65c66e55262e2db084826084dcaf34b91 --- M src/sua.c 1 file changed, 116 insertions(+), 3 deletions(-) Approvals: Harald Welte: Looks good to me, approved Jenkins Builder: Verified diff --git a/src/sua.c b/src/sua.c index 2b4c64e..39afef0 100644 --- a/src/sua.c +++ b/src/sua.c @@ -1,6 +1,6 @@ /* Minimal implementation of RFC 3868 - SCCP User Adaptation Layer */ -/* (C) 2015 by Harald Welte <laforge at gnumonks.org> +/* (C) 2015-2017 by Harald Welte <laforge at gnumonks.org> * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -28,6 +28,7 @@ #include <osmocom/core/write_queue.h> #include <osmocom/core/logging.h> #include <osmocom/core/timer.h> +#include <osmocom/core/socket.h> #include <osmocom/netif/stream.h> #include <osmocom/sigtran/xua_msg.h> @@ -241,6 +242,8 @@ static int sua_link_send(struct osmo_sccp_link *link, struct msgb *msg) { msgb_sctp_ppid(msg) = SUA_PPID; + + DEBUGP(DSUA, "sua_link_send(%s)\n", osmo_hexdump(msg->data, msgb_length(msg))); if (link->is_server) osmo_stream_srv_send(link->data, msg); @@ -550,6 +553,7 @@ conn_state_set(conn, S_DISCONN_PEND); conn_destroy(conn); + LOGP(DSUA, LOGL_NOTICE, "About to send the SUA RELRE\n"); return sua_link_send(link, outmsg); } @@ -1256,6 +1260,85 @@ #include <osmocom/netif/stream.h> #include <netinet/sctp.h> +static const struct value_string sctp_assoc_chg_vals[] = { + { SCTP_COMM_UP, "COMM_UP" }, + { SCTP_COMM_LOST, "COMM_LOST" }, + { SCTP_RESTART, "RESTART" }, + { SCTP_SHUTDOWN_COMP, "SHUTDOWN_COMP" }, + { SCTP_CANT_STR_ASSOC, "CANT_STR_ASSOC" }, + { 0, NULL } +}; + +static const struct value_string sctp_sn_type_vals[] = { + { SCTP_ASSOC_CHANGE, "ASSOC_CHANGE" }, + { SCTP_PEER_ADDR_CHANGE, "PEER_ADDR_CHANGE" }, + { SCTP_SHUTDOWN_EVENT, "SHUTDOWN_EVENT" }, + { SCTP_SEND_FAILED, "SEND_FAILED" }, + { SCTP_REMOTE_ERROR, "REMOTE_ERROR" }, + { SCTP_PARTIAL_DELIVERY_EVENT, "PARTIAL_DELIVERY_EVENT" }, + { SCTP_ADAPTATION_INDICATION, "ADAPTATION_INDICATION" }, +#ifdef SCTP_AUTHENTICATION_INDICATION + { SCTP_AUTHENTICATION_INDICATION, "UTHENTICATION_INDICATION" }, +#endif +#ifdef SCTP_SENDER_DRY_EVENT + { SCTP_SENDER_DRY_EVENT, "SENDER_DRY_EVENT" }, +#endif + { 0, NULL } +}; + +static int get_logevel_by_sn_type(int sn_type) +{ + switch (sn_type) { + case SCTP_ADAPTATION_INDICATION: + case SCTP_PEER_ADDR_CHANGE: +#ifdef SCTP_AUTHENTICATION_INDICATION + case SCTP_AUTHENTICATION_INDICATION: +#endif +#ifdef SCTP_SENDER_DRY_EVENT + case SCTP_SENDER_DRY_EVENT: +#endif + return LOGL_INFO; + case SCTP_ASSOC_CHANGE: + return LOGL_NOTICE; + case SCTP_SHUTDOWN_EVENT: + case SCTP_PARTIAL_DELIVERY_EVENT: + return LOGL_NOTICE; + case SCTP_SEND_FAILED: + case SCTP_REMOTE_ERROR: + return LOGL_ERROR; + default: + return LOGL_NOTICE; + } +} + +static void log_sctp_notification(int fd, const char *pfx, + union sctp_notification *notif) +{ + int log_level; + char *conn_id = osmo_sock_get_name(NULL, fd); + + LOGP(DSUA, LOGL_INFO, "%s %s SCTP NOTIFICATION %u flags=0x%0x\n", + conn_id, pfx, notif->sn_header.sn_type, + notif->sn_header.sn_flags); + + log_level = get_logevel_by_sn_type(notif->sn_header.sn_type); + + switch (notif->sn_header.sn_type) { + case SCTP_ASSOC_CHANGE: + LOGP(DSUA, log_level, "%s %s SCTP_ASSOC_CHANGE: %s\n", + conn_id, pfx, get_value_string(sctp_assoc_chg_vals, + notif->sn_assoc_change.sac_state)); + break; + default: + LOGP(DSUA, log_level, "%s %s %s\n", + conn_id, pfx, get_value_string(sctp_sn_type_vals, + notif->sn_header.sn_type)); + break; + } + + talloc_free(conn_id); +} + /* netif code tells us we can read something from the socket */ static int sua_srv_conn_cb(struct osmo_stream_srv *conn) { @@ -1273,6 +1356,8 @@ /* read SUA message from socket and process it */ rc = sctp_recvmsg(ofd->fd, msgb_data(msg), msgb_tailroom(msg), NULL, NULL, &sinfo, &flags); + LOGP(DSUA, LOGL_DEBUG, "sua_srv_conn_cb(): sctp_recvmsg() returned %d\n", + rc); if (rc < 0) { close(ofd->fd); osmo_fd_unregister(ofd); @@ -1287,6 +1372,19 @@ } if (flags & MSG_NOTIFICATION) { + union sctp_notification *notif = (union sctp_notification *) msgb_data(msg); + + log_sctp_notification(ofd->fd, "SUA SRV", notif); + + switch (notif->sn_header.sn_type) { + case SCTP_SHUTDOWN_EVENT: + close(ofd->fd); + osmo_fd_unregister(ofd); + ofd->fd = -1; + break; + default: + break; + } msgb_free(msg); return 0; } @@ -1385,7 +1483,7 @@ } /* netif code tells us we can read something from the socket */ -static int sua_cli_conn_cb(struct osmo_stream_cli *conn) +static int sua_cli_read_cb(struct osmo_stream_cli *conn) { struct osmo_fd *ofd = osmo_stream_cli_get_ofd(conn); struct osmo_sccp_link *link = osmo_stream_cli_get_data(conn); @@ -1394,6 +1492,8 @@ unsigned int ppid; int flags = 0; int rc; + + LOGP(DSUA, LOGL_DEBUG, "sua_cli_read_cb() rx\n"); if (!msg) return -ENOMEM; @@ -1415,6 +1515,19 @@ } if (flags & MSG_NOTIFICATION) { + union sctp_notification *notif = (union sctp_notification *) msgb_data(msg); + + log_sctp_notification(ofd->fd, "SUA CLNT", notif); + + switch (notif->sn_header.sn_type) { + case SCTP_SHUTDOWN_EVENT: + close(ofd->fd); + osmo_fd_unregister(ofd); + ofd->fd = -1; + break; + default: + break; + } msgb_free(msg); return 0; } @@ -1452,7 +1565,7 @@ osmo_stream_cli_set_port(cli, port); osmo_stream_cli_set_proto(cli, IPPROTO_SCTP); osmo_stream_cli_set_reconnect_timeout(cli, 5); - osmo_stream_cli_set_read_cb(cli, sua_cli_conn_cb); + osmo_stream_cli_set_read_cb(cli, sua_cli_read_cb); /* create SUA link and associate it with stream_cli */ sual = sua_link_new(user, 0); -- To view, visit https://gerrit.osmocom.org/1696 To unsubscribe, visit https://gerrit.osmocom.org/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ie00c4fc65c66e55262e2db084826084dcaf34b91 Gerrit-PatchSet: 2 Gerrit-Project: libosmo-sccp Gerrit-Branch: master Gerrit-Owner: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org> Gerrit-Reviewer: Jenkins Builder