> > - sum += in_cksumdata((caddr_t) &ipov, sizeof(ipov)); > > + sum += in_cksumdata((caddr_t) &ipov + 8, sizeof(ipov) - 8); > > I think this would be clearer with a comment.
Sure, added one. > Please remove the trailing space that some of the changed lines have. Ok. Updated patch below. > > Index: sys/arch/sparc64/sparc64/in4_cksum.c > > + __asm volatile( > > + " lduw [%5 + 12], %1; " > > + " lduw [%5 + 16], %2; " > > " mov -1, %3; add %0, %1, %0; " > > " srl %3, 0, %3; add %0, %2, %0; " > > - " srlx %0, 32, %2; and %0, %3, %1; " > > + " srlx %0, 32, %2; " > > " add %0, %2, %0; " > > : "=r" (sum), "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3) > > - : "0" (sum), "r" (w)); > > + : "0" (sum), "r" (&ipov)); > > I might be missing something, but is the temporary register %3 needed > at all? Yes, it is set to -1 and used for shifts, at the moment. Miod Index: sys/arch/alpha/alpha/in_cksum.c =================================================================== RCS file: /OpenBSD/src/sys/arch/alpha/alpha/in_cksum.c,v retrieving revision 1.9 diff -u -p -r1.9 in_cksum.c --- sys/arch/alpha/alpha/in_cksum.c 21 Aug 2014 14:24:08 -0000 1.9 +++ sys/arch/alpha/alpha/in_cksum.c 30 Jan 2022 18:35:18 -0000 @@ -200,7 +200,7 @@ in4_cksum(struct mbuf *m, u_int8_t nxt, int clen = 0; caddr_t addr; union q_util q_util; - union l_util l_util; + union l_util l_util; struct ipovly ipov; if (nxt != 0) { @@ -212,14 +212,14 @@ in4_cksum(struct mbuf *m, u_int8_t nxt, panic("in4_cksum: bad mbuf chain"); #endif - memset(&ipov, 0, sizeof(ipov)); - - ipov.ih_len = htons(len); + ipov.ih_x1[8] = 0; ipov.ih_pr = nxt; + ipov.ih_len = htons(len); ipov.ih_src = mtod(m, struct ip *)->ip_src; ipov.ih_dst = mtod(m, struct ip *)->ip_dst; - sum += in_cksumdata((caddr_t) &ipov, sizeof(ipov)); + /* first 8 bytes are zeroes */ + sum += in_cksumdata((caddr_t) &ipov + 8, sizeof(ipov) - 8); } /* skip over unnecessary part */ @@ -241,7 +241,7 @@ in4_cksum(struct mbuf *m, u_int8_t nxt, sum += in_cksumdata(addr, mlen) << 8; else sum += in_cksumdata(addr, mlen); - + clen += mlen; len -= mlen; } Index: sys/arch/m88k/m88k/in_cksum.c =================================================================== RCS file: /OpenBSD/src/sys/arch/m88k/m88k/in_cksum.c,v retrieving revision 1.4 diff -u -p -r1.4 in_cksum.c --- sys/arch/m88k/m88k/in_cksum.c 21 Aug 2014 14:24:08 -0000 1.4 +++ sys/arch/m88k/m88k/in_cksum.c 30 Jan 2022 18:35:18 -0000 @@ -95,19 +95,22 @@ in4_cksum(struct mbuf *m, uint8_t nxt, i { u_int16_t *w; u_int sum = 0; - struct ipovly ipov; + union { + struct ipovly ipov; + u_int16_t w[10]; + } u; if (nxt != 0) { /* pseudo header */ - bzero(&ipov, sizeof(ipov)); - ipov.ih_len = htons(len); - ipov.ih_pr = nxt; - ipov.ih_src = mtod(m, struct ip *)->ip_src; - ipov.ih_dst = mtod(m, struct ip *)->ip_dst; - w = (u_int16_t *)&ipov; - /* assumes sizeof(ipov) == 20 */ - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; sum += w[4]; - sum += w[5]; sum += w[6]; sum += w[7]; sum += w[8]; sum += w[9]; + u.ipov.ih_x1[8] = 0; + u.ipov.ih_pr = nxt; + u.ipov.ih_len = htons(len); + u.ipov.ih_src = mtod(m, struct ip *)->ip_src; + u.ipov.ih_dst = mtod(m, struct ip *)->ip_dst; + w = u.w; + /* assumes sizeof(ipov) == 20 and first 8 bytes are zeroes */ + sum += w[4]; sum += w[5]; sum += w[6]; + sum += w[7]; sum += w[8]; sum += w[9]; } /* skip unnecessary part */ Index: sys/arch/powerpc/powerpc/in_cksum.c =================================================================== RCS file: /OpenBSD/src/sys/arch/powerpc/powerpc/in_cksum.c,v retrieving revision 1.10 diff -u -p -r1.10 in_cksum.c --- sys/arch/powerpc/powerpc/in_cksum.c 22 Jul 2014 10:35:35 -0000 1.10 +++ sys/arch/powerpc/powerpc/in_cksum.c 30 Jan 2022 18:35:18 -0000 @@ -87,7 +87,7 @@ in_cksum_internal(struct mbuf *m, int of * of a word spanning between this mbuf and the * last mbuf. * - * s_util.c[0] is already saved when scanning previous + * s_util.c[0] is already saved when scanning previous * mbuf. */ s_util.c[1] = *w++; @@ -254,15 +254,15 @@ in4_cksum(struct mbuf *m, uint8_t nxt, i if (nxt != 0) { /* pseudo header */ - memset(&u.ipov, 0, sizeof(u.ipov)); + u.ipov.ih_x1[8] = 0; + u.ipov.ih_pr = nxt; u.ipov.ih_len = htons(len); - u.ipov.ih_pr = nxt; - u.ipov.ih_src = mtod(m, struct ip *)->ip_src; + u.ipov.ih_src = mtod(m, struct ip *)->ip_src; u.ipov.ih_dst = mtod(m, struct ip *)->ip_dst; w = u.w; - /* assumes sizeof(ipov) == 20 */ - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; sum += w[4]; - sum += w[5]; sum += w[6]; sum += w[7]; sum += w[8]; sum += w[9]; + /* assumes sizeof(ipov) == 20 and first 8 bytes are zeroes */ + sum += w[4]; sum += w[5]; sum += w[6]; + sum += w[7]; sum += w[8]; sum += w[9]; } /* skip unnecessary part */ Index: sys/arch/sparc64/sparc64/in4_cksum.c =================================================================== RCS file: /OpenBSD/src/sys/arch/sparc64/sparc64/in4_cksum.c,v retrieving revision 1.7 diff -u -p -r1.7 in4_cksum.c --- sys/arch/sparc64/sparc64/in4_cksum.c 24 Aug 2014 20:06:57 -0000 1.7 +++ sys/arch/sparc64/sparc64/in4_cksum.c 30 Jan 2022 18:35:18 -0000 @@ -93,7 +93,6 @@ extern int in_cksum_internal(struct mbuf int in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len) { - u_char *w; u_int sum = 0; struct ipovly ipov; @@ -106,24 +105,19 @@ in4_cksum(struct mbuf *m, u_int8_t nxt, if (nxt != 0) { /* pseudo header */ - memset(&ipov, 0, sizeof(ipov)); - ipov.ih_len = htons(len); - ipov.ih_pr = nxt; - ipov.ih_src = mtod(m, struct ip *)->ip_src; + ipov.ih_src = mtod(m, struct ip *)->ip_src; ipov.ih_dst = mtod(m, struct ip *)->ip_dst; - w = (u_char *)&ipov; + sum = ((u_int)nxt << 16) | htons(len); /* assumes sizeof(ipov) == 20 */ - __asm volatile(" lduw [%5 + 0], %1; " - " lduw [%5 + 4], %2; " - " lduw [%5 + 8], %3; add %0, %1, %0; " - " lduw [%5 + 12], %1; add %0, %2, %0; " - " lduw [%5 + 16], %2; add %0, %3, %0; " + __asm volatile( + " lduw [%5 + 12], %1; " + " lduw [%5 + 16], %2; " " mov -1, %3; add %0, %1, %0; " " srl %3, 0, %3; add %0, %2, %0; " - " srlx %0, 32, %2; and %0, %3, %1; " + " srlx %0, 32, %2; " " add %0, %2, %0; " : "=r" (sum), "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3) - : "0" (sum), "r" (w)); + : "0" (sum), "r" (&ipov)); } /* skip unnecessary part */ Index: sys/netinet/in4_cksum.c =================================================================== RCS file: /OpenBSD/src/sys/netinet/in4_cksum.c,v retrieving revision 1.10 diff -u -p -r1.10 in4_cksum.c --- sys/netinet/in4_cksum.c 8 Sep 2014 06:24:13 -0000 1.10 +++ sys/netinet/in4_cksum.c 30 Jan 2022 18:35:18 -0000 @@ -111,15 +111,15 @@ in4_cksum(struct mbuf *m, u_int8_t nxt, panic("in4_cksum: offset too short"); if (m->m_len < sizeof(struct ip)) panic("in4_cksum: bad mbuf chain"); - bzero(&u.ipov, sizeof(u.ipov)); - u.ipov.ih_len = htons(len); + u.ipov.ih_x1[8] = 0; u.ipov.ih_pr = nxt; + u.ipov.ih_len = htons(len); u.ipov.ih_src = mtod(m, struct ip *)->ip_src; u.ipov.ih_dst = mtod(m, struct ip *)->ip_dst; w = u.w; - /* assumes sizeof(ipov) == 20 */ - sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3]; sum += w[4]; - sum += w[5]; sum += w[6]; sum += w[7]; sum += w[8]; sum += w[9]; + /* assumes sizeof(ipov) == 20 and first 8 bytes are zeroes */ + sum += w[4]; sum += w[5]; sum += w[6]; + sum += w[7]; sum += w[8]; sum += w[9]; } /* skip unnecessary part */