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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* ARP header conversion routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "arp.h"
  7. /* Copy a host format arp structure into mbuf for transmission */
  8. struct mbuf *
  9. htonarp(arp)
  10. register struct arp *arp;
  11. {
  12. struct mbuf *bp;
  13. register uint8 *buf;
  14. if(arp == (struct arp *)NULL)
  15. return NULL;
  16. bp = ambufw(ARPLEN + 2 * arp->hwalen);
  17. buf = bp->data;
  18. buf = put16(buf,arp->hardware);
  19. buf = put16(buf,arp->protocol);
  20. *buf++ = arp->hwalen;
  21. *buf++ = arp->pralen;
  22. buf = put16(buf,arp->opcode);
  23. memcpy(buf,arp->shwaddr,(uint16)arp->hwalen);
  24. buf += arp->hwalen;
  25. buf = put32(buf,arp->sprotaddr);
  26. memcpy(buf,arp->thwaddr,(uint16)arp->hwalen);
  27. buf += arp->hwalen;
  28. buf = put32(buf,arp->tprotaddr);
  29. bp->cnt = buf - bp->data;
  30. return bp;
  31. }
  32. /* Convert an incoming ARP packet into a host-format structure */
  33. int
  34. ntoharp(
  35. struct arp *arp,
  36. struct mbuf **bpp
  37. ){
  38. if(arp == (struct arp *)NULL || bpp == NULL)
  39. return -1;
  40. arp->hardware = pull16(bpp);
  41. arp->protocol = pull16(bpp);
  42. arp->hwalen = PULLCHAR(bpp);
  43. arp->pralen = PULLCHAR(bpp);
  44. arp->opcode = pull16(bpp);
  45. pullup(bpp,arp->shwaddr,(uint16)arp->hwalen);
  46. arp->sprotaddr = pull32(bpp);
  47. pullup(bpp,arp->thwaddr,(uint16)arp->hwalen);
  48. arp->tprotaddr = pull32(bpp);
  49. /* Get rid of anything left over */
  50. free_p(bpp);
  51. return 0;
  52. }