Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_ktls.c
Show First 20 Lines • Show All 1,975 Lines • ▼ Show 20 Lines | ktls_enqueue(struct mbuf *m, struct socket *so, int page_count) | ||||
STAILQ_INSERT_TAIL(&wq->m_head, m, m_epg_stailq); | STAILQ_INSERT_TAIL(&wq->m_head, m, m_epg_stailq); | ||||
running = wq->running; | running = wq->running; | ||||
mtx_unlock(&wq->mtx); | mtx_unlock(&wq->mtx); | ||||
if (!running) | if (!running) | ||||
wakeup(wq); | wakeup(wq); | ||||
counter_u64_add(ktls_cnt_tx_queued, 1); | counter_u64_add(ktls_cnt_tx_queued, 1); | ||||
} | } | ||||
#define MAX_TLS_PAGES (1 + btoc(TLS_MAX_MSG_SIZE_V10_2)) | |||||
static __noinline void | static __noinline void | ||||
ktls_encrypt(struct ktls_wq *wq, struct mbuf *top) | ktls_encrypt(struct ktls_wq *wq, struct mbuf *top) | ||||
{ | { | ||||
struct ktls_session *tls; | struct ktls_session *tls; | ||||
struct socket *so; | struct socket *so; | ||||
struct mbuf *m; | struct mbuf *m; | ||||
vm_paddr_t parray[1 + btoc(TLS_MAX_MSG_SIZE_V10_2)]; | vm_paddr_t parray[MAX_TLS_PAGES + 1]; | ||||
struct iovec dst_iov[1 + btoc(TLS_MAX_MSG_SIZE_V10_2)]; | struct iovec dst_iov[MAX_TLS_PAGES + 2]; | ||||
vm_page_t pg; | vm_page_t pg; | ||||
void *cbuf; | void *cbuf; | ||||
int error, i, len, npages, off, total_pages; | int error, i, len, npages, off, total_pages; | ||||
so = top->m_epg_so; | so = top->m_epg_so; | ||||
tls = top->m_epg_tls; | tls = top->m_epg_tls; | ||||
KASSERT(tls != NULL, ("tls = NULL, top = %p\n", top)); | KASSERT(tls != NULL, ("tls = NULL, top = %p\n", top)); | ||||
KASSERT(so != NULL, ("so = NULL, top = %p\n", top)); | KASSERT(so != NULL, ("so = NULL, top = %p\n", top)); | ||||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | if ((m->m_epg_flags & EPG_FLAG_ANON) != 0) { | ||||
len = m_epg_pagelen(m, i, off); | len = m_epg_pagelen(m, i, off); | ||||
parray[i] = VM_PAGE_TO_PHYS(pg); | parray[i] = VM_PAGE_TO_PHYS(pg); | ||||
dst_iov[i].iov_base = | dst_iov[i].iov_base = | ||||
(char *)(void *)PHYS_TO_DMAP( | (char *)(void *)PHYS_TO_DMAP( | ||||
parray[i]) + off; | parray[i]) + off; | ||||
dst_iov[i].iov_len = len; | dst_iov[i].iov_len = len; | ||||
} | } | ||||
} | } | ||||
KASSERT(i + 1 <= nitems(dst_iov), | |||||
("dst_iov is too small")); | |||||
dst_iov[i].iov_base = m->m_epg_trail; | |||||
dst_iov[i].iov_len = m->m_epg_trllen; | |||||
error = (*tls->sw_encrypt)(tls, m, dst_iov, i); | error = (*tls->sw_encrypt)(tls, m, dst_iov, i + 1); | ||||
/* Free the old pages. */ | /* Free the old pages. */ | ||||
m->m_ext.ext_free(m); | m->m_ext.ext_free(m); | ||||
/* Replace them with the new pages. */ | /* Replace them with the new pages. */ | ||||
if (cbuf != NULL) { | if (cbuf != NULL) { | ||||
for (i = 0; i < m->m_epg_npgs; i++) | for (i = 0; i < m->m_epg_npgs; i++) | ||||
m->m_epg_pa[i] = parray[0] + ptoa(i); | m->m_epg_pa[i] = parray[0] + ptoa(i); | ||||
▲ Show 20 Lines • Show All 97 Lines • Show Last 20 Lines |