Checksum forwarding issue on XEN

Roger Pau Monné roger.pau at citrix.com
Thu Nov 5 15:16:15 UTC 2015


Hello,

Adding the persons that contributed that code in case they can shed some
light.

El 03/11/15 a les 21.12, Larry Baird ha escrit:
> Has anybody made any progress on "Bug 188261 - [xen] FreeBSD DomU PVHVM
> guests cannot 'route' traffic for other Xen PV guests on same Dom0 Host."
> (https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=188261)?
>
> The code for checksum calculation in the function xnb_add_mbuf_cksum() looks
> suspect.
> 
>         switch (iph->ip_p) {
>         case IPPROTO_TCP:
>                 if (mbufc->m_pkthdr.csum_flags & CSUM_IP_VALID) {
>                         size_t tcplen = ntohs(iph->ip_len) - sizeof(struct ip);
>                         struct tcphdr *th = (struct tcphdr*)(iph + 1);
>                         th->th_sum = in_pseudo(iph->ip_src.s_addr,
>                             iph->ip_dst.s_addr, htons(IPPROTO_TCP + tcplen));
>                         th->th_sum = in_cksum_skip(mbufc,
>                             sizeof(struct ether_header) + ntohs(iph->ip_len),
>                             sizeof(struct ether_header) + (iph->ip_hl << 2));
>                 }
>                 break;
>         case IPPROTO_UDP:
>                 if (mbufc->m_pkthdr.csum_flags & CSUM_IP_VALID) {
>                         size_t udplen = ntohs(iph->ip_len) - sizeof(struct ip);
>                         struct udphdr *uh = (struct udphdr*)(iph + 1);
>                         uh->uh_sum = in_pseudo(iph->ip_src.s_addr,
>                             iph->ip_dst.s_addr, htons(IPPROTO_UDP + udplen));
>                         uh->uh_sum = in_cksum_skip(mbufc,
>                             sizeof(struct ether_header) + ntohs(iph->ip_len),
>                             sizeof(struct ether_header) + (iph->ip_hl << 2));
>                 }
>                 break;
>         default:
>                 break;
>         }
> 
> 
> Both in_pseudo() and in_cksum_skip() set the same checksum. Does this
> make since to anybody?

The bug you are referring to affects FreeBSD when running as a guest
using xen-netfront, but the code snipped above and the function
referenced (xnb_add_mbuf_cksum) is only used on FreeBSD when running as
a host (AKA Dom0) by xen-netback.

TBH, I don't know that much about FreeBSD network subsystem to have an
opinion, but it certainly looks weird. Patches are welcome :).

Roger.


More information about the freebsd-xen mailing list