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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* AX25 link callsign monitoring. Also contains beginnings of
  2.  * an automatic link quality monitoring scheme (incomplete)
  3.  *
  4.  * Copyright 1991 Phil Karn, KA9Q
  5.  */
  6. #include "global.h"
  7. #include "mbuf.h"
  8. #include "iface.h"
  9. #include "ax25.h"
  10. #include "ip.h"
  11. #include "timer.h"
  12. static struct lq *al_create(struct iface *ifp,uint8 *addr);
  13. static struct ld *ad_lookup(struct iface *ifp,uint8 *addr,int sort);
  14. static struct ld *ad_create(struct iface *ifp,uint8 *addr);
  15. struct lq *Lq;
  16. struct ld *Ld;
  17. #ifdef notdef
  18. /* Send link quality reports to interface */
  19. void
  20. genrpt(ifp)
  21. struct iface *ifp;
  22. {
  23. struct mbuf *bp;
  24. register uint8 *cp;
  25. int i;
  26. struct lq *lp;
  27. int maxentries,nentries;
  28. maxentries = (Paclen - LQHDR) / LQENTRY;
  29. if((bp = alloc_mbuf(Paclen)) == NULL)
  30. return;
  31. cp = bp->data;
  32. nentries = 0;
  33. /* Build and emit header */
  34. cp = putlqhdr(cp,LINKVERS,Ip_addr);
  35. /* First entry is for ourselves. Since we're examining the Axsent
  36.  * variable before we've sent this frame, add one to it so it'll
  37.  * match the receiver's count after he gets this frame.
  38.  */
  39. cp = putlqentry(cp,ifp->hwaddr,Axsent+1);
  40. nentries++;
  41. /* Now add entries from table */
  42. for(lp = lq;lp != NULL;lp = lp->next){
  43. cp = putlqentry(cp,&lp->addr,lp->currxcnt);
  44. if(++nentries >= MAXENTRIES){
  45. /* Flush */
  46. bp->cnt = nentries*LQENTRY + LQHDR;
  47. ax_output(ifp,Ax25multi[0],ifp->hwaddr,PID_LQ,bp);
  48. if((bp = alloc_mbuf(Paclen)) == NULL)
  49. return;
  50. cp = bp->data;
  51. }
  52. }
  53. if(nentries > 0){
  54. bp->cnt = nentries*LQENTRY + LQHDR;
  55. ax_output(ifp,Ax25multi[0],ifp->hwaddr,LQPID,bp);
  56. } else {
  57. free_p(&bp);
  58. }
  59. }
  60. /* Pull the header off a link quality packet */
  61. void
  62. getlqhdr(hp,bpp)
  63. struct lqhdr *hp;
  64. struct mbuf **bpp;
  65. {
  66. hp->version = pull16(bpp);
  67. hp->ip_addr = pull32(bpp);
  68. }
  69. /* Put a header on a link quality packet.
  70.  * Return pointer to buffer immediately following header
  71.  */
  72. uint8 *
  73. putlqhdr(cp,version,ip_addr)
  74. register uint8 *cp;
  75. uint16 version;
  76. int32 ip_addr;
  77. {
  78. cp = put16(cp,version);
  79. return put32(cp,ip_addr);
  80. }
  81. /* Pull an entry off a link quality packet */
  82. void
  83. getlqentry(ep,bpp)
  84. struct lqentry *ep;
  85. struct mbuf **bpp;
  86. {
  87. pullup(bpp,ep->addr,AXALEN);
  88. ep->count = pull32(bpp);
  89. }
  90. /* Put an entry on a link quality packet
  91.  * Return pointer to buffer immediately following header
  92.  */
  93. uint8 *
  94. putlqentry(cp,addr,count)
  95. uint8 *cp;
  96. uint8 *addr;
  97. int32 count;
  98. {
  99. memcpy(cp,addr,AXALEN);
  100. cp += AXALEN;
  101. return put32(cp,count);
  102. }
  103. #endif
  104. /* Log the source address of an incoming packet */
  105. void
  106. logsrc(ifp,addr)
  107. struct iface *ifp;
  108. uint8 *addr;
  109. {
  110. register struct lq *lp;
  111. if((lp = al_lookup(ifp,addr,1)) == NULL
  112.  && (lp = al_create(ifp,addr)) == NULL)
  113. return;
  114. lp->currxcnt++;
  115. lp->time = secclock();
  116. }
  117. /* Log the destination address of an incoming packet */
  118. void
  119. logdest(ifp,addr)
  120. struct iface *ifp;
  121. uint8 *addr;
  122. {
  123. register struct ld *lp;
  124. if((lp = ad_lookup(ifp,addr,1)) == NULL
  125.  && (lp = ad_create(ifp,addr)) == NULL)
  126. return;
  127. lp->currxcnt++;
  128. lp->time = secclock();
  129. }
  130. /* Look up an entry in the source data base */
  131. struct lq *
  132. al_lookup(ifp,addr,sort)
  133. struct iface *ifp;
  134. uint8 *addr;
  135. int sort;
  136. {
  137. register struct lq *lp;
  138. struct lq *lplast = NULL;
  139. for(lp = Lq;lp != NULL;lplast = lp,lp = lp->next){
  140. if(addreq(lp->addr,addr) && lp->iface == ifp){
  141. if(sort && lplast != NULL){
  142. /* Move entry to top of list */
  143. lplast->next = lp->next;
  144. lp->next = Lq;
  145. Lq = lp;
  146. }
  147. return lp;
  148. }
  149. }
  150. return NULL;
  151. }
  152. /* Create a new entry in the source database */
  153. static struct lq *
  154. al_create(ifp,addr)
  155. struct iface *ifp;
  156. uint8 *addr;
  157. {
  158. register struct lq *lp;
  159. lp = (struct lq *)callocw(1,sizeof(struct lq));
  160. memcpy(lp->addr,addr,AXALEN);
  161. lp->next = Lq;
  162. Lq = lp;
  163. lp->iface = ifp;
  164. return lp;
  165. }
  166. /* Look up an entry in the destination database */
  167. static struct ld *
  168. ad_lookup(ifp,addr,sort)
  169. struct iface *ifp;
  170. uint8 *addr;
  171. int sort;
  172. {
  173. register struct ld *lp;
  174. struct ld *lplast = NULL;
  175. for(lp = Ld;lp != NULL;lplast = lp,lp = lp->next){
  176. if(lp->iface == ifp && addreq(lp->addr,addr)){
  177. if(sort && lplast != NULL){
  178. /* Move entry to top of list */
  179. lplast->next = lp->next;
  180. lp->next = Ld;
  181. Ld = lp;
  182. }
  183. return lp;
  184. }
  185. }
  186. return NULL;
  187. }
  188. /* Create a new entry in the destination database */
  189. static struct ld *
  190. ad_create(ifp,addr)
  191. struct iface *ifp;
  192. uint8 *addr;
  193. {
  194. register struct ld *lp;
  195. lp = (struct ld *)callocw(1,sizeof(struct ld));
  196. memcpy(lp->addr,addr,AXALEN);
  197. lp->next = Ld;
  198. Ld = lp;
  199. lp->iface = ifp;
  200. return lp;
  201. }