Source-Changes-D archive

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

Re: CVS commit: src/sys/netinet



On Mon, Apr 25, 2011 at 10:45:08PM +0000, YAMAMOTO Takashi wrote:
> somthing like the following.
> 
> YAMAMOTO Takashi
> 
> Index: ip_output.c
> ===================================================================
> RCS file: /cvsroot/src/sys/netinet/ip_output.c,v
> retrieving revision 1.208
> diff -u -p -r1.208 ip_output.c
> --- ip_output.c       14 Apr 2011 15:53:36 -0000      1.208
> +++ ip_output.c       25 Apr 2011 22:41:43 -0000
> @@ -1010,12 +1010,19 @@ ip_fragment(struct mbuf *m, struct ifnet
>               m->m_pkthdr.len = mhlen + len;
>               m->m_pkthdr.rcvif = (struct ifnet *)0;
>               mhip->ip_sum = 0;
> +             KASSERT((m->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0);
>               if (sw_csum & M_CSUM_IPv4) {
>                       mhip->ip_sum = in_cksum(m, mhlen);
> -                     KASSERT((m->m_pkthdr.csum_flags & M_CSUM_IPv4) == 0);
>               } else {
> -                     m->m_pkthdr.csum_flags |= M_CSUM_IPv4;
> +                     /*
> +                      * checksum is hw-offloaded or not necessary.
> +                      */
> +                     m->m_pkthdr.csum_flags |=
> +                         m0->m_pkthdr.csum_flags & M_CSUM_IPv4;
>                       m->m_pkthdr.csum_data |= mhlen << 16;
> +                     KASSERT(!(ifp != NULL &&
> +                         IN_NEED_CHECKSUM(ifp, M_CSUM_IPv4))
> +                         || (m->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0);
>               }
>               IP_STATINC(IP_STAT_OFRAGMENTS);
>               fragments++;
> @@ -1030,19 +1037,17 @@ ip_fragment(struct mbuf *m, struct ifnet
>       ip->ip_len = htons((u_int16_t)m->m_pkthdr.len);
>       ip->ip_off |= htons(IP_MF);
>       ip->ip_sum = 0;
> -     /*
> -      * We may not use checksums on loopback interfaces
> -      */
> -     if (__predict_false(ifp == NULL) ||
> -         IN_NEED_CHECKSUM(ifp, M_CSUM_IPv4)) {
> -             if (sw_csum & M_CSUM_IPv4) {
> -                     ip->ip_sum = in_cksum(m, hlen);
> -                     m->m_pkthdr.csum_flags &= ~M_CSUM_IPv4;
> -             } else {
> -                     KASSERT(m->m_pkthdr.csum_flags & M_CSUM_IPv4);
> -                     KASSERT(M_CSUM_DATA_IPv4_IPHL(m->m_pkthdr.csum_data) >=
> -                             sizeof(struct ip));
> -             }
> +     if (sw_csum & M_CSUM_IPv4) {
> +             ip->ip_sum = in_cksum(m, hlen);
> +             m->m_pkthdr.csum_flags &= ~M_CSUM_IPv4;
> +     } else {
> +             /*
> +              * checksum is hw-offloaded or not necessary.
> +              */
> +             KASSERT(!(ifp != NULL && IN_NEED_CHECKSUM(ifp, M_CSUM_IPv4))
> +                || (m->m_pkthdr.csum_flags & M_CSUM_IPv4) != 0);
> +             KASSERT(M_CSUM_DATA_IPv4_IPHL(m->m_pkthdr.csum_data) >=
> +                     sizeof(struct ip));
>       }
>  sendorfree:
>       /*

Ah, I see. This works fine, please commit!

Martin


Home | Main Index | Thread Index | Old Index