xref: /freebsd/usr.bin/systat/sctp.c (revision 35e941ce5520b8ef710bb388bd63460aa0ce63eb)
11eaa5682SMichael Tuexen /*-
21eaa5682SMichael Tuexen  * Copyright (c) 2015
31eaa5682SMichael Tuexen  * The Regents of the University of California.  All rights reserved.
41eaa5682SMichael Tuexen  * Michael Tuexen.  All rights reserved.
51eaa5682SMichael Tuexen  *
61eaa5682SMichael Tuexen  * Redistribution and use in source and binary forms, with or without
71eaa5682SMichael Tuexen  * modification, are permitted provided that the following conditions
81eaa5682SMichael Tuexen  * are met:
91eaa5682SMichael Tuexen  * 1. Redistributions of source code must retain the above copyright
101eaa5682SMichael Tuexen  *    notice, this list of conditions and the following disclaimer.
111eaa5682SMichael Tuexen  * 2. Redistributions in binary form must reproduce the above copyright
121eaa5682SMichael Tuexen  *    notice, this list of conditions and the following disclaimer in the
131eaa5682SMichael Tuexen  *    documentation and/or other materials provided with the distribution.
14fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
151eaa5682SMichael Tuexen  *    may be used to endorse or promote products derived from this software
161eaa5682SMichael Tuexen  *    without specific prior written permission.
171eaa5682SMichael Tuexen  *
181eaa5682SMichael Tuexen  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
191eaa5682SMichael Tuexen  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
201eaa5682SMichael Tuexen  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
211eaa5682SMichael Tuexen  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
221eaa5682SMichael Tuexen  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
231eaa5682SMichael Tuexen  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
241eaa5682SMichael Tuexen  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
251eaa5682SMichael Tuexen  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
261eaa5682SMichael Tuexen  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
271eaa5682SMichael Tuexen  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
281eaa5682SMichael Tuexen  * SUCH DAMAGE.
291eaa5682SMichael Tuexen  */
301eaa5682SMichael Tuexen 
311eaa5682SMichael Tuexen #include <sys/param.h>
321eaa5682SMichael Tuexen #include <sys/types.h>
331eaa5682SMichael Tuexen #include <sys/socket.h>
341eaa5682SMichael Tuexen #include <sys/sysctl.h>
351eaa5682SMichael Tuexen 
361eaa5682SMichael Tuexen #include <netinet/sctp.h>
371eaa5682SMichael Tuexen 
381eaa5682SMichael Tuexen #include <stdlib.h>
391eaa5682SMichael Tuexen #include <string.h>
401eaa5682SMichael Tuexen 
411eaa5682SMichael Tuexen #include "systat.h"
421eaa5682SMichael Tuexen #include "extern.h"
431eaa5682SMichael Tuexen #include "mode.h"
441eaa5682SMichael Tuexen 
451eaa5682SMichael Tuexen static struct sctpstat curstat, initstat, oldstat;
461eaa5682SMichael Tuexen 
471eaa5682SMichael Tuexen /*-
481eaa5682SMichael Tuexen --0         1         2         3         4         5         6         7
491eaa5682SMichael Tuexen --0123456789012345678901234567890123456789012345678901234567890123456789012345
501eaa5682SMichael Tuexen 00             SCTP Associations                     SCTP Packets
511eaa5682SMichael Tuexen 01999999999999 associations initiated   999999999999 packets sent
521eaa5682SMichael Tuexen 02999999999999 associations accepted    999999999999 packets received
532caa5afcSMichael Tuexen 03999999999999 associations restarted   999999999999 - out of the blue
542caa5afcSMichael Tuexen 04999999999999 associations terminated  999999999999 - bad vtag
552caa5afcSMichael Tuexen 05999999999999 associations aborted     999999999999 - bad crc32c
562caa5afcSMichael Tuexen 06
572caa5afcSMichael Tuexen 07             SCTP Timers                           SCTP Chunks
582caa5afcSMichael Tuexen 08999999999999 init timeouts            999999999999 control chunks sent
592caa5afcSMichael Tuexen 09999999999999 cookie timeouts          999999999999 data chunks sent
602caa5afcSMichael Tuexen 10999999999999 data timeouts            999999999999 - ordered
612caa5afcSMichael Tuexen 11999999999999 delayed sack timeouts    999999999999 - unordered
622caa5afcSMichael Tuexen 12999999999999 shutdown timeouts        999999999999 control chunks received
632caa5afcSMichael Tuexen 13999999999999 shutdown-ack timeouts    999999999999 data chunks received
642caa5afcSMichael Tuexen 14999999999999 shutdown guard timeouts  999999999999 - ordered
652caa5afcSMichael Tuexen 15999999999999 heartbeat timeouts       999999999999 - unordered
662caa5afcSMichael Tuexen 16999999999999 path MTU timeouts
672caa5afcSMichael Tuexen 17999999999999 autoclose timeouts                    SCTP user messages
682caa5afcSMichael Tuexen 18999999999999 asconf timeouts          999999999999 fragmented
692caa5afcSMichael Tuexen 19999999999999 stream reset timeouts    999999999999 reassembled
701eaa5682SMichael Tuexen --0123456789012345678901234567890123456789012345678901234567890123456789012345
711eaa5682SMichael Tuexen --0         1         2         3         4         5         6         7
721eaa5682SMichael Tuexen */
731eaa5682SMichael Tuexen 
741eaa5682SMichael Tuexen WINDOW *
opensctp(void)751eaa5682SMichael Tuexen opensctp(void)
761eaa5682SMichael Tuexen {
771eaa5682SMichael Tuexen 	return (subwin(stdscr, LINES-3-1, 0, MAINWIN_ROW, 0));
781eaa5682SMichael Tuexen }
791eaa5682SMichael Tuexen 
801eaa5682SMichael Tuexen void
closesctp(WINDOW * w)811eaa5682SMichael Tuexen closesctp(WINDOW *w)
821eaa5682SMichael Tuexen {
831eaa5682SMichael Tuexen 	if (w != NULL) {
841eaa5682SMichael Tuexen 		wclear(w);
851eaa5682SMichael Tuexen 		wrefresh(w);
861eaa5682SMichael Tuexen 		delwin(w);
871eaa5682SMichael Tuexen 	}
881eaa5682SMichael Tuexen }
891eaa5682SMichael Tuexen 
901eaa5682SMichael Tuexen void
labelsctp(void)911eaa5682SMichael Tuexen labelsctp(void)
921eaa5682SMichael Tuexen {
931eaa5682SMichael Tuexen 	wmove(wnd, 0, 0); wclrtoeol(wnd);
941eaa5682SMichael Tuexen #define L(row, str) mvwprintw(wnd, row, 13, str)
951eaa5682SMichael Tuexen #define R(row, str) mvwprintw(wnd, row, 51, str);
961eaa5682SMichael Tuexen 	L(0, "SCTP Associations");		R(0, "SCTP Packets");
971eaa5682SMichael Tuexen 	L(1, "associations initiated");		R(1, "packets sent");
981eaa5682SMichael Tuexen 	L(2, "associations accepted");		R(2, "packets received");
992caa5afcSMichael Tuexen 	L(3, "associations restarted");		R(3, "- out of the blue");
1002caa5afcSMichael Tuexen 	L(4, "associations terminated");	R(4, "- bad vtag");
1012caa5afcSMichael Tuexen 	L(5, "associations aborted");		R(5, "- bad crc32c");
1021eaa5682SMichael Tuexen 
1032caa5afcSMichael Tuexen 	L(7, "SCTP Timers");			R(7, "SCTP Chunks");
1042caa5afcSMichael Tuexen 	L(8, "init timeouts");			R(8, "control chunks sent");
1052caa5afcSMichael Tuexen 	L(9, "cookie timeouts");		R(9, "data chunks sent");
1062caa5afcSMichael Tuexen 	L(10, "data timeouts");			R(10, "- ordered");
1072caa5afcSMichael Tuexen 	L(11, "delayed sack timeouts");		R(11, "- unordered");
1082caa5afcSMichael Tuexen 	L(12, "shutdown timeouts");		R(12, "control chunks received");
1092caa5afcSMichael Tuexen 	L(13, "shutdown-ack timeouts");		R(13, "data chunks received");
1102caa5afcSMichael Tuexen 	L(14, "shutdown guard timeouts");	R(14, "- ordered");
1112caa5afcSMichael Tuexen 	L(15, "heartbeat timeouts");		R(15, "- unordered");
1122caa5afcSMichael Tuexen 	L(16, "path MTU timeouts");
1132caa5afcSMichael Tuexen 	L(17, "autoclose timeouts");		R(17, "SCTP User Messages");
1142caa5afcSMichael Tuexen 	L(18, "asconf timeouts");		R(18, "fragmented");
1152caa5afcSMichael Tuexen 	L(19, "stream reset timeouts");		R(19, "reassembled");
1161eaa5682SMichael Tuexen #undef L
1171eaa5682SMichael Tuexen #undef R
1181eaa5682SMichael Tuexen }
1191eaa5682SMichael Tuexen 
1201eaa5682SMichael Tuexen static void
domode(struct sctpstat * ret)1211eaa5682SMichael Tuexen domode(struct sctpstat *ret)
1221eaa5682SMichael Tuexen {
1231eaa5682SMichael Tuexen 	const struct sctpstat *sub;
1241eaa5682SMichael Tuexen 	int divisor = 1;
1251eaa5682SMichael Tuexen 
1261eaa5682SMichael Tuexen 	switch(currentmode) {
1271eaa5682SMichael Tuexen 	case display_RATE:
1281eaa5682SMichael Tuexen 		sub = &oldstat;
1291eaa5682SMichael Tuexen 		divisor = (delay > 1000000) ? delay / 1000000 : 1;
1301eaa5682SMichael Tuexen 		break;
1311eaa5682SMichael Tuexen 	case display_DELTA:
1321eaa5682SMichael Tuexen 		sub = &oldstat;
1331eaa5682SMichael Tuexen 		break;
1341eaa5682SMichael Tuexen 	case display_SINCE:
1351eaa5682SMichael Tuexen 		sub = &initstat;
1361eaa5682SMichael Tuexen 		break;
1371eaa5682SMichael Tuexen 	default:
1381eaa5682SMichael Tuexen 		*ret = curstat;
1391eaa5682SMichael Tuexen 		return;
1401eaa5682SMichael Tuexen 	}
1411eaa5682SMichael Tuexen #define DO(stat) ret->stat = (curstat.stat - sub->stat) / divisor
1421eaa5682SMichael Tuexen 	DO(sctps_currestab);
1431eaa5682SMichael Tuexen 	DO(sctps_activeestab);
1441eaa5682SMichael Tuexen 	DO(sctps_restartestab);
1451eaa5682SMichael Tuexen 	DO(sctps_collisionestab);
1461eaa5682SMichael Tuexen 	DO(sctps_passiveestab);
1471eaa5682SMichael Tuexen 	DO(sctps_aborted);
1481eaa5682SMichael Tuexen 	DO(sctps_shutdown);
1491eaa5682SMichael Tuexen 	DO(sctps_outoftheblue);
1501eaa5682SMichael Tuexen 	DO(sctps_checksumerrors);
1511eaa5682SMichael Tuexen 	DO(sctps_outcontrolchunks);
1521eaa5682SMichael Tuexen 	DO(sctps_outorderchunks);
1531eaa5682SMichael Tuexen 	DO(sctps_outunorderchunks);
1541eaa5682SMichael Tuexen 	DO(sctps_incontrolchunks);
1551eaa5682SMichael Tuexen 	DO(sctps_inorderchunks);
1561eaa5682SMichael Tuexen 	DO(sctps_inunorderchunks);
1571eaa5682SMichael Tuexen 	DO(sctps_fragusrmsgs);
1581eaa5682SMichael Tuexen 	DO(sctps_reasmusrmsgs);
1591eaa5682SMichael Tuexen 	DO(sctps_outpackets);
1601eaa5682SMichael Tuexen 	DO(sctps_inpackets);
1611eaa5682SMichael Tuexen 
1621eaa5682SMichael Tuexen 	DO(sctps_recvpackets);
1631eaa5682SMichael Tuexen 	DO(sctps_recvdatagrams);
1641eaa5682SMichael Tuexen 	DO(sctps_recvpktwithdata);
1651eaa5682SMichael Tuexen 	DO(sctps_recvsacks);
1661eaa5682SMichael Tuexen 	DO(sctps_recvdata);
1671eaa5682SMichael Tuexen 	DO(sctps_recvdupdata);
1681eaa5682SMichael Tuexen 	DO(sctps_recvheartbeat);
1691eaa5682SMichael Tuexen 	DO(sctps_recvheartbeatack);
1701eaa5682SMichael Tuexen 	DO(sctps_recvecne);
1711eaa5682SMichael Tuexen 	DO(sctps_recvauth);
1721eaa5682SMichael Tuexen 	DO(sctps_recvauthmissing);
1731eaa5682SMichael Tuexen 	DO(sctps_recvivalhmacid);
1741eaa5682SMichael Tuexen 	DO(sctps_recvivalkeyid);
1751eaa5682SMichael Tuexen 	DO(sctps_recvauthfailed);
1761eaa5682SMichael Tuexen 	DO(sctps_recvexpress);
1771eaa5682SMichael Tuexen 	DO(sctps_recvexpressm);
1781eaa5682SMichael Tuexen 	DO(sctps_recvswcrc);
1791eaa5682SMichael Tuexen 	DO(sctps_recvhwcrc);
1801eaa5682SMichael Tuexen 
1811eaa5682SMichael Tuexen 	DO(sctps_sendpackets);
1821eaa5682SMichael Tuexen 	DO(sctps_sendsacks);
1831eaa5682SMichael Tuexen 	DO(sctps_senddata);
1841eaa5682SMichael Tuexen 	DO(sctps_sendretransdata);
1851eaa5682SMichael Tuexen 	DO(sctps_sendfastretrans);
1861eaa5682SMichael Tuexen 	DO(sctps_sendmultfastretrans);
1871eaa5682SMichael Tuexen 	DO(sctps_sendheartbeat);
1881eaa5682SMichael Tuexen 	DO(sctps_sendecne);
1891eaa5682SMichael Tuexen 	DO(sctps_sendauth);
1901eaa5682SMichael Tuexen 	DO(sctps_senderrors);
1911eaa5682SMichael Tuexen 	DO(sctps_sendswcrc);
1921eaa5682SMichael Tuexen 	DO(sctps_sendhwcrc);
1931eaa5682SMichael Tuexen 
1941eaa5682SMichael Tuexen 	DO(sctps_pdrpfmbox);
1951eaa5682SMichael Tuexen 	DO(sctps_pdrpfehos);
1961eaa5682SMichael Tuexen 	DO(sctps_pdrpmbda);
1971eaa5682SMichael Tuexen 	DO(sctps_pdrpmbct);
1981eaa5682SMichael Tuexen 	DO(sctps_pdrpbwrpt);
1991eaa5682SMichael Tuexen 	DO(sctps_pdrpcrupt);
2001eaa5682SMichael Tuexen 	DO(sctps_pdrpnedat);
2011eaa5682SMichael Tuexen 	DO(sctps_pdrppdbrk);
2021eaa5682SMichael Tuexen 	DO(sctps_pdrptsnnf);
2031eaa5682SMichael Tuexen 	DO(sctps_pdrpdnfnd);
2041eaa5682SMichael Tuexen 	DO(sctps_pdrpdiwnp);
2051eaa5682SMichael Tuexen 	DO(sctps_pdrpdizrw);
2061eaa5682SMichael Tuexen 	DO(sctps_pdrpbadd);
2071eaa5682SMichael Tuexen 	DO(sctps_pdrpmark);
2081eaa5682SMichael Tuexen 
2091eaa5682SMichael Tuexen 	DO(sctps_timoiterator);
2101eaa5682SMichael Tuexen 	DO(sctps_timodata);
2111eaa5682SMichael Tuexen 	DO(sctps_timowindowprobe);
2121eaa5682SMichael Tuexen 	DO(sctps_timoinit);
2131eaa5682SMichael Tuexen 	DO(sctps_timosack);
2141eaa5682SMichael Tuexen 	DO(sctps_timoshutdown);
2151eaa5682SMichael Tuexen 	DO(sctps_timoheartbeat);
2161eaa5682SMichael Tuexen 	DO(sctps_timocookie);
2171eaa5682SMichael Tuexen 	DO(sctps_timosecret);
2181eaa5682SMichael Tuexen 	DO(sctps_timopathmtu);
2191eaa5682SMichael Tuexen 	DO(sctps_timoshutdownack);
2201eaa5682SMichael Tuexen 	DO(sctps_timoshutdownguard);
2211eaa5682SMichael Tuexen 	DO(sctps_timostrmrst);
2221eaa5682SMichael Tuexen 	DO(sctps_timoearlyfr);
2231eaa5682SMichael Tuexen 	DO(sctps_timoasconf);
2241eaa5682SMichael Tuexen 	DO(sctps_timodelprim);
2251eaa5682SMichael Tuexen 	DO(sctps_timoautoclose);
2261eaa5682SMichael Tuexen 	DO(sctps_timoassockill);
2271eaa5682SMichael Tuexen 	DO(sctps_timoinpkill);
2281eaa5682SMichael Tuexen 
2291eaa5682SMichael Tuexen 	DO(sctps_hdrops);
2301eaa5682SMichael Tuexen 	DO(sctps_badsum);
2311eaa5682SMichael Tuexen 	DO(sctps_noport);
2321eaa5682SMichael Tuexen 	DO(sctps_badvtag);
2331eaa5682SMichael Tuexen 	DO(sctps_badsid);
2341eaa5682SMichael Tuexen 	DO(sctps_nomem);
2351eaa5682SMichael Tuexen 	DO(sctps_fastretransinrtt);
2361eaa5682SMichael Tuexen 	DO(sctps_markedretrans);
2371eaa5682SMichael Tuexen 	DO(sctps_naglesent);
2381eaa5682SMichael Tuexen 	DO(sctps_naglequeued);
2391eaa5682SMichael Tuexen 	DO(sctps_maxburstqueued);
2401eaa5682SMichael Tuexen 	DO(sctps_ifnomemqueued);
2411eaa5682SMichael Tuexen 	DO(sctps_windowprobed);
2421eaa5682SMichael Tuexen 	DO(sctps_lowlevelerr);
2431eaa5682SMichael Tuexen 	DO(sctps_lowlevelerrusr);
2441eaa5682SMichael Tuexen 	DO(sctps_datadropchklmt);
2451eaa5682SMichael Tuexen 	DO(sctps_datadroprwnd);
2461eaa5682SMichael Tuexen 	DO(sctps_ecnereducedcwnd);
2471eaa5682SMichael Tuexen 	DO(sctps_vtagexpress);
2481eaa5682SMichael Tuexen 	DO(sctps_vtagbogus);
2491eaa5682SMichael Tuexen 	DO(sctps_primary_randry);
2501eaa5682SMichael Tuexen 	DO(sctps_cmt_randry);
2511eaa5682SMichael Tuexen 	DO(sctps_slowpath_sack);
2521eaa5682SMichael Tuexen 	DO(sctps_wu_sacks_sent);
2531eaa5682SMichael Tuexen 	DO(sctps_sends_with_flags);
2541eaa5682SMichael Tuexen 	DO(sctps_sends_with_unord);
2551eaa5682SMichael Tuexen 	DO(sctps_sends_with_eof);
2561eaa5682SMichael Tuexen 	DO(sctps_sends_with_abort);
2571eaa5682SMichael Tuexen 	DO(sctps_protocol_drain_calls);
2581eaa5682SMichael Tuexen 	DO(sctps_protocol_drains_done);
2591eaa5682SMichael Tuexen 	DO(sctps_read_peeks);
2601eaa5682SMichael Tuexen 	DO(sctps_cached_chk);
2611eaa5682SMichael Tuexen 	DO(sctps_cached_strmoq);
2621eaa5682SMichael Tuexen 	DO(sctps_left_abandon);
2631eaa5682SMichael Tuexen 	DO(sctps_send_burst_avoid);
2641eaa5682SMichael Tuexen 	DO(sctps_send_cwnd_avoid);
2651eaa5682SMichael Tuexen 	DO(sctps_fwdtsn_map_over);
2661eaa5682SMichael Tuexen 	DO(sctps_queue_upd_ecne);
2671eaa5682SMichael Tuexen #undef DO
2681eaa5682SMichael Tuexen }
2691eaa5682SMichael Tuexen 
2701eaa5682SMichael Tuexen void
showsctp(void)2711eaa5682SMichael Tuexen showsctp(void)
2721eaa5682SMichael Tuexen {
2731eaa5682SMichael Tuexen 	struct sctpstat stats;
2741eaa5682SMichael Tuexen 
2751eaa5682SMichael Tuexen 	memset(&stats, 0, sizeof stats);
2761eaa5682SMichael Tuexen 	domode(&stats);
2771eaa5682SMichael Tuexen 
2781eaa5682SMichael Tuexen #define DO(stat, row, col) \
279*35e941ceSBaptiste Daroussin 	mvwprintw(wnd, row, col, "%12u", stats.stat)
2801eaa5682SMichael Tuexen #define	L(row, stat) DO(stat, row, 0)
2811eaa5682SMichael Tuexen #define	R(row, stat) DO(stat, row, 38)
2821eaa5682SMichael Tuexen 	L(1, sctps_activeestab);	R(1, sctps_outpackets);
2831eaa5682SMichael Tuexen 	L(2, sctps_passiveestab);	R(2, sctps_inpackets);
2842caa5afcSMichael Tuexen 	L(3, sctps_restartestab);	R(3, sctps_outoftheblue);
2852caa5afcSMichael Tuexen 	L(4, sctps_shutdown);		R(4, sctps_badvtag);
2862caa5afcSMichael Tuexen 	L(5, sctps_aborted);		R(5, sctps_checksumerrors);
2871eaa5682SMichael Tuexen 
2881eaa5682SMichael Tuexen 
2892caa5afcSMichael Tuexen 	L(8, sctps_timoinit);		R(8, sctps_outcontrolchunks);
2902caa5afcSMichael Tuexen 	L(9, sctps_timocookie);		R(9, sctps_senddata);
2912caa5afcSMichael Tuexen 	L(10, sctps_timodata);		R(10, sctps_outorderchunks);
2922caa5afcSMichael Tuexen 	L(11, sctps_timosack);		R(11, sctps_outunorderchunks);
2932caa5afcSMichael Tuexen 	L(12, sctps_timoshutdown);	R(12, sctps_incontrolchunks);
2942caa5afcSMichael Tuexen 	L(13, sctps_timoshutdownack);	R(13, sctps_recvdata);
2952caa5afcSMichael Tuexen 	L(14, sctps_timoshutdownguard);	R(14, sctps_inorderchunks);
2962caa5afcSMichael Tuexen 	L(15, sctps_timoheartbeat);	R(15, sctps_inunorderchunks);
2972caa5afcSMichael Tuexen 	L(16, sctps_timopathmtu);
2982caa5afcSMichael Tuexen 	L(17, sctps_timoautoclose);
2992caa5afcSMichael Tuexen 	L(18, sctps_timoasconf);	R(18, sctps_fragusrmsgs);
3002caa5afcSMichael Tuexen 	L(19, sctps_timostrmrst);	R(19, sctps_reasmusrmsgs);
3011eaa5682SMichael Tuexen #undef DO
3021eaa5682SMichael Tuexen #undef L
3031eaa5682SMichael Tuexen #undef R
3041eaa5682SMichael Tuexen }
3051eaa5682SMichael Tuexen 
3061eaa5682SMichael Tuexen int
initsctp(void)3071eaa5682SMichael Tuexen initsctp(void)
3081eaa5682SMichael Tuexen {
3091eaa5682SMichael Tuexen 	size_t len;
3101eaa5682SMichael Tuexen 	const char *name = "net.inet.sctp.stats";
3111eaa5682SMichael Tuexen 
3121eaa5682SMichael Tuexen 	len = 0;
3131eaa5682SMichael Tuexen 	if (sysctlbyname(name, NULL, &len, NULL, 0) < 0) {
3141eaa5682SMichael Tuexen 		error("sysctl getting sctpstat size failed");
3151eaa5682SMichael Tuexen 		return 0;
3161eaa5682SMichael Tuexen 	}
3171eaa5682SMichael Tuexen 	if (len > sizeof curstat) {
3181eaa5682SMichael Tuexen 		error("sctpstat structure has grown--recompile systat!");
3191eaa5682SMichael Tuexen 		return 0;
3201eaa5682SMichael Tuexen 	}
3211eaa5682SMichael Tuexen 	if (sysctlbyname(name, &initstat, &len, NULL, 0) < 0) {
3221eaa5682SMichael Tuexen 		error("sysctl getting sctpstat failed");
3231eaa5682SMichael Tuexen 		return 0;
3241eaa5682SMichael Tuexen 	}
3251eaa5682SMichael Tuexen 	oldstat = initstat;
3261eaa5682SMichael Tuexen 	return 1;
3271eaa5682SMichael Tuexen }
3281eaa5682SMichael Tuexen 
3291eaa5682SMichael Tuexen void
resetsctp(void)3301eaa5682SMichael Tuexen resetsctp(void)
3311eaa5682SMichael Tuexen {
3321eaa5682SMichael Tuexen 	size_t len;
3331eaa5682SMichael Tuexen 	const char *name = "net.inet.sctp.stats";
3341eaa5682SMichael Tuexen 
3351eaa5682SMichael Tuexen 	len = sizeof initstat;
3361eaa5682SMichael Tuexen 	if (sysctlbyname(name, &initstat, &len, NULL, 0) < 0) {
3371eaa5682SMichael Tuexen 		error("sysctl getting sctpstat failed");
3381eaa5682SMichael Tuexen 	}
3391eaa5682SMichael Tuexen 	oldstat = initstat;
3401eaa5682SMichael Tuexen }
3411eaa5682SMichael Tuexen 
3421eaa5682SMichael Tuexen void
fetchsctp(void)3431eaa5682SMichael Tuexen fetchsctp(void)
3441eaa5682SMichael Tuexen {
3451eaa5682SMichael Tuexen 	size_t len;
3461eaa5682SMichael Tuexen 	const char *name = "net.inet.sctp.stats";
3471eaa5682SMichael Tuexen 
3481eaa5682SMichael Tuexen 	oldstat = curstat;
3491eaa5682SMichael Tuexen 	len = sizeof curstat;
3501eaa5682SMichael Tuexen 	if (sysctlbyname(name, &curstat, &len, NULL, 0) < 0) {
3511eaa5682SMichael Tuexen 		error("sysctl getting sctpstat failed");
3521eaa5682SMichael Tuexen 	}
3531eaa5682SMichael Tuexen 	return;
3541eaa5682SMichael Tuexen }
355