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