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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* LAPB (AX25) timer recovery routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "ax25.h"
  7. #include "timer.h"
  8. #include "lapb.h"
  9. static void tx_enq(struct ax25_cb *axp);
  10. /* Called whenever timer T1 expires */
  11. void
  12. recover(p)
  13. void *p;
  14. {
  15. register struct ax25_cb *axp = (struct ax25_cb *)p;
  16. axp->flags.retrans = 1;
  17. axp->retries++;
  18. if((1L << axp->retries) < Blimit)
  19. /* Back off retransmit timer */
  20. set_timer(&axp->t1,dur_timer(&axp->t1)*2);
  21. switch(axp->state){
  22. case LAPB_SETUP:
  23. if(axp->n2 != 0 && axp->retries > axp->n2){
  24. free_q(&axp->txq);
  25. axp->reason = LB_TIMEOUT;
  26. lapbstate(axp,LAPB_DISCONNECTED);
  27. } else {
  28. sendctl(axp,LAPB_COMMAND,SABM|PF);
  29. start_timer(&axp->t1);
  30. }
  31. break;
  32. case LAPB_DISCPENDING:
  33. if(axp->n2 != 0 && axp->retries > axp->n2){
  34. axp->reason = LB_TIMEOUT;
  35. lapbstate(axp,LAPB_DISCONNECTED);
  36. } else {
  37. sendctl(axp,LAPB_COMMAND,DISC|PF);
  38. start_timer(&axp->t1);
  39. }
  40. break;
  41. case LAPB_CONNECTED:
  42. case LAPB_RECOVERY:
  43. if(axp->n2 != 0 && axp->retries > axp->n2){
  44. /* Give up */
  45. sendctl(axp,LAPB_RESPONSE,DM|PF);
  46. free_q(&axp->txq);
  47. axp->reason = LB_TIMEOUT;
  48. lapbstate(axp,LAPB_DISCONNECTED);
  49. } else {
  50. /* Transmit poll */
  51. tx_enq(axp);
  52. lapbstate(axp,LAPB_RECOVERY);
  53. }
  54. break;
  55. }
  56. }
  57. /* Send a poll (S-frame command with the poll bit set) */
  58. void
  59. pollthem(p)
  60. void *p;
  61. {
  62. register struct ax25_cb *axp;
  63. axp = (struct ax25_cb *)p;
  64. if(axp->proto == V1)
  65. return; /* Not supported in the old protocol */
  66. switch(axp->state){
  67. case LAPB_CONNECTED:
  68. axp->retries = 0;
  69. tx_enq(axp);
  70. lapbstate(axp,LAPB_RECOVERY);
  71. break;
  72. }
  73. }
  74. /* Transmit query */
  75. static void
  76. tx_enq(axp)
  77. register struct ax25_cb *axp;
  78. {
  79. char ctl;
  80. struct mbuf *bp;
  81. /* I believe that retransmitting the oldest unacked
  82.  * I-frame tends to give better performance than polling,
  83.  * as long as the frame isn't too "large", because
  84.  * chances are that the I frame got lost anyway.
  85.  * This is an option in LAPB, but not in the official AX.25.
  86.  */
  87. if(axp->txq != NULL
  88.  && (len_p(axp->txq) < axp->pthresh || axp->proto == V1)){
  89. /* Retransmit oldest unacked I-frame */
  90. dup_p(&bp,axp->txq,0,len_p(axp->txq));
  91. ctl = PF | I | (((axp->vs - axp->unack) & MMASK) << 1)
  92.  | (axp->vr << 5);
  93. sendframe(axp,LAPB_COMMAND,ctl,&bp);
  94. } else {
  95. ctl = len_p(axp->rxq) >= axp->window ? RNR|PF : RR|PF;
  96. sendctl(axp,LAPB_COMMAND,ctl);
  97. }
  98. axp->response = 0;
  99. stop_timer(&axp->t3);
  100. start_timer(&axp->t1);
  101. }