MCPcopy Create free account
hub / github.com/F-Stack/f-stack / sbcut_internal

Function sbcut_internal

freebsd/kern/uipc_sockbuf.c:1465–1576  ·  view source on GitHub ↗

* Cut data from (the front of) a sockbuf. */

Source from the content-addressed store, hash-verified

1463 * Cut data from (the front of) a sockbuf.
1464 */
1465static struct mbuf *
1466sbcut_internal(struct sockbuf *sb, int len)
1467{
1468 struct mbuf *m, *next, *mfree;
1469 bool is_tls;
1470
1471 KASSERT(len >= 0, ("%s: len is %d but it is supposed to be >= 0",
1472 __func__, len));
1473 KASSERT(len <= sb->sb_ccc, ("%s: len: %d is > ccc: %u",
1474 __func__, len, sb->sb_ccc));
1475
1476 next = (m = sb->sb_mb) ? m->m_nextpkt : 0;
1477 is_tls = false;
1478 mfree = NULL;
1479
1480 while (len > 0) {
1481 if (m == NULL) {
1482#ifdef KERN_TLS
1483 if (next == NULL && !is_tls) {
1484 if (sb->sb_tlsdcc != 0) {
1485 MPASS(len >= sb->sb_tlsdcc);
1486 len -= sb->sb_tlsdcc;
1487 sb->sb_ccc -= sb->sb_tlsdcc;
1488 sb->sb_tlsdcc = 0;
1489 if (len == 0)
1490 break;
1491 }
1492 next = sb->sb_mtls;
1493 is_tls = true;
1494 }
1495#endif
1496 KASSERT(next, ("%s: no next, len %d", __func__, len));
1497 m = next;
1498 next = m->m_nextpkt;
1499 }
1500 if (m->m_len > len) {
1501 KASSERT(!(m->m_flags & M_NOTAVAIL),
1502 ("%s: m %p M_NOTAVAIL", __func__, m));
1503 m->m_len -= len;
1504 m->m_data += len;
1505 sb->sb_ccc -= len;
1506 sb->sb_acc -= len;
1507 if (sb->sb_sndptroff != 0)
1508 sb->sb_sndptroff -= len;
1509 if (m->m_type != MT_DATA && m->m_type != MT_OOBDATA)
1510 sb->sb_ctl -= len;
1511 break;
1512 }
1513 len -= m->m_len;
1514#ifdef KERN_TLS
1515 if (is_tls)
1516 sbfree_ktls_rx(sb, m);
1517 else
1518#endif
1519 sbfree(sb, m);
1520 /*
1521 * Do not put M_NOTREADY buffers to the free list, they
1522 * are referenced from outside.

Callers 4

sbflush_internalFunction · 0.85
sbdrop_lockedFunction · 0.85
sbcut_lockedFunction · 0.85
sbdropFunction · 0.85

Calls 2

sbfree_ktls_rxFunction · 0.85
sbfreeFunction · 0.85

Tested by

no test coverage detected