Hi,
Propagate the crypto errors and count them in ipsec. This is part
of a larger diff where I disable the crypto queues for ipsec. I
think it cannot happen, but errors should always be checked.
tq is never NULL.
I know that tdb->tdb_odrops++ is not MP safe. I have just copied
the code. My plan is to address this in multiple places later.
ok?
bluhm
Index: crypto/crypto.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/crypto/crypto.c,v
retrieving revision 1.83
diff -u -p -r1.83 crypto.c
--- crypto/crypto.c 30 Jun 2021 12:21:02 -0000 1.83
+++ crypto/crypto.c 20 Jul 2021 22:51:56 -0000
@@ -388,7 +388,7 @@ int
crypto_dispatch(struct cryptop *crp)
{
struct taskq *tq = crypto_taskq;
- int s;
+ int error = 0, s;
u_int32_t hid;
s = splvm();
@@ -399,14 +399,14 @@ crypto_dispatch(struct cryptop *crp)
}
splx(s);
- if (tq && !(crp->crp_flags & CRYPTO_F_NOQUEUE)) {
+ if ((crp->crp_flags & CRYPTO_F_NOQUEUE) == 0) {
task_set(&crp->crp_task, (void (*))crypto_invoke, crp);
task_add(tq, &crp->crp_task);
} else {
- crypto_invoke(crp);
+ error = crypto_invoke(crp);
}
- return 0;
+ return error;
}
/*
Index: netinet/ipsec_output.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ipsec_output.c,v
retrieving revision 1.82
diff -u -p -r1.82 ipsec_output.c
--- netinet/ipsec_output.c 8 Jul 2021 15:13:14 -0000 1.82
+++ netinet/ipsec_output.c 20 Jul 2021 23:09:06 -0000
@@ -418,7 +418,12 @@ ipsec_output_cb(struct cryptop *crp)
if (tdb->tdb_cryptoid != 0)
tdb->tdb_cryptoid = crp->crp_sid;
NET_UNLOCK();
- crypto_dispatch(crp);
+ error = crypto_dispatch(crp);
+ if (error) {
+ DPRINTF("crypto dispatch error %d", error);
+ ipsecstat_inc(ipsec_odrops);
+ tdb->tdb_odrops++;
+ }
return;
}
DPRINTF("crypto error %d", crp->crp_etype);