PCSED.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:4k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * Ethernet Driver Routines
  3.  *
  4.  *  The TCP code uses Ethernet constants for protocol numbers and 48 bits
  5.  *  for address.  Also, 0xffffffffffff is assumed to be a broadcast.
  6.  *
  7.  *  If you need to write a new driver, implement it at this level and use
  8.  *  the above mentioned constants as this program's constants, not device
  9.  *  dependant constants.
  10.  *
  11.  *  The packet driver code lies below this and really ought to be rewritten
  12.  *  in assembly language.
  13.  *
  14.  *  _eth_addr   - Ethernet address of this host.
  15.  *  _eth_brdcast - Ethernet broadcast address.
  16.  */
  17. #include <copyright.h>
  18. #include <wattcp.h>
  19. #include <ethdev.h>
  20. #include <mem.h>
  21. eth_address _eth_addr; /* local ethernet address */
  22. eth_address _eth_brdcast; /* Ethernet broadcast address */
  23. word _pktdevclass = 1; /* Ethernet = 1, SLIP = 6 */
  24. #ifdef NOTUSED // S. Lawson
  25. /*
  26.  *  Initialize the Ethernet Interface, and this package.  Enable input on
  27.  *  all packet buffers.
  28.  */
  29. void _eth_init(void)
  30. {
  31.     movmem( _pkt_eth_init() , &_eth_addr, 6 );
  32.     memset( &_eth_brdcast, 0xff, sizeof( _eth_brdcast ));
  33. }
  34. #else  // S. Lawson
  35. /*
  36.  *  Initialize the Ethernet Interface, and this package.  Enable input on
  37.  *  all packet buffers.  Return 0 on success.
  38.  */
  39. int _eth_init(void)
  40. {
  41.     eth_address *e;
  42.     e=_pkt_eth_init();
  43.     if (!e) return 1;
  44.     movmem( e, &_eth_addr, 6 );
  45.     memset( &_eth_brdcast, 0xff, sizeof( _eth_brdcast ));
  46.     return 0;
  47. }
  48. #endif   // S. Lawson
  49. /*
  50.  * _eth_FormatPacket places the next packet into the buffer and uses the
  51.  * type field for protocol determination.  Note, I only maintain a single
  52.  * output buffer, and it gets used quickly then released.  The benefits of
  53.  * non-blocking systems are immense.
  54.  */
  55. static struct ether outbuf;
  56. //byte *_eth_formatpacket( void *eth_dest, word eth_type )
  57. byte *_eth_formatpacket( eth_address *eth_dest, word eth_type )    // 94.11.19
  58. {
  59.     memset( &outbuf, 0, sizeof(struct ether));
  60.     switch ( _pktdevclass ) {
  61. case PD_SLIP :
  62.                 return( (byte *) &outbuf );      /* no header */
  63. case PD_ETHER :
  64.    default:             /* should never catch default case */
  65. movmem( eth_dest, outbuf.dest, 6 );
  66.                 movmem( &_eth_addr, outbuf.src, 6 );
  67. outbuf.type = eth_type;
  68.                 return( (byte *)&outbuf.data );
  69.     }
  70. }
  71. /*
  72.  * _eth_send does the actual transmission once we are complete with the
  73.  * buffer.  Do any last minute patches here, like fix the size.
  74.  */
  75. int _eth_send( word len )
  76. {
  77.     if (( _pktdevclass == PD_ETHER ) && ((len += 14) < ETH_MIN ))
  78. len = ETH_MIN;
  79.     return( pkt_send( (char *)&outbuf, len ));   /* send to packet driver */
  80. }
  81. /*
  82.  * _eth_free - free an input buffer once it is no longer needed
  83.  * If pointer to NULL, release all buffers
  84.  */
  85. void _eth_free( void *buf )
  86. {
  87.     if ( buf )
  88. pkt_buf_release( buf );
  89.     else
  90. pkt_buf_wipe();
  91. }
  92. /*
  93.  * _eth_arrived - if a new packet has arrived, read it and fill pointer
  94.  * with type of packet
  95.  */
  96. byte *_eth_arrived( word *type_ptr )
  97. {
  98.     struct ether * temp;
  99.     if ((temp = (struct ether * ) pkt_received()) != NULL ) {
  100. switch ( _pktdevclass ) {
  101.     case PD_ETHER : *type_ptr = temp->type;
  102.     return( temp->data );
  103.     case PD_SLIP  : *type_ptr = 0x008;
  104.     return( (byte *) temp );
  105. }
  106.     }
  107.     return( NULL );
  108. }
  109. /*
  110.  * _eth_release - release the hardware
  111.  */
  112. void _eth_release( void )
  113. {
  114.     pkt_release();
  115. }
  116. /*
  117.  * _eth_hardware - return pointer to hardware address of a packet
  118.  */
  119. void *_eth_hardware( byte *p )
  120. {
  121.     return( p - 8 );
  122. }