Changeset View
Changeset View
Standalone View
Standalone View
sys/opencrypto/criov.c
Show First 20 Lines • Show All 315 Lines • ▼ Show 20 Lines | case CRYPTO_BUF_SINGLE_MBUF: | ||||
break; | break; | ||||
case CRYPTO_BUF_VMPAGE: | case CRYPTO_BUF_VMPAGE: | ||||
cc->cc_vmpage = cb->cb_vm_page; | cc->cc_vmpage = cb->cb_vm_page; | ||||
cc->cc_buf_len = cb->cb_vm_page_len; | cc->cc_buf_len = cb->cb_vm_page_len; | ||||
cc->cc_offset = cb->cb_vm_page_offset; | cc->cc_offset = cb->cb_vm_page_offset; | ||||
break; | break; | ||||
case CRYPTO_BUF_UIO: | case CRYPTO_BUF_UIO: | ||||
cc->cc_iov = cb->cb_uio->uio_iov; | cc->cc_iov = cb->cb_uio->uio_iov; | ||||
cc->cc_buf_len = cb->cb_uio->uio_resid; | |||||
break; | break; | ||||
default: | default: | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
panic("%s: invalid buffer type %d", __func__, cb->cb_type); | panic("%s: invalid buffer type %d", __func__, cb->cb_type); | ||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | case CRYPTO_BUF_VMPAGE: | ||||
break; | break; | ||||
case CRYPTO_BUF_UIO: | case CRYPTO_BUF_UIO: | ||||
for (;;) { | for (;;) { | ||||
remain = cc->cc_iov->iov_len - cc->cc_offset; | remain = cc->cc_iov->iov_len - cc->cc_offset; | ||||
if (amount < remain) { | if (amount < remain) { | ||||
cc->cc_offset += amount; | cc->cc_offset += amount; | ||||
break; | break; | ||||
} | } | ||||
cc->cc_buf_len -= remain; | |||||
amount -= remain; | amount -= remain; | ||||
cc->cc_iov++; | cc->cc_iov++; | ||||
cc->cc_offset = 0; | cc->cc_offset = 0; | ||||
if (amount == 0) | if (amount == 0) | ||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
default: | default: | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
panic("%s: invalid buffer type %d", __func__, cc->cc_type); | panic("%s: invalid buffer type %d", __func__, cc->cc_type); | ||||
#endif | #endif | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
void * | void * | ||||
crypto_cursor_segment(struct crypto_buffer_cursor *cc, size_t *len) | crypto_cursor_segment(struct crypto_buffer_cursor *cc, size_t *len) | ||||
{ | { | ||||
switch (cc->cc_type) { | switch (cc->cc_type) { | ||||
case CRYPTO_BUF_CONTIG: | case CRYPTO_BUF_CONTIG: | ||||
*len = cc->cc_buf_len; | case CRYPTO_BUF_UIO: | ||||
return (cc->cc_buf); | case CRYPTO_BUF_VMPAGE: | ||||
if (cc->cc_buf_len == 0) { | |||||
*len = 0; | |||||
return (NULL); | |||||
} | |||||
break; | |||||
case CRYPTO_BUF_MBUF: | case CRYPTO_BUF_MBUF: | ||||
case CRYPTO_BUF_SINGLE_MBUF: | case CRYPTO_BUF_SINGLE_MBUF: | ||||
if (cc->cc_mbuf == NULL) { | if (cc->cc_mbuf == NULL) { | ||||
*len = 0; | *len = 0; | ||||
return (NULL); | return (NULL); | ||||
} | } | ||||
break; | |||||
default: | |||||
#ifdef INVARIANTS | |||||
panic("%s: invalid buffer type %d", __func__, cc->cc_type); | |||||
#endif | |||||
*len = 0; | |||||
return (NULL); | |||||
} | |||||
switch (cc->cc_type) { | |||||
case CRYPTO_BUF_CONTIG: | |||||
*len = cc->cc_buf_len; | |||||
return (cc->cc_buf); | |||||
case CRYPTO_BUF_MBUF: | |||||
case CRYPTO_BUF_SINGLE_MBUF: | |||||
if (cc->cc_mbuf->m_flags & M_EXTPG) | if (cc->cc_mbuf->m_flags & M_EXTPG) | ||||
return (m_epg_segment(cc->cc_mbuf, cc->cc_offset, len)); | return (m_epg_segment(cc->cc_mbuf, cc->cc_offset, len)); | ||||
*len = cc->cc_mbuf->m_len - cc->cc_offset; | *len = cc->cc_mbuf->m_len - cc->cc_offset; | ||||
return (mtod(cc->cc_mbuf, char *) + cc->cc_offset); | return (mtod(cc->cc_mbuf, char *) + cc->cc_offset); | ||||
case CRYPTO_BUF_VMPAGE: | case CRYPTO_BUF_VMPAGE: | ||||
*len = PAGE_SIZE - cc->cc_offset; | *len = PAGE_SIZE - cc->cc_offset; | ||||
return ((char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS( | return ((char *)PHYS_TO_DMAP(VM_PAGE_TO_PHYS( | ||||
*cc->cc_vmpage)) + cc->cc_offset); | *cc->cc_vmpage)) + cc->cc_offset); | ||||
case CRYPTO_BUF_UIO: | case CRYPTO_BUF_UIO: | ||||
*len = cc->cc_iov->iov_len - cc->cc_offset; | *len = cc->cc_iov->iov_len - cc->cc_offset; | ||||
return ((char *)cc->cc_iov->iov_base + cc->cc_offset); | return ((char *)cc->cc_iov->iov_base + cc->cc_offset); | ||||
default: | default: | ||||
#ifdef INVARIANTS | __assert_unreachable(); | ||||
panic("%s: invalid buffer type %d", __func__, cc->cc_type); | |||||
#endif | |||||
*len = 0; | |||||
return (NULL); | |||||
} | } | ||||
} | } | ||||
void | void | ||||
crypto_cursor_copyback(struct crypto_buffer_cursor *cc, int size, | crypto_cursor_copyback(struct crypto_buffer_cursor *cc, int size, | ||||
const void *vsrc) | const void *vsrc) | ||||
{ | { | ||||
size_t remain, todo; | size_t remain, todo; | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | case CRYPTO_BUF_VMPAGE: | ||||
break; | break; | ||||
case CRYPTO_BUF_UIO: | case CRYPTO_BUF_UIO: | ||||
for (;;) { | for (;;) { | ||||
dst = (char *)cc->cc_iov->iov_base + cc->cc_offset; | dst = (char *)cc->cc_iov->iov_base + cc->cc_offset; | ||||
remain = cc->cc_iov->iov_len - cc->cc_offset; | remain = cc->cc_iov->iov_len - cc->cc_offset; | ||||
todo = MIN(remain, size); | todo = MIN(remain, size); | ||||
memcpy(dst, src, todo); | memcpy(dst, src, todo); | ||||
src += todo; | src += todo; | ||||
cc->cc_buf_len -= todo; | |||||
olce: Typo? | |||||
Done Inline ActionsIndeed, thank you. markj: Indeed, thank you. | |||||
if (todo < remain) { | if (todo < remain) { | ||||
cc->cc_offset += todo; | cc->cc_offset += todo; | ||||
break; | break; | ||||
} | } | ||||
size -= todo; | size -= todo; | ||||
cc->cc_iov++; | cc->cc_iov++; | ||||
cc->cc_offset = 0; | cc->cc_offset = 0; | ||||
if (size == 0) | if (size == 0) | ||||
▲ Show 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | crypto_cursor_copydata(struct crypto_buffer_cursor *cc, int size, void *vdst) | ||||
case CRYPTO_BUF_UIO: | case CRYPTO_BUF_UIO: | ||||
for (;;) { | for (;;) { | ||||
src = (const char *)cc->cc_iov->iov_base + | src = (const char *)cc->cc_iov->iov_base + | ||||
cc->cc_offset; | cc->cc_offset; | ||||
remain = cc->cc_iov->iov_len - cc->cc_offset; | remain = cc->cc_iov->iov_len - cc->cc_offset; | ||||
todo = MIN(remain, size); | todo = MIN(remain, size); | ||||
memcpy(dst, src, todo); | memcpy(dst, src, todo); | ||||
dst += todo; | dst += todo; | ||||
cc->cc_buf_len -= todo; | |||||
if (todo < remain) { | if (todo < remain) { | ||||
cc->cc_offset += todo; | cc->cc_offset += todo; | ||||
break; | break; | ||||
} | } | ||||
size -= todo; | size -= todo; | ||||
cc->cc_iov++; | cc->cc_iov++; | ||||
cc->cc_offset = 0; | cc->cc_offset = 0; | ||||
if (size == 0) | if (size == 0) | ||||
▲ Show 20 Lines • Show All 237 Lines • Show Last 20 Lines |
Typo?