* Cut data from (the front of) a sockbuf. */
| 1463 | * Cut data from (the front of) a sockbuf. |
| 1464 | */ |
| 1465 | static struct mbuf * |
| 1466 | sbcut_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. |
no test coverage detected