Merge tag 'arc-5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[sfrench/cifs-2.6.git] / net / sctp / debug.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* SCTP kernel implementation
3  * (C) Copyright IBM Corp. 2001, 2004
4  * Copyright (c) 1999-2000 Cisco, Inc.
5  * Copyright (c) 1999-2001 Motorola, Inc.
6  * Copyright (c) 2001 Intel Corp.
7  *
8  * This file is part of the SCTP kernel implementation
9  *
10  * This file converts numerical ID value to alphabetical names for SCTP
11  * terms such as chunk type, parameter time, event type, etc.
12  *
13  * Please send any bug reports or fixes you make to the
14  * email address(es):
15  *    lksctp developers <linux-sctp@vger.kernel.org>
16  *
17  * Written or modified by:
18  *    La Monte H.P. Yarroll <piggy@acm.org>
19  *    Karl Knutson          <karl@athena.chicago.il.us>
20  *    Xingang Guo           <xingang.guo@intel.com>
21  *    Jon Grimm             <jgrimm@us.ibm.com>
22  *    Daisy Chang           <daisyc@us.ibm.com>
23  *    Sridhar Samudrala     <sri@us.ibm.com>
24  */
25
26 #include <net/sctp/sctp.h>
27
28 /* These are printable forms of Chunk ID's from section 3.1.  */
29 static const char *const sctp_cid_tbl[SCTP_NUM_BASE_CHUNK_TYPES] = {
30         "DATA",
31         "INIT",
32         "INIT_ACK",
33         "SACK",
34         "HEARTBEAT",
35         "HEARTBEAT_ACK",
36         "ABORT",
37         "SHUTDOWN",
38         "SHUTDOWN_ACK",
39         "ERROR",
40         "COOKIE_ECHO",
41         "COOKIE_ACK",
42         "ECN_ECNE",
43         "ECN_CWR",
44         "SHUTDOWN_COMPLETE",
45 };
46
47 /* Lookup "chunk type" debug name. */
48 const char *sctp_cname(const union sctp_subtype cid)
49 {
50         if (cid.chunk <= SCTP_CID_BASE_MAX)
51                 return sctp_cid_tbl[cid.chunk];
52
53         switch (cid.chunk) {
54         case SCTP_CID_ASCONF:
55                 return "ASCONF";
56
57         case SCTP_CID_ASCONF_ACK:
58                 return "ASCONF_ACK";
59
60         case SCTP_CID_FWD_TSN:
61                 return "FWD_TSN";
62
63         case SCTP_CID_AUTH:
64                 return "AUTH";
65
66         case SCTP_CID_RECONF:
67                 return "RECONF";
68
69         case SCTP_CID_I_DATA:
70                 return "I_DATA";
71
72         case SCTP_CID_I_FWD_TSN:
73                 return "I_FWD_TSN";
74
75         default:
76                 break;
77         }
78
79         return "unknown chunk";
80 }
81
82 /* These are printable forms of the states.  */
83 const char *const sctp_state_tbl[SCTP_STATE_NUM_STATES] = {
84         "STATE_CLOSED",
85         "STATE_COOKIE_WAIT",
86         "STATE_COOKIE_ECHOED",
87         "STATE_ESTABLISHED",
88         "STATE_SHUTDOWN_PENDING",
89         "STATE_SHUTDOWN_SENT",
90         "STATE_SHUTDOWN_RECEIVED",
91         "STATE_SHUTDOWN_ACK_SENT",
92 };
93
94 /* Events that could change the state of an association.  */
95 const char *const sctp_evttype_tbl[] = {
96         "EVENT_T_unknown",
97         "EVENT_T_CHUNK",
98         "EVENT_T_TIMEOUT",
99         "EVENT_T_OTHER",
100         "EVENT_T_PRIMITIVE"
101 };
102
103 /* Return value of a state function */
104 const char *const sctp_status_tbl[] = {
105         "DISPOSITION_DISCARD",
106         "DISPOSITION_CONSUME",
107         "DISPOSITION_NOMEM",
108         "DISPOSITION_DELETE_TCB",
109         "DISPOSITION_ABORT",
110         "DISPOSITION_VIOLATION",
111         "DISPOSITION_NOT_IMPL",
112         "DISPOSITION_ERROR",
113         "DISPOSITION_BUG"
114 };
115
116 /* Printable forms of primitives */
117 static const char *const sctp_primitive_tbl[SCTP_NUM_PRIMITIVE_TYPES] = {
118         "PRIMITIVE_ASSOCIATE",
119         "PRIMITIVE_SHUTDOWN",
120         "PRIMITIVE_ABORT",
121         "PRIMITIVE_SEND",
122         "PRIMITIVE_REQUESTHEARTBEAT",
123         "PRIMITIVE_ASCONF",
124 };
125
126 /* Lookup primitive debug name. */
127 const char *sctp_pname(const union sctp_subtype id)
128 {
129         if (id.primitive <= SCTP_EVENT_PRIMITIVE_MAX)
130                 return sctp_primitive_tbl[id.primitive];
131         return "unknown_primitive";
132 }
133
134 static const char *const sctp_other_tbl[] = {
135         "NO_PENDING_TSN",
136         "ICMP_PROTO_UNREACH",
137 };
138
139 /* Lookup "other" debug name. */
140 const char *sctp_oname(const union sctp_subtype id)
141 {
142         if (id.other <= SCTP_EVENT_OTHER_MAX)
143                 return sctp_other_tbl[id.other];
144         return "unknown 'other' event";
145 }
146
147 static const char *const sctp_timer_tbl[] = {
148         "TIMEOUT_NONE",
149         "TIMEOUT_T1_COOKIE",
150         "TIMEOUT_T1_INIT",
151         "TIMEOUT_T2_SHUTDOWN",
152         "TIMEOUT_T3_RTX",
153         "TIMEOUT_T4_RTO",
154         "TIMEOUT_T5_SHUTDOWN_GUARD",
155         "TIMEOUT_HEARTBEAT",
156         "TIMEOUT_RECONF",
157         "TIMEOUT_SACK",
158         "TIMEOUT_AUTOCLOSE",
159 };
160
161 /* Lookup timer debug name. */
162 const char *sctp_tname(const union sctp_subtype id)
163 {
164         BUILD_BUG_ON(SCTP_EVENT_TIMEOUT_MAX + 1 != ARRAY_SIZE(sctp_timer_tbl));
165
166         if (id.timeout < ARRAY_SIZE(sctp_timer_tbl))
167                 return sctp_timer_tbl[id.timeout];
168         return "unknown_timer";
169 }