[Devel] Re: [PATCH] Correct data pointer offset calculation
Oren Laadan
orenl at cs.columbia.edu
Wed Nov 25 10:53:39 PST 2009
... for v19-rc2, too. Thanks.
Oren.
Dan Smith wrote:
> The current data pointer offset calculation is not correct in all cases.
> This patch records the offset and resets it on restore. With this patch,
> all of my test cases now pass and behave as they should.
>
> Signed-off-by: Dan Smith <danms at us.ibm.com>
> ---
> include/linux/checkpoint_hdr.h | 1 +
> net/checkpoint.c | 11 ++++++++++-
> 2 files changed, 11 insertions(+), 1 deletions(-)
>
> diff --git a/include/linux/checkpoint_hdr.h b/include/linux/checkpoint_hdr.h
> index 95ea3dd..4e57d37 100644
> --- a/include/linux/checkpoint_hdr.h
> +++ b/include/linux/checkpoint_hdr.h
> @@ -605,6 +605,7 @@ struct ckpt_hdr_socket_buffer {
> __u32 skb_len; /* Length of skb (adjusted) */
> __u32 hdr_len; /* Length of skipped header */
> __u32 mac_len;
> + __u32 data_offset; /* Offset of data pointer from head */
> __s32 sk_objref;
> __s32 pr_objref;
> __u16 protocol;
> diff --git a/net/checkpoint.c b/net/checkpoint.c
> index c9d5b1e..2ac6a42 100644
> --- a/net/checkpoint.c
> +++ b/net/checkpoint.c
> @@ -100,6 +100,8 @@ static void sock_record_header_info(struct sk_buff *skb,
> h->lin_len = (skb->tail - skb->head);
> h->frg_len = skb->data_len;
>
> + h->data_offset = (skb->data - skb->head);
> +
> #ifdef NET_SKBUFF_DATA_USES_OFFSET
> h->transport_header = skb->transport_hdr;
> h->network_header = skb->network_header;
> @@ -140,6 +142,13 @@ int sock_restore_header_info(struct ckpt_ctx *ctx,
> return -EINVAL;
> }
>
> + if (h->data_offset > h->lin_len) {
> + ckpt_err(ctx, -EINVAL,
> + "skb data offset %u > linear length %u\n",
> + h->data_offset, h->lin_len);
> + return -EINVAL;
> + }
> +
> if (h->skb_len > SKB_MAX_ALLOC) {
> ckpt_err(ctx, -EINVAL,
> "skb total length %u larger than max of %lu\n",
> @@ -161,7 +170,7 @@ int sock_restore_header_info(struct ckpt_ctx *ctx,
> */
> memcpy(skb->cb, h->cb, sizeof(skb->cb));
>
> - skb->data = skb->head + skb->hdr_len;
> + skb->data = skb->head + h->data_offset;
> skb->len = h->skb_len;
>
> skb_shinfo(skb)->gso_type = sk->sk_gso_type;
_______________________________________________
Containers mailing list
Containers at lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/containers
More information about the Devel
mailing list