aboutsummaryrefslogtreecommitdiffstats
path: root/include/scsi
diff options
context:
space:
mode:
authorJoe Eykholt <jeykholt@cisco.com>2010-07-20 18:20:30 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-28 10:05:56 -0400
commite10f8c667b874a57512c936089092a3d1ef7ab8a (patch)
tree8094610399133fd6e0ad26d23c46ec0a6cc91398 /include/scsi
parent9b651da900ccfe5581befb46eb06ef781a1d7e74 (diff)
[SCSI] libfcoe: fcoe: fnic: add FIP VN2VN point-to-multipoint support
The FC-BB-6 committee is proposing a new FIP usage model called VN_port to VN_port mode. It allows VN_ports to discover each other over a loss-free L2 Ethernet without any FCF or Fibre-channel fabric services. This is point-to-multipoint. There is also a variant of this called point-to-point which provides for making sure there is just one pair of ports operating over the Ethernet fabric. We add these new states: VNMP_START, _PROBE1, _PROBE2, _CLAIM, and _UP. These usually go quickly in that sequence. After waiting a random amount of time up to 100 ms in START, we select a pseudo-random proposed locally-unique port ID and send out probes in states PROBE1 and PROBE2, 100 ms apart. If no probe responses are heard, we proceed to CLAIM state 400 ms later and send a claim notification. We wait another 400 ms to receive claim responses, which give us a list of the other nodes on the network, including their FC-4 capabilities. After another 400 ms we go to VNMP_UP state and should start interoperating with any of the nodes for whic we receivec claim responses. More details are in the spec.j Add the new mode as FIP_MODE_VN2VN. The driver must specify explicitly that it wants to operate in this mode. There is no automatic detection between point-to-multipoint and fabric mode, and the local port initialization is affected, so it isn't anticipated that there will ever be any such automatic switchover. It may eventually be possible to have both fabric and VN2VN modes on the same L2 network, which may be done by two separate local VN_ports (lports). When in VN2VN mode, FIP replaces libfc's fabric-oriented discovery module with its own simple code that adds remote ports as they are discovered from incoming claim notifications and responses. These hooks are placed by fcoe_disc_init(). A linear list of discovered vn_ports is maintained under the fcoe_ctlr struct. It is expected to be short for now, and accessed infrequently. It is kept under RCU for lock-ordering reasons. The lport and/or rport mutexes may be held when we need to lookup a fcoe_vnport during an ELS send. Change fcoe_ctlr_encaps() to lookup the destination vn_port in the list of peers for the destination MAC address of the FIP-encapsulated frame. Add a new function fcoe_disc_init() to initialize just the discovery portion of libfcoe for VN2VN mode. Signed-off-by: Joe Eykholt <jeykholt@cisco.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/libfcoe.h42
1 files changed, 41 insertions, 1 deletions
diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h
index 1a84a3182da0..06f1b5a8ed19 100644
--- a/include/scsi/libfcoe.h
+++ b/include/scsi/libfcoe.h
@@ -26,6 +26,7 @@
26#include <linux/netdevice.h> 26#include <linux/netdevice.h>
27#include <linux/skbuff.h> 27#include <linux/skbuff.h>
28#include <linux/workqueue.h> 28#include <linux/workqueue.h>
29#include <linux/random.h>
29#include <scsi/fc/fc_fcoe.h> 30#include <scsi/fc/fc_fcoe.h>
30#include <scsi/libfc.h> 31#include <scsi/libfc.h>
31 32
@@ -37,6 +38,7 @@
37#define FCOE_CTLR_START_DELAY 2000 /* mS after first adv. to choose FCF */ 38#define FCOE_CTLR_START_DELAY 2000 /* mS after first adv. to choose FCF */
38#define FCOE_CTRL_SOL_TOV 2000 /* min. solicitation interval (mS) */ 39#define FCOE_CTRL_SOL_TOV 2000 /* min. solicitation interval (mS) */
39#define FCOE_CTLR_FCF_LIMIT 20 /* max. number of FCF entries */ 40#define FCOE_CTLR_FCF_LIMIT 20 /* max. number of FCF entries */
41#define FCOE_CTLR_VN2VN_LOGIN_LIMIT 3 /* max. VN2VN rport login retries */
40 42
41/** 43/**
42 * enum fip_state - internal state of FCoE controller. 44 * enum fip_state - internal state of FCoE controller.
@@ -45,6 +47,11 @@
45 * @FIP_ST_AUTO: determining whether to use FIP or non-FIP mode. 47 * @FIP_ST_AUTO: determining whether to use FIP or non-FIP mode.
46 * @FIP_ST_NON_FIP: non-FIP mode selected. 48 * @FIP_ST_NON_FIP: non-FIP mode selected.
47 * @FIP_ST_ENABLED: FIP mode selected. 49 * @FIP_ST_ENABLED: FIP mode selected.
50 * @FIP_ST_VNMP_START: VN2VN multipath mode start, wait
51 * @FIP_ST_VNMP_PROBE1: VN2VN sent first probe, listening
52 * @FIP_ST_VNMP_PROBE2: VN2VN sent second probe, listening
53 * @FIP_ST_VNMP_CLAIM: VN2VN sent claim, waiting for responses
54 * @FIP_ST_VNMP_UP: VN2VN multipath mode operation
48 */ 55 */
49enum fip_state { 56enum fip_state {
50 FIP_ST_DISABLED, 57 FIP_ST_DISABLED,
@@ -52,6 +59,11 @@ enum fip_state {
52 FIP_ST_AUTO, 59 FIP_ST_AUTO,
53 FIP_ST_NON_FIP, 60 FIP_ST_NON_FIP,
54 FIP_ST_ENABLED, 61 FIP_ST_ENABLED,
62 FIP_ST_VNMP_START,
63 FIP_ST_VNMP_PROBE1,
64 FIP_ST_VNMP_PROBE2,
65 FIP_ST_VNMP_CLAIM,
66 FIP_ST_VNMP_UP,
55}; 67};
56 68
57/* 69/*
@@ -62,6 +74,7 @@ enum fip_state {
62#define FIP_MODE_AUTO FIP_ST_AUTO 74#define FIP_MODE_AUTO FIP_ST_AUTO
63#define FIP_MODE_NON_FIP FIP_ST_NON_FIP 75#define FIP_MODE_NON_FIP FIP_ST_NON_FIP
64#define FIP_MODE_FABRIC FIP_ST_ENABLED 76#define FIP_MODE_FABRIC FIP_ST_ENABLED
77#define FIP_MODE_VN2VN FIP_ST_VNMP_START
65 78
66/** 79/**
67 * struct fcoe_ctlr - FCoE Controller and FIP state 80 * struct fcoe_ctlr - FCoE Controller and FIP state
@@ -79,11 +92,14 @@ enum fip_state {
79 * @timer_work: &work_struct for doing keep-alives and resets. 92 * @timer_work: &work_struct for doing keep-alives and resets.
80 * @recv_work: &work_struct for receiving FIP frames. 93 * @recv_work: &work_struct for receiving FIP frames.
81 * @fip_recv_list: list of received FIP frames. 94 * @fip_recv_list: list of received FIP frames.
95 * @rnd_state: state for pseudo-random number generator.
96 * @port_id: proposed or selected local-port ID.
82 * @user_mfs: configured maximum FC frame size, including FC header. 97 * @user_mfs: configured maximum FC frame size, including FC header.
83 * @flogi_oxid: exchange ID of most recent fabric login. 98 * @flogi_oxid: exchange ID of most recent fabric login.
84 * @flogi_count: number of FLOGI attempts in AUTO mode. 99 * @flogi_count: number of FLOGI attempts in AUTO mode.
85 * @map_dest: use the FC_MAP mode for destination MAC addresses. 100 * @map_dest: use the FC_MAP mode for destination MAC addresses.
86 * @spma: supports SPMA server-provided MACs mode 101 * @spma: supports SPMA server-provided MACs mode
102 * @probe_tries: number of FC_IDs probed
87 * @dest_addr: MAC address of the selected FC forwarder. 103 * @dest_addr: MAC address of the selected FC forwarder.
88 * @ctl_src_addr: the native MAC address of our local port. 104 * @ctl_src_addr: the native MAC address of our local port.
89 * @send: LLD-supplied function to handle sending FIP Ethernet frames 105 * @send: LLD-supplied function to handle sending FIP Ethernet frames
@@ -110,11 +126,16 @@ struct fcoe_ctlr {
110 struct work_struct timer_work; 126 struct work_struct timer_work;
111 struct work_struct recv_work; 127 struct work_struct recv_work;
112 struct sk_buff_head fip_recv_list; 128 struct sk_buff_head fip_recv_list;
129
130 struct rnd_state rnd_state;
131 u32 port_id;
132
113 u16 user_mfs; 133 u16 user_mfs;
114 u16 flogi_oxid; 134 u16 flogi_oxid;
115 u8 flogi_count; 135 u8 flogi_count;
116 u8 map_dest; 136 u8 map_dest;
117 u8 spma; 137 u8 spma;
138 u8 probe_tries;
118 u8 dest_addr[ETH_ALEN]; 139 u8 dest_addr[ETH_ALEN];
119 u8 ctl_src_addr[ETH_ALEN]; 140 u8 ctl_src_addr[ETH_ALEN];
120 141
@@ -160,6 +181,24 @@ struct fcoe_fcf {
160 u8 fd_flags:1; 181 u8 fd_flags:1;
161}; 182};
162 183
184/**
185 * struct fcoe_rport - VN2VN remote port
186 * @time: time of create or last beacon packet received from node
187 * @fcoe_len: max FCoE frame size, not including VLAN or Ethernet headers
188 * @flags: flags from probe or claim
189 * @login_count: number of unsuccessful rport logins to this port
190 * @enode_mac: E_Node control MAC address
191 * @vn_mac: VN_Node assigned MAC address for data
192 */
193struct fcoe_rport {
194 unsigned long time;
195 u16 fcoe_len;
196 u16 flags;
197 u8 login_count;
198 u8 enode_mac[ETH_ALEN];
199 u8 vn_mac[ETH_ALEN];
200};
201
163/* FIP API functions */ 202/* FIP API functions */
164void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_state); 203void fcoe_ctlr_init(struct fcoe_ctlr *, enum fip_state);
165void fcoe_ctlr_destroy(struct fcoe_ctlr *); 204void fcoe_ctlr_destroy(struct fcoe_ctlr *);
@@ -172,7 +211,8 @@ int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *, struct fc_lport *,
172 211
173/* libfcoe funcs */ 212/* libfcoe funcs */
174u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int); 213u64 fcoe_wwn_from_mac(unsigned char mac[], unsigned int, unsigned int);
175int fcoe_libfc_config(struct fc_lport *, struct libfc_function_template *); 214int fcoe_libfc_config(struct fc_lport *, struct fcoe_ctlr *,
215 const struct libfc_function_template *, int init_fcp);
176 216
177/** 217/**
178 * is_fip_mode() - returns true if FIP mode selected. 218 * is_fip_mode() - returns true if FIP mode selected.