linux/net/sctp/debug.c
<<
>>
Prefs
   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.  */
  29static 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. */
  48const 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.  */
  83const 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.  */
  95const 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 */
 104const 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 */
 117static 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. */
 127const 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
 134static const char *const sctp_other_tbl[] = {
 135        "NO_PENDING_TSN",
 136        "ICMP_PROTO_UNREACH",
 137};
 138
 139/* Lookup "other" debug name. */
 140const 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
 147static 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. */
 163const 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