1*d4fd6347SChristoph Hellwig /* SPDX-License-Identifier: GPL-2.0 */ 2af5f4287SJoe Eykholt /* 3af5f4287SJoe Eykholt * Copyright 2008 Cisco Systems, Inc. All rights reserved. 4af5f4287SJoe Eykholt */ 5af5f4287SJoe Eykholt #ifndef _FC_FIP_H_ 6af5f4287SJoe Eykholt #define _FC_FIP_H_ 7af5f4287SJoe Eykholt 8edcbb439SJoe Eykholt #include <scsi/fc/fc_ns.h> 9edcbb439SJoe Eykholt 10af5f4287SJoe Eykholt /* 11af5f4287SJoe Eykholt * This version is based on: 12af5f4287SJoe Eykholt * http://www.t11.org/ftp/t11/pub/fc/bb-5/08-543v1.pdf 136a551c11SHannes Reinecke * and T11 FC-BB-6 13-091v5.pdf (December 2013 VN2VN proposal) 14af5f4287SJoe Eykholt */ 15af5f4287SJoe Eykholt 16af5f4287SJoe Eykholt #define FIP_DEF_PRI 128 /* default selection priority */ 17af5f4287SJoe Eykholt #define FIP_DEF_FC_MAP 0x0efc00 /* default FCoE MAP (MAC OUI) value */ 18af5f4287SJoe Eykholt #define FIP_DEF_FKA 8000 /* default FCF keep-alive/advert period (mS) */ 19af5f4287SJoe Eykholt #define FIP_VN_KA_PERIOD 90000 /* required VN_port keep-alive period (mS) */ 20af5f4287SJoe Eykholt #define FIP_FCF_FUZZ 100 /* random time added by FCF (mS) */ 21af5f4287SJoe Eykholt 22af5f4287SJoe Eykholt /* 23edcbb439SJoe Eykholt * VN2VN proposed-standard values. 24edcbb439SJoe Eykholt */ 25edcbb439SJoe Eykholt #define FIP_VN_FC_MAP 0x0efd00 /* MAC OUI for VN2VN use */ 26edcbb439SJoe Eykholt #define FIP_VN_PROBE_WAIT 100 /* interval between VN2VN probes (ms) */ 27edcbb439SJoe Eykholt #define FIP_VN_ANN_WAIT 400 /* interval between VN2VN announcements (ms) */ 28edcbb439SJoe Eykholt #define FIP_VN_RLIM_INT 10000 /* interval between probes when rate limited */ 29edcbb439SJoe Eykholt #define FIP_VN_RLIM_COUNT 10 /* number of probes before rate limiting */ 30edcbb439SJoe Eykholt #define FIP_VN_BEACON_INT 8000 /* interval between VN2VN beacons */ 31edcbb439SJoe Eykholt #define FIP_VN_BEACON_FUZZ 100 /* random time to add to beacon period (ms) */ 32edcbb439SJoe Eykholt 33edcbb439SJoe Eykholt /* 34af5f4287SJoe Eykholt * Multicast MAC addresses. T11-adopted. 35af5f4287SJoe Eykholt */ 36edcbb439SJoe Eykholt #define FIP_ALL_FCOE_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 0 }) 37edcbb439SJoe Eykholt #define FIP_ALL_ENODE_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 1 }) 38edcbb439SJoe Eykholt #define FIP_ALL_FCF_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 2 }) 39edcbb439SJoe Eykholt #define FIP_ALL_VN2VN_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 4 }) 40edcbb439SJoe Eykholt #define FIP_ALL_P2P_MACS ((__u8[6]) { 1, 0x10, 0x18, 1, 0, 5 }) 41af5f4287SJoe Eykholt 42af5f4287SJoe Eykholt #define FIP_VER 1 /* version for fip_header */ 43af5f4287SJoe Eykholt 44af5f4287SJoe Eykholt struct fip_header { 45af5f4287SJoe Eykholt __u8 fip_ver; /* upper 4 bits are the version */ 46af5f4287SJoe Eykholt __u8 fip_resv1; /* reserved */ 47af5f4287SJoe Eykholt __be16 fip_op; /* operation code */ 48af5f4287SJoe Eykholt __u8 fip_resv2; /* reserved */ 49af5f4287SJoe Eykholt __u8 fip_subcode; /* lower 4 bits are sub-code */ 50af5f4287SJoe Eykholt __be16 fip_dl_len; /* length of descriptors in words */ 51af5f4287SJoe Eykholt __be16 fip_flags; /* header flags */ 52af5f4287SJoe Eykholt } __attribute__((packed)); 53af5f4287SJoe Eykholt 54af5f4287SJoe Eykholt #define FIP_VER_SHIFT 4 55af5f4287SJoe Eykholt #define FIP_VER_ENCAPS(v) ((v) << FIP_VER_SHIFT) 56af5f4287SJoe Eykholt #define FIP_VER_DECAPS(v) ((v) >> FIP_VER_SHIFT) 57af5f4287SJoe Eykholt #define FIP_BPW 4 /* bytes per word for lengths */ 58af5f4287SJoe Eykholt 59af5f4287SJoe Eykholt /* 60af5f4287SJoe Eykholt * fip_op. 61af5f4287SJoe Eykholt */ 62af5f4287SJoe Eykholt enum fip_opcode { 63af5f4287SJoe Eykholt FIP_OP_DISC = 1, /* discovery, advertisement, etc. */ 64af5f4287SJoe Eykholt FIP_OP_LS = 2, /* Link Service request or reply */ 65af5f4287SJoe Eykholt FIP_OP_CTRL = 3, /* Keep Alive / Link Reset */ 66af5f4287SJoe Eykholt FIP_OP_VLAN = 4, /* VLAN discovery */ 67edcbb439SJoe Eykholt FIP_OP_VN2VN = 5, /* VN2VN operation */ 68af5f4287SJoe Eykholt FIP_OP_VENDOR_MIN = 0xfff8, /* min vendor-specific opcode */ 69af5f4287SJoe Eykholt FIP_OP_VENDOR_MAX = 0xfffe, /* max vendor-specific opcode */ 70af5f4287SJoe Eykholt }; 71af5f4287SJoe Eykholt 72af5f4287SJoe Eykholt /* 73af5f4287SJoe Eykholt * Subcodes for FIP_OP_DISC. 74af5f4287SJoe Eykholt */ 75af5f4287SJoe Eykholt enum fip_disc_subcode { 76af5f4287SJoe Eykholt FIP_SC_SOL = 1, /* solicitation */ 77af5f4287SJoe Eykholt FIP_SC_ADV = 2, /* advertisement */ 78af5f4287SJoe Eykholt }; 79af5f4287SJoe Eykholt 80af5f4287SJoe Eykholt /* 81af5f4287SJoe Eykholt * Subcodes for FIP_OP_LS. 82af5f4287SJoe Eykholt */ 83af5f4287SJoe Eykholt enum fip_trans_subcode { 84af5f4287SJoe Eykholt FIP_SC_REQ = 1, /* request */ 85af5f4287SJoe Eykholt FIP_SC_REP = 2, /* reply */ 86af5f4287SJoe Eykholt }; 87af5f4287SJoe Eykholt 88af5f4287SJoe Eykholt /* 89af5f4287SJoe Eykholt * Subcodes for FIP_OP_RESET. 90af5f4287SJoe Eykholt */ 91af5f4287SJoe Eykholt enum fip_reset_subcode { 92af5f4287SJoe Eykholt FIP_SC_KEEP_ALIVE = 1, /* keep-alive from VN_Port */ 93af5f4287SJoe Eykholt FIP_SC_CLR_VLINK = 2, /* clear virtual link from VF_Port */ 94af5f4287SJoe Eykholt }; 95af5f4287SJoe Eykholt 96af5f4287SJoe Eykholt /* 97af5f4287SJoe Eykholt * Subcodes for FIP_OP_VLAN. 98af5f4287SJoe Eykholt */ 99af5f4287SJoe Eykholt enum fip_vlan_subcode { 1006a551c11SHannes Reinecke FIP_SC_VL_REQ = 1, /* vlan request */ 1016a551c11SHannes Reinecke FIP_SC_VL_NOTE = 2, /* vlan notification */ 1026a551c11SHannes Reinecke FIP_SC_VL_VN2VN_NOTE = 3, /* VN2VN vlan notification */ 103af5f4287SJoe Eykholt }; 104af5f4287SJoe Eykholt 105af5f4287SJoe Eykholt /* 106edcbb439SJoe Eykholt * Subcodes for FIP_OP_VN2VN. 107edcbb439SJoe Eykholt */ 108edcbb439SJoe Eykholt enum fip_vn2vn_subcode { 109edcbb439SJoe Eykholt FIP_SC_VN_PROBE_REQ = 1, /* probe request */ 110edcbb439SJoe Eykholt FIP_SC_VN_PROBE_REP = 2, /* probe reply */ 111edcbb439SJoe Eykholt FIP_SC_VN_CLAIM_NOTIFY = 3, /* claim notification */ 112edcbb439SJoe Eykholt FIP_SC_VN_CLAIM_REP = 4, /* claim response */ 113edcbb439SJoe Eykholt FIP_SC_VN_BEACON = 5, /* beacon */ 114edcbb439SJoe Eykholt }; 115edcbb439SJoe Eykholt 116edcbb439SJoe Eykholt /* 117af5f4287SJoe Eykholt * flags in header fip_flags. 118af5f4287SJoe Eykholt */ 119af5f4287SJoe Eykholt enum fip_flag { 120af5f4287SJoe Eykholt FIP_FL_FPMA = 0x8000, /* supports FPMA fabric-provided MACs */ 121af5f4287SJoe Eykholt FIP_FL_SPMA = 0x4000, /* supports SPMA server-provided MACs */ 1226a551c11SHannes Reinecke FIP_FL_FCF = 0x0020, /* originated from a controlling FCF */ 1236a551c11SHannes Reinecke FIP_FL_FDF = 0x0010, /* originated from an FDF */ 124edcbb439SJoe Eykholt FIP_FL_REC_OR_P2P = 0x0008, /* configured addr or point-to-point */ 125af5f4287SJoe Eykholt FIP_FL_AVAIL = 0x0004, /* available for FLOGI/ELP */ 126af5f4287SJoe Eykholt FIP_FL_SOL = 0x0002, /* this is a solicited message */ 127af5f4287SJoe Eykholt FIP_FL_FPORT = 0x0001, /* sent from an F port */ 128af5f4287SJoe Eykholt }; 129af5f4287SJoe Eykholt 130af5f4287SJoe Eykholt /* 131af5f4287SJoe Eykholt * Common descriptor header format. 132af5f4287SJoe Eykholt */ 133af5f4287SJoe Eykholt struct fip_desc { 134af5f4287SJoe Eykholt __u8 fip_dtype; /* type - see below */ 135af5f4287SJoe Eykholt __u8 fip_dlen; /* length - in 32-bit words */ 136af5f4287SJoe Eykholt }; 137af5f4287SJoe Eykholt 138af5f4287SJoe Eykholt enum fip_desc_type { 139af5f4287SJoe Eykholt FIP_DT_PRI = 1, /* priority for forwarder selection */ 140af5f4287SJoe Eykholt FIP_DT_MAC = 2, /* MAC address */ 141af5f4287SJoe Eykholt FIP_DT_MAP_OUI = 3, /* FC-MAP OUI */ 142af5f4287SJoe Eykholt FIP_DT_NAME = 4, /* switch name or node name */ 143af5f4287SJoe Eykholt FIP_DT_FAB = 5, /* fabric descriptor */ 144af5f4287SJoe Eykholt FIP_DT_FCOE_SIZE = 6, /* max FCoE frame size */ 145af5f4287SJoe Eykholt FIP_DT_FLOGI = 7, /* FLOGI request or response */ 146af5f4287SJoe Eykholt FIP_DT_FDISC = 8, /* FDISC request or response */ 147af5f4287SJoe Eykholt FIP_DT_LOGO = 9, /* LOGO request or response */ 148af5f4287SJoe Eykholt FIP_DT_ELP = 10, /* ELP request or response */ 149af5f4287SJoe Eykholt FIP_DT_VN_ID = 11, /* VN_Node Identifier */ 150af5f4287SJoe Eykholt FIP_DT_FKA = 12, /* advertisement keep-alive period */ 151af5f4287SJoe Eykholt FIP_DT_VENDOR = 13, /* vendor ID */ 152af5f4287SJoe Eykholt FIP_DT_VLAN = 14, /* vlan number */ 153edcbb439SJoe Eykholt FIP_DT_FC4F = 15, /* FC-4 features */ 154af5f4287SJoe Eykholt FIP_DT_LIMIT, /* max defined desc_type + 1 */ 1556a551c11SHannes Reinecke FIP_DT_NON_CRITICAL = 128, /* First non-critical descriptor */ 1566a551c11SHannes Reinecke FIP_DT_CLR_VLINKS = 128, /* Clear virtual links reason code */ 1576a551c11SHannes Reinecke FIP_DT_VENDOR_BASE = 241, /* first vendor-specific desc_type */ 158af5f4287SJoe Eykholt }; 159af5f4287SJoe Eykholt 160af5f4287SJoe Eykholt /* 161af5f4287SJoe Eykholt * FIP_DT_PRI - priority descriptor. 162af5f4287SJoe Eykholt */ 163af5f4287SJoe Eykholt struct fip_pri_desc { 164af5f4287SJoe Eykholt struct fip_desc fd_desc; 165af5f4287SJoe Eykholt __u8 fd_resvd; 166af5f4287SJoe Eykholt __u8 fd_pri; /* FCF priority: higher is better */ 167af5f4287SJoe Eykholt } __attribute__((packed)); 168af5f4287SJoe Eykholt 169af5f4287SJoe Eykholt /* 170af5f4287SJoe Eykholt * FIP_DT_MAC - MAC address descriptor. 171af5f4287SJoe Eykholt */ 172af5f4287SJoe Eykholt struct fip_mac_desc { 173af5f4287SJoe Eykholt struct fip_desc fd_desc; 174af5f4287SJoe Eykholt __u8 fd_mac[ETH_ALEN]; 175af5f4287SJoe Eykholt } __attribute__((packed)); 176af5f4287SJoe Eykholt 177af5f4287SJoe Eykholt /* 178af5f4287SJoe Eykholt * FIP_DT_MAP - descriptor. 179af5f4287SJoe Eykholt */ 180af5f4287SJoe Eykholt struct fip_map_desc { 181af5f4287SJoe Eykholt struct fip_desc fd_desc; 182af5f4287SJoe Eykholt __u8 fd_resvd[3]; 183af5f4287SJoe Eykholt __u8 fd_map[3]; 184af5f4287SJoe Eykholt } __attribute__((packed)); 185af5f4287SJoe Eykholt 186af5f4287SJoe Eykholt /* 187af5f4287SJoe Eykholt * FIP_DT_NAME descriptor. 188af5f4287SJoe Eykholt */ 189af5f4287SJoe Eykholt struct fip_wwn_desc { 190af5f4287SJoe Eykholt struct fip_desc fd_desc; 191af5f4287SJoe Eykholt __u8 fd_resvd[2]; 192af5f4287SJoe Eykholt __be64 fd_wwn; /* 64-bit WWN, unaligned */ 193af5f4287SJoe Eykholt } __attribute__((packed)); 194af5f4287SJoe Eykholt 195af5f4287SJoe Eykholt /* 196af5f4287SJoe Eykholt * FIP_DT_FAB descriptor. 197af5f4287SJoe Eykholt */ 198af5f4287SJoe Eykholt struct fip_fab_desc { 199af5f4287SJoe Eykholt struct fip_desc fd_desc; 200af5f4287SJoe Eykholt __be16 fd_vfid; /* virtual fabric ID */ 201af5f4287SJoe Eykholt __u8 fd_resvd; 202af5f4287SJoe Eykholt __u8 fd_map[3]; /* FC-MAP value */ 203af5f4287SJoe Eykholt __be64 fd_wwn; /* fabric name, unaligned */ 204af5f4287SJoe Eykholt } __attribute__((packed)); 205af5f4287SJoe Eykholt 206af5f4287SJoe Eykholt /* 207af5f4287SJoe Eykholt * FIP_DT_FCOE_SIZE descriptor. 208af5f4287SJoe Eykholt */ 209af5f4287SJoe Eykholt struct fip_size_desc { 210af5f4287SJoe Eykholt struct fip_desc fd_desc; 211af5f4287SJoe Eykholt __be16 fd_size; 212af5f4287SJoe Eykholt } __attribute__((packed)); 213af5f4287SJoe Eykholt 214af5f4287SJoe Eykholt /* 215af5f4287SJoe Eykholt * Descriptor that encapsulates an ELS or ILS frame. 216af5f4287SJoe Eykholt * The encapsulated frame immediately follows this header, without 217af5f4287SJoe Eykholt * SOF, EOF, or CRC. 218af5f4287SJoe Eykholt */ 219af5f4287SJoe Eykholt struct fip_encaps { 220af5f4287SJoe Eykholt struct fip_desc fd_desc; 221af5f4287SJoe Eykholt __u8 fd_resvd[2]; 222af5f4287SJoe Eykholt } __attribute__((packed)); 223af5f4287SJoe Eykholt 224af5f4287SJoe Eykholt /* 225af5f4287SJoe Eykholt * FIP_DT_VN_ID - VN_Node Identifier descriptor. 226af5f4287SJoe Eykholt */ 227af5f4287SJoe Eykholt struct fip_vn_desc { 228af5f4287SJoe Eykholt struct fip_desc fd_desc; 229af5f4287SJoe Eykholt __u8 fd_mac[ETH_ALEN]; 230af5f4287SJoe Eykholt __u8 fd_resvd; 231af5f4287SJoe Eykholt __u8 fd_fc_id[3]; 232af5f4287SJoe Eykholt __be64 fd_wwpn; /* port name, unaligned */ 233af5f4287SJoe Eykholt } __attribute__((packed)); 234af5f4287SJoe Eykholt 235af5f4287SJoe Eykholt /* 236af5f4287SJoe Eykholt * FIP_DT_FKA - Advertisement keep-alive period. 237af5f4287SJoe Eykholt */ 238af5f4287SJoe Eykholt struct fip_fka_desc { 239af5f4287SJoe Eykholt struct fip_desc fd_desc; 2408cdffdccSYi Zou __u8 fd_resvd; 2418cdffdccSYi Zou __u8 fd_flags; /* bit0 is fka disable flag */ 242af5f4287SJoe Eykholt __be32 fd_fka_period; /* adv./keep-alive period in mS */ 243af5f4287SJoe Eykholt } __attribute__((packed)); 244af5f4287SJoe Eykholt 245af5f4287SJoe Eykholt /* 2468cdffdccSYi Zou * flags for fip_fka_desc.fd_flags 2478cdffdccSYi Zou */ 2488cdffdccSYi Zou enum fip_fka_flags { 2498cdffdccSYi Zou FIP_FKA_ADV_D = 0x01, /* no need for FKA from ENode */ 2508cdffdccSYi Zou }; 2518cdffdccSYi Zou 2528cdffdccSYi Zou /* FIP_DT_FKA flags */ 2538cdffdccSYi Zou 2548cdffdccSYi Zou /* 2556a551c11SHannes Reinecke * FIP_DT_VLAN descriptor 2566a551c11SHannes Reinecke */ 2576a551c11SHannes Reinecke struct fip_vlan_desc { 2586a551c11SHannes Reinecke struct fip_desc fd_desc; 2596a551c11SHannes Reinecke __be16 fd_vlan; /* Note: highest 4 bytes are unused */ 2606a551c11SHannes Reinecke } __attribute__((packed)); 2616a551c11SHannes Reinecke 2626a551c11SHannes Reinecke /* 263edcbb439SJoe Eykholt * FIP_DT_FC4F - FC-4 features. 264edcbb439SJoe Eykholt */ 265edcbb439SJoe Eykholt struct fip_fc4_feat { 266edcbb439SJoe Eykholt struct fip_desc fd_desc; 267edcbb439SJoe Eykholt __u8 fd_resvd[2]; 268edcbb439SJoe Eykholt struct fc_ns_fts fd_fts; 269edcbb439SJoe Eykholt struct fc_ns_ff fd_ff; 270edcbb439SJoe Eykholt } __attribute__((packed)); 271edcbb439SJoe Eykholt 272edcbb439SJoe Eykholt /* 273af5f4287SJoe Eykholt * FIP_DT_VENDOR descriptor. 274af5f4287SJoe Eykholt */ 275af5f4287SJoe Eykholt struct fip_vendor_desc { 276af5f4287SJoe Eykholt struct fip_desc fd_desc; 277af5f4287SJoe Eykholt __u8 fd_resvd[2]; 278af5f4287SJoe Eykholt __u8 fd_vendor_id[8]; 279af5f4287SJoe Eykholt } __attribute__((packed)); 280af5f4287SJoe Eykholt 281af5f4287SJoe Eykholt #endif /* _FC_FIP_H_ */ 282