Lines Matching refs:rb
29 loff2boff(tcprb_t *rb, loff_t loff) in loff2boff() argument
31 int woff = loff - rb->head; /* window offset */ in loff2boff()
32 if (woff < 0 || woff > rb->len) in loff2boff()
35 return (boff_t)((loff + rb->corr) % rb->len); in loff2boff()
51 frags_insert(tcprb_t *rb, tcpfrag_t *f) in frags_insert() argument
55 TAILQ_FOREACH(walk, &rb->frags, link) in frags_insert()
62 TAILQ_INSERT_TAIL(&rb->frags, f, link); in frags_insert()
82 buf_first(tcprb_t *rb) in buf_first() argument
86 if ((tmp = TAILQ_FIRST(&rb->bufsegs))) in buf_first()
89 if ((rb->lbufsegs == 0) || ((tmp = bufseg_new(rb->mp)) == NULL)) in buf_first()
93 TAILQ_INSERT_TAIL(&rb->bufsegs, tmp, link); in buf_first()
99 buf_next(tcprb_t *rb, tcpbufseg_t *buf) in buf_next() argument
106 if ((rb->lbufsegs <= buf->id + 1) || ((tmp = bufseg_new(rb->mp)) == NULL)) in buf_next()
110 TAILQ_INSERT_TAIL(&rb->bufsegs, tmp, link); in buf_next()
116 buf_getbuf(tcprb_t *rb, boff_t off) in buf_getbuf() argument
123 int max = rb->len / UNITBUFSIZE; in buf_getbuf()
126 buf = TAILQ_FIRST(&rb->bufsegs); in buf_getbuf()
130 buf = TAILQ_LAST(&rb->bufsegs, blist); in buf_getbuf()
135 buf = buf_first(rb); in buf_getbuf()
137 buf = buf_next(rb, buf); in buf_getbuf()
150 buf_try_resize(tcprb_t *rb, int len, loff_t data, int datalen) in buf_try_resize() argument
156 assert(rb); in buf_try_resize()
157 assert(rb->len); in buf_try_resize()
160 int segdiff = (len - rb->len) / UNITBUFSIZE; in buf_try_resize()
164 boff_t head = loff2boff(rb, data); in buf_try_resize()
165 boff_t tail = (data + datalen - 1) % rb->len; in buf_try_resize()
167 tcpbufseg_t *headseg = buf_getbuf(rb, head); in buf_try_resize()
168 tcpbufseg_t *tailseg = buf_getbuf(rb, tail); in buf_try_resize()
172 rb->len = len; in buf_try_resize()
173 boff_t new_head = loff2boff(rb, data); in buf_try_resize()
174 rb->corr = (rb->corr + (segdiff * UNITBUFSIZE) - (new_head - head)) in buf_try_resize()
175 % rb->len; in buf_try_resize()
176 if (rb->corr < 0) in buf_try_resize()
177 rb->corr += rb->len; in buf_try_resize()
180 tcpbufseg_t *seg = bufseg_new(rb->mp); in buf_try_resize()
185 TAILQ_INSERT_AFTER(&rb->bufsegs, tailseg, seg, link); in buf_try_resize()
190 tcpbufseg_t *seg = bufseg_new(rb->mp); in buf_try_resize()
192 TAILQ_INSERT_AFTER(&rb->bufsegs, tailseg, seg, link); in buf_try_resize()
199 int shrinkable = (rb->len - datalen) / UNITBUFSIZE; in buf_try_resize()
202 rb->len -= (tobeshrank * UNITBUFSIZE); in buf_try_resize()
203 if (rb->len) { in buf_try_resize()
204 boff_t new_head = loff2boff(rb, data); in buf_try_resize()
205 rb->corr = (rb->corr - (tobeshrank * UNITBUFSIZE) - in buf_try_resize()
206 (new_head - head)) % rb->len; in buf_try_resize()
207 if (rb->corr < 0) in buf_try_resize()
208 rb->corr += rb->len; in buf_try_resize()
213 loff_t eh = data + rb->len + in buf_try_resize()
214 (UNITBUFSIZE - (loff2boff(rb, data) % UNITBUFSIZE)); in buf_try_resize()
218 struct _tcpfrag_t *f = TAILQ_FIRST(&rb->frags), *new; in buf_try_resize()
220 TAILQ_FOREACH(f, &rb->frags, link) { in buf_try_resize()
228 TAILQ_INSERT_AFTER(&rb->frags, f, new, link); in buf_try_resize()
242 TAILQ_INSERT_AFTER(&rb->frags, f, new, link); in buf_try_resize()
250 int skip = rb->len / UNITBUFSIZE; in buf_try_resize()
253 TAILQ_REMOVE(&rb->bufsegs, seg, link); in buf_try_resize()
254 bufseg_del(rb->mp, seg); in buf_try_resize()
256 seg = TAILQ_LOOP_NEXT(&rb->bufsegs, blist, tailseg, link); in buf_try_resize()
262 (seg = TAILQ_LOOP_NEXT(&rb->bufsegs, blist, tailseg, link)) in buf_try_resize()
264 TAILQ_REMOVE(&rb->bufsegs, seg, link); in buf_try_resize()
265 bufseg_del(rb->mp, seg); in buf_try_resize()
274 TAILQ_REMOVE(&rb->bufsegs, headseg, link); in buf_try_resize()
275 bufseg_del(rb->mp, headseg); in buf_try_resize()
295 buf_##rw(tcprb_t *rb, uint8_t *buf, int len, loff_t off) \
299 assert(rb); \
301 boff_t from = loff2boff(rb, off); \
302 boff_t to = loff2boff(rb, off + len); \
303 tcpbufseg_t *bufseg_from = buf_getbuf(rb, from); \
304 tcpbufseg_t *bufseg_to = buf_getbuf(rb, to); \
309 for (bufseg = buf_next(rb, bufseg_from); \
311 bufseg = buf_next(rb, bufseg)) { \
315 for (bufseg = buf_first(rb); \
317 bufseg = buf_next(rb, bufseg)) { \
327 for (bufseg = buf_next(rb, bufseg_from); \
329 bufseg = buf_next(rb, bufseg)) { \
344 seq2loff(tcprb_t *rb, uint32_t seq, uint32_t isn) in FUNCDEF_BUF_RW()
348 while (off < rb->head) in FUNCDEF_BUF_RW()
357 tcprb_t *rb; in tcprb_new() local
362 if (!(rb = calloc(sizeof(tcprb_t), 1))) in tcprb_new()
365 TAILQ_INIT(&rb->bufsegs); in tcprb_new()
366 rb->lbufsegs = ((len - 1) / UNITBUFSIZE) + 1; in tcprb_new()
370 for (i = 0; i < rb->lbufsegs; i++) { in tcprb_new()
373 TAILQ_FOREACH(bufseg, &rb->bufsegs, link) in tcprb_new()
375 FREE(rb); in tcprb_new()
378 TAILQ_INSERT_TAIL(&rb->bufsegs, bufseg, link); in tcprb_new()
382 rb->buf_mgmt = buf_mgmt; in tcprb_new()
383 rb->mp = mp; in tcprb_new()
384 rb->len = rb->metalen = len; in tcprb_new()
385 TAILQ_INIT(&rb->frags); in tcprb_new()
387 return rb; in tcprb_new()
391 tcprb_del(tcprb_t *rb) in tcprb_del() argument
396 for (bwalk = TAILQ_FIRST(&rb->bufsegs); bwalk; bwalk = bnext) { in tcprb_del()
398 bufseg_del(rb->mp, bwalk); in tcprb_del()
401 for (fwalk = TAILQ_FIRST(&rb->frags); fwalk; fwalk = fnext) { in tcprb_del()
406 FREE(rb); in tcprb_del()
412 tcprb_setpile(tcprb_t *rb, loff_t new) in tcprb_setpile() argument
414 if (!rb || new > (rb->head + rb->len) || new < rb->head) in tcprb_setpile()
417 tcpfrag_t *cf = TAILQ_FIRST(&rb->frags); /* contiguous buffer seg. */ in tcprb_setpile()
419 if (!cf || (cf->head != rb->head)) { in tcprb_setpile()
421 assert(rb->pile == rb->head); in tcprb_setpile()
428 rb->pile = new; in tcprb_setpile()
434 tcprb_cflen(tcprb_t *rb) in tcprb_cflen() argument
436 tcpfrag_t *cf = TAILQ_FIRST(&rb->frags); /* contiguous buffer seg. */ in tcprb_cflen()
438 if (!cf || (cf->head != rb->head)) in tcprb_cflen()
442 int cflen = cf->tail - rb->pile; /* length of cf */ in tcprb_cflen()
450 tcprb_ffhead(tcprb_t *rb, int len) in tcprb_ffhead() argument
452 if (!rb || len < 0) in tcprb_ffhead()
457 tcpfrag_t *cf = TAILQ_FIRST(&rb->frags); /* contiguous buffer seg. */ in tcprb_ffhead()
459 if (!cf || (cf->head != rb->head)) in tcprb_ffhead()
467 ff = MIN(ff, rb->pile - rb->head); /* head cannot go further than pile */ in tcprb_ffhead()
471 TAILQ_REMOVE(&rb->frags, cf, link); in tcprb_ffhead()
477 rb->head += ff; in tcprb_ffhead()
484 tcprb_fflen(tcprb_t *rb, uint8_t *buf, int len, loff_t off) in tcprb_fflen() argument
486 if (!rb || !buf || len < 0 || in tcprb_fflen()
487 off < rb->head || off >= rb->pile + rb->metalen) in tcprb_fflen()
490 else if (len == 0 || off + len < rb->pile) in tcprb_fflen()
493 int ff = (off + len) - (rb->head + MIN(rb->len, rb->metalen)); in tcprb_fflen()
497 tcpfrag_t *cf = TAILQ_FIRST(&rb->frags); /* contiguous buffer seg. */ in tcprb_fflen()
499 if (!cf || (cf->head != rb->head)) in tcprb_fflen()
507 fflen = MIN(ff, rb->pile - rb->head); /* head cannot go further than pile */ in tcprb_fflen()
513 tcprb_get_datalen(tcprb_t *rb) in tcprb_get_datalen() argument
515 tcpfrag_t *lastfrag = TAILQ_LAST(&rb->frags, flist); in tcprb_get_datalen()
516 return lastfrag ? (int)(lastfrag->tail - rb->head) : 0; in tcprb_get_datalen()
520 tcprb_resize_meta(tcprb_t *rb, int len) in tcprb_resize_meta() argument
527 rb->metalen = 0; in tcprb_resize_meta()
529 for (fwalk = TAILQ_FIRST(&rb->frags); fwalk; fwalk = fnext) { in tcprb_resize_meta()
531 TAILQ_REMOVE(&rb->frags, fwalk, link); in tcprb_resize_meta()
539 if ((diff = len - rb->metalen) > 0) { in tcprb_resize_meta()
540 rb->metalen = len; in tcprb_resize_meta()
542 ff = diff - (rb->len - tcprb_get_datalen(rb)); in tcprb_resize_meta()
543 tcprb_ffhead(rb, ff); in tcprb_resize_meta()
544 datalen = tcprb_get_datalen(rb); in tcprb_resize_meta()
545 rb->metalen = MAX(datalen, len); in tcprb_resize_meta()
548 return rb->metalen; in tcprb_resize_meta()
553 tcprb_setpolicy(tcprb_t *rb, uint8_t policy) in tcprb_setpolicy() argument
558 rb->overlap = policy; in tcprb_setpolicy()
563 tcprb_resize(tcprb_t *rb, int len) in tcprb_resize() argument
571 rb->metalen = 0; in tcprb_resize()
572 rb->len = 0; in tcprb_resize()
574 for (bwalk = TAILQ_FIRST(&rb->bufsegs); bwalk; bwalk = bnext) { in tcprb_resize()
576 TAILQ_REMOVE(&rb->bufsegs, bwalk, link); in tcprb_resize()
577 bufseg_del(rb->mp, bwalk); in tcprb_resize()
580 for (fwalk = TAILQ_FIRST(&rb->frags); fwalk; fwalk = fnext) { in tcprb_resize()
582 TAILQ_REMOVE(&rb->frags, fwalk, link); in tcprb_resize()
592 else if (len == rb->len) in tcprb_resize()
595 if ((diff = rb->len - len) > 0 && /* shrinking */ in tcprb_resize()
596 (ff = diff - (rb->len - tcprb_get_datalen(rb)))) in tcprb_resize()
597 tcprb_ffhead(rb, ff); in tcprb_resize()
599 return buf_try_resize(rb, len, rb->head, in tcprb_resize()
600 tcprb_get_datalen(rb)); in tcprb_resize()
605 tcprb_ppeek(tcprb_t *rb, uint8_t *buf, int len, loff_t off) in tcprb_ppeek() argument
609 if (!rb || rb->buf_mgmt != BUFMGMT_FULL || !buf || len < 0) in tcprb_ppeek()
614 TAILQ_FOREACH(f, &rb->frags, link) in tcprb_ppeek()
626 buf_read(rb, buf, plen, off); in tcprb_ppeek()
632 tcprb_pwrite(tcprb_t *rb, uint8_t *buf, int len, loff_t off) in tcprb_pwrite() argument
642 if (!rb || !buf || len < 0 || in tcprb_pwrite()
643 off < rb->head || off >= rb->pile + rb->metalen) in tcprb_pwrite()
647 else if (off + len < rb->pile) /* already written */ in tcprb_pwrite()
652 if ((ff = (off + len) - (rb->head + MIN(rb->len, rb->metalen))) > 0) in tcprb_pwrite()
653 len -= ff - tcprb_ffhead(rb, ff); in tcprb_pwrite()
654 if (rb->metalen > rb->len) in tcprb_pwrite()
655 eflen = MIN(olen - len, rb->metalen - rb->len); in tcprb_pwrite()
660 struct _tcpfrag_t *f = TAILQ_FIRST(&rb->frags), *fnext; in tcprb_pwrite()
694 TAILQ_REMOVE(&rb->frags, ef, link); in tcprb_pwrite()
709 TAILQ_REMOVE(&rb->frags, fnext, link); in tcprb_pwrite()
726 TAILQ_REMOVE(&rb->frags, ef, link); in tcprb_pwrite()
754 frags_insert(rb, new); in tcprb_pwrite()
758 if ((rb->overlap == MOS_OVERLAP_POLICY_LAST || !skip) in tcprb_pwrite()
759 && rb->buf_mgmt) in tcprb_pwrite()
760 buf_write(rb, &buf[uoff], wrlen, off + uoff); in tcprb_pwrite()
766 assert(rb->metalen > rb->len); in tcprb_pwrite()
777 frags_insert(rb, new); in tcprb_pwrite()
802 tcprb_printfrags(struct _tcprb_t *rb) in tcprb_printfrags() argument
807 TAILQ_FOREACH(walk, &rb->frags, link) { in tcprb_printfrags()
816 boff_t j = loff2boff(rb, i); in tcprb_printfrags()
817 bufseg = buf_getbuf(rb, j); in tcprb_printfrags()
845 tcprb_printbufsegs(tcprb_t *rb) in tcprb_printbufsegs() argument
850 TAILQ_FOREACH(walk, &rb->bufsegs, link) { in tcprb_printbufsegs()
882 tcprb_printrb(struct _tcprb_t *rb) in tcprb_printrb() argument
886 rb->len, rb->metalen, rb->head, rb->pile, rb->head + rb->metalen); in tcprb_printrb()
887 tcprb_printfrags(rb); in tcprb_printrb()
888 tcprb_printbufsegs(rb); in tcprb_printrb()
900 tcprb_t *rb; in tcp_rb_overlapchk() local
903 && (rb = recvside_stream->rcvvar->rcvbuf) != NULL) { in tcp_rb_overlapchk()
905 loff_t off = seq2loff(rb, pctx->p.seq, recvside_stream->rcvvar->irs + 1); in tcp_rb_overlapchk()
906 TAILQ_FOREACH(f, &rb->frags, link) in tcp_rb_overlapchk()