|
Lines 68-73
Link Here
|
| 68 |
static void sbdrop_internal(struct sockbuf *sb, int len); |
68 |
static void sbdrop_internal(struct sockbuf *sb, int len); |
| 69 |
static void sbflush_internal(struct sockbuf *sb); |
69 |
static void sbflush_internal(struct sockbuf *sb); |
| 70 |
|
70 |
|
|
|
71 |
#ifdef INVARIANTS |
| 72 |
static int |
| 73 |
sb_cc_check(struct sockbuf *sb) |
| 74 |
{ |
| 75 |
struct mbuf *n = sb->sb_mb; |
| 76 |
int slen = 0; |
| 77 |
|
| 78 |
while (n) { |
| 79 |
slen = m_length(n, &n); |
| 80 |
n = n->m_nextpkt; |
| 81 |
} |
| 82 |
|
| 83 |
return (slen == sb->sb_cc ? 1 : 0); |
| 84 |
} |
| 85 |
#endif |
| 86 |
|
| 71 |
/* |
87 |
/* |
| 72 |
* Socantsendmore indicates that no more data will be sent on the socket; it |
88 |
* Socantsendmore indicates that no more data will be sent on the socket; it |
| 73 |
* would normally be applied to a socket when the user informs the system |
89 |
* would normally be applied to a socket when the user informs the system |
|
Lines 528-533
Link Here
|
| 528 |
|
544 |
|
| 529 |
SBLASTMBUFCHK(sb); |
545 |
SBLASTMBUFCHK(sb); |
| 530 |
|
546 |
|
|
|
547 |
KASSERT(sb_cc_check(sb), |
| 548 |
("%s: sb_cc != total mbuf length - before", __func__)); |
| 549 |
|
| 531 |
/* Remove all packet headers and mbuf tags to get a pure data chain. */ |
550 |
/* Remove all packet headers and mbuf tags to get a pure data chain. */ |
| 532 |
m_demote(m, 1); |
551 |
m_demote(m, 1); |
| 533 |
|
552 |
|
|
Lines 535-540
Link Here
|
| 535 |
|
554 |
|
| 536 |
sb->sb_lastrecord = sb->sb_mb; |
555 |
sb->sb_lastrecord = sb->sb_mb; |
| 537 |
SBLASTRECORDCHK(sb); |
556 |
SBLASTRECORDCHK(sb); |
|
|
557 |
|
| 558 |
KASSERT(sb_cc_check(sb), |
| 559 |
("%s: sb_cc != total mbuf length - after", __func__)); |
| 538 |
} |
560 |
} |
| 539 |
|
561 |
|
| 540 |
/* |
562 |
/* |
|
Lines 811-816
Link Here
|
| 811 |
sbflush_internal(struct sockbuf *sb) |
833 |
sbflush_internal(struct sockbuf *sb) |
| 812 |
{ |
834 |
{ |
| 813 |
|
835 |
|
|
|
836 |
KASSERT(sb_cc_check(sb), |
| 837 |
("%s: sb_cc != total mbuf length", __func__)); |
| 838 |
|
| 814 |
while (sb->sb_mbcnt) { |
839 |
while (sb->sb_mbcnt) { |
| 815 |
/* |
840 |
/* |
| 816 |
* Don't call sbdrop(sb, 0) if the leading mbuf is non-empty: |
841 |
* Don't call sbdrop(sb, 0) if the leading mbuf is non-empty: |
|
Lines 851-860
Link Here
|
| 851 |
struct mbuf *m; |
876 |
struct mbuf *m; |
| 852 |
struct mbuf *next; |
877 |
struct mbuf *next; |
| 853 |
|
878 |
|
| 854 |
next = (m = sb->sb_mb) ? m->m_nextpkt : 0; |
879 |
KASSERT(len <= sb->sb_cc, |
|
|
880 |
("%s: len > sb->sb_cc", __func__)); |
| 881 |
KASSERT(sb->sb_cc >= sb->sb_sndptroff, |
| 882 |
("%s: sb_sndptroff > sb_cc", __func__)); |
| 883 |
KASSERT(sb_cc_check(sb), |
| 884 |
("%s: sb_cc != total mbuf length - enter", __func__)); |
| 885 |
|
| 886 |
if (len > sb->sb_sndptroff) { |
| 887 |
sb->sb_sndptroff = 0; |
| 888 |
sb->sb_sndptr = NULL; |
| 889 |
} |
| 890 |
|
| 891 |
next = (m = sb->sb_mb) ? m->m_nextpkt : NULL; |
| 855 |
while (len > 0) { |
892 |
while (len > 0) { |
| 856 |
if (m == 0) { |
893 |
if (m == NULL) { |
| 857 |
if (next == 0) |
894 |
if (next == NULL) |
| 858 |
panic("sbdrop"); |
895 |
panic("sbdrop"); |
| 859 |
m = next; |
896 |
m = next; |
| 860 |
next = m->m_nextpkt; |
897 |
next = m->m_nextpkt; |
|
Lines 874-880
Link Here
|
| 874 |
sbfree(sb, m); |
911 |
sbfree(sb, m); |
| 875 |
m = m_free(m); |
912 |
m = m_free(m); |
| 876 |
} |
913 |
} |
| 877 |
while (m && m->m_len == 0) { |
914 |
while (m != NULL && m->m_len == 0) { |
| 878 |
sbfree(sb, m); |
915 |
sbfree(sb, m); |
| 879 |
m = m_free(m); |
916 |
m = m_free(m); |
| 880 |
} |
917 |
} |
|
Lines 891-899
Link Here
|
| 891 |
if (m == NULL) { |
928 |
if (m == NULL) { |
| 892 |
sb->sb_mbtail = NULL; |
929 |
sb->sb_mbtail = NULL; |
| 893 |
sb->sb_lastrecord = NULL; |
930 |
sb->sb_lastrecord = NULL; |
|
|
931 |
sb->sb_sndptr = NULL; |
| 894 |
} else if (m->m_nextpkt == NULL) { |
932 |
} else if (m->m_nextpkt == NULL) { |
| 895 |
sb->sb_lastrecord = m; |
933 |
sb->sb_lastrecord = m; |
| 896 |
} |
934 |
} |
|
|
935 |
|
| 936 |
KASSERT(sb_cc_check(sb), |
| 937 |
("%s: sb_cc != total mbuf length - exit", __func__)); |
| 897 |
} |
938 |
} |
| 898 |
|
939 |
|
| 899 |
/* |
940 |
/* |
|
Lines 922-934
Link Here
|
| 922 |
* avoid traversal of the entire socket buffer for larger offsets. |
963 |
* avoid traversal of the entire socket buffer for larger offsets. |
| 923 |
*/ |
964 |
*/ |
| 924 |
struct mbuf * |
965 |
struct mbuf * |
| 925 |
sbsndptr(struct sockbuf *sb, u_int off, u_int len, u_int *moff) |
966 |
sbsndptr(struct sockbuf *sb, int off, int len, int *moff) |
| 926 |
{ |
967 |
{ |
| 927 |
struct mbuf *m, *ret; |
968 |
struct mbuf *m, *ret; |
| 928 |
|
969 |
|
| 929 |
KASSERT(sb->sb_mb != NULL, ("%s: sb_mb is NULL", __func__)); |
970 |
KASSERT(sb->sb_mb != NULL, ("%s: sb_mb is NULL", __func__)); |
| 930 |
KASSERT(off + len <= sb->sb_cc, ("%s: beyond sb", __func__)); |
971 |
KASSERT(off + len <= sb->sb_cc, ("%s: beyond sb", __func__)); |
| 931 |
KASSERT(sb->sb_sndptroff <= sb->sb_cc, ("%s: sndptroff broken", __func__)); |
972 |
KASSERT(sb->sb_sndptroff <= sb->sb_cc, ("%s: sndptroff broken", __func__)); |
|
|
973 |
KASSERT(sb_cc_check(sb), |
| 974 |
("%s: sb_cc != total mbuf length", __func__)); |
| 932 |
|
975 |
|
| 933 |
/* |
976 |
/* |
| 934 |
* Is off below stored offset? Happens on retransmits. |
977 |
* Is off below stored offset? Happens on retransmits. |