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

TCP/IP协议栈

开发平台:

Visual C++

  1. /* Stuff generic to all Ethernet controllers
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include <stdio.h>
  5. #include "global.h"
  6. #include "mbuf.h"
  7. #include "iface.h"
  8. #include "arp.h"
  9. #include "ip.h"
  10. #include "enet.h"
  11. uint8 Ether_bdcst[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  12. /* Convert Ethernet header in host form to network mbuf */
  13. void
  14. htonether(
  15. struct ether *ether,
  16. struct mbuf **bpp
  17. ){
  18. register uint8 *cp;
  19. if(bpp == NULL)
  20. return;
  21. pushdown(bpp,NULL,ETHERLEN);
  22. cp = (*bpp)->data;
  23. memcpy(cp,ether->dest,EADDR_LEN);
  24. cp += EADDR_LEN;
  25. memcpy(cp,ether->source,EADDR_LEN);
  26. cp += EADDR_LEN;
  27. put16(cp,ether->type);
  28. }
  29. /* Extract Ethernet header */
  30. int
  31. ntohether(
  32. struct ether *ether,
  33. struct mbuf **bpp
  34. ){
  35. pullup(bpp,ether->dest,EADDR_LEN);
  36. pullup(bpp,ether->source,EADDR_LEN);
  37. ether->type = pull16(bpp);
  38. return ETHERLEN;
  39. }
  40. /* Format an Ethernet address into a printable ascii string */
  41. char *
  42. pether(
  43. char *out,
  44. uint8 *addr
  45. ){
  46. sprintf(out,"%02x:%02x:%02x:%02x:%02x:%02x",
  47.  addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
  48. return out;
  49. }
  50. /* Convert an Ethernet address from Hex/ASCII to binary */
  51. int
  52. gether(
  53. register uint8 *out,
  54. register char *cp
  55. ){
  56. register int i;
  57. for(i=6; i!=0; i--){
  58. *out++ = htoi(cp);
  59. if((cp = strchr(cp,':')) == NULL) /* Find delimiter */
  60. break;
  61. cp++; /* and skip over it */
  62. }
  63. return i;
  64. }
  65. /* Send an IP datagram on Ethernet */
  66. int
  67. enet_send(
  68. struct mbuf **bpp, /* Buffer to send */
  69. struct iface *iface, /* Pointer to interface control block */
  70. int32 gateway, /* IP address of next hop */
  71. uint8 tos /* Type of service, not used */
  72. ){
  73. uint8 *egate;
  74. egate = res_arp(iface,ARP_ETHER,gateway,bpp);
  75. if(egate != NULL)
  76. return (*iface->output)(iface,egate,iface->hwaddr,IP_TYPE,bpp);
  77. return 0;
  78. }
  79. /* Send a packet with Ethernet header */
  80. int
  81. enet_output(
  82. struct iface *iface, /* Pointer to interface control block */
  83. uint8 *dest, /* Destination Ethernet address */
  84. uint8 *source, /* Source Ethernet address */
  85. uint16 type, /* Type field */
  86. struct mbuf **bpp /* Data field */
  87. ){
  88. struct ether ep;
  89. memcpy(ep.dest,dest,EADDR_LEN);
  90. memcpy(ep.source,source,EADDR_LEN);
  91. ep.type = type;
  92. htonether(&ep,bpp);
  93. return (*iface->raw)(iface,bpp);
  94. }
  95. /* Process incoming Ethernet packets. Shared by all ethernet drivers. */
  96. void
  97. eproc(
  98. struct iface *iface,
  99. struct mbuf **bpp
  100. ){
  101. struct ether hdr;
  102. /* Remove Ethernet header and kick packet upstairs */
  103. ntohether(&hdr,bpp);
  104. switch(hdr.type){
  105. case REVARP_TYPE:
  106. case ARP_TYPE:
  107. arp_input(iface,bpp);
  108. break;
  109. case IP_TYPE:
  110. ip_route(iface,bpp,hdr.dest[0] & 1);
  111. break;
  112. default:
  113. free_p(bpp);
  114. break;
  115. }
  116. }