| 7361 | } |
| 7362 | |
| 7363 | static void inline |
| 7364 | rack_peer_reneges(struct tcp_rack *rack, struct rack_sendmap *rsm, tcp_seq th_ack) |
| 7365 | { |
| 7366 | struct rack_sendmap *tmap; |
| 7367 | |
| 7368 | tmap = NULL; |
| 7369 | while (rsm && (rsm->r_flags & RACK_ACKED)) { |
| 7370 | /* Its no longer sacked, mark it so */ |
| 7371 | rack->r_ctl.rc_sacked -= (rsm->r_end - rsm->r_start); |
| 7372 | #ifdef INVARIANTS |
| 7373 | if (rsm->r_in_tmap) { |
| 7374 | panic("rack:%p rsm:%p flags:0x%x in tmap?", |
| 7375 | rack, rsm, rsm->r_flags); |
| 7376 | } |
| 7377 | #endif |
| 7378 | rsm->r_flags &= ~(RACK_ACKED|RACK_SACK_PASSED|RACK_WAS_SACKPASS); |
| 7379 | /* Rebuild it into our tmap */ |
| 7380 | if (tmap == NULL) { |
| 7381 | TAILQ_INSERT_HEAD(&rack->r_ctl.rc_tmap, rsm, r_tnext); |
| 7382 | tmap = rsm; |
| 7383 | } else { |
| 7384 | TAILQ_INSERT_AFTER(&rack->r_ctl.rc_tmap, tmap, rsm, r_tnext); |
| 7385 | tmap = rsm; |
| 7386 | } |
| 7387 | tmap->r_in_tmap = 1; |
| 7388 | rsm = RB_NEXT(rack_rb_tree_head, &rack->r_ctl.rc_mtree, rsm); |
| 7389 | } |
| 7390 | /* |
| 7391 | * Now lets possibly clear the sack filter so we start |
| 7392 | * recognizing sacks that cover this area. |
| 7393 | */ |
| 7394 | sack_filter_clear(&rack->r_ctl.rack_sf, th_ack); |
| 7395 | |
| 7396 | } |
| 7397 | |
| 7398 | static void |
| 7399 | rack_do_decay(struct tcp_rack *rack) |
no test coverage detected