1214501Srpaulo/*- 2214501Srpaulo * Copyright (c) 2015 3214501Srpaulo * The Regents of the University of California. All rights reserved. 4214501Srpaulo * Michael Tuexen. All rights reserved. 5252726Srpaulo * 6252726Srpaulo * Redistribution and use in source and binary forms, with or without 7214501Srpaulo * modification, are permitted provided that the following conditions 8214501Srpaulo * are met: 9214501Srpaulo * 1. Redistributions of source code must retain the above copyright 10214501Srpaulo * notice, this list of conditions and the following disclaimer. 11214501Srpaulo * 2. Redistributions in binary form must reproduce the above copyright 12214501Srpaulo * notice, this list of conditions and the following disclaimer in the 13214501Srpaulo * documentation and/or other materials provided with the distribution. 14214501Srpaulo * 4. Neither the name of the University nor the names of its contributors 15214501Srpaulo * may be used to endorse or promote products derived from this software 16252726Srpaulo * without specific prior written permission. 17214501Srpaulo * 18214501Srpaulo * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19214501Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20214501Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21214501Srpaulo * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22214501Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23214501Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24214501Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25214501Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26214501Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27214501Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28214501Srpaulo * SUCH DAMAGE. 29214501Srpaulo */ 30214501Srpaulo 31214501Srpaulo#include <sys/cdefs.h> 32214501Srpaulo__FBSDID("$FreeBSD$"); 33214501Srpaulo 34214501Srpaulo#include <sys/param.h> 35214501Srpaulo#include <sys/types.h> 36214501Srpaulo#include <sys/socket.h> 37214501Srpaulo#include <sys/sysctl.h> 38214501Srpaulo 39214501Srpaulo#include <netinet/sctp.h> 40214501Srpaulo 41214501Srpaulo#include <stdlib.h> 42214501Srpaulo#include <string.h> 43214501Srpaulo 44214501Srpaulo#include "systat.h" 45214501Srpaulo#include "extern.h" 46214501Srpaulo#include "mode.h" 47214501Srpaulo 48214501Srpaulostatic struct sctpstat curstat, initstat, oldstat; 49214501Srpaulo 50214501Srpaulo/*- 51214501Srpaulo--0 1 2 3 4 5 6 7 52214501Srpaulo--0123456789012345678901234567890123456789012345678901234567890123456789012345 53214501Srpaulo00 SCTP Associations SCTP Packets 54214501Srpaulo01999999999999 associations initiated 999999999999 packets sent 55214501Srpaulo02999999999999 associations accepted 999999999999 packets received 56214501Srpaulo03999999999999 associations established 999999999999 - out of the blue 57214501Srpaulo04999999999999 associations restarted 999999999999 - bad vtag 58214501Srpaulo05999999999999 associations terminated 999999999999 - bad crc32c 59214501Srpaulo06999999999999 associations aborted 60214501Srpaulo07 61214501Srpaulo08 SCTP Timers SCTP Chunks 62214501Srpaulo09999999999999 init timeouts 999999999999 control chunks sent 63214501Srpaulo10999999999999 cookie timeouts 999999999999 data chunks sent 64252726Srpaulo11999999999999 data timeouts 999999999999 - ordered 65214501Srpaulo12999999999999 delayed sack timeouts 999999999999 - unordered 66214501Srpaulo13999999999999 shutdown timeouts 999999999999 control chunks received 67214501Srpaulo14999999999999 shutdown-ack timeouts 999999999999 data chunks received 68214501Srpaulo15999999999999 shutdown guard timeouts 999999999999 - ordered 69214501Srpaulo16999999999999 heartbeat timeouts 999999999999 - unordered 70214501Srpaulo17999999999999 path MTU timeouts 71214501Srpaulo18999999999999 autoclose timeouts SCTP user messages 72214501Srpaulo19999999999999 asconf timeouts 999999999999 fragmented 73214501Srpaulo20999999999999 stream reset timeouts 999999999999 reassembled 74214501Srpaulo--0123456789012345678901234567890123456789012345678901234567890123456789012345 75214501Srpaulo--0 1 2 3 4 5 6 7 76214501Srpaulo*/ 77214501Srpaulo 78214501SrpauloWINDOW * 79214501Srpauloopensctp(void) 80214501Srpaulo{ 81214501Srpaulo return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0)); 82214501Srpaulo} 83214501Srpaulo 84214501Srpaulovoid 85214501Srpauloclosesctp(WINDOW *w) 86214501Srpaulo{ 87214501Srpaulo if (w != NULL) { 88214501Srpaulo wclear(w); 89214501Srpaulo wrefresh(w); 90214501Srpaulo delwin(w); 91214501Srpaulo } 92214501Srpaulo} 93214501Srpaulo 94214501Srpaulovoid 95214501Srpaulolabelsctp(void) 96214501Srpaulo{ 97214501Srpaulo wmove(wnd, 0, 0); wclrtoeol(wnd); 98214501Srpaulo#define L(row, str) mvwprintw(wnd, row, 13, str) 99214501Srpaulo#define R(row, str) mvwprintw(wnd, row, 51, str); 100214501Srpaulo L(0, "SCTP Associations"); R(0, "SCTP Packets"); 101214501Srpaulo L(1, "associations initiated"); R(1, "packets sent"); 102214501Srpaulo L(2, "associations accepted"); R(2, "packets received"); 103214501Srpaulo L(3, "associations established"); R(3, "- out of the blue"); 104214501Srpaulo L(4, "associations restarted"); R(4, "- bad vtag"); 105214501Srpaulo L(5, "associations terminated"); R(5, "- bad crc32c"); 106214501Srpaulo L(6, "associations aborted"); 107214501Srpaulo 108214501Srpaulo L(8, "SCTP Timers"); R(8, "SCTP Chunks"); 109214501Srpaulo L(9, "init timeouts"); R(9, "control chunks sent"); 110214501Srpaulo L(10, "cookie timeouts"); R(10, "data chunks sent"); 111214501Srpaulo L(11, "data timeouts"); R(11, "- ordered"); 112214501Srpaulo L(12, "delayed sack timeouts"); R(12, "- unordered"); 113214501Srpaulo L(13, "shutdown timeouts"); R(13, "control chunks received"); 114214501Srpaulo L(14, "shutdown-ack timeouts"); R(14, "data chunks received"); 115214501Srpaulo L(15, "shutdown guard timeouts"); R(15, "- ordered"); 116214501Srpaulo L(16, "heartbeat timeouts"); R(16, "- unordered"); 117214501Srpaulo L(17, "path MTU timeouts"); 118214501Srpaulo L(18, "autoclose timeouts"); R(18, "SCTP User Messages"); 119214501Srpaulo L(19, "asconf timeouts"); R(19, "fragmented"); 120214501Srpaulo L(20, "stream reset timeouts"); R(20, "reassembled"); 121214501Srpaulo#undef L 122252726Srpaulo#undef R 123252726Srpaulo} 124214501Srpaulo 125252726Srpaulostatic void 126214501Srpaulodomode(struct sctpstat *ret) 127214501Srpaulo{ 128214501Srpaulo const struct sctpstat *sub; 129214501Srpaulo int divisor = 1; 130214501Srpaulo 131214501Srpaulo switch(currentmode) { 132214501Srpaulo case display_RATE: 133214501Srpaulo sub = &oldstat; 134214501Srpaulo divisor = (delay > 1000000) ? delay / 1000000 : 1; 135214501Srpaulo break; 136214501Srpaulo case display_DELTA: 137214501Srpaulo sub = &oldstat; 138214501Srpaulo break; 139214501Srpaulo case display_SINCE: 140214501Srpaulo sub = &initstat; 141214501Srpaulo break; 142214501Srpaulo default: 143214501Srpaulo *ret = curstat; 144214501Srpaulo return; 145214501Srpaulo } 146214501Srpaulo#define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor 147214501Srpaulo DO(sctps_currestab); 148214501Srpaulo DO(sctps_activeestab); 149214501Srpaulo DO(sctps_restartestab); 150214501Srpaulo DO(sctps_collisionestab); 151214501Srpaulo DO(sctps_passiveestab); 152214501Srpaulo DO(sctps_aborted); 153214501Srpaulo DO(sctps_shutdown); 154214501Srpaulo DO(sctps_outoftheblue); 155214501Srpaulo DO(sctps_checksumerrors); 156214501Srpaulo DO(sctps_outcontrolchunks); 157214501Srpaulo DO(sctps_outorderchunks); 158214501Srpaulo DO(sctps_outunorderchunks); 159214501Srpaulo DO(sctps_incontrolchunks); 160214501Srpaulo DO(sctps_inorderchunks); 161214501Srpaulo DO(sctps_inunorderchunks); 162214501Srpaulo DO(sctps_fragusrmsgs); 163214501Srpaulo DO(sctps_reasmusrmsgs); 164214501Srpaulo DO(sctps_outpackets); 165214501Srpaulo DO(sctps_inpackets); 166214501Srpaulo 167214501Srpaulo DO(sctps_recvpackets); 168214501Srpaulo DO(sctps_recvdatagrams); 169214501Srpaulo DO(sctps_recvpktwithdata); 170214501Srpaulo DO(sctps_recvsacks); 171214501Srpaulo DO(sctps_recvdata); 172214501Srpaulo DO(sctps_recvdupdata); 173214501Srpaulo DO(sctps_recvheartbeat); 174214501Srpaulo DO(sctps_recvheartbeatack); 175214501Srpaulo DO(sctps_recvecne); 176214501Srpaulo DO(sctps_recvauth); 177214501Srpaulo DO(sctps_recvauthmissing); 178214501Srpaulo DO(sctps_recvivalhmacid); 179214501Srpaulo DO(sctps_recvivalkeyid); 180214501Srpaulo DO(sctps_recvauthfailed); 181214501Srpaulo DO(sctps_recvexpress); 182214501Srpaulo DO(sctps_recvexpressm); 183214501Srpaulo DO(sctps_recvnocrc); 184214501Srpaulo DO(sctps_recvswcrc); 185214501Srpaulo DO(sctps_recvhwcrc); 186214501Srpaulo 187214501Srpaulo DO(sctps_sendpackets); 188214501Srpaulo DO(sctps_sendsacks); 189214501Srpaulo DO(sctps_senddata); 190214501Srpaulo DO(sctps_sendretransdata); 191214501Srpaulo DO(sctps_sendfastretrans); 192214501Srpaulo DO(sctps_sendmultfastretrans); 193214501Srpaulo DO(sctps_sendheartbeat); 194214501Srpaulo DO(sctps_sendecne); 195214501Srpaulo DO(sctps_sendauth); 196214501Srpaulo DO(sctps_senderrors); 197214501Srpaulo DO(sctps_sendnocrc); 198214501Srpaulo DO(sctps_sendswcrc); 199214501Srpaulo DO(sctps_sendhwcrc); 200214501Srpaulo 201214501Srpaulo DO(sctps_pdrpfmbox); 202214501Srpaulo DO(sctps_pdrpfehos); 203214501Srpaulo DO(sctps_pdrpmbda); 204214501Srpaulo DO(sctps_pdrpmbct); 205214501Srpaulo DO(sctps_pdrpbwrpt); 206214501Srpaulo DO(sctps_pdrpcrupt); 207214501Srpaulo DO(sctps_pdrpnedat); 208214501Srpaulo DO(sctps_pdrppdbrk); 209214501Srpaulo DO(sctps_pdrptsnnf); 210214501Srpaulo DO(sctps_pdrpdnfnd); 211214501Srpaulo DO(sctps_pdrpdiwnp); 212214501Srpaulo DO(sctps_pdrpdizrw); 213214501Srpaulo DO(sctps_pdrpbadd); 214214501Srpaulo DO(sctps_pdrpmark); 215214501Srpaulo 216214501Srpaulo DO(sctps_timoiterator); 217214501Srpaulo DO(sctps_timodata); 218214501Srpaulo DO(sctps_timowindowprobe); 219214501Srpaulo DO(sctps_timoinit); 220214501Srpaulo DO(sctps_timosack); 221214501Srpaulo DO(sctps_timoshutdown); 222214501Srpaulo DO(sctps_timoheartbeat); 223214501Srpaulo DO(sctps_timocookie); 224214501Srpaulo DO(sctps_timosecret); 225214501Srpaulo DO(sctps_timopathmtu); 226214501Srpaulo DO(sctps_timoshutdownack); 227214501Srpaulo DO(sctps_timoshutdownguard); 228214501Srpaulo DO(sctps_timostrmrst); 229214501Srpaulo DO(sctps_timoearlyfr); 230214501Srpaulo DO(sctps_timoasconf); 231214501Srpaulo DO(sctps_timodelprim); 232214501Srpaulo DO(sctps_timoautoclose); 233214501Srpaulo DO(sctps_timoassockill); 234214501Srpaulo DO(sctps_timoinpkill); 235214501Srpaulo 236214501Srpaulo DO(sctps_hdrops); 237214501Srpaulo DO(sctps_badsum); 238214501Srpaulo DO(sctps_noport); 239214501Srpaulo DO(sctps_badvtag); 240214501Srpaulo DO(sctps_badsid); 241214501Srpaulo DO(sctps_nomem); 242214501Srpaulo DO(sctps_fastretransinrtt); 243214501Srpaulo DO(sctps_markedretrans); 244214501Srpaulo DO(sctps_naglesent); 245214501Srpaulo DO(sctps_naglequeued); 246214501Srpaulo DO(sctps_maxburstqueued); 247214501Srpaulo DO(sctps_ifnomemqueued); 248214501Srpaulo DO(sctps_windowprobed); 249214501Srpaulo DO(sctps_lowlevelerr); 250214501Srpaulo DO(sctps_lowlevelerrusr); 251214501Srpaulo DO(sctps_datadropchklmt); 252214501Srpaulo DO(sctps_datadroprwnd); 253214501Srpaulo DO(sctps_ecnereducedcwnd); 254214501Srpaulo DO(sctps_vtagexpress); 255214501Srpaulo DO(sctps_vtagbogus); 256214501Srpaulo DO(sctps_primary_randry); 257214501Srpaulo DO(sctps_cmt_randry); 258214501Srpaulo DO(sctps_slowpath_sack); 259214501Srpaulo DO(sctps_wu_sacks_sent); 260214501Srpaulo DO(sctps_sends_with_flags); 261214501Srpaulo DO(sctps_sends_with_unord); 262214501Srpaulo DO(sctps_sends_with_eof); 263214501Srpaulo DO(sctps_sends_with_abort); 264214501Srpaulo DO(sctps_protocol_drain_calls); 265214501Srpaulo DO(sctps_protocol_drains_done); 266214501Srpaulo DO(sctps_read_peeks); 267214501Srpaulo DO(sctps_cached_chk); 268214501Srpaulo DO(sctps_cached_strmoq); 269214501Srpaulo DO(sctps_left_abandon); 270214501Srpaulo DO(sctps_send_burst_avoid); 271214501Srpaulo DO(sctps_send_cwnd_avoid); 272214501Srpaulo DO(sctps_fwdtsn_map_over); 273214501Srpaulo DO(sctps_queue_upd_ecne); 274214501Srpaulo#undef DO 275214501Srpaulo} 276214501Srpaulo 277214501Srpaulovoid 278214501Srpauloshowsctp(void) 279214501Srpaulo{ 280214501Srpaulo struct sctpstat stats; 281214501Srpaulo 282214501Srpaulo memset(&stats, 0, sizeof stats); 283214501Srpaulo domode(&stats); 284214501Srpaulo 285214501Srpaulo#define DO(stat, row, col) \ 286214501Srpaulo mvwprintw(wnd, row, col, "%12lu", stats.stat) 287214501Srpaulo#define L(row, stat) DO(stat, row, 0) 288214501Srpaulo#define R(row, stat) DO(stat, row, 38) 289214501Srpaulo L(1, sctps_activeestab); R(1, sctps_outpackets); 290214501Srpaulo L(2, sctps_passiveestab); R(2, sctps_inpackets); 291214501Srpaulo L(3, sctps_currestab); R(3, sctps_outoftheblue); 292214501Srpaulo L(4, sctps_restartestab); R(4, sctps_badvtag); 293214501Srpaulo L(5, sctps_shutdown); R(5, sctps_checksumerrors); 294214501Srpaulo L(6, sctps_aborted); 295214501Srpaulo 296214501Srpaulo 297214501Srpaulo L(9, sctps_timoinit); R(9, sctps_outcontrolchunks); 298214501Srpaulo L(10, sctps_timocookie); R(10, sctps_senddata); 299214501Srpaulo L(11, sctps_timodata); R(11, sctps_outorderchunks); 300214501Srpaulo L(12, sctps_timosack); R(12, sctps_outunorderchunks); 301214501Srpaulo L(13, sctps_timoshutdown); R(13, sctps_incontrolchunks); 302214501Srpaulo L(14, sctps_timoshutdownack); R(14, sctps_recvdata); 303214501Srpaulo L(15, sctps_timoshutdownguard); R(15, sctps_inorderchunks); 304214501Srpaulo L(16, sctps_timoheartbeat); R(16, sctps_inunorderchunks); 305214501Srpaulo L(17, sctps_timopathmtu); 306214501Srpaulo L(18, sctps_timoautoclose); 307214501Srpaulo L(19, sctps_timoasconf); R(19, sctps_fragusrmsgs); 308214501Srpaulo L(20, sctps_timostrmrst); R(20, sctps_reasmusrmsgs); 309214501Srpaulo#undef DO 310214501Srpaulo#undef L 311214501Srpaulo#undef R 312214501Srpaulo} 313214501Srpaulo 314214501Srpauloint 315214501Srpauloinitsctp(void) 316214501Srpaulo{ 317214501Srpaulo size_t len; 318214501Srpaulo const char *name = "net.inet.sctp.stats"; 319214501Srpaulo 320214501Srpaulo len = 0; 321214501Srpaulo if (sysctlbyname(name, NULL, &len, NULL, 0) < 0) { 322214501Srpaulo error("sysctl getting sctpstat size failed"); 323214501Srpaulo return 0; 324214501Srpaulo } 325214501Srpaulo if (len > sizeof curstat) { 326214501Srpaulo error("sctpstat structure has grown--recompile systat!"); 327214501Srpaulo return 0; 328214501Srpaulo } 329214501Srpaulo if (sysctlbyname(name, &initstat, &len, NULL, 0) < 0) { 330214501Srpaulo error("sysctl getting sctpstat failed"); 331214501Srpaulo return 0; 332214501Srpaulo } 333214501Srpaulo oldstat = initstat; 334214501Srpaulo return 1; 335214501Srpaulo} 336214501Srpaulo 337214501Srpaulovoid 338214501Srpauloresetsctp(void) 339214501Srpaulo{ 340214501Srpaulo size_t len; 341214501Srpaulo const char *name = "net.inet.sctp.stats"; 342214501Srpaulo 343214501Srpaulo len = sizeof initstat; 344214501Srpaulo if (sysctlbyname(name, &initstat, &len, NULL, 0) < 0) { 345214501Srpaulo error("sysctl getting sctpstat failed"); 346214501Srpaulo } 347214501Srpaulo oldstat = initstat; 348214501Srpaulo} 349214501Srpaulo 350214501Srpaulovoid 351214501Srpaulofetchsctp(void) 352214501Srpaulo{ 353214501Srpaulo size_t len; 354214501Srpaulo const char *name = "net.inet.sctp.stats"; 355214501Srpaulo 356214501Srpaulo oldstat = curstat; 357214501Srpaulo len = sizeof curstat; 358214501Srpaulo if (sysctlbyname(name, &curstat, &len, NULL, 0) < 0) { 359214501Srpaulo error("sysctl getting sctpstat failed"); 360214501Srpaulo } 361214501Srpaulo return; 362214501Srpaulo} 363214501Srpaulo