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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* ARP packet tracing routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "arp.h"
  8. #include "netuser.h"
  9. #include "trace.h"
  10. void
  11. arp_dump(fp,bpp)
  12. FILE *fp;
  13. struct mbuf **bpp;
  14. {
  15. struct arp arp;
  16. struct arp_type *at;
  17. int is_ip = 0;
  18. char tmp[25];
  19. if(bpp == NULL || *bpp == NULL)
  20. return;
  21. fprintf(fp,"ARP: len %d",len_p(*bpp));
  22. if(ntoharp(&arp,bpp) == -1){
  23. fprintf(fp," bad packetn");
  24. return;
  25. }
  26. if(arp.hardware < NHWTYPES)
  27. at = &Arp_type[arp.hardware];
  28. else
  29. at = NULL;
  30. /* Print hardware type in Ascii if known, numerically if not */
  31. fprintf(fp," hwtype %s",smsg(Arptypes,NHWTYPES,arp.hardware));
  32. /* Print hardware length only if unknown type, or if it doesn't match
  33.  * the length in the known types table
  34.  */
  35. if(at == NULL || arp.hwalen != at->hwalen)
  36. fprintf(fp," hwlen %u",arp.hwalen);
  37. /* Check for most common case -- upper level protocol is IP */
  38. if(at != NULL && arp.protocol == at->iptype){
  39. fprintf(fp," prot IP");
  40. is_ip = 1;
  41. } else {
  42. fprintf(fp," prot 0x%x prlen %u",arp.protocol,arp.pralen);
  43. }
  44. switch(arp.opcode){
  45. case ARP_REQUEST:
  46. fprintf(fp," op REQUEST");
  47. break;
  48. case ARP_REPLY:
  49. fprintf(fp," op REPLY");
  50. break;
  51. case REVARP_REQUEST:
  52. fprintf(fp," op REVERSE REQUEST");
  53. break;
  54. case REVARP_REPLY:
  55. fprintf(fp," op REVERSE REPLY");
  56. break;
  57. default:
  58. fprintf(fp," op %u",arp.opcode);
  59. break;
  60. }
  61. fprintf(fp,"n");
  62. fprintf(fp,"sender");
  63. if(is_ip)
  64. fprintf(fp," IPaddr %s",inet_ntoa(arp.sprotaddr));
  65. fprintf(fp," hwaddr %sn",at->format(tmp,arp.shwaddr));
  66. fprintf(fp,"target");
  67. if(is_ip)
  68. fprintf(fp," IPaddr %s",inet_ntoa(arp.tprotaddr));
  69. fprintf(fp," hwaddr %sn",at->format(tmp,arp.thwaddr));
  70. }