2 * Copyright(c) 2007 Intel Corporation. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * You should have received a copy of the GNU General Public License along with
14 * this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17 * Maintained at www.Open-FCoE.org
23 #include <linux/module.h>
24 #include <linux/kernel.h>
25 #include <linux/skbuff.h>
26 #include <linux/crc32.h>
28 #include <scsi/fc_frame.h>
31 * Check the CRC in a frame.
33 u32
fc_frame_crc_check(struct fc_frame
*fp
)
40 WARN_ON(!fc_frame_is_linear(fp
));
41 fr_flags(fp
) &= ~FCPHF_CRC_UNCHECKED
;
42 len
= (fr_len(fp
) + 3) & ~3; /* round up length to include fill */
43 bp
= (const u8
*) fr_hdr(fp
);
44 crc
= ~crc32(~0, bp
, len
);
45 error
= crc
^ fr_crc(fp
);
48 EXPORT_SYMBOL(fc_frame_crc_check
);
51 * Allocate a frame intended to be sent via fcoe_xmit.
52 * Get an sk_buff for the frame and set the length.
54 struct fc_frame
*__fc_frame_alloc(size_t len
)
59 WARN_ON((len
% sizeof(u32
)) != 0);
60 len
+= sizeof(struct fc_frame_header
);
61 skb
= dev_alloc_skb(len
+ FC_FRAME_HEADROOM
+ FC_FRAME_TAILROOM
);
64 fp
= (struct fc_frame
*) skb
;
66 skb_reserve(skb
, FC_FRAME_HEADROOM
);
70 EXPORT_SYMBOL(__fc_frame_alloc
);
73 struct fc_frame
*fc_frame_alloc_fill(struct fc_lport
*lp
, size_t payload_len
)
78 fill
= payload_len
% 4;
81 fp
= __fc_frame_alloc(payload_len
+ fill
);
83 memset((char *) fr_hdr(fp
) + payload_len
, 0, fill
);
84 /* trim is OK, we just allocated it so there are no fragments */
86 payload_len
+ sizeof(struct fc_frame_header
));