diff options
| author | Conrad Meyer <cem@FreeBSD.org> | 2018-07-18 00:56:25 +0000 |
|---|---|---|
| committer | Conrad Meyer <cem@FreeBSD.org> | 2018-07-18 00:56:25 +0000 |
| commit | 1b0909d51a8aa8b5ec5a61c2dc1a69642976a732 (patch) | |
| tree | b9c915e7d2ca9312b6f83308f05040a78875b6d7 /sys/dev/safe | |
| parent | 38b42191fb8cbdf348508c72b504e0dc3da1b53c (diff) | |
Notes
Diffstat (limited to 'sys/dev/safe')
| -rw-r--r-- | sys/dev/safe/safe.c | 86 | ||||
| -rw-r--r-- | sys/dev/safe/safevar.h | 9 |
2 files changed, 13 insertions, 82 deletions
diff --git a/sys/dev/safe/safe.c b/sys/dev/safe/safe.c index 83b22d8d89ee..a1673c9cd60f 100644 --- a/sys/dev/safe/safe.c +++ b/sys/dev/safe/safe.c @@ -88,8 +88,7 @@ static int safe_suspend(device_t); static int safe_resume(device_t); static int safe_shutdown(device_t); -static int safe_newsession(device_t, u_int32_t *, struct cryptoini *); -static int safe_freesession(device_t, u_int64_t); +static int safe_newsession(device_t, crypto_session_t, struct cryptoini *); static int safe_process(device_t, struct cryptop *, int); static device_method_t safe_methods[] = { @@ -103,7 +102,6 @@ static device_method_t safe_methods[] = { /* crypto device methods */ DEVMETHOD(cryptodev_newsession, safe_newsession), - DEVMETHOD(cryptodev_freesession,safe_freesession), DEVMETHOD(cryptodev_process, safe_process), DEVMETHOD_END @@ -266,7 +264,8 @@ safe_attach(device_t dev) goto bad2; } - sc->sc_cid = crypto_get_driverid(dev, CRYPTOCAP_F_HARDWARE); + sc->sc_cid = crypto_get_driverid(dev, sizeof(struct safe_session), + CRYPTOCAP_F_HARDWARE); if (sc->sc_cid < 0) { device_printf(dev, "could not get crypto driver id\n"); goto bad3; @@ -698,14 +697,13 @@ safe_setup_mackey(struct safe_session *ses, int algo, caddr_t key, int klen) * id on successful allocation. */ static int -safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri) +safe_newsession(device_t dev, crypto_session_t cses, struct cryptoini *cri) { struct safe_softc *sc = device_get_softc(dev); struct cryptoini *c, *encini = NULL, *macini = NULL; struct safe_session *ses = NULL; - int sesn; - if (sidp == NULL || cri == NULL || sc == NULL) + if (cri == NULL || sc == NULL) return (EINVAL); for (c = cri; c != NULL; c = c->cri_next) { @@ -746,41 +744,7 @@ safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri) } } - if (sc->sc_sessions == NULL) { - ses = sc->sc_sessions = (struct safe_session *)malloc( - sizeof(struct safe_session), M_DEVBUF, M_NOWAIT); - if (ses == NULL) - return (ENOMEM); - sesn = 0; - sc->sc_nsessions = 1; - } else { - for (sesn = 0; sesn < sc->sc_nsessions; sesn++) { - if (sc->sc_sessions[sesn].ses_used == 0) { - ses = &sc->sc_sessions[sesn]; - break; - } - } - - if (ses == NULL) { - sesn = sc->sc_nsessions; - ses = (struct safe_session *)malloc((sesn + 1) * - sizeof(struct safe_session), M_DEVBUF, M_NOWAIT); - if (ses == NULL) - return (ENOMEM); - bcopy(sc->sc_sessions, ses, sesn * - sizeof(struct safe_session)); - bzero(sc->sc_sessions, sesn * - sizeof(struct safe_session)); - free(sc->sc_sessions, M_DEVBUF); - sc->sc_sessions = ses; - ses = &sc->sc_sessions[sesn]; - sc->sc_nsessions++; - } - } - - bzero(ses, sizeof(struct safe_session)); - ses->ses_used = 1; - + ses = crypto_get_driver_session(cses); if (encini) { /* get an IV */ /* XXX may read fewer than requested */ @@ -806,32 +770,9 @@ safe_newsession(device_t dev, u_int32_t *sidp, struct cryptoini *cri) } } - *sidp = SAFE_SID(device_get_unit(sc->sc_dev), sesn); return (0); } -/* - * Deallocate a session. - */ -static int -safe_freesession(device_t dev, u_int64_t tid) -{ - struct safe_softc *sc = device_get_softc(dev); - int session, ret; - u_int32_t sid = ((u_int32_t) tid) & 0xffffffff; - - if (sc == NULL) - return (EINVAL); - - session = SAFE_SESSION(sid); - if (session < sc->sc_nsessions) { - bzero(&sc->sc_sessions[session], sizeof(sc->sc_sessions[session])); - ret = 0; - } else - ret = EINVAL; - return (ret); -} - static void safe_op_cb(void *arg, bus_dma_segment_t *seg, int nsegs, bus_size_t mapsize, int error) { @@ -865,10 +806,6 @@ safe_process(device_t dev, struct cryptop *crp, int hint) safestats.st_invalid++; return (EINVAL); } - if (SAFE_SESSION(crp->crp_sid) >= sc->sc_nsessions) { - safestats.st_badsession++; - return (EINVAL); - } mtx_lock(&sc->sc_ringmtx); if (sc->sc_front == sc->sc_back && sc->sc_nqchip != 0) { @@ -885,7 +822,6 @@ safe_process(device_t dev, struct cryptop *crp, int hint) re->re_sa.sa_staterec = staterec; /* restore */ re->re_crp = crp; - re->re_sesn = SAFE_SESSION(crp->crp_sid); if (crp->crp_flags & CRYPTO_F_IMBUF) { re->re_src_m = (struct mbuf *)crp->crp_buf; @@ -900,7 +836,7 @@ safe_process(device_t dev, struct cryptop *crp, int hint) } sa = &re->re_sa; - ses = &sc->sc_sessions[re->re_sesn]; + ses = crypto_get_driver_session(crp->crp_session); crd1 = crp->crp_desc; if (crd1 == NULL) { @@ -1501,8 +1437,11 @@ static void safe_callback(struct safe_softc *sc, struct safe_ringentry *re) { struct cryptop *crp = (struct cryptop *)re->re_crp; + struct safe_session *ses; struct cryptodesc *crd; + ses = crypto_get_driver_session(crp->crp_session); + safestats.st_opackets++; safestats.st_obytes += re->re_dst.mapsize; @@ -1548,7 +1487,7 @@ safe_callback(struct safe_softc *sc, struct safe_ringentry *re) continue; crypto_copydata(crp->crp_flags, crp->crp_buf, crd->crd_skip + crd->crd_len - ivsize, ivsize, - (caddr_t)sc->sc_sessions[re->re_sesn].ses_iv); + (caddr_t)ses->ses_iv); break; } } @@ -1573,8 +1512,7 @@ safe_callback(struct safe_softc *sc, struct safe_ringentry *re) bswap32(re->re_sastate.sa_saved_indigest[2]); } crypto_copyback(crp->crp_flags, crp->crp_buf, - crd->crd_inject, - sc->sc_sessions[re->re_sesn].ses_mlen, + crd->crd_inject, ses->ses_mlen, (caddr_t)re->re_sastate.sa_saved_indigest); break; } diff --git a/sys/dev/safe/safevar.h b/sys/dev/safe/safevar.h index 6386e9b71daf..024d00564562 100644 --- a/sys/dev/safe/safevar.h +++ b/sys/dev/safe/safevar.h @@ -47,10 +47,6 @@ #define SAFE_RNG_MAXBUFSIZ 128 /* 32-bit words */ -#define SAFE_CARD(sid) (((sid) & 0xf0000000) >> 28) -#define SAFE_SESSION(sid) ( (sid) & 0x0fffffff) -#define SAFE_SID(crd, sesn) (((crd) << 28) | ((sesn) & 0x0fffffff)) - #define SAFE_DEF_RTY 0xff /* PCI Retry Timeout */ #define SAFE_DEF_TOUT 0xff /* PCI TRDY Timeout */ #define SAFE_DEF_CACHELINE 0x01 /* Cache Line setting */ @@ -114,7 +110,7 @@ struct safe_ringentry { struct safe_operand re_src; /* source operand */ struct safe_operand re_dst; /* destination operand */ - int re_sesn; /* crypto session ID */ + int unused; int re_flags; #define SAFE_QFLAGS_COPYOUTIV 0x1 /* copy back on completion */ #define SAFE_QFLAGS_COPYOUTICV 0x2 /* copy back on completion */ @@ -137,7 +133,6 @@ struct safe_ringentry { struct rndstate_test; struct safe_session { - u_int32_t ses_used; u_int32_t ses_klen; /* key length in bits */ u_int32_t ses_key[8]; /* DES/3DES/AES key */ u_int32_t ses_mlen; /* hmac length in bytes */ @@ -177,8 +172,6 @@ struct safe_softc { struct safe_pdesc *sc_dpringtop; /* dest particle ring top */ struct safe_pdesc *sc_dpfree; /* next free dest particle */ struct safe_dma_alloc sc_dpalloc; /* dst particle ring state */ - int sc_nsessions; /* # of sessions */ - struct safe_session *sc_sessions; /* sessions */ struct callout sc_rngto; /* rng timeout */ struct rndtest_state *sc_rndtest; /* RNG test state */ |
