/* * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * http://www.ntop.org * * Copyright (C) 2003 Dinesh G. Dutt * Copyright (C) 2003-04 Luca Deri * * -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef __FC_UTILS_H__ #define __FC_UTILS_H__ #define FC_ID_SYSTEM_DOMAIN 0xFF #define FC_ID_DOMCTLR_AREA 0xFC #define FC_BROADCAST_ADDR "ff.ff.ff" #define FC_FAB_CTLR_ADDR "ff.ff.fd" #define MDSHDR_HEADER_SIZE 16 #define MDSHDR_TRAILER_SIZE 6 /* SOF Encodings */ #define MDSHDR_SOFc1 0x1 #define MDSHDR_SOFi1 0x2 #define MDSHDR_SOFn1 0x3 #define MDSHDR_SOFi2 0x4 #define MDSHDR_SOFn2 0x5 #define MDSHDR_SOFi3 0x6 #define MDSHDR_SOFn3 0x7 #define MDSHDR_SOFf 0x8 #define MDSHDR_SOFc4 0x9 #define MDSHDR_SOFi4 0xa #define MDSHDR_SOFn4 0xb /* EOF Encodings */ #define MDSHDR_EOFt 0x1 #define MDSHDR_EOFdt 0x2 #define MDSHDR_EOFa 0x4 #define MDSHDR_EOFn 0x3 #define MDSHDR_EOFdti 0x6 #define MDSHDR_EOFni 0x7 #define MDSHDR_EOFrt 0xa #define MDSHDR_EOFrti 0xe #define MDSHDR_EOF_UNKNOWN 0xb /* 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_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 /* SB3 Control Unit -> Channel */ #define FC_TYPE_SB_FROM_CU 0x1C /* SB3 Channel -> Control Unit */ #define FC_TYPE_FCCT 0x20 #define FC_TYPE_SWILS 0x22 #define FC_TYPE_AL 0x23 #define FC_TYPE_SNMP 0x24 /* Derived Frame types (used for ULP demux) */ #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_UNDEF 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 #define FC_ELS_CMD_ACC 0x02 #define FC_ELS_CMD_PLOGI 0x03 #define FC_ELS_CMD_LOGO 0x05 #define FC_ELS_CMD_RSCN 0x61 #define FC_ELS_CMD_SCR 0x62 /* Well-known GSTYPEs */ #define FCCT_GSTYPE_KEYSVC 0xF7 #define FCCT_GSTYPE_ALIASSVC 0xF8 #define FCCT_GSTYPE_MGMTSVC 0xFA #define FCCT_GSTYPE_TIMESVC 0xFB #define FCCT_GSTYPE_DIRSVC 0xFC /* Well-known GSSUBTYPES */ /* Actual servers serving the directory service type identified by subtype */ #define FCCT_GSSUBTYPE_DNS 0x02 #define FCCT_GSSUBTYPE_IP 0x03 #define FCCT_GSSUBTYPE_FCS 0x01 #define FCCT_GSSUBTYPE_UNS 0x02 #define FCCT_GSSUBTYPE_FZS 0x03 #define FCCT_GSSUBTYPE_AS 0x01 #define FCCT_GSSUBTYPE_TS 0x01 #define FCDNS_RPN_ID 0x0212 #define FCDNS_RNN_ID 0x0213 #define FCDNS_RCS_ID 0x0214 #define FCDNS_RFT_ID 0x0217 #define FCDNS_RSPN_ID 0x0218 #define FCDNS_RPT_ID 0x021A #define FCDNS_RIPP_ID 0x021B #define FCDNS_RHA_ID 0x021D #define FCDNS_RFD_ID 0x021E #define FCDNS_RFF_ID 0x021F #define FCDNS_RIP_NN 0x0235 #define FCDNS_RIPA_NN 0x0236 #define FCDNS_RSNN_NN 0x0239 /* Information Categories based on lower 4 bits of R_CTL */ #define FCP_IU_DATA 0x1 #define FCP_IU_CONFIRM 0x3 #define FCP_IU_XFER_RDY 0x5 #define FCP_IU_CMD 0x6 #define FCP_IU_RSP 0x7 /* SWILS Commands */ #define FC_SWILS_SWRJT 0x01 #define FC_SWILS_SWACC 0x02 #define FC_SWILS_ELP 0x10 #define FC_SWILS_EFP 0x11 #define FC_SWILS_DIA 0x12 #define FC_SWILS_RDI 0x13 #define FC_SWILS_HLO 0x14 #define FC_SWILS_LSU 0x15 #define FC_SWILS_LSA 0x16 #define FC_SWILS_BF 0x17 #define FC_SWILS_RCF 0x18 #define FC_SWILS_RSCN 0x1B #define FC_SWILS_DRLIR 0x1E #define FC_SWILS_DSCN 0x20 #define FC_SWILS_LOOPD 0x21 #define FC_SWILS_MR 0x22 #define FC_SWILS_ACA 0x23 #define FC_SWILS_RCA 0x24 #define FC_SWILS_SFC 0x25 #define FC_SWILS_UFC 0x26 #define FC_SWILS_ESC 0x30 #define FC_HDR_SIZE 24 /* SW_RSCN fields */ #define FC_SW_RSCN_FABRIC_DETECT 0x01 #define FC_SW_RSCN_NPORT_DETECT 0x02 #define FC_SW_RSCN_PORT_ONLINE 0x10 #define FC_SW_RSCN_PORT_OFFLINE 0x20 #define CMP_FC_PORT(a,b) \ if ((a->fcCounters->hostFcAddress.domain == 0xFF) || \ (b->fcCounters->hostFcAddress.domain == 0xFF)) { \ /* Always compare FC_IDs for reserved FC_IDs */ \ rc = memcmp (&a->fcCounters->hostFcAddress, &b->fcCounters->hostFcAddress, LEN_FC_ADDRESS); \ } \ else { \ /* Sort such that entries with alias names show up together, then \ * entries with pWWN and finally entries with FC_ID. Within each \ * set, the entries must be correctly sorted. \ */ \ if ((a->hostResolvedName[0] != '\0') && \ (b->hostResolvedName[0] != '\0')) { \ rc = strcmp(a->hostResolvedName, b->hostResolvedName); \ } \ else if ((a->hostResolvedName[0] == 0) && \ (b->hostResolvedName[0] != '\0')) { \ rc = 1; /* Named entries float to top */ \ } \ else if ((a->hostResolvedName[0] != 0) && \ (b->hostResolvedName[0] == '\0')) { \ rc = -1; /* Named entries float to top */ \ } \ else if ((a->fcCounters->pWWN.str[0] != '\0') && \ (b->fcCounters->pWWN.str[0] != '\0')) { \ rc = memcmp (a->fcCounters->pWWN.str, b->fcCounters->pWWN.str, LEN_WWN_ADDRESS); \ } \ else if ((a->fcCounters->pWWN.str[0] == '\0') && \ (b->fcCounters->pWWN.str[0] != '\0')) { \ rc = 1; /* pWWN entries float above FC_ID only entries */ \ } \ else if ((a->fcCounters->pWWN.str[0] != '\0') && \ (b->fcCounters->pWWN.str[0] == '\0')) { \ rc = -1; \ } \ else { \ rc = memcmp (&a->hostIpAddress, &b->hostIpAddress, LEN_FC_ADDRESS); \ } \ } #endif