diff options
author | Joe Eykholt <jeykholt@cisco.com> | 2010-07-20 18:20:14 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-07-28 10:05:54 -0400 |
commit | f60e12e9c778c8256a646f80603d1b88ba5ce891 (patch) | |
tree | 732e918fc85cc441cd539be5e389e0dfd29a2199 /drivers/scsi/libfc | |
parent | a7b12a279faaad26837276065104a1f9cf60e962 (diff) |
[SCSI] libfc: track FIP exchanges
When an exchange is received with a FIP encapsulation, we need
to know that the response must be sent via FIP and what the original
ELS opcode was. This becomes important for VN2VN mode, where we may
receive FLOGI or LOGO from several peer VN_ports, and the LS_ACC or
LS_RJT must be sent FIP-encapsulated with the correct sub-type.
Add a field to the struct fc_frame, fr_encaps, to indicate the
encapsulation values. That term is chosen to be neutral and
LLD-agnostic in case non-FCoE/FIP LLDs might find it useful.
The frame fr_encaps is transferred from the ingress frame to the
exchange by fc_exch_recv_req(), and back to the outgoing frame
by fc_seq_send().
This is taking the last byte in the skb->cb array. If needed,
we could combine the info in sof, eof, flags, and encaps
together into one field, but it'd be better to do that if
and when its needed.
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 'drivers/scsi/libfc')
-rw-r--r-- | drivers/scsi/libfc/fc_exch.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c index 104e0fba7c43..61eabd3ce436 100644 --- a/drivers/scsi/libfc/fc_exch.c +++ b/drivers/scsi/libfc/fc_exch.c | |||
@@ -464,6 +464,7 @@ static int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp, | |||
464 | 464 | ||
465 | f_ctl = ntoh24(fh->fh_f_ctl); | 465 | f_ctl = ntoh24(fh->fh_f_ctl); |
466 | fc_exch_setup_hdr(ep, fp, f_ctl); | 466 | fc_exch_setup_hdr(ep, fp, f_ctl); |
467 | fr_encaps(fp) = ep->encaps; | ||
467 | 468 | ||
468 | /* | 469 | /* |
469 | * update sequence count if this frame is carrying | 470 | * update sequence count if this frame is carrying |
@@ -1259,6 +1260,7 @@ static void fc_exch_recv_req(struct fc_lport *lport, struct fc_exch_mgr *mp, | |||
1259 | sp = fr_seq(fp); /* sequence will be held */ | 1260 | sp = fr_seq(fp); /* sequence will be held */ |
1260 | ep = fc_seq_exch(sp); | 1261 | ep = fc_seq_exch(sp); |
1261 | fc_seq_send_ack(sp, fp); | 1262 | fc_seq_send_ack(sp, fp); |
1263 | ep->encaps = fr_encaps(fp); | ||
1262 | 1264 | ||
1263 | /* | 1265 | /* |
1264 | * Call the receive function. | 1266 | * Call the receive function. |