> > - 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 */