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>
27 #include <linux/gfp.h>
29 #include <scsi/fc_frame.h>
32 * Check the CRC in a frame.
34 u32
fc_frame_crc_check(struct fc_frame
*fp
)
41 WARN_ON(!fc_frame_is_linear(fp
));
42 fr_flags(fp
) &= ~FCPHF_CRC_UNCHECKED
;
43 len
= (fr_len(fp
) + 3) & ~3; /* round up length to include fill */
44 bp
= (const u8
*) fr_hdr(fp
);
45 crc
= ~crc32(~0, bp
, len
);
46 error
= crc
^ fr_crc(fp
);
49 EXPORT_SYMBOL(fc_frame_crc_check
);
52 * Allocate a frame intended to be sent via fcoe_xmit.
53 * Get an sk_buff for the frame and set the length.
55 struct fc_frame
*_fc_frame_alloc(size_t len
)
60 WARN_ON((len
% sizeof(u32
)) != 0);
61 len
+= sizeof(struct fc_frame_header
);
62 skb
= alloc_skb_fclone(len
+ FC_FRAME_HEADROOM
+ FC_FRAME_TAILROOM
+
63 NET_SKB_PAD
, GFP_ATOMIC
);
66 skb_reserve(skb
, NET_SKB_PAD
+ FC_FRAME_HEADROOM
);
67 fp
= (struct fc_frame
*) skb
;
72 EXPORT_SYMBOL(_fc_frame_alloc
);
74 struct fc_frame
*fc_frame_alloc_fill(struct fc_lport
*lp
, size_t payload_len
)
79 fill
= payload_len
% 4;
82 fp
= _fc_frame_alloc(payload_len
+ fill
);
84 memset((char *) fr_hdr(fp
) + payload_len
, 0, fill
);
85 /* trim is OK, we just allocated it so there are no fragments */
87 payload_len
+ sizeof(struct fc_frame_header
));
91 EXPORT_SYMBOL(fc_frame_alloc_fill
);