Home | History | Annotate | Download | only in netinet

Lines Matching refs:cb

123 	struct tcplike_send_ccb *cb = (struct tcplike_send_ccb *) ccb;
127 mutex_enter(&(cb->mutex));
129 cb->ssthresh = cb->cwnd >>1;
130 cb->cwnd = 1; /* allowing 1 packet to be sent */
131 cb->outstanding = 0; /* is this correct? */
132 cb->rto_timer_callout = 0;
133 cb->rto = cb->rto << 1;
134 TIMEOUT_DEBUG((LOG_INFO, "RTO Timeout. New RTO = %u\n", cb->rto));
136 cb->sample_rtt = 0;
138 cb->ack_last = 0;
139 cb->ack_miss = 0;
141 cb->rcvr_ackratio = 1; /* Constraint 2 & 3. We need ACKs asap */
142 dccp_remove_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO);
143 dccp_add_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO,
144 (char *) &cb->rcvr_ackratio, 1);
145 cb->acked_in_win = 0;
146 cb->acked_windows = 0;
147 cb->oldcwnd_ts = cb->pcb->seq_snd;
150 cb->cwnd, cb->outstanding));
151 mutex_exit(&(cb->mutex));
156 /*inp = cb->pcb->d_inpcb;*/
160 dccp_output(cb->pcb, 1);
166 void tcplike_rtt_sample(struct tcplike_send_ccb *cb, u_int16_t sample)
170 if (cb->rtt == 0xffff) {
172 cb->rtt = sample;
173 cb->rto = cb->rtt << 1;
178 if (sample >= cb->rtt) {
179 err = sample - cb->rtt;
180 cb->rtt = cb->rtt + (err >> 3);
182 err = cb->rtt - sample;
183 cb->rtt = cb->rtt - (err >> 3);
185 cb->rtt_d = cb->rtt_d + ((err - cb->rtt_d) >> 2);
186 if (cb->rtt < TCPLIKE_MIN_RTT)
187 cb->rtt = TCPLIKE_MIN_RTT;
188 cb->rto = cb->rtt + (cb->rtt_d << 2);
193 cb->srtt = ( 0.8 * cb->srtt ) + (0.2 * sample);
194 if (cb->srtt < TCPLIKE_MIN_RTT)
195 cb->srtt = TCPLIKE_MIN_RTT;
196 cb->rto = cb->srtt << 1;
199 LOSS_DEBUG((LOG_INFO, "RTT Sample: %u , New RTO: %u\n", sample, cb->rto));
211 struct tcplike_send_ccb *cb;
215 cb = malloc(sizeof (struct tcplike_send_ccb), M_PCB, M_NOWAIT | M_ZERO);
216 if (cb == 0) {
221 memset(cb, 0, sizeof (struct tcplike_send_ccb));
224 cb->pcb = pcb;
226 cb->cwnd = TCPLIKE_INITIAL_CWND;
227 cb->ssthresh = 0xafff; /* lim-> infinity */
228 cb->oldcwnd_ts = 0;
229 cb->outstanding = 0;
230 cb->rcvr_ackratio = 2; /* Ack Ratio */
231 cb->acked_in_win = 0;
232 cb->acked_windows = 0;
235 cb->cwnd, cb->outstanding));
236 cb->rtt = 0xffff;
237 cb->rto = TIMEOUT_UBOUND;
238 callout_init(&cb->rto_timer, 0);
239 callout_init(&cb->free_timer, 0);
240 cb->rto_timer_callout = 0;
241 cb->rtt_d = 0;
242 cb->timestamp = 0;
244 cb->sample_rtt = 1;
246 cb->cv_size = TCPLIKE_INITIAL_CWNDVECTOR;
248 cb->cwndvector = malloc(cb->cv_size / 8, M_PCB, M_NOWAIT | M_ZERO);
249 if (cb->cwndvector == NULL) {
252 cb->cv_size = 0;
256 memset(cb->cwndvector, 0, cb->cv_size / 8);
257 cb->cv_hs = cb->cv_ts = 0;
258 cb->cv_hp = cb->cwndvector;
260 cb->ack_last = 0;
261 cb->ack_miss = 0;
263 mutex_init(&(cb->mutex), MUTEX_DEFAULT, IPL_SOFTNET);
267 return cb;
272 struct tcplike_send_ccb *cb = (struct tcplike_send_ccb *) ccb;
276 mutex_destroy(&(cb->mutex));
278 free(cb, M_PCB);
289 struct tcplike_send_ccb *cb = (struct tcplike_send_ccb *) ccb;
296 mutex_enter(&(cb->mutex));
298 free(cb->cwndvector, M_PCB);
299 cb->cv_hs = cb->cv_ts = 0;
302 if (cb->rto_timer_callout) {
304 callout_stop(&cb->rto_timer);
305 cb->rto_timer_callout = 0;
308 mutex_exit(&(cb->mutex));
310 callout_reset(&cb->free_timer, 10 * hz, tcplike_send_term, (void *)cb);
322 struct tcplike_send_ccb *cb = (struct tcplike_send_ccb *) ccb;
333 mutex_enter(&(cb->mutex));
335 if (cb->cwnd <= cb->outstanding) {
337 DCCP_DEBUG((LOG_INFO, "cwnd (%d) < outstanding (%d)\n", cb->cwnd, cb->outstanding));
338 if (!cb->rto_timer_callout) {
339 LOSS_DEBUG((LOG_INFO, "Trigger TCPlike RTO timeout timer. Ticks = %u\n", cb->rto));
340 ticks = (long)cb->rto;
341 callout_reset(&cb->rto_timer, ticks,
342 tcplike_rto_timeout, (void *)cb);
343 cb->rto_timer_callout = 1;
345 mutex_exit(&(cb->mutex));
352 if (cb->pcb->remote_ackvector == 0) {
354 dccp_remove_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKVECTOR);
355 dccp_add_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKVECTOR, feature, 1);
359 if (cb->rto_timer_callout) {
361 callout_stop(&cb->rto_timer);
362 cb->rto_timer_callout = 0;
365 if (!cb->sample_rtt) {
368 cb->timestamp = ((stamp.tv_sec & 0x00000FFF) * 1000000) + stamp.tv_usec;
369 dccp_add_option(cb->pcb, DCCP_OPT_TIMESTAMP, (char*) &(cb->timestamp), 4);
370 /*LOSS_DEBUG((LOG_INFO, "Adding timestamp %u\n", cb->timestamp));*/
371 cb->sample_rtt = 1;
374 mutex_exit(&(cb->mutex));
387 struct tcplike_send_ccb *cb = (struct tcplike_send_ccb *) ccb;
396 mutex_enter(&(cb->mutex));
398 cb->outstanding++;
399 TCPLIKE_DEBUG((LOG_INFO, "SENT. cwnd: %d, outstanding: %d\n",cb->cwnd, cb->outstanding));
403 _add_to_cwndvector(cb, cb->pcb->seq_snd);
404 CWND_DEBUG((LOG_INFO, "Sent. CWND value: %u , OUTSTANDING value: %u\n",cb->cwnd, cb->outstanding));
406 dccp_remove_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO);
407 mutex_exit(&(cb->mutex));
421 struct tcplike_send_ccb *cb = (struct tcplike_send_ccb *) ccb;
424 mutex_enter(&(cb->mutex));
433 if (echo == cb->timestamp) {
441 diff = (u_int16_t) c_stamp - cb->timestamp - elapsed;
445 tcplike_rtt_sample(cb, diff);
449 if (cb->pcb->ack_rcv == 0) {
459 cb->ack_last = 0;
460 cb->ack_miss = 0;
462 mutex_exit(&(cb->mutex));
466 cb->sample_rtt = 0;
476 acknum = cb->pcb->ack_rcv;
480 prev_size = _cwndvector_size(cb);
484 _remove_from_cwndvector(cb, acknum);
494 _remove_from_cwndvector(cb, acknum);
496 if (acknum > cb->oldcwnd_ts) {
497 LOSS_DEBUG((LOG_INFO, "Packet %llu was lost %llu state %d\n", acknum, cb->oldcwnd_ts, state));
507 if (_chop_cwndvector(cb, lastok-TCPLIKE_NUMDUPACK)) {
509 if (lastok-TCPLIKE_NUMDUPACK > cb->oldcwnd_ts) {
515 lastok = cb->cv_hs;
516 while (_cwndvector_state(cb, lastok) == 0x00 && lastok < cb->cv_ts)
518 if (lastok != cb->cv_hs)
519 _chop_cwndvector(cb, lastok);
521 cb->outstanding = _cwndvector_size(cb);
522 CWND_DEBUG((LOG_INFO, "Decrease outstanding. was = %u , now = %u\n", prev_size, cb->outstanding));
523 if (prev_size == cb->outstanding) {
525 mutex_exit(&(cb->mutex));
529 cb->acked_in_win += numokpackets;
531 if (cb->cwnd < cb->ssthresh) {
537 cb->cwnd = cb->cwnd>>1;
538 if (cb->cwnd < 1)
539 cb->cwnd = 1;
540 cb->ssthresh = cb->cwnd;
541 cb->acked_in_win = 0;
542 cb->acked_windows = 0;
543 cb->oldcwnd_ts = cb->pcb->seq_snd;
546 cb->cwnd++;
549 } else if (cb->cwnd >= cb->ssthresh) {
554 cb->cwnd = cb->cwnd>>1;
555 if (cb->cwnd < 1)
556 cb->cwnd = 1;
557 cb->ssthresh = cb->cwnd;
558 cb->acked_in_win = 0;
559 cb->acked_windows = 0;
560 cb->oldcwnd_ts = cb->pcb->seq_snd;
562 } else if (cb->acked_in_win > cb->cwnd) {
563 cb->cwnd++;
569 cb->pcb->seq_rcv, cb->ack_last, cb->ack_miss));
571 if (cb->ack_last == 0) {
573 cb->ack_last = cb->pcb->seq_rcv;
574 cb->ack_miss = 0;
575 } else if (cb->pcb->seq_rcv == (cb->ack_last + 1)) {
577 cb->ack_last = cb->pcb->seq_rcv;
579 } else if (cb->pcb->seq_rcv < (cb
586 if (cb->pcb->seq_rcv == cb->ack_miss) {
588 cb->ack_miss = 0;
591 } else if (cb->pcb->seq_rcv > (cb->ack_last + 1)) {
593 cb->ack_miss = cb->ack_last + 1;
594 cb->ack_last = cb->pcb->seq_rcv;
597 if (cb->ack_miss && ((cb->ack_miss + TCPLIKE_NUMDUPACK) < cb->ack_last)) {
601 cb->rcvr_ackratio = cb->rcvr_ackratio<<1;
602 if (cb->rcvr_ackratio > (cb->cwnd>>1)) {
604 cb->rcvr_ackratio = cb->cwnd>>1;
606 if (cb->rcvr_ackratio == 0)
607 cb->rcvr_ackratio = 1;
608 ACKRATIO_DEBUG((LOG_INFO, "Increase Ack Ratio. Now = %u. (cwnd = %u)\n", cb->rcvr_ackratio, cb->cwnd));
609 dccp_remove_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO);
610 dccp_add_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO,
611 (char *) &cb->rcvr_ackratio, 1);
613 cb->ack_miss = 0;
614 cb->acked_windows = 0;
615 cb->acked_in_win = 0;
618 } else if (cb->acked_in_win > cb->cwnd) {
619 cb->acked_in_win = 0;
620 cb->acked_windows++;
621 if (cb->rcvr_ackratio == 1) {
625 cb->acked_windows = 0;
629 if (cb->acked_windows >= 1) {
630 ackratiocnt = (cb->cwnd / ((cb->rcvr_ackratio*cb->rcvr_ackratio) - cb->rcvr_ackratio));
631 if (cb->acked_windows >= ackratiocnt) {
632 if (cb->rcvr_ackratio > 2 && cb->cwnd >= 4) {
634 cb->rcvr_ackratio--;
635 ACKRATIO_DEBUG((LOG_INFO, "Decrease ackratio by 1, now: %u\n", cb->rcvr_ackratio));
636 dccp_remove_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO);
637 dccp_add_feature(cb->pcb, DCCP_OPT_CHANGE_R, DCCP_FEATURE_ACKRATIO,
638 (char *) &cb->rcvr_ackratio, 1);
640 cb->acked_in_win = 0;
641 cb->acked_windows = 0;
646 cb->cwnd, cb->outstanding));
648 if (cb->cwnd > cb->outstanding && cb->rto_timer_callout) {
650 cb->cwnd, cb->outstanding));
651 callout_stop(&cb->rto_timer);
652 cb->rto_timer_callout = 0;
654 mutex_exit(&(cb->mutex));
655 dccp_output(cb->pcb, 1);
658 mutex_exit(&(cb->mutex));
662 _cwndvector_size(struct tcplike_send_ccb *cb)
670 for (seqnr = cb->cv_hs; seqnr < cb->cv_ts; seqnr++) {
671 gap = seqnr - cb->cv_hs;
674 t = cb->cv_hp + (gap/8);
675 if (t >= (cb->cwndvector + (cb->cv_size/8)))
676 t -= (cb->cv_size / 8); /* wrapped */
685 _cwndvector_state(struct tcplike_send_ccb *cb, u_int64_t seqnr)
691 if (seqnr >= cb->cv_hs) {
693 gap = seqnr - cb->cv_hs;
696 gap = seqnr + 0x1000000000000LL - cb->cv_hs; /* seq nr = 48 bits */
699 if (gap >= cb->cv_size) {
705 t = cb->cv_hp + (gap/8);
706 if (t >= (cb->cwndvector + (cb->cv_size/8)))
707 t -= (cb->cv_size / 8); /* wrapped */
713 _add_to_cwndvector(struct tcplike_send_ccb *cb, u_int64_t seqnr)
720 if (cb->cv_hs == cb->cv_ts) {
722 cb->cv_hs = cb->cv_ts = seqnr;
726 if (seqnr >= cb->cv_hs) {
728 gap = seqnr - cb->cv_hs;
731 gap = seqnr + 0x1000000000000LL - cb->cv_hs; /* seq nr = 48 bits */
734 if (gap >= cb->cv_size) {
738 gap, cb->cv_size, seqnr));
744 t = cb->cv_hp + (gap/8);
745 if (t >= (cb->cwndvector + (cb->cv_size/8)))
746 t -= (cb->cv_size / 8); /* cwndvector wrapped */
750 cb->cv_ts = seqnr+1;
751 if (cb->cv_ts == 0x1000000000000LL)
752 cb->cv_ts = 0;
754 if (gap > (cb->cv_size - 128)) {
756 n = malloc(cb->cv_size/4, M_PCB, M_NOWAIT); /* old size * 2 */
762 memset (n+cb->cv_size/8,0x00,cb->cv_size/8); /* new half all missing */
763 dc = (cb->cwndvector + (cb->cv_size/8)) - cb->cv_hp;
764 memcpy (n,cb->cv_hp, dc); /* tail to end */
765 memcpy (n+dc,cb->cwndvector,cb->cv_hp - cb->cwndvector); /* start to tail */
766 cb->cv_size = cb->cv_size * 2; /* counted in items, so it';s a doubling */
767 free (cb->cwndvector, M_PCB);
768 cb->cv_hp = cb->cwndvector = n;
773 _remove_from_cwndvector(struct tcplike_send_ccb *cb, u_int64_t seqnr)
781 if (cb->cv_hs == cb->cv_ts) {
787 if (seqnr >= cb->cv_hs) {
789 gap = seqnr - cb->cv_hs;
792 gap = seqnr + 0x1000000000000LL - cb->cv_hs; /* seq nr = 48 bits */
795 if (gap >= cb->cv_size) {
801 t = cb->cv_hp + (gap/8);
802 if (t >= (cb->cwndvector + (cb->cv_size/8)))
803 t -= (cb->cv_size / 8); /* cwndvector wrapped */
809 _chop_cwndvector(struct tcplike_send_ccb *cb, u_int64_t seqnr)
816 if (cb->cv_hs == cb->cv_ts)
819 if (seqnr > cb->cv_hs) {
820 gap = seqnr - cb->cv_hs;
830 t = cb->cv_hp + bytegap;
831 if (t >= (cb->cwndvector + (cb->cv_size/8)))
832 t -= (cb->cv_size / 8); /* ackvector wrapped */
833 cb->cv_hp = t;
834 cb->cv_hs += bytegap*8;
881 struct tcplike_recv_ccb *cb = (struct tcplike_recv_ccb *) ccb;
885 mutex_destroy(&(cb->mutex));
886 free(cb, M_PCB);
897 struct tcplike_recv_ccb *cb = (struct tcplike_recv_ccb *) ccb;
904 mutex_enter(&(cb->mutex));
906 a = cb->av_list;
908 cb->av_list = a->next;
910 a = cb->av_list;
913 cb->pcb->av_size = 0;
914 free(cb->pcb->ackvector, M_PCB);
916 mutex_exit(&(cb->mutex));
917 callout_reset(&cb->free_timer, 10 * hz, tcplike_recv_term, (void *)cb);
927 struct tcplike_recv_ccb *cb = (struct tcplike_recv_ccb *) ccb;
934 mutex_enter(&(cb->mutex));
936 if (cb->pcb->type_rcv == DCCP_TYPE_DATA ||
937 cb->pcb->type_rcv == DCCP_TYPE_DATAACK)
947 if (avsize == 0 && cb->pcb->ack_rcv) {
952 ackthru = _avlist_get(cb, cb->pcb->ack_rcv);
955 dccp_update_ackvector(cb->pcb, ackthru);
958 } else if (avsize > 0 && cb->pcb->ack_rcv) {
964 acknum = cb->pcb->ack_rcv;
976 ackthru = _avlist_get(cb, acknum);
979 dccp_update_ackvector(cb->pcb, ackthru);
988 ACK_DEBUG((LOG_INFO, "Adding %llu to local ackvector\n", cb->pcb->seq_rcv));
989 dccp_increment_ackvector(cb->pcb, cb->pcb->seq_rcv);
990 cb->unacked++;
992 if (cb->unacked >= cb->pcb->ack_ratio) {
995 avsize = dccp_generate_ackvector(cb->pcb, ackvector);
997 cb->unacked = 0;
999 dccp_add_option(cb->pcb, DCCP_OPT_ACK_VECTOR0, ackvector, avsize);
1000 cb->pcb->ack_snd = cb->pcb->seq_rcv;
1001 _avlist_add(cb, cb->pcb->seq_snd+1, cb->pcb->ack_snd);
1002 ACK_DEBUG((LOG_INFO, "Recvr: Sending Ack (%llu) w/ Ack Vector\n", cb->pcb->ack_snd));
1004 dccp_output(cb->pcb, 1);
1007 mutex_exit(&(cb->mutex));
1011 _avlist_add(struct tcplike_recv_ccb *cb, u_int64_t localseq, u_int64_t ackthru)
1025 a->next = cb->av_list;
1026 cb->av_list = a;
1034 _avlist_get(struct tcplike_recv_ccb *cb, u_int64_t localseq)
1040 a = cb->av_list;
1048 cb->av_list = n;