pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/libosmo-sccp/+/35284?usp=email )


Change subject: vty: Introduce show cs7 instance asp-assoc-status
......................................................................

vty: Introduce show cs7 instance asp-assoc-status

Change-Id: I96ef4c0500991c9b86ab5991fb338ea20a18ff33
Depends: libosmocore.git Change-Id I3e1c84526b006baff435bbbca49dc6cf7d201cf5
Depends: libosmo-netif.git Change-Id I78a0bd8279a04f4011c7273e0f542981308e482f
Related: SYS#6636
---
M TODO-RELEASE
M src/osmo_ss7_vty.c
M tests/vty/ss7_asp_test.vty
3 files changed, 175 insertions(+), 7 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/84/35284/1

diff --git a/TODO-RELEASE b/TODO-RELEASE
index 1913dc6..25eeb6e 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -11,4 +11,4 @@
 libosmo-netif >1.4.0   osmo_stream_{srv,cli}_get_fd()
 libosmocore >1.9.0  osmo_sock_multiaddr_get_ip_and_port(), 
osmo_multiaddr_ip_and_port_snprintf()
 libosmocore >1.9.0  osmo_sock_sctp_get_peer_addr_info()
-libosmo-netif >1.4.0    osmo_sctp_spinfo_state_str()
+libosmo-netif >1.4.0    osmo_sctp_spinfo_state_str(), 
osmo_sctp_sstat_state_str()
diff --git a/src/osmo_ss7_vty.c b/src/osmo_ss7_vty.c
index 0a1ad92..7896b48 100644
--- a/src/osmo_ss7_vty.c
+++ b/src/osmo_ss7_vty.c
@@ -28,6 +28,7 @@

 #include <netdb.h>
 #include <arpa/inet.h>
+#include <sys/ioctl.h>

 #include <osmocom/core/sockaddr_str.h>

@@ -1422,6 +1423,154 @@
        return show_asp_remaddr(vty, id, asp_name);
 }

+static void show_one_asp_assoc_status_tcp(struct vty *vty, struct osmo_ss7_asp 
*asp)
+{
+       struct osmo_sockaddr osa = {};
+       struct tcp_info tcpi = {};
+       socklen_t len;
+       int fd, rc;
+       int rx_pend_bytes = 0;
+
+       fd = ss7_asp_get_fd(asp);
+       if (fd < 0) {
+               vty_out(vty, "%-12s  uninitialized%s", asp->cfg.name, 
VTY_NEWLINE);
+               return;
+       }
+
+       len = sizeof(osa.u.sas);
+       rc = getpeername(fd, &osa.u.sa, &len);
+
+       len = sizeof(tcpi);
+       rc = getsockopt(fd, SOL_TCP, TCP_INFO, &tcpi, &len);
+       if (rc < 0) {
+               char buf_err[128];
+               strerror_r(errno, buf_err, sizeof(buf_err));
+               vty_out(vty, "%-12s  getsockopt(TCP_INFO) failed: %s%s",
+                       asp->cfg.name, buf_err, VTY_NEWLINE);
+               return;
+       }
+
+       rc = ioctl(fd, FIONREAD, &rx_pend_bytes);
+
+       vty_out(vty, "%-12s  TCP_%-19s  %-9s  %-10s  %-8u  %-9u  %-7u  %-9u  
%-46s%s",
+               asp->cfg.name,
+               get_value_string(tcp_info_state_values, tcpi.tcpi_state),
+               "-", "-", tcpi.tcpi_rcv_wnd, tcpi.tcpi_unacked, rx_pend_bytes,
+               tcpi.tcpi_pmtu, osmo_sockaddr_to_str(&osa),
+               VTY_NEWLINE);
+}
+
+#ifdef HAVE_LIBSCTP
+static void show_one_asp_assoc_status_sctp(struct vty *vty, struct 
osmo_ss7_asp *asp)
+{
+       struct osmo_sockaddr osa = {};
+       struct sctp_status st;
+       socklen_t len;
+       int fd, rc;
+
+       fd = ss7_asp_get_fd(asp);
+       if (fd < 0) {
+               vty_out(vty, "%-12s  uninitialized%s", asp->cfg.name, 
VTY_NEWLINE);
+               return;
+       }
+
+       memset(&st, 0, sizeof(st));
+       len = sizeof(st);
+       rc = getsockopt(fd, IPPROTO_SCTP, SCTP_STATUS, &st, &len);
+       if (rc < 0) {
+               char buf_err[128];
+               strerror_r(errno, buf_err, sizeof(buf_err));
+               vty_out(vty, "%-12s  getsockopt(SCTP_STATUS) failed: %s%s", 
asp->cfg.name, buf_err, VTY_NEWLINE);
+               return;
+       }
+
+       osa.u.sas = st.sstat_primary.spinfo_address;
+       vty_out(vty, "%-12s  SCTP_%-18s  %-9u  %-10u  %-8u  %-9u  %-7u  %-9u  
%-46s%s",
+               asp->cfg.name,
+               osmo_sctp_sstat_state_str(st.sstat_state),
+               st.sstat_instrms, st.sstat_outstrms,
+               st.sstat_rwnd, st.sstat_unackdata, st.sstat_penddata,
+               st.sstat_fragmentation_point,
+               osmo_sockaddr_to_str(&osa),
+               VTY_NEWLINE);
+}
+#endif
+
+static void show_one_asp_assoc_status(struct vty *vty, struct osmo_ss7_asp 
*asp)
+{
+       int proto = ss7_asp_proto_to_ip_proto(asp->cfg.proto);
+
+       switch (proto) {
+       case IPPROTO_TCP:
+               show_one_asp_assoc_status_tcp(vty, asp);
+               break;
+#ifdef HAVE_LIBSCTP
+       case IPPROTO_SCTP:
+               show_one_asp_assoc_status_sctp(vty, asp);
+               break;
+#endif
+       default:
+               vty_out(vty, "%-12s  unknown proto %u%s", asp->cfg.name, proto, 
VTY_NEWLINE);
+               break;
+       }
+}
+
+static int show_asp_assoc_status(struct vty *vty, int id, const char *asp_name)
+{
+       struct osmo_ss7_instance *inst;
+       struct osmo_ss7_asp *asp = NULL;
+
+       inst = osmo_ss7_instance_find(id);
+       if (!inst) {
+               vty_out(vty, "No SS7 instance %d found%s", id, VTY_NEWLINE);
+               return CMD_WARNING;
+       }
+
+       if (asp_name) {
+               asp = osmo_ss7_asp_find_by_name(inst, asp_name);
+               if (!asp) {
+                       vty_out(vty, "No ASP %s found%s", asp_name, 
VTY_NEWLINE);
+                       return CMD_WARNING;
+               }
+       }
+
+       vty_out(vty, "ASP Name      State                    InStreams  
OutStreams  RWND      UnackData  PenData  FragPoint  Current Primary Remote IP 
Address & Port%s", VTY_NEWLINE);
+       vty_out(vty, "------------  -----------------------  ---------  
----------  --------  ---------  -------  ---------  
----------------------------------------------%s", VTY_NEWLINE);
+
+       if (asp) {
+               show_one_asp_assoc_status(vty, asp);
+               return CMD_SUCCESS;
+       }
+
+       llist_for_each_entry(asp, &inst->asp_list, list)
+               show_one_asp_assoc_status(vty, asp);
+       return CMD_SUCCESS;
+}
+
+DEFUN(show_cs7_asp_assoc_status, show_cs7_asp_assoc_status_cmd,
+       "show cs7 instance <0-15> asp-assoc-status",
+       SHOW_STR CS7_STR INST_STR INST_STR
+       "Application Server Process (ASP) SCTP association status\n")
+{
+       int id = atoi(argv[0]);
+
+       return show_asp_assoc_status(vty, id, NULL);
+}
+
+
+DEFUN(show_cs7_asp_assoc_status_name, show_cs7_asp_assoc_status_name_cmd,
+       "show cs7 instance <0-15> asp-assoc-status name ASP_NAME",
+       SHOW_STR CS7_STR INST_STR INST_STR
+       "Application Server Process (ASP) SCTP association information\n"
+       "Lookup ASP with a given name\n"
+       "Name of the Application Server Process (ASP)\n")
+{
+       int id = atoi(argv[0]);
+       const char *asp_name = argv[1];
+
+       return show_asp_assoc_status(vty, id, asp_name);
+}
+
 static void write_one_asp(struct vty *vty, struct osmo_ss7_asp *asp, bool 
show_dyn_config)
 {
        int i;
@@ -2700,6 +2849,8 @@
        install_lib_element_ve(&show_cs7_asp_name_cmd);
        install_lib_element_ve(&show_cs7_asp_remaddr_cmd);
        install_lib_element_ve(&show_cs7_asp_remaddr_name_cmd);
+       install_lib_element_ve(&show_cs7_asp_assoc_status_cmd);
+       install_lib_element_ve(&show_cs7_asp_assoc_status_name_cmd);
        install_lib_element(L_CS7_NODE, &cs7_asp_cmd);
        install_lib_element(L_CS7_NODE, &no_cs7_asp_cmd);
        install_lib_element(L_CS7_ASP_NODE, &cfg_description_cmd);
diff --git a/tests/vty/ss7_asp_test.vty b/tests/vty/ss7_asp_test.vty
index 0c11d61..914d8d4 100644
--- a/tests/vty/ss7_asp_test.vty
+++ b/tests/vty/ss7_asp_test.vty
@@ -7,6 +7,8 @@
   show cs7 instance <0-15> asp name ASP_NAME
   show cs7 instance <0-15> asp-remaddr
   show cs7 instance <0-15> asp-remaddr name ASP_NAME
+  show cs7 instance <0-15> asp-assoc-status
+  show cs7 instance <0-15> asp-assoc-status name ASP_NAME
   show cs7 instance <0-15> as (active|all|m3ua|sua)
   show cs7 instance <0-15> route
   show cs7 instance <0-15> sccp addressbook
@@ -26,6 +28,8 @@
   show cs7 instance <0-15> asp name ASP_NAME
   show cs7 instance <0-15> asp-remaddr
   show cs7 instance <0-15> asp-remaddr name ASP_NAME
+  show cs7 instance <0-15> asp-assoc-status
+  show cs7 instance <0-15> asp-assoc-status name ASP_NAME
   show cs7 instance <0-15> as (active|all|m3ua|sua)
   show cs7 instance <0-15> route
   show cs7 instance <0-15> sccp addressbook
@@ -54,12 +58,13 @@
   <0-15>  An instance of the SS7 stack

 ss7_asp_vty_test# show cs7 instance 0 ?
-  users        User Table
-  asp          Application Server Process (ASP)
-  asp-remaddr  Application Server Process (ASP) remote addresses information
-  as           Application Server (AS)
-  route        Routing Table
-  sccp         Signalling Connection Control Part
+  users             User Table
+  asp               Application Server Process (ASP)
+  asp-remaddr       Application Server Process (ASP) remote addresses 
information
+  asp-assoc-status  Application Server Process (ASP) SCTP association status
+  as                Application Server (AS)
+  route             Routing Table
+  sccp              Signalling Connection Control Part

 ss7_asp_vty_test# show cs7 instance 0 as ?
   active  Display all active ASs

--
To view, visit https://gerrit.osmocom.org/c/libosmo-sccp/+/35284?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Change-Id: I96ef4c0500991c9b86ab5991fb338ea20a18ff33
Gerrit-Change-Number: 35284
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pes...@sysmocom.de>
Gerrit-MessageType: newchange

Reply via email to