Lines Matching refs:cb
228 * args: cb - sender congestion control block
233 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
237 if (cb->state == TFRC_SSTATE_TERM) {
242 if (callout_pending(&cb->ch_stimer)) {
250 /*inp = cb->pcb->d_inpcb;*/
254 callout_stop(&cb->ch_stimer);
256 dccp_output(cb->pcb, 1);
258 tfrc_send_packet_sent(cb, 0, -1);
266 * args: cb - sender congestion control block
271 tfrc_set_send_timer(struct tfrc_send_ccb * cb, struct timeval t_now)
278 t_temp = cb->t_nom;
292 callout_reset(&cb->ch_stimer, t_ticks, tfrc_time_send, cb);
304 * args: cb - sender congestion control block
309 tfrc_updateX(struct tfrc_send_ccb * cb, struct timeval t_now)
315 if (fixpoint_cmp(&cb->p, &tfrc_smallest_p) >= 0) {
316 cb->x_calc = *tfrc_calcX(cb->s, cb->rtt, &cb->p);
317 temp = cb->x_recv;
319 if (fixpoint_cmp(&cb->x_calc, &temp) < 0)
320 temp = cb->x_calc;
321 cb->x = temp;
322 temp2.num = cb->s;
325 cb->x = temp2;
326 normalize(&cb->x.num, &cb->x.denom);
328 PRINTFLOAT(&cb->x);
331 t_rtt.tv_usec = cb->rtt % 1000000;
332 t_rtt.tv_sec = cb->rtt / 1000000;
334 timersub(&t_temp, &cb->t_ld, &t_temp);
336 temp = cb->x_recv;
338 temp2 = cb->x;
342 cb->x.num = cb->s;
343 cb->x.denom = 1;
344 cb->x.num *= 1000000;
345 cb->x.denom *= cb->rtt;
346 if (fixpoint_cmp(&temp, &cb->x) > 0)
347 cb->x = temp;
348 normalize(&cb->x.num, &cb->x.denom);
349 cb->t_ld = t_now;
351 PRINTFLOAT(&cb->x);
360 * args: cb - sender congestion control block
369 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
371 mutex_enter(&(cb->mutex));
373 if (cb->state == TFRC_SSTATE_TERM) {
377 if (callout_pending(&(cb)->ch_nftimer)) {
381 switch (cb->state) {
385 cb->x.denom *= 2;
386 v.num = cb->s;
388 if (fixpoint_cmp(&cb->x, &v) < 0)
389 cb->x = v;
392 PRINTFLOAT(&cb->x);
399 w.num = cb->s;
402 fixpoint_div(&v, &v, &(cb->x));
415 v.num = cb->s;
417 v.denom = cb->rtt;
420 if (!cb->idle || fixpoint_cmp(&cb->x_recv, &v) >= 0) {
430 if (fixpoint_cmp(&cb->p, &v) < 0 && cb->x_calc.num == 0)
434 w = cb->x_recv;
436 if (fixpoint_cmp(&cb->p, &v) || fixpoint_cmp(&cb->x_calc, &w) > 0) {
437 cb->x_recv.denom *= 2;
438 w.num = cb->s;
440 if (fixpoint_cmp(&cb->x_recv, &w) < 0)
441 cb->x_recv = w;
443 cb->x_recv.denom *= 4;
444 normalize(&cb->x_recv.num, &cb->x_recv.denom);
448 tfrc_updateX(cb, t_now);
451 v.num = cb->s;
453 fixpoint_div(&v, &v, &cb->x);
456 if (next_time_out < cb->t_rto)
457 next_time_out = cb->t_rto;
472 callout_reset(&cb->ch_nftimer, next_time_out, tfrc_time_no_feedback, cb);
475 cb->idle = 1;
477 mutex_exit(&(cb->mutex));
487 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
494 mutex_destroy(&(cb->mutex));
496 free(cb, M_PCB);
561 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
571 mutex_enter(&(cb->mutex));
573 cb->state = TFRC_SSTATE_TERM;
575 callout_stop(&cb->ch_stimer);
576 callout_stop(&cb->ch_nftimer);
579 elm = TAILQ_FIRST(&(cb->hist));
585 TAILQ_INIT(&(cb->hist));
587 mutex_exit(&(cb->mutex));
590 callout_reset(&cb->ch_stimer, TFRC_SEND_WAIT_TERM * hz, tfrc_send_term, cb);
606 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
612 if (datasize == 0 || cb->state == TFRC_SSTATE_TERM) {
614 } else if (cb->state == TFRC_SSTATE_TERM) {
619 mutex_enter(&(cb->mutex));
622 new_packet = TAILQ_FIRST(&(cb->hist));
634 TAILQ_INSERT_HEAD(&(cb->hist), new_packet, linfo);
636 switch (cb->state) {
639 microtime(&(cb->t_nom)); /* set nominal send time for initial packet */
640 t_now = cb->t_nom;
644 callout_reset(&cb->ch_nftimer, TFRC_INITIAL_TIMEOUT * hz, tfrc_time_no_feedback, cb);
646 cb->t_last_win_count = t_now;
651 CALCNEWTIPI(cb);
652 timeradd(&cb->t_nom, &cb->t_ipi, &cb->t_nom);
654 CALCNEWDELTA(cb);
655 tfrc_set_send_timer(cb, t_now); /* if so schedule sendtimer */
656 cb->state = TFRC_SSTATE_NO_FBACK;
661 if (!callout_pending(&cb->ch_stimer)) {
665 timeradd(&t_temp, &cb->delta, &t_temp);
667 if ((timercmp(&(t_temp), &(cb->t_nom), >))) {
671 if (cb->t_last_win_count.tv_sec == -1)
675 timersub(&t_temp, &(cb->t_last_win_count), &t_temp);
678 if (cb->state == TFRC_SSTATE_NO_FBACK) {
683 if (cb->rtt)
685 / cb->rtt / TFRC_WIN_COUNT_PER_RTT;
689 uw_win_count += cb->last_win_count;
705 cb->pcb->ccval = win_count;
710 mutex_exit(&(cb->mutex));
723 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
729 if (cb->state == TFRC_SSTATE_TERM) {
733 mutex_enter(&(cb->mutex));
739 packet = TAILQ_FIRST(&(cb->hist));
745 packet->seq = cb->pcb->seq_snd;
747 if (packet->win_count != cb->last_win_count) {
748 cb->t_last_win_count = t_now;
749 cb->last_win_count = packet->win_count;
753 cb->idle = 0;
757 if (callout_pending(&cb->ch_stimer)) {
761 switch (cb->state) {
777 CALCNEWTIPI(cb);
778 timeradd(&cb->t_nom, &cb->t_ipi, &cb->t_nom);
780 CALCNEWDELTA(cb);
787 timeradd(&t_temp, &cb->delta, &t_temp);
788 while ((timercmp(&(t_temp), &(cb->t_nom), >))) {
790 CALCNEWTIPI(cb);
791 timeradd(&cb->t_nom, &cb->t_ipi, &cb->t_nom);
794 CALCNEWDELTA(cb);
798 timeradd(&t_temp, &cb->delta, &t_temp);
800 tfrc_set_send_timer(cb, t_now);
804 timeradd(&t_temp, &cb->delta, &t_temp);
807 if (!(timercmp(&(t_temp), &(cb->t_nom), >))) {
808 tfrc_set_send_timer(cb, t_now); /* if so schedule sendtimer */
818 mutex_exit(&(cb->mutex));
838 struct tfrc_send_ccb *cb = (struct tfrc_send_ccb *) ccb;
844 if (cb->state == TFRC_SSTATE_TERM) {
849 if (!(cb->pcb->type_rcv == DCCP_TYPE_ACK || cb->pcb->type_rcv == DCCP_TYPE_DATAACK))
886 TFRC_DEBUG((LOG_INFO, "TFRC - Received options on ack %llu: pinv=%u, t_elapsed=%u, x_recv=%u ! (tfrc_send_packet_recv)\n", cb->pcb->ack_rcv, pinv, t_elapsed, x_recv));
888 TFRC_DEBUG((LOG_INFO, "TFRC - Received options on ack %llu: pinv=%u, t_elapsed=%u, x_recv=%u ! (tfrc_send_packet_recv)\n", cb->pcb->ack_rcv, pinv, t_elapsed_l, x_recv));
890 mutex_enter(&(cb->mutex));
892 switch (cb->state) {
899 elm = TAILQ_FIRST(&(cb->hist));
901 if (elm->seq == cb->pcb->ack_rcv)
908 "TFRC - Packet does not exist in history (seq=%llu)! (tfrc_send_packet_recv)", cb->pcb->ack_rcv));
922 if (cb->state == TFRC_SSTATE_NO_FBACK) {
923 cb->state = TFRC_SSTATE_FBACK;
924 cb->rtt = r_sample;
926 cb->rtt = (u_int32_t) (TFRC_RTT_FILTER_CONST * cb->rtt +
930 TFRC_DEBUG((LOG_INFO, "TFRC - New RTT estimate %u (tfrc_send_packet_recv)\n", cb->rtt));
933 cb->t_rto = 4 * cb->rtt;
939 fixpoint_div(&(cb)->x_recv, &x, &y);
943 cb->p.num = cb->p.denom = 0;
945 cb->p.num = 1.0;
946 cb->p.denom = pinv;
947 if (fixpoint_cmp(&cb->p, &tfrc_smallest_p) <= 0) {
948 cb->p.num = tfrc_smallest_p.num;
949 cb->p.denom = tfrc_smallest_p.denom;
955 if (!callout_pending(&cb->ch_nftimer)) {
956 callout_stop(&cb->ch_nftimer);
960 tfrc_updateX(cb, t_now);
963 timersub(&cb->t_nom, &cb->t_ipi, &cb->t_nom);
966 CALCNEWTIPI(cb);
967 timeradd(&cb->t_nom, &cb->t_ipi, &cb->t_nom);
969 CALCNEWDELTA(cb);
971 if (callout_pending(&cb->ch_stimer)) {
972 callout_stop(&cb->ch_stimer);
976 dccp_output(cb->pcb, 1);
977 tfrc_send_packet_sent(cb, 0, -1); /* make sure we schedule next send time */
986 TAILQ_REMOVE(&(cb->hist), elm2, linfo);
992 /* next_time_out = (u_int32_t) (2 * cb->s * 1000000 / cb->x); */
996 y.num = cb->s;
999 fixpoint_div(&x, &x, &(cb->x));
1004 if (next_time_out < cb->t_rto)
1005 next_time_out = cb->t_rto;
1013 callout_reset(&cb->ch_nftimer, next_time_out, tfrc_time_no_feedback, cb);
1016 cb->idle = 1;
1023 mutex_exit(&(cb->mutex));
1040 * args: cb - ccb of receiver
1046 #define TFRC_RECV_FINDDATAPACKET(cb,elm,num) \
1048 elm = TAILQ_FIRST(&((cb)->hist)); \
1059 * args: cb - ccb of receiver
1064 #define TFRC_RECV_NEXTDATAPACKET(cb,elm) \
1076 * args: cb - ccb of receiver
1081 tfrc_calclmean(struct tfrc_recv_ccb * cb)
1090 elm = TAILQ_FIRST(&(cb->li_hist));
1111 elm = TAILQ_FIRST(&(cb->li_hist));
1163 * args: cb - ccb for receiver
1167 tfrc_recv_send_feedback(struct tfrc_recv_ccb * cb)
1178 if (fixpoint_cmp(&cb->p, &x) < 0)
1179 /* if (cb->p < 0.00000000025) -> 1/p > 4 000 000 000 */
1182 /* pinv = (u_int32_t) (1.0 / cb->p); */
1185 fixpoint_div(&x, &x, &(cb)->p);
1189 switch (cb->state) {
1196 timersub(&t_temp, &cb->t_last_feedback, &t_temp);
1198 x_recv = (u_int32_t) (cb->bytes_recv * 8 * 1000000) / (t_temp.tv_sec * 1000000 + t_temp.tv_usec);
1208 TFRC_RECV_FINDDATAPACKET(cb, elm, num);
1224 if (dccp_add_option(cb->pcb, TFRC_OPT_LOSS_RATE, (char *) &pinv, 4)
1225 || dccp_add_option(cb->pcb, DCCP_OPT_ELAPSEDTIME, (char *) &t_elapsed, 4)
1226 || dccp_add_option(cb->pcb, TFRC_OPT_RECEIVE_RATE, (char *) &x_recv, 4)) {
1232 cb->pcb->ack_snd = elm->seq;
1233 cb->last_counter = elm->win_count;
1234 cb->seq_last_counter = elm->seq;
1235 microtime(&(cb->t_last_feedback));
1236 cb->bytes_recv = 0;
1241 dccp_output(cb->pcb, 1);
1245 * args: cb - ccb of the receiver
1250 tfrc_recv_calcFirstLI(struct tfrc_recv_ccb * cb)
1260 TFRC_RECV_FINDDATAPACKET(cb, elm, temp);
1267 TFRC_RECV_NEXTDATAPACKET(cb, elm2);
1276 TFRC_RECV_NEXTDATAPACKET(cb, elm2);
1303 timersub(&t_temp, &cb->t_last_feedback, &t_temp);
1305 x_recv = (((double) (cb->bytes_recv)) /
1308 x_recv.num = cb->bytes_recv * 1000000;
1315 /* fval = ((double) (cb->s)) / (x_recv * t_rtt); */
1316 fval.num = cb->s;
1336 * args: cb - ccb of receiver
1342 tfrc_recv_add_hist(struct tfrc_recv_ccb * cb, struct r_hist_entry * packet)
1351 if (TAILQ_EMPTY(&(cb->hist))) {
1352 TAILQ_INSERT_HEAD(&(cb->hist), packet, linfo);
1354 elm = TAILQ_FIRST(&(cb->hist));
1359 TAILQ_INSERT_HEAD(&(cb->hist), packet, linfo);
1370 TAILQ_INSERT_AFTER(&(cb->hist), elm, packet, linfo);
1388 TAILQ_INSERT_TAIL(&(cb->hist), packet, linfo);
1395 if (TAILQ_FIRST(&(cb->li_hist)) != NULL) {
1397 TFRC_RECV_FINDDATAPACKET(cb, elm, num_later);
1401 TAILQ_REMOVE(&(cb->hist), elm2, linfo);
1410 TFRC_RECV_FINDDATAPACKET(cb, elm2, num_later);
1413 TFRC_RECV_FINDDATAPACKET(cb, elm, num_later);
1417 TFRC_RECV_NEXTDATAPACKET(cb, elm2);
1429 TAILQ_REMOVE(&(cb->hist), elm, linfo);
1436 TFRC_RECV_NEXTDATAPACKET(cb, elm2);
1445 * args: cb - ccb of the receiver
1449 tfrc_recv_detectLoss(struct tfrc_recv_ccb * cb)
1457 TFRC_RECV_FINDDATAPACKET(cb, bLoss, num_later);
1463 TFRC_RECV_FINDDATAPACKET(cb, aLoss, num_later);
1465 if (TAILQ_EMPTY(&(cb->li_hist))) {
1500 tfrc_recv_updateLI(cb, seq_loss, win_loss);
1503 * cb - congestion control block
1509 tfrc_recv_updateLI(struct tfrc_recv_ccb * cb, long seq_loss, u_int8_t win_loss)
1521 if (TAILQ_EMPTY(&(cb->li_hist))) {
1532 li_elm = TAILQ_FIRST(&(cb->li_hist));
1540 TAILQ_INSERT_HEAD(&(cb->li_hist), li_elm, linfo);
1548 li_elm->interval = tfrc_recv_calcFirstLI(cb);
1554 win_start = (TAILQ_FIRST(&(cb->li_hist)))->win_count;
1561 seq_temp = seq_loss - ((long) ((TAILQ_FIRST(&(cb->li_hist)))->seq));
1565 (TAILQ_FIRST(&(cb->li_hist)))->interval = seq_temp;
1569 li_elm = TAILQ_LAST(&(cb->li_hist), li_hist_head);
1570 TAILQ_REMOVE(&(cb->li_hist), li_elm, linfo);
1577 TAILQ_INSERT_HEAD(&(cb->li_hist), li_elm, linfo);
1582 if (TAILQ_FIRST(&(cb->li_hist)) != NULL) {
1585 TFRC_RECV_FINDDATAPACKET(cb, elm, num_later);
1588 ((long) ((TAILQ_FIRST(&(cb->li_hist)))->seq));
1592 (TAILQ_FIRST(&(cb->li_hist)))->interval = seq_temp;
1648 struct tfrc_recv_ccb *cb = (struct tfrc_recv_ccb *) ccb;
1655 cb->state = TFRC_RSTATE_TERM;
1657 mutex_enter(&(cb->mutex));
1660 elm = TAILQ_FIRST(&(cb->hist));
1666 TAILQ_INIT(&(cb->hist));
1669 li_elm = TAILQ_FIRST(&(cb->li_hist));
1675 TAILQ_INIT(&(cb->li_hist));
1677 mutex_exit(&(cb->mutex));
1678 mutex_destroy(&(cb->mutex));
1697 struct tfrc_recv_ccb *cb = (struct tfrc_recv_ccb *) ccb;
1703 if (!(cb->state == TFRC_RSTATE_NO_DATA || cb->state == TFRC_RSTATE_DATA)) {
1708 switch (cb->pcb->type_rcv) {
1710 if (cb->state == TFRC_RSTATE_NO_DATA)
1721 mutex_enter(&(cb->mutex));
1732 packet->seq = cb->pcb->seq_rcv;
1733 packet->type = cb->pcb->type_rcv;
1734 packet->ndp = cb->pcb->ndp_rcv;
1737 win_count = cb->pcb->ccval;
1740 ins = tfrc_recv_add_hist(cb, packet);
1743 if (cb->pcb->type_rcv != DCCP_TYPE_ACK) {
1745 switch (cb->state) {
1748 tfrc_recv_send_feedback(cb);
1749 cb->state = TFRC_RSTATE_DATA;
1752 cb->bytes_recv = cb->bytes_recv + cb->pcb->len_rcv;
1755 tfrc_recv_detectLoss(cb);
1756 p_prev.num = cb->p.num;
1757 cb->p.denom;
1760 if (!TAILQ_EMPTY(&(cb->li_hist))) {
1761 cb->p.num = 1;
1762 cb->p.denom = tfrc_calclmean(cb);
1766 if (fixpoint_cmp(&(cb)->p, &p_prev) > 0) {
1768 tfrc_recv_send_feedback(cb);
1770 if ((cb->pcb->seq_rcv > cb->seq_last_counter
1771 && cb->pcb->seq_rcv - cb->seq_last_counter < TFRC_RECV_NEW_SEQ_RANGE) ||
1772 (cb->pcb->seq_rcv < cb->seq_last_counter
1773 && cb->seq_last_counter - cb->pcb->seq_rcv > DCCP_SEQ_NUM_LIMIT - TFRC_RECV_NEW_SEQ_RANGE)) {
1777 if ((win_count > cb->last_counter
1778 && win_count - cb->last_counter > TFRC_WIN_COUNT_PER_RTT) ||
1779 (win_count < cb->last_counter
1780 && cb->last_counter - win_count < TFRC_WIN_COUNT_LIMIT - TFRC_WIN_COUNT_PER_RTT)) {
1782 TFRC_DEBUG((LOG_INFO, "TFRC - Send a feedback packet (%i)(win_count larger) (tfrc_recv_packet_recv)\n", (win_count - cb->last_counter + TFRC_WIN_COUNT_LIMIT) % TFRC_WIN_COUNT_LIMIT));
1784 tfrc_recv_send_feedback(cb);
1798 mutex_exit(&(cb->mutex));