public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [OpenFCoE PATCH] If expecting pre-T11 frames, a T11 frame caused a data fault.
@ 2007-12-05  0:52 Joe Eykholt
  2007-12-05 13:55 ` Christoph Hellwig
  0 siblings, 1 reply; 3+ messages in thread
From: Joe Eykholt @ 2007-12-05  0:52 UTC (permalink / raw)
  To: linux-scsi

If expecting pre-T11 frames, a T11 frame caused a data fault.

This is because the T11 frames have zeros where the old length/SOF
field was, and a length of less than the size of the FC header was
not checked for.

Also limit length error messages to frames (per-CPU actually).

Signed-off-by: Joe Eykholt <fcoe@eykholt.com>

---
 drivers/scsi/ofc/fcoe/fcoe_dev.c |   23 +++++++++++++++--------
 1 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/ofc/fcoe/fcoe_dev.c b/drivers/scsi/ofc/fcoe/fcoe_dev.c
index df652b6..878efd4 100644
--- a/drivers/scsi/ofc/fcoe/fcoe_dev.c
+++ b/drivers/scsi/ofc/fcoe/fcoe_dev.c
@@ -485,8 +485,9 @@ int fcoe_percpu_receive_thread(void *arg)
 
 			hp = (struct fcoe_hdr *)skb->data;
 			if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
-				SA_LOG("unknown FCoE version %x",
-				       FC_FCOE_DECAPS_VER(hp));
+				if (stats->ErrorFrames < 5)
+					SA_LOG("unknown FCoE version %x",
+					       FC_FCOE_DECAPS_VER(hp));
 				stats->ErrorFrames++;
 				kfree_skb(skb);
 				continue;
@@ -505,20 +506,25 @@ int fcoe_percpu_receive_thread(void *arg)
 			skb_pull(skb, sizeof(*fchp));
 			fr_len = FC_FCOE_DECAPS_LEN(len);
 			fr_len = fr_len * FCOE_WORD_TO_BYTE;
+			if (unlikely(fr_len < sizeof(struct fc_frame_header) +
+			    sizeof(cp->fcoe_crc32))) {
+				if (stats->ErrorFrames < 5)
+					SA_LOG("length error: len_sof %x", len);
+				stats->ErrorFrames++;
+				kfree_skb(skb);
+				continue;
+			}
 			sof = FC_FCOE_DECAPS_SOF(len);
 			fr_len -= sizeof(cp->fcoe_crc32);
 			tlen = sizeof(struct fcoe_crc_eof_old);
 		}
 
 		if (skb_is_nonlinear(skb))
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-			skb_linearize(skb, GFP_KERNEL);	/* not ideal */
-#else
 			skb_linearize(skb);	/* not ideal */
-#endif
 		if (unlikely(fr_len + tlen > skb->len)) {
-			SA_LOG("short frame fr_len %x skb->len %x\n",
-			       fr_len + tlen, skb->len);
+			if (stats->ErrorFrames < 5)
+				SA_LOG("length error fr_len 0x%x skb->len 0x%x",
+				       fr_len + tlen, skb->len);
 			stats->ErrorFrames++;
 			kfree_skb(skb);
 			continue;
@@ -540,6 +546,7 @@ int fcoe_percpu_receive_thread(void *arg)
 		 * and it'll be more cache-efficient.
 		 */
 		fh = fc_frame_header_get(fp);
+		ASSERT(fh);
 		if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
 		    fh->fh_type == FC_TYPE_FCP) {
 			fp->fr_flags |= FCPHF_CRC_UNCHECKED;



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [OpenFCoE PATCH] If expecting pre-T11 frames, a T11 frame caused a data fault.
  2007-12-05  0:52 [OpenFCoE PATCH] If expecting pre-T11 frames, a T11 frame caused a data fault Joe Eykholt
@ 2007-12-05 13:55 ` Christoph Hellwig
  2007-12-05 16:42   ` Joe Eykholt
  0 siblings, 1 reply; 3+ messages in thread
From: Christoph Hellwig @ 2007-12-05 13:55 UTC (permalink / raw)
  To: Joe Eykholt; +Cc: linux-scsi

Just wondering:

>From my quick reading of the code these pre-T11 frames are basically
a different frame-level protocol.  Given that T11 has standardized
on a different one what's the rationale for supporting the old frames?


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [OpenFCoE PATCH] If expecting pre-T11 frames, a T11 frame caused a data fault.
  2007-12-05 13:55 ` Christoph Hellwig
@ 2007-12-05 16:42   ` Joe Eykholt
  0 siblings, 0 replies; 3+ messages in thread
From: Joe Eykholt @ 2007-12-05 16:42 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

Christoph Hellwig wrote:
> Just wondering:
> 
>>From my quick reading of the code these pre-T11 frames are basically
> a different frame-level protocol.  Given that T11 has standardized
> on a different one what's the rationale for supporting the old frames?

There is still some use in lab environments of the old frame format, and
it would greatly help if we could keep it working for now.  Eventually,
in a year or so, it could be removed completely.  It seems to be a small
amount of code and in a loadable module besides.

	Joe

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-12-05 16:41 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-05  0:52 [OpenFCoE PATCH] If expecting pre-T11 frames, a T11 frame caused a data fault Joe Eykholt
2007-12-05 13:55 ` Christoph Hellwig
2007-12-05 16:42   ` Joe Eykholt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox