+u_int tp_start_win;
+
+#define ROUND(scaled_int) (((scaled_int) >> 8) + (((scaled_int) & 0x80) ? 1:0))
+
+/* to round off a scaled int with an 8 bit fraction part */
+
+#define CONG_INIT_SAMPLE(pcb) \
+ pcb->tp_cong_sample.cs_received = \
+ pcb->tp_cong_sample.cs_ce_set = 0; \
+ pcb->tp_cong_sample.cs_size = MAX(pcb->tp_lcredit, 1) << 1;
+
+#define CONG_UPDATE_SAMPLE(pcb, ce_bit) \
+ pcb->tp_cong_sample.cs_received++; \
+ if (ce_bit) { \
+ pcb->tp_cong_sample.cs_ce_set++; \
+ } \
+ if (pcb->tp_cong_sample.cs_size <= pcb->tp_cong_sample.cs_received) { \
+ if ((pcb->tp_cong_sample.cs_ce_set << 1) >= \
+ pcb->tp_cong_sample.cs_size ) { \
+ pcb->tp_win_recv -= pcb->tp_win_recv >> 3; /* multiply by .875 */ \
+ pcb->tp_win_recv = MAX(1 << 8, pcb->tp_win_recv); \
+ } \
+ else { \
+ pcb->tp_win_recv += (1 << 8); /* add one to the scaled int */ \
+ } \
+ pcb->tp_lcredit = ROUND(pcb->tp_win_recv); \
+ CONG_INIT_SAMPLE(pcb); \
+ }
+
+#define CONG_ACK(pcb, seq) \
+{ int newacks = SEQ_SUB(pcb, seq, pcb->tp_snduna); \
+ if (newacks > 0) { \
+ pcb->tp_ackrcvd += newacks; \
+ if (pcb->tp_ackrcvd >= MIN(pcb->tp_fcredit, pcb->tp_cong_win)) { \
+ ++pcb->tp_cong_win; \
+ pcb->tp_ackrcvd = 0; \
+ } \
+ } \
+}
+
+#ifdef KERNEL