On Fri, Nov 16, 2012 at 2:55 PM, Dmitry Fleytman <[email protected]> wrote:
> @@ -252,6 +253,58 @@ unsigned iov_copy(struct iovec *dst_iov, unsigned int
> dst_iov_cnt,
> return j;
> }
>
> +size_t iov_rebuild(struct iovec *dst, unsigned int dst_cnt,
> + const struct iovec *src, const unsigned int src_cnt,
> + size_t src_off)
> +{
> + size_t curr_src_off = 0;
> + unsigned int i, j = 0;
> +
> + for (i = 0; i < src_cnt; i++) {
> + if (src_off < (curr_src_off + src[i].iov_len)) {
> + if (j == dst_cnt) {
> + return (size_t) -1;
> + }
> +
> + dst[j].iov_len = curr_src_off + src[i].iov_len - src_off;
> + dst[j].iov_base = src[i].iov_base + (src_off - curr_src_off);
> +
> + src_off += dst[j].iov_len;
> + j++;
> + }
> + curr_src_off += src[i].iov_len;
> + }
> + return j;
> +}
The existing iov_copy() function provides equivalent functionality. I
don't think iov_rebuild() is needed.
> +uint32_t
> +iov_net_csum_add(const struct iovec *iov, const unsigned int iov_cnt,
> + size_t iov_off, size_t size)
> +{
> + size_t iovec_off, buf_off;
> + unsigned int i;
> + uint32_t res = 0;
> + uint32_t seq = 0;
> +
> + iovec_off = 0;
> + buf_off = 0;
> + for (i = 0; i < iov_cnt && size; i++) {
> + if (iov_off < (iovec_off + iov[i].iov_len)) {
> + size_t len = MIN((iovec_off + iov[i].iov_len) - iov_off , size);
> + void *chunk_buf = iov[i].iov_base + (iov_off - iovec_off);
> +
> + res += net_checksum_add_cont(len, chunk_buf, seq);
> + seq += len;
> +
> + buf_off += len;
> + iov_off += len;
> + size -= len;
> + }
> + iovec_off += iov[i].iov_len;
> + }
> + return res;
> +}
Rename this net_checksum_add_iov() and place it in net/checksum.c,
then the new dependency on net from block can be dropped.