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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* IP header tracing routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "internet.h"
  8. #include "iface.h"
  9. #include "ip.h"
  10. #include "trace.h"
  11. #include "netuser.h"
  12. #include "session.h"
  13. void ipldump(FILE *fp,struct ip *ip,struct mbuf **bpp,int check);
  14. void
  15. ip_dump(
  16. FILE *fp,
  17. struct mbuf **bpp,
  18. int check
  19. ){
  20. struct ip ip;
  21. uint16 ip_len;
  22. uint16 csum;
  23. if(bpp == NULL || *bpp == NULL)
  24. return;
  25. /* Sneak peek at IP header and find length */
  26. ip_len = ((*bpp)->data[0] & 0xf) << 2;
  27. if(ip_len < IPLEN){
  28. fprintf(fp,"IP: bad headern");
  29. return;
  30. }
  31. if(check && cksum(NULL,*bpp,ip_len) != 0)
  32. fprintf(fp,"IP: CHECKSUM ERROR (%u)",csum);
  33. ntohip(&ip,bpp); /* Can't fail, we've already checked ihl */
  34. ipldump(fp,&ip,bpp,check);
  35. }
  36. void
  37. ipip_dump(
  38. FILE *fp,
  39. struct mbuf **bpp,
  40. int32 source,
  41. int32 dest,
  42. int check
  43. ){
  44. ip_dump(fp,bpp,check);
  45. }
  46. void
  47. ipldump(fp,ip,bpp,check)
  48. FILE *fp;
  49. struct ip *ip;
  50. struct mbuf **bpp;
  51. int check;
  52. {
  53. uint16 length;
  54. int i;
  55. /* Trim data segment if necessary. */
  56. length = ip->length - (IPLEN + ip->optlen); /* Length of data portion */
  57. trim_mbuf(bpp,length);
  58. fprintf(fp,"IP: len %u",ip->length);
  59. fprintf(fp," %s",inet_ntoa(ip->source));
  60. fprintf(fp,"->%s ihl %u ttl %u",
  61. inet_ntoa(ip->dest),IPLEN + ip->optlen,ip->ttl);
  62. if(ip->tos != 0)
  63. fprintf(fp," tos %u",ip->tos);
  64. if(ip->offset != 0 || ip->flags.mf)
  65. fprintf(fp," id %u offs %u",ip->id,ip->offset);
  66. if(ip->flags.df)
  67. fprintf(fp," DF");
  68. if(ip->flags.mf){
  69. fprintf(fp," MF");
  70. check = 0; /* Bypass host-level checksum verify */
  71. }
  72. if(ip->flags.congest){
  73. fprintf(fp," CE");
  74. }
  75. if(ip->offset != 0){
  76. putc('n',fp);
  77. return;
  78. }
  79. for(i=0;Iplink[i].proto != 0;i++){
  80. if(Iplink[i].proto == ip->protocol){
  81. fprintf(fp," prot %sn",Iplink[i].name);
  82. (*Iplink[i].dump)(fp,bpp,ip->source,ip->dest,check);
  83. return;
  84. }
  85. }
  86. fprintf(fp," prot %un",ip->protocol);
  87. }
  88. /* Dump a locally sent or received IP datagram to the command interp session */
  89. void
  90. dumpip(iface,ip,bp,spi)
  91. struct iface *iface;
  92. struct ip *ip;
  93. struct mbuf *bp;
  94. int32 spi;
  95. {
  96. struct mbuf *bpp;
  97. if(iface != NULL){
  98. fprintf(Command->output,"ip_recv(%s)",iface->name);
  99. if(spi != 0)
  100. fprintf(Command->output," spi %lx",spi);
  101. fprintf(Command->output,"n");
  102. } else
  103. fprintf(Command->output,"ip_sendn");
  104. dup_p(&bpp,bp,0,len_p(bp));
  105. ipldump(Command->output,ip,&bpp,1);
  106. free_p(&bpp);
  107. fprintf(Command->output,"n");
  108. }