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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Stuff generic to all ARCnet controllers
  2.  * Copyright 1990 Russ Nelson
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "iface.h"
  8. #include "timer.h"
  9. #include "arp.h"
  10. #include "ip.h"
  11. #include "arcnet.h"
  12. uint8 ARC_bdcst[] = { 0 };
  13. /* Convert ARCnet header in host form to network mbuf */
  14. void
  15. htonarc(
  16. struct arc *arc,
  17. struct mbuf **bpp
  18. ){
  19. register uint8 *cp;
  20. pushdown(bpp,NULL,ARCLEN);
  21. cp = (*bpp)->data;
  22. memcpy(cp,arc->source,AADDR_LEN);
  23. cp += AADDR_LEN;
  24. memcpy(cp,arc->dest,AADDR_LEN);
  25. cp += AADDR_LEN;
  26. *cp++ = arc->type;
  27. }
  28. /* Extract ARCnet header */
  29. int
  30. ntoharc(arc,bpp)
  31. struct arc *arc;
  32. struct mbuf **bpp;
  33. {
  34. pullup(bpp,arc->source,AADDR_LEN);
  35. pullup(bpp,arc->dest,AADDR_LEN);
  36. arc->type = PULLCHAR(bpp);
  37. return ARCLEN;
  38. }
  39. /* Format an ARCnet address into a printable ascii string */
  40. char *
  41. parc(out,addr)
  42. char *out;
  43. uint8 *addr;
  44. {
  45. sprintf(out,"%02x", addr[0]);
  46. return  out;
  47. }
  48. /* Convert an ARCnet address from Hex/ASCII to binary */
  49. int
  50. garc(out,cp)
  51. register uint8 *out;
  52. register char *cp;
  53. {
  54. *out = htoi(cp);
  55. return 0;
  56. }
  57. /* Send an IP datagram on ARCnet */
  58. int
  59. anet_send(
  60. struct mbuf **bpp, /* Buffer to send */
  61. struct iface *iface, /* Pointer to interface control block */
  62. int32 gateway, /* IP address of next hop */
  63. uint8 tos
  64. ){
  65. uint8 *agate;
  66. agate = res_arp(iface,ARP_ARCNET,gateway,bpp);
  67. if(agate != NULL)
  68. return (*iface->output)(iface,agate,iface->hwaddr,ARC_IP,bpp);
  69. return 0;
  70. }
  71. /* Send a packet with ARCnet header */
  72. int
  73. anet_output(
  74. struct iface *iface, /* Pointer to interface control block */
  75. uint8 *dest, /* Destination ARCnet address */
  76. uint8 *source, /* Source ARCnet address */
  77. uint16 type, /* Type field */
  78. struct mbuf **data /* Data field */
  79. ){
  80. struct arc ap;
  81. memcpy(ap.dest,dest,AADDR_LEN);
  82. memcpy(ap.source,source,AADDR_LEN);
  83. ap.type = type;
  84. htonarc(&ap,data);
  85. return (*iface->raw)(iface,data);
  86. }
  87. /* Process incoming ARCnet packets. Shared by all ARCnet drivers. */
  88. void
  89. aproc(
  90. struct iface *iface,
  91. struct mbuf **bpp
  92. ){
  93. struct arc hdr;
  94. /* Remove ARCnet header and kick packet upstairs */
  95. ntoharc(&hdr,bpp);
  96. switch(hdr.type){
  97. case ARC_ARP:
  98. arp_input(iface,bpp);
  99. break;
  100. case ARC_IP:
  101. ip_route(iface,bpp,0);
  102. break;
  103. default:
  104. free_p(bpp);
  105. break;
  106. }
  107. }