Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright(c) 2007 Intel Corporation. All rights reserved.
0004  *
0005  * Maintained at www.Open-FCoE.org
0006  */
0007 #ifndef _FC_ENCAPS_H_
0008 #define _FC_ENCAPS_H_
0009 
0010 /*
0011  * Protocol definitions from RFC 3643 - Fibre Channel Frame Encapsulation.
0012  *
0013  * Note:  The frame length field is the number of 32-bit words in
0014  * the encapsulation including the fcip_encaps_header, CRC and EOF words.
0015  * The minimum frame length value in bytes is (32 + 24 + 4 + 4) * 4 = 64.
0016  * The maximum frame length value in bytes is (32 + 24 + 2112 + 4 + 4) = 2172.
0017  */
0018 #define FC_ENCAPS_MIN_FRAME_LEN 64  /* min frame len (bytes) (see above) */
0019 #define FC_ENCAPS_MAX_FRAME_LEN (FC_ENCAPS_MIN_FRAME_LEN + FC_MAX_PAYLOAD)
0020 
0021 #define FC_ENCAPS_VER       1           /* current version number */
0022 
0023 struct fc_encaps_hdr {
0024     __u8    fc_proto;   /* protocol number */
0025     __u8    fc_ver;     /* version of encapsulation */
0026     __u8    fc_proto_n; /* ones complement of protocol */
0027     __u8    fc_ver_n;   /* ones complement of version */
0028 
0029     unsigned char fc_proto_data[8]; /* protocol specific data */
0030 
0031     __be16  fc_len_flags;   /* 10-bit length/4 w/ 6 flag bits */
0032     __be16  fc_len_flags_n; /* ones complement of length / flags */
0033 
0034     /*
0035      * Offset 0x10
0036      */
0037     __be32  fc_time[2]; /* time stamp: seconds and fraction */
0038     __be32  fc_crc;     /* CRC */
0039     __be32  fc_sof;     /* start of frame (see FC_SOF below) */
0040 
0041     /* 0x20 - FC frame content followed by EOF word */
0042 };
0043 
0044 #define FCIP_ENCAPS_HDR_LEN 0x20    /* expected length for asserts */
0045 
0046 /*
0047  * Macro's for making redundant copies of EOF and SOF.
0048  */
0049 #define FC_XY(x, y)     ((((x) & 0xff) << 8) | ((y) & 0xff))
0050 #define FC_XYXY(x, y)       ((FCIP_XY(x, y) << 16) | FCIP_XY(x, y))
0051 #define FC_XYNN(x, y)       (FCIP_XYXY(x, y) ^ 0xffff)
0052 
0053 #define FC_SOF_ENCODE(n)    FC_XYNN(n, n)
0054 #define FC_EOF_ENCODE(n)    FC_XYNN(n, n)
0055 
0056 /*
0057  * SOF / EOF bytes.
0058  */
0059 enum fc_sof {
0060     FC_SOF_F =  0x28,   /* fabric */
0061     FC_SOF_I4 = 0x29,   /* initiate class 4 */
0062     FC_SOF_I2 = 0x2d,   /* initiate class 2 */
0063     FC_SOF_I3 = 0x2e,   /* initiate class 3 */
0064     FC_SOF_N4 = 0x31,   /* normal class 4 */
0065     FC_SOF_N2 = 0x35,   /* normal class 2 */
0066     FC_SOF_N3 = 0x36,   /* normal class 3 */
0067     FC_SOF_C4 = 0x39,   /* activate class 4 */
0068 } __attribute__((packed));
0069 
0070 enum fc_eof {
0071     FC_EOF_N =  0x41,   /* normal (not last frame of seq) */
0072     FC_EOF_T =  0x42,   /* terminate (last frame of sequence) */
0073     FC_EOF_RT = 0x44,
0074     FC_EOF_DT = 0x46,   /* disconnect-terminate class-1 */
0075     FC_EOF_NI = 0x49,   /* normal-invalid */
0076     FC_EOF_DTI =    0x4e,   /* disconnect-terminate-invalid */
0077     FC_EOF_RTI =    0x4f,
0078     FC_EOF_A =  0x50,   /* abort */
0079 } __attribute__((packed));
0080 
0081 #define FC_SOF_CLASS_MASK 0x06  /* mask for class of service in SOF */
0082 
0083 /*
0084  * Define classes in terms of the SOF code (initial).
0085  */
0086 enum fc_class {
0087     FC_CLASS_NONE = 0,  /* software value indicating no class */
0088     FC_CLASS_2 =    FC_SOF_I2,
0089     FC_CLASS_3 =    FC_SOF_I3,
0090     FC_CLASS_4 =    FC_SOF_I4,
0091     FC_CLASS_F =    FC_SOF_F,
0092 };
0093 
0094 /*
0095  * Determine whether SOF code indicates the need for a BLS ACK.
0096  */
0097 static inline int fc_sof_needs_ack(enum fc_sof sof)
0098 {
0099     return (~sof) & 0x02;   /* true for class 1, 2, 4, 6, or F */
0100 }
0101 
0102 /*
0103  * Given an fc_class, return the normal (non-initial) SOF value.
0104  */
0105 static inline enum fc_sof fc_sof_normal(enum fc_class class)
0106 {
0107     return class + FC_SOF_N3 - FC_SOF_I3;   /* diff is always 8 */
0108 }
0109 
0110 /*
0111  * Compute class from SOF value.
0112  */
0113 static inline enum fc_class fc_sof_class(enum fc_sof sof)
0114 {
0115     return (sof & 0x7) | FC_SOF_F;
0116 }
0117 
0118 /*
0119  * Determine whether SOF is for the initial frame of a sequence.
0120  */
0121 static inline int fc_sof_is_init(enum fc_sof sof)
0122 {
0123     return sof < 0x30;
0124 }
0125 
0126 #endif /* _FC_ENCAPS_H_ */