Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/tls-earlyentropy]: src/sys/dev Whups. It'd help to check in the ioctl c...
details: https://anonhg.NetBSD.org/src/rev/459a84f10617
branches: tls-earlyentropy
changeset: 795267:459a84f10617
user: tls <tls%NetBSD.org@localhost>
date: Mon Apr 07 02:54:53 2014 +0000
description:
Whups. It'd help to check in the ioctl changes needed to support that
rndctl change just prior... ;-)
diffstat:
sys/dev/rndpseudo.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 82 insertions(+), 4 deletions(-)
diffs (158 lines):
diff -r f68c97e08906 -r 459a84f10617 sys/dev/rndpseudo.c
--- a/sys/dev/rndpseudo.c Mon Apr 07 02:49:52 2014 +0000
+++ b/sys/dev/rndpseudo.c Mon Apr 07 02:54:53 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: rndpseudo.c,v 1.19 2014/03/16 05:20:26 dholland Exp $ */
+/* $NetBSD: rndpseudo.c,v 1.19.2.1 2014/04/07 02:54:53 tls Exp $ */
/*-
* Copyright (c) 1997-2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rndpseudo.c,v 1.19 2014/03/16 05:20:26 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rndpseudo.c,v 1.19.2.1 2014/04/07 02:54:53 tls Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -514,12 +514,27 @@
r->flags = kr->flags;
}
+static void
+krndsource_to_rndsource_est(krndsource_t *kr, rndsource_est_t *re)
+{
+ memset(re, 0, sizeof(*re));
+ krndsource_to_rndsource(kr, &re->rt);
+ re->dt_samples = kr->time_delta.insamples;
+ re->dt_total = kr->time_delta.outbits;
+ re->dv_samples = kr->value_delta.insamples;
+ re->dv_total = kr->value_delta.outbits;
+ re->lzv_bytes = kr->lz_v.inbytes;
+ re->lzv_total = kr->lz_v.outbits;
+}
+
int
rnd_ioctl(struct file *fp, u_long cmd, void *addr)
{
krndsource_t *kr;
rndstat_t *rst;
rndstat_name_t *rstnm;
+ rndstat_est_t *rset;
+ rndstat_est_name_t *rsetnm;
rndctl_t *rctl;
rnddata_t *rnddata;
u_int32_t count, start;
@@ -535,6 +550,8 @@
case RNDGETPOOLSTAT:
case RNDGETSRCNUM:
case RNDGETSRCNAME:
+ case RNDGETESTNUM:
+ case RNDGETESTNAME:
ret = kauth_authorize_device(curlwp->l_cred,
KAUTH_DEVICE_RND_GETPRIV, NULL, NULL, NULL, NULL);
if (ret)
@@ -623,6 +640,41 @@
mutex_spin_exit(&rndpool_mtx);
break;
+ case RNDGETESTNUM:
+ rset = (rndstat_est_t *)addr;
+
+ if (rset->count == 0)
+ break;
+
+ if (rset->count > RND_MAXSTATCOUNT)
+ return (EINVAL);
+
+ mutex_spin_enter(&rndpool_mtx);
+ /*
+ * Find the starting source by running through the
+ * list of sources.
+ */
+ kr = rnd_sources.lh_first;
+ start = rset->start;
+ while (kr != NULL && start > 1) {
+ kr = kr->list.le_next;
+ start--;
+ }
+
+ /* Return up to as many structures as the user asked
+ * for. If we run out of sources, a count of zero
+ * will be returned, without an error.
+ */
+ for (count = 0; count < rset->count && kr != NULL; count++) {
+ krndsource_to_rndsource_est(kr, &rset->source[count]);
+ kr = kr->list.le_next;
+ }
+
+ rset->count = count;
+
+ mutex_spin_exit(&rndpool_mtx);
+ break;
+
case RNDGETSRCNAME:
/*
* Scan through the list, trying to find the name.
@@ -633,7 +685,7 @@
while (kr != NULL) {
if (strncmp(kr->name, rstnm->name,
MIN(sizeof(kr->name),
- sizeof(*rstnm))) == 0) {
+ sizeof(rstnm->name))) == 0) {
krndsource_to_rndsource(kr, &rstnm->source);
mutex_spin_exit(&rndpool_mtx);
return (0);
@@ -646,6 +698,30 @@
break;
+ case RNDGETESTNAME:
+ /*
+ * Scan through the list, trying to find the name.
+ */
+ mutex_spin_enter(&rndpool_mtx);
+ rsetnm = (rndstat_est_name_t *)addr;
+ kr = rnd_sources.lh_first;
+ while (kr != NULL) {
+ if (strncmp(kr->name, rsetnm->name,
+ MIN(sizeof(kr->name),
+ sizeof(rsetnm->name))) == 0) {
+ krndsource_to_rndsource_est(kr,
+ &rsetnm->source);
+ mutex_spin_exit(&rndpool_mtx);
+ return (0);
+ }
+ kr = kr->list.le_next;
+ }
+ mutex_spin_exit(&rndpool_mtx);
+
+ ret = ENOENT; /* name not found */
+
+ break;
+
case RNDCTL:
/*
* Set flags to enable/disable entropy counting and/or
@@ -662,9 +738,11 @@
while (kr != NULL) {
if (kr->type == rctl->type) {
kr->flags &= ~rctl->mask;
+
kr->flags |=
(rctl->flags & rctl->mask);
}
+
kr = kr->list.le_next;
}
mutex_spin_exit(&rndpool_mtx);
@@ -680,7 +758,7 @@
sizeof(rctl->name))) == 0) {
kr->flags &= ~rctl->mask;
kr->flags |= (rctl->flags & rctl->mask);
-
+
mutex_spin_exit(&rndpool_mtx);
return (0);
}
Home |
Main Index |
Thread Index |
Old Index