tcptimer.c
上传用户:hepax88
上传日期:2007-01-03
资源大小:1101k
文件大小:1k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. /* TCP timeout routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "timer.h"
  8. #include "netuser.h"
  9. #include "internet.h"
  10. #include "tcp.h"
  11. /* Timer timeout */
  12. void
  13. tcp_timeout(p)
  14. void *p;
  15. {
  16. register struct tcb *tcb;
  17. int32 ptrsave;
  18. tcb = p;
  19. if(tcb == NULL)
  20. return;
  21. /* Make sure the timer has stopped (we might have been kicked) */
  22. stop_timer(&tcb->timer);
  23. switch(tcb->state){
  24. case TCP_TIME_WAIT: /* 2MSL timer has expired */
  25. close_self(tcb,NORMAL);
  26. break;
  27. default: /* Retransmission timer has expired */
  28. tcb->timeouts++;
  29. tcb->flags.retran = 1; /* Indicate > 1  transmission */
  30. tcb->backoff++;
  31. /* Reduce slowstart threshold to half current window */
  32. tcb->ssthresh = tcb->cwind / 2;
  33. tcb->ssthresh = max(tcb->ssthresh,tcb->mss);
  34. /* Shrink congestion window to 1 packet */
  35. tcb->cwind = tcb->mss;
  36. /* Retransmit just the oldest unacked packet */
  37. ptrsave = tcb->snd.ptr;
  38. tcb->snd.ptr = tcb->snd.una;
  39. tcp_output(tcb);
  40. tcb->snd.ptr = ptrsave;
  41. }
  42. }
  43. /* Backoff function - the subject of much research */
  44. int32
  45. backoff(n)
  46. int n;
  47. {
  48. if(n > 31)
  49. n = 31; /* Prevent truncation to zero */
  50. return 1L << n; /* Binary exponential back off */
  51. }