Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_sockbuf.c
Show All 28 Lines | |||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
* | * | ||||
* @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 | * @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93 | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include "opt_kern_tls.h" | |||||
#include "opt_param.h" | #include "opt_param.h" | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/aio.h> /* for aio_swake proto */ | #include <sys/aio.h> /* for aio_swake proto */ | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
#include <sys/ktls.h> | |||||
#include <sys/lock.h> | #include <sys/lock.h> | ||||
#include <sys/malloc.h> | #include <sys/malloc.h> | ||||
#include <sys/mbuf.h> | #include <sys/mbuf.h> | ||||
#include <sys/mutex.h> | #include <sys/mutex.h> | ||||
#include <sys/proc.h> | #include <sys/proc.h> | ||||
#include <sys/protosw.h> | #include <sys/protosw.h> | ||||
#include <sys/resourcevar.h> | #include <sys/resourcevar.h> | ||||
#include <sys/signalvar.h> | #include <sys/signalvar.h> | ||||
▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | sbready_compress(struct sockbuf *sb, struct mbuf *m0, struct mbuf *end) | ||||
if ((sb->sb_flags & SB_NOCOALESCE) != 0) | if ((sb->sb_flags & SB_NOCOALESCE) != 0) | ||||
return; | return; | ||||
for (m = m0; m != end; m = m->m_next) { | for (m = m0; m != end; m = m->m_next) { | ||||
MPASS((m->m_flags & M_NOTREADY) == 0); | MPASS((m->m_flags & M_NOTREADY) == 0); | ||||
/* Compress small unmapped mbufs into plain mbufs. */ | /* Compress small unmapped mbufs into plain mbufs. */ | ||||
if ((m->m_flags & M_NOMAP) && m->m_len <= MLEN) { | if ((m->m_flags & M_NOMAP) && m->m_len <= MLEN && | ||||
!mbuf_has_tls_session(m)) { | |||||
MPASS(m->m_flags & M_EXT); | MPASS(m->m_flags & M_EXT); | ||||
ext_size = m->m_ext.ext_size; | ext_size = m->m_ext.ext_size; | ||||
if (mb_unmapped_compress(m) == 0) { | if (mb_unmapped_compress(m) == 0) { | ||||
sb->sb_mbcnt -= ext_size; | sb->sb_mbcnt -= ext_size; | ||||
sb->sb_ccnt -= 1; | sb->sb_ccnt -= 1; | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* NB: In sbcompress(), 'n' is the last mbuf in the | * NB: In sbcompress(), 'n' is the last mbuf in the | ||||
* socket buffer and 'm' is the new mbuf being copied | * socket buffer and 'm' is the new mbuf being copied | ||||
* into the trailing space of 'n'. Here, the roles | * into the trailing space of 'n'. Here, the roles | ||||
* are reversed and 'n' is the next mbuf after 'm' | * are reversed and 'n' is the next mbuf after 'm' | ||||
* that is being copied into the trailing space of | * that is being copied into the trailing space of | ||||
* 'm'. | * 'm'. | ||||
*/ | */ | ||||
n = m->m_next; | n = m->m_next; | ||||
while ((n != NULL) && (n != end) && (m->m_flags & M_EOR) == 0 && | while ((n != NULL) && (n != end) && (m->m_flags & M_EOR) == 0 && | ||||
M_WRITABLE(m) && | M_WRITABLE(m) && | ||||
(m->m_flags & M_NOMAP) == 0 && | (m->m_flags & M_NOMAP) == 0 && | ||||
!mbuf_has_tls_session(n) && | |||||
!mbuf_has_tls_session(m) && | |||||
n->m_len <= MCLBYTES / 4 && /* XXX: Don't copy too much */ | n->m_len <= MCLBYTES / 4 && /* XXX: Don't copy too much */ | ||||
n->m_len <= M_TRAILINGSPACE(m) && | n->m_len <= M_TRAILINGSPACE(m) && | ||||
m->m_type == n->m_type) { | m->m_type == n->m_type) { | ||||
KASSERT(sb->sb_lastrecord != n, | KASSERT(sb->sb_lastrecord != n, | ||||
("%s: merging start of record (%p) into previous mbuf (%p)", | ("%s: merging start of record (%p) into previous mbuf (%p)", | ||||
__func__, n, m)); | __func__, n, m)); | ||||
m_copydata(n, 0, n->m_len, mtodo(m, m->m_len)); | m_copydata(n, 0, n->m_len, mtodo(m, m->m_len)); | ||||
m->m_len += n->m_len; | m->m_len += n->m_len; | ||||
▲ Show 20 Lines • Show All 519 Lines • ▼ Show 20 Lines | sbrelease(struct sockbuf *sb, struct socket *so) | ||||
SOCKBUF_UNLOCK(sb); | SOCKBUF_UNLOCK(sb); | ||||
} | } | ||||
void | void | ||||
sbdestroy(struct sockbuf *sb, struct socket *so) | sbdestroy(struct sockbuf *sb, struct socket *so) | ||||
{ | { | ||||
sbrelease_internal(sb, so); | sbrelease_internal(sb, so); | ||||
#ifdef KERN_TLS | |||||
if (sb->sb_tls_info != NULL) | |||||
ktls_free(sb->sb_tls_info); | |||||
sb->sb_tls_info = NULL; | |||||
#endif | |||||
} | } | ||||
/* | /* | ||||
* Routines to add and remove data from an mbuf queue. | * Routines to add and remove data from an mbuf queue. | ||||
* | * | ||||
* The routines sbappend() or sbappendrecord() are normally called to append | * The routines sbappend() or sbappendrecord() are normally called to append | ||||
* new mbufs to a socket buffer, after checking that adequate space is | * new mbufs to a socket buffer, after checking that adequate space is | ||||
* available, comparing the function sbspace() with the amount of data to be | * available, comparing the function sbspace() with the amount of data to be | ||||
▲ Show 20 Lines • Show All 147 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
SOCKBUF_LOCK_ASSERT(sb); | SOCKBUF_LOCK_ASSERT(sb); | ||||
KASSERT(m->m_nextpkt == NULL,("sbappendstream 0")); | KASSERT(m->m_nextpkt == NULL,("sbappendstream 0")); | ||||
KASSERT(sb->sb_mb == sb->sb_lastrecord,("sbappendstream 1")); | KASSERT(sb->sb_mb == sb->sb_lastrecord,("sbappendstream 1")); | ||||
SBLASTMBUFCHK(sb); | SBLASTMBUFCHK(sb); | ||||
#ifdef KERN_TLS | |||||
if (sb->sb_tls_info != NULL) | |||||
ktls_seq(sb, m); | |||||
#endif | |||||
/* Remove all packet headers and mbuf tags to get a pure data chain. */ | /* Remove all packet headers and mbuf tags to get a pure data chain. */ | ||||
m_demote(m, 1, flags & PRUS_NOTREADY ? M_NOTREADY : 0); | m_demote(m, 1, flags & PRUS_NOTREADY ? M_NOTREADY : 0); | ||||
sbcompress(sb, m, sb->sb_mbtail); | sbcompress(sb, m, sb->sb_mbtail); | ||||
sb->sb_lastrecord = sb->sb_mb; | sb->sb_lastrecord = sb->sb_mb; | ||||
SBLASTRECORDCHK(sb); | SBLASTRECORDCHK(sb); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 287 Lines • ▼ Show 20 Lines | if (m->m_len == 0 && | ||||
m = m_free(m); | m = m_free(m); | ||||
continue; | continue; | ||||
} | } | ||||
if (n && (n->m_flags & M_EOR) == 0 && | if (n && (n->m_flags & M_EOR) == 0 && | ||||
M_WRITABLE(n) && | M_WRITABLE(n) && | ||||
((sb->sb_flags & SB_NOCOALESCE) == 0) && | ((sb->sb_flags & SB_NOCOALESCE) == 0) && | ||||
!(m->m_flags & M_NOTREADY) && | !(m->m_flags & M_NOTREADY) && | ||||
!(n->m_flags & (M_NOTREADY | M_NOMAP)) && | !(n->m_flags & (M_NOTREADY | M_NOMAP)) && | ||||
!mbuf_has_tls_session(m) && | |||||
!mbuf_has_tls_session(n) && | |||||
m->m_len <= MCLBYTES / 4 && /* XXX: Don't copy too much */ | m->m_len <= MCLBYTES / 4 && /* XXX: Don't copy too much */ | ||||
m->m_len <= M_TRAILINGSPACE(n) && | m->m_len <= M_TRAILINGSPACE(n) && | ||||
n->m_type == m->m_type) { | n->m_type == m->m_type) { | ||||
m_copydata(m, 0, m->m_len, mtodo(n, n->m_len)); | m_copydata(m, 0, m->m_len, mtodo(n, n->m_len)); | ||||
n->m_len += m->m_len; | n->m_len += m->m_len; | ||||
sb->sb_ccc += m->m_len; | sb->sb_ccc += m->m_len; | ||||
if (sb->sb_fnrdy == NULL) | if (sb->sb_fnrdy == NULL) | ||||
sb->sb_acc += m->m_len; | sb->sb_acc += m->m_len; | ||||
if (m->m_type != MT_DATA && m->m_type != MT_OOBDATA) | if (m->m_type != MT_DATA && m->m_type != MT_OOBDATA) | ||||
/* XXX: Probably don't need.*/ | /* XXX: Probably don't need.*/ | ||||
sb->sb_ctl += m->m_len; | sb->sb_ctl += m->m_len; | ||||
m = m_free(m); | m = m_free(m); | ||||
continue; | continue; | ||||
} | } | ||||
if (m->m_len <= MLEN && (m->m_flags & M_NOMAP) && | if (m->m_len <= MLEN && (m->m_flags & M_NOMAP) && | ||||
(m->m_flags & M_NOTREADY) == 0) | (m->m_flags & M_NOTREADY) == 0 && | ||||
!mbuf_has_tls_session(m)) | |||||
(void)mb_unmapped_compress(m); | (void)mb_unmapped_compress(m); | ||||
if (n) | if (n) | ||||
n->m_next = m; | n->m_next = m; | ||||
else | else | ||||
sb->sb_mb = m; | sb->sb_mb = m; | ||||
sb->sb_mbtail = m; | sb->sb_mbtail = m; | ||||
sballoc(sb, m); | sballoc(sb, m); | ||||
n = m; | n = m; | ||||
▲ Show 20 Lines • Show All 351 Lines • Show Last 20 Lines |