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_PROBE" , |
158 | "TIMEOUT_SACK" , |
159 | "TIMEOUT_AUTOCLOSE" , |
160 | }; |
161 | |
162 | /* Lookup timer debug name. */ |
163 | const char *sctp_tname(const union sctp_subtype id) |
164 | { |
165 | BUILD_BUG_ON(SCTP_EVENT_TIMEOUT_MAX + 1 != ARRAY_SIZE(sctp_timer_tbl)); |
166 | |
167 | if (id.timeout < ARRAY_SIZE(sctp_timer_tbl)) |
168 | return sctp_timer_tbl[id.timeout]; |
169 | return "unknown_timer" ; |
170 | } |
171 | |