Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
0004  */
0005 #ifndef _FC_FIP_H_
0006 #define _FC_FIP_H_
0007 
0008 #include <scsi/fc/fc_ns.h>
0009 
0010 /*
0011  * This version is based on:
0012  * http://www.t11.org/ftp/t11/pub/fc/bb-5/08-543v1.pdf
0013  * and T11 FC-BB-6 13-091v5.pdf (December 2013 VN2VN proposal)
0014  */
0015 
0016 #define FIP_DEF_PRI 128 /* default selection priority */
0017 #define FIP_DEF_FC_MAP  0x0efc00 /* default FCoE MAP (MAC OUI) value */
0018 #define FIP_DEF_FKA 8000    /* default FCF keep-alive/advert period (mS) */
0019 #define FIP_VN_KA_PERIOD 90000  /* required VN_port keep-alive period (mS) */
0020 #define FIP_FCF_FUZZ    100 /* random time added by FCF (mS) */
0021 
0022 /*
0023  * VN2VN proposed-standard values.
0024  */
0025 #define FIP_VN_FC_MAP   0x0efd00 /* MAC OUI for VN2VN use */
0026 #define FIP_VN_PROBE_WAIT 100   /* interval between VN2VN probes (ms) */
0027 #define FIP_VN_ANN_WAIT 400 /* interval between VN2VN announcements (ms) */
0028 #define FIP_VN_RLIM_INT 10000   /* interval between probes when rate limited */
0029 #define FIP_VN_RLIM_COUNT 10    /* number of probes before rate limiting */
0030 #define FIP_VN_BEACON_INT 8000  /* interval between VN2VN beacons */
0031 #define FIP_VN_BEACON_FUZZ 100  /* random time to add to beacon period (ms) */
0032 
0033 /*
0034  * Multicast MAC addresses.  T11-adopted.
0035  */
0036 #define FIP_ALL_FCOE_MACS   ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 0 })
0037 #define FIP_ALL_ENODE_MACS  ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 1 })
0038 #define FIP_ALL_FCF_MACS    ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 })
0039 #define FIP_ALL_VN2VN_MACS  ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 4 })
0040 #define FIP_ALL_P2P_MACS    ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 5 })
0041 
0042 #define FIP_VER     1       /* version for fip_header */
0043 
0044 struct fip_header {
0045     __u8    fip_ver;        /* upper 4 bits are the version */
0046     __u8    fip_resv1;      /* reserved */
0047     __be16  fip_op;         /* operation code */
0048     __u8    fip_resv2;      /* reserved */
0049     __u8    fip_subcode;        /* lower 4 bits are sub-code */
0050     __be16  fip_dl_len;     /* length of descriptors in words */
0051     __be16  fip_flags;      /* header flags */
0052 } __attribute__((packed));
0053 
0054 #define FIP_VER_SHIFT   4
0055 #define FIP_VER_ENCAPS(v) ((v) << FIP_VER_SHIFT)
0056 #define FIP_VER_DECAPS(v) ((v) >> FIP_VER_SHIFT)
0057 #define FIP_BPW     4       /* bytes per word for lengths */
0058 
0059 /*
0060  * fip_op.
0061  */
0062 enum fip_opcode {
0063     FIP_OP_DISC =   1,      /* discovery, advertisement, etc. */
0064     FIP_OP_LS = 2,      /* Link Service request or reply */
0065     FIP_OP_CTRL =   3,      /* Keep Alive / Link Reset */
0066     FIP_OP_VLAN =   4,      /* VLAN discovery */
0067     FIP_OP_VN2VN =  5,      /* VN2VN operation */
0068     FIP_OP_VENDOR_MIN = 0xfff8, /* min vendor-specific opcode */
0069     FIP_OP_VENDOR_MAX = 0xfffe, /* max vendor-specific opcode */
0070 };
0071 
0072 /*
0073  * Subcodes for FIP_OP_DISC.
0074  */
0075 enum fip_disc_subcode {
0076     FIP_SC_SOL =    1,      /* solicitation */
0077     FIP_SC_ADV =    2,      /* advertisement */
0078 };
0079 
0080 /*
0081  * Subcodes for FIP_OP_LS.
0082  */
0083 enum fip_trans_subcode {
0084     FIP_SC_REQ =    1,      /* request */
0085     FIP_SC_REP =    2,      /* reply */
0086 };
0087 
0088 /*
0089  * Subcodes for FIP_OP_RESET.
0090  */
0091 enum fip_reset_subcode {
0092     FIP_SC_KEEP_ALIVE = 1,      /* keep-alive from VN_Port */
0093     FIP_SC_CLR_VLINK = 2,       /* clear virtual link from VF_Port */
0094 };
0095 
0096 /*
0097  * Subcodes for FIP_OP_VLAN.
0098  */
0099 enum fip_vlan_subcode {
0100     FIP_SC_VL_REQ = 1,      /* vlan request */
0101     FIP_SC_VL_NOTE = 2,     /* vlan notification */
0102     FIP_SC_VL_VN2VN_NOTE = 3,   /* VN2VN vlan notification */
0103 };
0104 
0105 /*
0106  * Subcodes for FIP_OP_VN2VN.
0107  */
0108 enum fip_vn2vn_subcode {
0109     FIP_SC_VN_PROBE_REQ = 1,    /* probe request */
0110     FIP_SC_VN_PROBE_REP = 2,    /* probe reply */
0111     FIP_SC_VN_CLAIM_NOTIFY = 3, /* claim notification */
0112     FIP_SC_VN_CLAIM_REP = 4,    /* claim response */
0113     FIP_SC_VN_BEACON = 5,       /* beacon */
0114 };
0115 
0116 /*
0117  * flags in header fip_flags.
0118  */
0119 enum fip_flag {
0120     FIP_FL_FPMA =   0x8000,     /* supports FPMA fabric-provided MACs */
0121     FIP_FL_SPMA =   0x4000,     /* supports SPMA server-provided MACs */
0122     FIP_FL_FCF =    0x0020,     /* originated from a controlling FCF */
0123     FIP_FL_FDF =    0x0010,     /* originated from an FDF */
0124     FIP_FL_REC_OR_P2P = 0x0008, /* configured addr or point-to-point */
0125     FIP_FL_AVAIL =  0x0004,     /* available for FLOGI/ELP */
0126     FIP_FL_SOL =    0x0002,     /* this is a solicited message */
0127     FIP_FL_FPORT =  0x0001,     /* sent from an F port */
0128 };
0129 
0130 /*
0131  * Common descriptor header format.
0132  */
0133 struct fip_desc {
0134     __u8    fip_dtype;      /* type - see below */
0135     __u8    fip_dlen;       /* length - in 32-bit words */
0136 };
0137 
0138 enum fip_desc_type {
0139     FIP_DT_PRI =    1,      /* priority for forwarder selection */
0140     FIP_DT_MAC =    2,      /* MAC address */
0141     FIP_DT_MAP_OUI = 3,     /* FC-MAP OUI */
0142     FIP_DT_NAME =   4,      /* switch name or node name */
0143     FIP_DT_FAB =    5,      /* fabric descriptor */
0144     FIP_DT_FCOE_SIZE = 6,       /* max FCoE frame size */
0145     FIP_DT_FLOGI =  7,      /* FLOGI request or response */
0146     FIP_DT_FDISC =  8,      /* FDISC request or response */
0147     FIP_DT_LOGO =   9,      /* LOGO request or response */
0148     FIP_DT_ELP =    10,     /* ELP request or response */
0149     FIP_DT_VN_ID =  11,     /* VN_Node Identifier */
0150     FIP_DT_FKA =    12,     /* advertisement keep-alive period */
0151     FIP_DT_VENDOR = 13,     /* vendor ID */
0152     FIP_DT_VLAN =   14,     /* vlan number */
0153     FIP_DT_FC4F =   15,     /* FC-4 features */
0154     FIP_DT_LIMIT,           /* max defined desc_type + 1 */
0155     FIP_DT_NON_CRITICAL = 128,  /* First non-critical descriptor */
0156     FIP_DT_CLR_VLINKS = 128,    /* Clear virtual links reason code */
0157     FIP_DT_VENDOR_BASE = 241,   /* first vendor-specific desc_type */
0158 };
0159 
0160 /*
0161  * FIP_DT_PRI - priority descriptor.
0162  */
0163 struct fip_pri_desc {
0164     struct fip_desc fd_desc;
0165     __u8        fd_resvd;
0166     __u8        fd_pri;     /* FCF priority:  higher is better */
0167 } __attribute__((packed));
0168 
0169 /*
0170  * FIP_DT_MAC - MAC address descriptor.
0171  */
0172 struct fip_mac_desc {
0173     struct fip_desc fd_desc;
0174     __u8        fd_mac[ETH_ALEN];
0175 } __attribute__((packed));
0176 
0177 /*
0178  * FIP_DT_MAP - descriptor.
0179  */
0180 struct fip_map_desc {
0181     struct fip_desc fd_desc;
0182     __u8        fd_resvd[3];
0183     __u8        fd_map[3];
0184 } __attribute__((packed));
0185 
0186 /*
0187  * FIP_DT_NAME descriptor.
0188  */
0189 struct fip_wwn_desc {
0190     struct fip_desc fd_desc;
0191     __u8        fd_resvd[2];
0192     __be64      fd_wwn;     /* 64-bit WWN, unaligned */
0193 } __attribute__((packed));
0194 
0195 /*
0196  * FIP_DT_FAB descriptor.
0197  */
0198 struct fip_fab_desc {
0199     struct fip_desc fd_desc;
0200     __be16      fd_vfid;    /* virtual fabric ID */
0201     __u8        fd_resvd;
0202     __u8        fd_map[3];  /* FC-MAP value */
0203     __be64      fd_wwn;     /* fabric name, unaligned */
0204 } __attribute__((packed));
0205 
0206 /*
0207  * FIP_DT_FCOE_SIZE descriptor.
0208  */
0209 struct fip_size_desc {
0210     struct fip_desc fd_desc;
0211     __be16      fd_size;
0212 } __attribute__((packed));
0213 
0214 /*
0215  * Descriptor that encapsulates an ELS or ILS frame.
0216  * The encapsulated frame immediately follows this header, without
0217  * SOF, EOF, or CRC.
0218  */
0219 struct fip_encaps {
0220     struct fip_desc fd_desc;
0221     __u8        fd_resvd[2];
0222 } __attribute__((packed));
0223 
0224 /*
0225  * FIP_DT_VN_ID - VN_Node Identifier descriptor.
0226  */
0227 struct fip_vn_desc {
0228     struct fip_desc fd_desc;
0229     __u8        fd_mac[ETH_ALEN];
0230     __u8        fd_resvd;
0231     __u8        fd_fc_id[3];
0232     __be64      fd_wwpn;    /* port name, unaligned */
0233 } __attribute__((packed));
0234 
0235 /*
0236  * FIP_DT_FKA - Advertisement keep-alive period.
0237  */
0238 struct fip_fka_desc {
0239     struct fip_desc fd_desc;
0240     __u8        fd_resvd;
0241     __u8        fd_flags;   /* bit0 is fka disable flag */
0242     __be32      fd_fka_period;  /* adv./keep-alive period in mS */
0243 } __attribute__((packed));
0244 
0245 /*
0246  * flags for fip_fka_desc.fd_flags
0247  */
0248 enum fip_fka_flags {
0249     FIP_FKA_ADV_D = 0x01,       /* no need for FKA from ENode */
0250 };
0251 
0252 /* FIP_DT_FKA flags */
0253 
0254 /*
0255  * FIP_DT_VLAN descriptor
0256  */
0257 struct fip_vlan_desc {
0258     struct fip_desc fd_desc;
0259     __be16      fd_vlan; /* Note: highest 4 bytes are unused */
0260 } __attribute__((packed));
0261 
0262 /*
0263  * FIP_DT_FC4F - FC-4 features.
0264  */
0265 struct fip_fc4_feat {
0266     struct fip_desc fd_desc;
0267     __u8        fd_resvd[2];
0268     struct fc_ns_fts fd_fts;
0269     struct fc_ns_ff fd_ff;
0270 } __attribute__((packed));
0271 
0272 /*
0273  * FIP_DT_VENDOR descriptor.
0274  */
0275 struct fip_vendor_desc {
0276     struct fip_desc fd_desc;
0277     __u8        fd_resvd[2];
0278     __u8        fd_vendor_id[8];
0279 } __attribute__((packed));
0280 
0281 #endif /* _FC_FIP_H_ */