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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* AX25 header tracing
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "ax25.h"
  8. #include "lapb.h"
  9. #include "trace.h"
  10. #include "socket.h"
  11. static char *decode_type(uint16 type);
  12. /* Dump an AX.25 packet header */
  13. void
  14. ax25_dump(fp,bpp,check)
  15. FILE *fp;
  16. struct mbuf **bpp;
  17. int check; /* Not used */
  18. {
  19. char tmp[AXBUF];
  20. char frmr[3];
  21. int control,pid,seg;
  22. uint16 type;
  23. int unsegmented;
  24. struct ax25 hdr;
  25. uint8 *hp;
  26. fprintf(fp,"AX25: ");
  27. /* Extract the address header */
  28. if(ntohax25(&hdr,bpp) < 0){
  29. /* Something wrong with the header */
  30. fprintf(fp," bad header!n");
  31. return;
  32. }
  33. fprintf(fp,"%s",pax25(tmp,hdr.source));
  34. fprintf(fp,"->%s",pax25(tmp,hdr.dest));
  35. if(hdr.ndigis > 0){
  36. fprintf(fp," v");
  37. for(hp = hdr.digis[0]; hp < &hdr.digis[hdr.ndigis][0];
  38.  hp += AXALEN){
  39. /* Print digi string */
  40. fprintf(fp," %s%s",pax25(tmp,hp),
  41.  (hp[ALEN] & REPEATED) ? "*":"");
  42. }
  43. }
  44. if((control = PULLCHAR(bpp)) == -1)
  45. return;
  46. putc(' ',fp);
  47. type = ftype(control);
  48. fprintf(fp,"%s",decode_type(type));
  49. /* Dump poll/final bit */
  50. if(control & PF){
  51. switch(hdr.cmdrsp){
  52. case LAPB_COMMAND:
  53. fprintf(fp,"(P)");
  54. break;
  55. case LAPB_RESPONSE:
  56. fprintf(fp,"(F)");
  57. break;
  58. default:
  59. fprintf(fp,"(P/F)");
  60. break;
  61. }
  62. }
  63. /* Dump sequence numbers */
  64. if((type & 0x3) != U) /* I or S frame? */
  65. fprintf(fp," NR=%d",(control>>5)&7);
  66. if(type == I || type == UI){
  67. if(type == I)
  68. fprintf(fp," NS=%d",(control>>1)&7);
  69. /* Decode I field */
  70. if((pid = PULLCHAR(bpp)) != -1){ /* Get pid */
  71. if(pid == PID_SEGMENT){
  72. unsegmented = 0;
  73. seg = PULLCHAR(bpp);
  74. fprintf(fp,"%s remain %u",seg & SEG_FIRST ?
  75.  " First seg;" : "",seg & SEG_REM);
  76. if(seg & SEG_FIRST)
  77. pid = PULLCHAR(bpp);
  78. } else
  79. unsegmented = 1;
  80. switch(pid){
  81. case PID_SEGMENT:
  82. putc('n',fp);
  83. break; /* Already displayed */
  84. case PID_ARP:
  85. fprintf(fp," pid=ARPn");
  86. arp_dump(fp,bpp);
  87. break;
  88. case PID_NETROM:
  89. fprintf(fp," pid=NET/ROMn");
  90. /* Don't verify checksums unless unsegmented */
  91. netrom_dump(fp,bpp,unsegmented);
  92. break;
  93. case PID_IP:
  94. fprintf(fp," pid=IPn");
  95. /* Don't verify checksums unless unsegmented */
  96. ip_dump(fp,bpp,unsegmented);
  97. break;
  98. case PID_X25:
  99. fprintf(fp," pid=X.25n");
  100. break;
  101. case PID_TEXNET:
  102. fprintf(fp," pid=TEXNETn");
  103. break;
  104. case PID_NO_L3:
  105. fprintf(fp," pid=Textn");
  106. break;
  107. default:
  108. fprintf(fp," pid=0x%xn",pid);
  109. }
  110. }
  111. } else if(type == FRMR && pullup(bpp,frmr,3) == 3){
  112. fprintf(fp,": %s",decode_type(ftype(frmr[0])));
  113. fprintf(fp," Vr = %d Vs = %d",(frmr[1] >> 5) & MMASK,
  114. (frmr[1] >> 1) & MMASK);
  115. if(frmr[2] & W)
  116. fprintf(fp," Invalid control field");
  117. if(frmr[2] & X)
  118. fprintf(fp," Illegal I-field");
  119. if(frmr[2] & Y)
  120. fprintf(fp," Too-long I-field");
  121. if(frmr[2] & Z)
  122. fprintf(fp," Invalid seq number");
  123. putc('n',fp);
  124. } else
  125. putc('n',fp);
  126. }
  127. static char *
  128. decode_type(type)
  129. uint16 type;
  130. {
  131. switch(type){
  132. case I:
  133. return "I";
  134. case SABM:
  135. return "SABM";
  136. case DISC:
  137. return "DISC";
  138. case DM:
  139. return "DM";
  140. case UA:
  141. return "UA";
  142. case RR:
  143. return "RR";
  144. case RNR:
  145. return "RNR";
  146. case REJ:
  147. return "REJ";
  148. case FRMR:
  149. return "FRMR";
  150. case UI:
  151. return "UI";
  152. default:
  153. return "[invalid]";
  154. }
  155. }
  156. /* Return 1 if this packet is directed to us, 0 otherwise. Note that
  157.  * this checks only the ultimate destination, not the digipeater field
  158.  */
  159. int
  160. ax_forus(iface,bp)
  161. struct iface *iface;
  162. struct mbuf *bp;
  163. {
  164. struct mbuf *bpp;
  165. uint8 dest[AXALEN];
  166. /* Duplicate the destination address */
  167. if(dup_p(&bpp,bp,0,AXALEN) != AXALEN){
  168. free_p(&bpp);
  169. return 0;
  170. }
  171. if(pullup(&bpp,dest,AXALEN) < AXALEN)
  172. return 0;
  173. if(addreq(dest,iface->hwaddr))
  174. return 1;
  175. else
  176. return 0;
  177. }