Lines Matching defs:hole
230 struct sackhole *hole;
238 hole = (struct sackhole *)zalloc_noblock(sack_hole_zone);
239 if (hole == NULL)
242 hole->start = start;
243 hole->end = end;
244 hole->rxmit = start;
249 return hole;
256 tcp_sackhole_free(struct tcpcb *tp, struct sackhole *hole)
258 zfree(sack_hole_zone, hole);
265 * Insert new SACK hole into scoreboard.
271 struct sackhole *hole;
273 /* Allocate a new SACK hole. */
274 hole = tcp_sackhole_alloc(tp, start, end);
275 if (hole == NULL)
278 /* Insert the new SACK hole into scoreboard */
280 TAILQ_INSERT_AFTER(&tp->snd_holes, after, hole, scblink);
282 TAILQ_INSERT_TAIL(&tp->snd_holes, hole, scblink);
286 tp->sackhint.nexthole = hole;
288 return hole;
292 * Remove SACK hole from scoreboard.
295 tcp_sackhole_remove(struct tcpcb *tp, struct sackhole *hole)
298 if (tp->sackhint.nexthole == hole)
299 tp->sackhint.nexthole = TAILQ_NEXT(hole, scblink);
301 /* Remove this SACK hole. */
302 TAILQ_REMOVE(&tp->snd_holes, hole, scblink);
304 /* Free this SACK hole. */
305 tcp_sackhole_free(tp, hole);
387 * Append new SACK hole at the tail.
390 * way of hole splitting in the while-loop below.
399 * We failed to add a new hole based on the current
416 /* We must have at least one SACK hole in scoreboard */
417 cur = TAILQ_LAST(&tp->snd_holes, sackhole_head); /* Last SACK hole */
425 * SACKs data beyond the current hole.
433 * SACKs data before the current hole.
434 * Go to the previous hole.
441 /* Data acks at least the beginning of hole */
443 /* Acks entire hole, so delete hole */
449 * hole too, so continue onto the next hole.
453 /* Move start of hole forward */
458 /* Data acks at least the end of hole */
460 /* Move end of hole backward */
465 * ACKs some data in middle of a hole; need to
466 * split current hole
486 * we're done with the sack block or the sack hole.
553 if (SEQ_LT(p->rxmit, tp->snd_una)) {/* old SACK hole */
565 * Returns the next hole to retransmit and the number of retransmitted bytes
566 * from the scoreboard. We store both the next hole and the number of
571 * For the loop to traverse more than 1 link before finding the next hole to
577 * But that can't happen, (start == end) means that all the data in that hole
578 * has been sacked, in which case, the hole would have been removed from the
584 struct sackhole *hole = NULL, *dbg_hole = NULL;
589 hole = tp->sackhint.nexthole;
590 if (hole == NULL || SEQ_LT(hole->rxmit, hole->end))
592 while ((hole = TAILQ_NEXT(hole, scblink)) != NULL) {
593 if (SEQ_LT(hole->rxmit, hole->end)) {
594 tp->sackhint.nexthole = hole;
599 if (dbg_hole != hole) {
600 printf("%s: Computed sack hole not the same as cached value\n", __func__);
601 hole = dbg_hole;
609 return (hole);
628 * i) snd_nxt lies between end of one hole and beginning of another
629 * ii) snd_nxt lies between end of last hole and snd_fack