[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH net v5] xen-netback: fix fragment detection in checksum setup



>>> On 03.12.13 at 18:39, Paul Durrant <paul.durrant@xxxxxxxxxx> wrote:
>  static int checksum_setup_ip(struct xenvif *vif, struct sk_buff *skb,
>                            int recalculate_partial_csum)
>  {
> -     struct iphdr *iph = (void *)skb->data;
> -     unsigned int header_size;
>       unsigned int off;
> -     int err = -EPROTO;
> +     bool fragment;
> +     int err;
> +
> +     fragment = false;
> +
> +     err = maybe_pull_tail(skb,
> +                           sizeof(struct iphdr),
> +                           MAX_IP_HDR_LEN);
> +     if (err < 0)
> +             goto out;
>  
> -     off = sizeof(struct iphdr);
> +     if (ip_hdr(skb)->frag_off & htons(IP_OFFSET | IP_MF))
> +             fragment = true;

You don't seem to be using "fragment" anywhere.

>  
> -     header_size = skb->network_header + off + MAX_IPOPTLEN;
> -     maybe_pull_tail(skb, header_size);
> +     off = ip_hdrlen(skb);
>  
> -     off = iph->ihl * 4;
> +     err = -EPROTO;
>  
> -     switch (iph->protocol) {
> +     switch (ip_hdr(skb)->protocol) {
>       case IPPROTO_TCP:
>               if (!skb_partial_csum_set(skb, off,
>                                         offsetof(struct tcphdr, check)))
>                       goto out;
>  
>               if (recalculate_partial_csum) {
> -                     struct tcphdr *tcph = tcp_hdr(skb);
> -
> -                     header_size = skb->network_header +
> -                             off +
> -                             sizeof(struct tcphdr);
> -                     maybe_pull_tail(skb, header_size);
> -
> -                     tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,
> -                                                      skb->len - off,
> -                                                      IPPROTO_TCP, 0);
> +                     err = maybe_pull_tail(skb,
> +                                           off + sizeof(struct tcphdr),
> +                                           MAX_IP_HDR_LEN);

Is it really necessary/worthwhile to specify MAX_IP_HDR_LEN
here? Other than in the IPv6 case you're not risking to need
another pull if you simply used off + sizeof(struct tcphdr) instead.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.