summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-fc.h
blob: 5f21b620cf2171d45df52ff80386ef367a21434b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* packet-fc.h
 * Basic Fibre Channel Header definitions
 * Copyright 2002 Dinesh G Dutt (ddutt@cisco.com)
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#ifndef __PACKET_FC_H_
#define __PACKET_FC_H_

#include <epan/conversation.h>
#include <epan/etypes.h>
#include "ws_symbol_export.h"

/* R_CTL upper bits creates a classification tree */
#define FC_RCTL_DEV_DATA       0x00
#define FC_RCTL_ELS            0x20
#define FC_RCTL_LINK_DATA      0x30
#define FC_RCTL_VIDEO          0x40
#define FC_RCTL_BLS            0x80
#define FC_RCTL_LINK_CTL       0xC0
/* XXX - is 0xF0 Extended Routing?  It is in the FC-FS draft on the T11
   Web site. */

#define FC_TYPE_CMNSVC         0x0  /* Used in PRLI Svc Param Page */

/* TYPE definitions for Basic or Extended Link_Data */
#define FC_TYPE_BLS            0x0
#define FC_TYPE_ELS            0x1

/* TYPE definitions for FC-4 */
#define FC_TYPE_LLCSNAP        0x4
#define FC_TYPE_IP             0x5
#define FC_TYPE_SCSI           0x8
#define FC_TYPE_SB_TO_CU       0x1B
#define FC_TYPE_SB_FROM_CU     0x1C
#define FC_TYPE_FCCT           0x20
#define FC_TYPE_SWILS          0x22
#define FC_TYPE_AL             0x23
#define FC_TYPE_SNMP           0x24
#define FC_TYPE_VENDOR         0xFF


/*
 * the following allows TAP code access to the messages
 * without having to duplicate it. With MSVC and a
 * libwireshark.dll, we need a special declaration.
 */
WS_DLL_PUBLIC const value_string fc_fc4_val[];

/* DF_CTL bits */
#define FC_DFCTL_DH         0x03   /* Device_Header type bits: */
#define FC_DFCTL_DH_NONE    0x00   /* No Device_Header */
#define FC_DFCTL_DH_16_BYTE 0x01   /* 16 Byte Device_Header */
#define FC_DFCTL_DH_32_BYTE 0x02   /* 32 Byte Device_Header */
#define FC_DFCTL_DH_64_BYTE 0x03   /* 64 Byte Device_Header */
#define FC_DFCTL_AH         0x10   /* Association_Header bit */
#define FC_DFCTL_NH         0x20   /* Association_Header bit */
#define FC_DFCTL_SH         0x40   /* reserved for security header */

/* Derived Frame types (used for ULP demux) */
#define FC_FTYPE_UNDEF         0x0
#define FC_FTYPE_SWILS         0x1
#define FC_FTYPE_IP            0x2
#define FC_FTYPE_SCSI          0x3
#define FC_FTYPE_BLS           0x4
#define FC_FTYPE_ELS           0x5
#define FC_FTYPE_FCCT          0x7
#define FC_FTYPE_LINKDATA      0x8
#define FC_FTYPE_VDO           0x9
#define FC_FTYPE_LINKCTL       0xA
#define FC_FTYPE_SWILS_RSP     0xB
#define FC_FTYPE_SBCCS         0xC
#define FC_FTYPE_OHMS          0xD

/* Well-known Address Definitions (in Network order) */
#define FC_WKA_MULTICAST       0xFFFFF5
#define FC_WKA_CLKSYNC         0xFFFFF6
#define FC_WKA_KEYDIST         0xFFFFF7
#define FC_WKA_ALIAS           0xFFFFF8
#define FC_WKA_QOSF            0xFFFFF9
#define FC_WKA_MGMT            0xFFFFFA
#define FC_WKA_TIME            0xFFFFFB
#define FC_WKA_DNS             0xFFFFFC
#define FC_WKA_FABRIC_CTRLR    0xFFFFFD
#define FC_WKA_FPORT           0xFFFFFE
#define FC_WKA_BCAST           0xFFFFFF

/* Well-known Address Definitions (in little endian) */

/* Information Categories for Link Data & Link Control Frames */
#define FC_IU_UNCATEGORIZED     0x0
#define FC_IU_SOLICITED_DATA    0x1
#define FC_IU_UNSOLICITED_CTL   0x2
#define FC_IU_SOLICITED_CTL     0x3
#define FC_IU_UNSOLICITED_DATA  0x4
#define FC_IU_DATA_DESCRIPTOR   0x5
#define FC_IU_UNSOLICITED_CMD   0x6
#define FC_IU_CMD_STATUS        0x7

/* FC_CTL bits */
#define FC_FCTL_EXCHANGE_RESPONDER	0x800000
#define FC_FCTL_SEQ_RECIPIENT		0x400000
#define FC_FCTL_EXCHANGE_FIRST		0x200000
#define FC_FCTL_EXCHANGE_LAST		0x100000
#define FC_FCTL_SEQ_LAST		0x080000
#define FC_FCTL_PRIORITY		0x020000
#define FC_FCTL_TRANSFER_SEQ_INITIATIVE	0x010000
#define FC_FCTL_LAST_DATA_FRAME_MASK	0x00c000
#define FC_FCTL_ACK_0_1_MASK		0x003000
#define FC_FCTL_REXMITTED_SEQ		0x000200
#define FC_FCTL_ABTS_MASK		0x000030
#define FC_FCTL_REL_OFFSET		0x000008


typedef struct _fc_exchange_t {
    uint32_t first_exchange_frame;
    uint32_t last_exchange_frame;
    nstime_t fc_time;
} fc_exchange_t;

/* FC header structure */
typedef struct _fc_hdr {
    address s_id;
    address d_id;
    uint32_t fctl;
    uint8_t type;
    uint16_t seqcnt;
    uint16_t oxid;
    uint16_t rxid;
    uint8_t r_ctl;
    uint8_t cs_ctl;
    uint16_t lun;
    fc_exchange_t* fc_ex;
    uint32_t relative_offset;
} fc_hdr;

#define FC_DATA_SOF_FIRST_FRAME   0x1
#define FC_DATA_SOF_SOFF          0x2
#define FC_DATA_EOF_LAST_FRAME    0x80
#define FC_DATA_EOF_INVALID       0x40

/* Data structure to pass into FC dissector */
typedef struct _fc_data {
    unsigned   ethertype;
    uint8_t sof_eof;              /**< FC's SOF/EOF encoding passed to FC decoder
                                 * Bit 7 set if Last frame in sequence
                                 * Bit 6 set if invalid frame content
                                 * Bit 2 set if SOFf
                                 * Bit 1 set if first frame in sequence
                                 */
} fc_data_t;

#endif /* __PACKET_FC_H_ */