Subversion Repositories Kolibri OS

Rev

Rev 1887 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                                 ;;
  3. ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved.    ;;
  4. ;; Distributed under terms of the GNU General Public License       ;;
  5. ;;                                                                 ;;
  6. ;;  ETHERNET.INC                                                   ;;
  7. ;;                                                                 ;;
  8. ;;  Ethernet network layer for Menuet OS                           ;;
  9. ;;                                                                 ;;
  10. ;;  This file contains the following:                              ;;
  11. ;;      PCI bus scanning for valid devices                         ;;
  12. ;;      Table of supported ethernet drivers                        ;;
  13. ;;      Code to identify and activate a supported driver           ;;
  14. ;;      ARP handler                                                ;;
  15. ;;      Driver interface to the IP layer                           ;;
  16. ;;      Gateway support                                            ;;
  17. ;;                                                                 ;;
  18. ;;  Individual driver files are included here                      ;;
  19. ;;                                                                 ;;
  20. ;;  The PCI bus scanning code was ported from the etherboot        ;;
  21. ;;  5.0.6 project. The copyright statement for that code is        ;;
  22. ;;                                                                 ;;
  23. ;;          GNU GENERAL PUBLIC LICENSE                             ;;
  24. ;;             Version 2, June 1991                                ;;
  25. ;;                                                                 ;;
  26. ;;  remaining parts Copyright 2002 Mike Hibbett                    ;;
  27. ;;   mikeh@oceanfree.net                                           ;;
  28. ;;                                                                 ;;
  29. ;;  See file COPYING for details                                   ;;
  30. ;;                                                                 ;;
  31. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  32.  
  33. $Revision: 2288 $
  34.  
  35.  
  36. ;********************************************************************
  37. ;   Interface
  38. ;      ethernet_driver   called by stack_handler in stack.inc
  39. ;      eth_probe         called by app_stack_handler in stack.inc
  40. ;
  41. ;********************************************************************
  42.  
  43. ETHER_IP                    equ     0x0008      ; Reversed from 0800 for intel
  44. ETHER_ARP                   equ     0x0608      ; Reversed from 0806 for intel
  45. ETHER_RARP                  equ     0x3580
  46.  
  47. struc ETH_FRAME
  48. {  .DstMAC       dp   ?  ;destination MAC-address [6 bytes]
  49.    .SrcMAC       dp   ?  ;source MAC-address [6 bytes]
  50.    .Type         dw   ?  ;type of the upper-layer protocol [2 bytes]
  51.    .Data         db   ?  ;data [46-1500 bytes]
  52.  }
  53.  
  54. virtual at Ether_buffer
  55.   ETH_FRAME ETH_FRAME
  56. end virtual
  57.  
  58.  
  59. ; Some useful information on data structures
  60.  
  61. ;     Ethernet Packet - ARP Request example
  62. ;
  63. ;   0                   1                   2                   3
  64. ;   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  65. ;
  66. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  67. ;   |       Dest   H/W Address                                      |
  68. ;   |                    ( 14 byte header )                         |
  69. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  70. ;   |                               |     Source     H/W Address    |
  71. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  72. ;   |                                                               |
  73. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  74. ;   |    Protocol - ARP 08  06      |
  75. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  76.  
  77. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  78. ;   |  H/W Type  00           01    |  Protocol Type   08 00        |
  79. ;   |                   ( ARP Request packet )                      |
  80. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  81. ;   | HLen    0x06  | PLen    0x04  |    OpCode        00   01      |
  82. ;   |               ( 0001 for request, 0002 for reply )            |
  83. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  84. ;   | Source Hardware Address ( MAC Address )                       |
  85. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  86. ;   |                               |  Source IP Address            |
  87. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  88. ;   |                               | Destination Hardware Address  |
  89. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  90. ;   |                                                               |
  91. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  92. ;   | Destination IP Address                                        |
  93. ;   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  94.  
  95. ; Include individual drivers source files at this point.
  96. ; If you create a new driver, include it below.
  97.  
  98. include "drivers/rtl8029.inc"
  99. include "drivers/i8255x.inc"
  100. include "drivers/rtl8139.inc"
  101. include "drivers/3c59x.inc"
  102. include "drivers/sis900.inc"
  103. include "drivers/pcnet32.inc"
  104. include "drivers/rtl8169.inc"
  105. include "drivers/forcedeth.inc"
  106. include "drivers/r6040.inc"
  107.  
  108. ; PCICards
  109. ; ========
  110. ; PCI vendor and hardware types for hardware supported by the above drivers
  111. ; If you add a driver, ensure you update this datastructure, otherwise the
  112. ; card will not be probed.
  113. ; Each driver is defined by 4 double words. These are
  114. ;   PCIVendorDevice  probeFunction ResetFunction PollFunction transmitFunction
  115. ; The last entry must be kept at all zeros, to indicate the end of the list
  116. ; As a PCI driver may support more than one hardware implementation, there may
  117. ; be several lines which refer to the same functions.
  118. ; The first driver found on the PCI bus will be the one used.
  119.  
  120. PCICARDS_ENTRY_SIZE         equ     24    ; Size of each PCICARDS entry
  121.  
  122. iglobal
  123. PCICards:
  124. dd  0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
  125. dd  0x10298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
  126. dd  0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
  127. dd  0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
  128. dd  0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0
  129.  
  130. dd  0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0
  131.  
  132. ;dd  0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  133. ;dd  0x813810ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  134. ;dd  0x12111113, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  135. ;dd  0x13601500, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  136. ;dd  0x13604033, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  137. ;dd  0x13001186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  138. ;dd  0x13401186, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  139. ;dd  0xab0613d1, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  140. ;dd  0xa1171259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  141. ;dd  0xa11e1259, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  142. ;dd  0xab0614ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  143. ;dd  0xab0714ea, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  144. ;dd  0x123411db, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  145. ;dd  0x91301432, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  146. ;dd  0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  147. ;dd  0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  148. ;dd  0x1211126c, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  149. ;dd  0x81391743, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  150. ;dd  0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable
  151.  
  152. dd  0x816810ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
  153. dd  0x816910ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
  154. dd  0x011616ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
  155. dd  0x43001186, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
  156. dd  0x816710ec, rtl8169_probe, rtl8169_reset, rtl8169_poll, rtl8169_transmit, 0
  157.  
  158. dd  0x590010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  159. dd  0x592010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  160. dd  0x597010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  161. dd  0x595010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  162. dd  0x595110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  163. dd  0x595210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  164. dd  0x900010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  165. dd  0x900110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  166. dd  0x900410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  167. dd  0x900510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  168. dd  0x900610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  169. dd  0x900A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  170. dd  0x905010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  171. dd  0x905110b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  172. dd  0x905510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  173. dd  0x905810b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  174. dd  0x905A10b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  175. dd  0x920010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  176. dd  0x980010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  177. dd  0x980510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  178. dd  0x764610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  179. dd  0x505510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  180. dd  0x605510b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  181. dd  0x605610b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  182. dd  0x5b5710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  183. dd  0x505710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  184. dd  0x515710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  185. dd  0x525710b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  186. dd  0x656010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  187. dd  0x656210b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  188. dd  0x656410b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  189. dd  0x450010b7, e3c59x_probe, e3c59x_reset, e3c59x_poll, e3c59x_transmit, 0
  190.  
  191. dd  0x09001039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
  192. dd  0x70161039, SIS900_probe, SIS900_reset, SIS900_poll, SIS900_transmit, 0
  193.  
  194. dd  0x20001022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
  195. dd  0x26251022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
  196. dd  0x20011022, pcnet32_probe, pcnet32_reset, pcnet32_poll, pcnet32_xmit, 0
  197.  
  198. dd  0x006610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; nVidia Corporation nForce2 Ethernet Controller
  199. dd  0x01c310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  200. dd  0x00D610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  201. dd  0x008610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  202. dd  0x008c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  203. dd  0x00e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  204. dd  0x00df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  205. dd  0x005610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  206. dd  0x005710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  207. dd  0x003710de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  208. dd  0x003810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  209. dd  0x026810de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  210. dd  0x026910de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  211. dd  0x037210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  212. dd  0x037310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  213. dd  0x03e510de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  214. dd  0x03e610de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  215. dd  0x03ee10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  216. dd  0x03ef10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  217. dd  0x045010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  218. dd  0x045110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  219. dd  0x045210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  220. dd  0x045310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  221. dd  0x054c10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  222. dd  0x054d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  223. dd  0x054e10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  224. dd  0x054f10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  225. dd  0x07dc10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  226. dd  0x07dd10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  227. dd  0x07de10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  228. dd  0x07df10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  229. dd  0x076010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; MCP77 Ethernet Controller
  230. dd  0x076110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  231. dd  0x076210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  232. dd  0x076310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  233. dd  0x0ab010de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  234. dd  0x0ab110de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  235. dd  0x0ab210de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  236. dd  0x0ab310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  237. dd  0x0d7d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested
  238.  
  239. dd  0x604017F3, r6040_probe, r6040_reset, r6040_poll, r6040_transmit, 0
  240.  
  241. rb PCICARDS_ENTRY_SIZE  ; end of list marker, do not remove
  242. endg
  243.  
  244. uglobal
  245. ;Net-stack's interface's settings
  246.   node_addr:
  247.                       db  0,0,0,0,0,0
  248.   gateway_ip:
  249.                       dd  0
  250.   dns_ip:
  251.                       dd  0
  252.  
  253.   eth_rx_data_len:
  254.                       dw  0
  255.   eth_status:
  256.                       dd  0
  257.   io_addr:
  258.                       dd  0
  259.   hdrtype:
  260.                       db  0
  261.   vendor_device:
  262.                       dd  0
  263.   pci_data:
  264.                       dd  0
  265.   pci_dev:
  266.                       dd  0
  267.   pci_bus:
  268.                       dd  0
  269.  
  270.   ; These will hold pointers to the selected driver functions
  271.   drvr_probe:
  272.                       dd  0
  273.   drvr_reset:
  274.                       dd  0
  275.   drvr_poll:
  276.                       dd  0
  277.   drvr_transmit:
  278.                       dd  0
  279.   drvr_cable:
  280.                       dd  0
  281.  
  282. endg
  283.  
  284. iglobal
  285.   broadcast_add:
  286.                       db  0xff,0xff,0xff,0xff,0xff,0xff
  287.   subnet_mask:
  288.                       dd  0x00ffffff   ; 255.255.255.0
  289. endg
  290.  
  291. include "arp.inc"    ;arp-protocol functions
  292. include "pci.inc"    ;PCI bus access functions
  293.  
  294.  
  295. ;***************************************************************************
  296. ;   Function
  297. ;      eth_tx
  298. ;
  299. ;   Description
  300. ;      Looks at the NET1OUT_QUEUE for data to send.
  301. ;      Stores that destination IP in a location used by the tx routine
  302. ;      Looks up the MAC address in the ARP table; stores that where
  303. ;      the tx routine can get it
  304. ;      Get the length of the data. Store that where the tx routine wants it
  305. ;      Call tx
  306. ;      Places buffer on empty queue when the tx routine finished
  307. ;
  308. ;***************************************************************************
  309. proc eth_tx stdcall uses ebx esi edi
  310. local MACAddress  dp  ?  ;allocate 6 bytes in the stack
  311.  
  312.     ; Look for a buffer to tx
  313.         mov     eax, NET1OUT_QUEUE
  314.         call    dequeue
  315.         cmp     ax, NO_BUFFER
  316.         je      .exit        ; Exit if no buffer available
  317.  
  318.         push    eax;save buffer number
  319.  
  320.     ; convert buffer pointer eax to the absolute address
  321.         imul    eax, IPBUFFSIZE
  322.         add     eax, IPbuffs
  323.  
  324.     ; Extract the destination IP
  325.     ; find the destination IP in the ARP table, get MAC
  326.     ; store this MAC in 'MACAddress'
  327.         mov     ebx, eax           ; Save buffer address
  328.         mov     edx, [ebx + 16]    ; get destination address
  329.  
  330.     ; If the destination address is 255.255.255.255,
  331.     ; set the MACAddress to all ones ( broadcast )
  332.         cld
  333.         mov     esi, broadcast_add
  334.         lea     edi, [MACAddress]
  335.         movsd
  336.         movsw
  337.         cmp     edx, 0xffffffff
  338.         je      .send            ; If it is broadcast, just send
  339.  
  340.         lea     eax, [MACAddress];cause this is local variable
  341.         stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax;opcode,IP,MAC_ptr - Get the MAC address.
  342.  
  343.         cmp     eax, ARP_VALID_MAPPING
  344.         je      .send
  345.  
  346.     ; No valid entry. Has the request been sent, but timed out?
  347.         cmp     eax, ARP_RESPONSE_TIMEOUT
  348.         je      .freebuf
  349.  
  350.   .wait_response:                   ;we wait arp-response
  351.                                     ; Re-queue the packet, and exit
  352.         pop     ebx
  353.         mov     eax, NET1OUT_QUEUE
  354.         call    queue                    ; Get the buffer back
  355.         jmp     .exit
  356.  
  357.   .send:    ;if ARP_VALID_MAPPING then send the packet
  358.         lea     edi, [MACAddress] ; Pointer to 48 bit destination address
  359.         movzx   ecx, word[ebx+2]  ; Size of IP packet to send
  360.         xchg    ch, cl            ; because mirror byte-order
  361.         mov     esi, ebx          ; Pointer to packet data
  362.         mov     bx, ETHER_IP      ; Type of packet
  363.         push    ebp
  364.         call    dword [drvr_transmit]; Call the drivers transmit function
  365.         pop     ebp
  366.  
  367.     ; OK, we have sent a packet, so increment the count
  368.         inc     dword [ip_tx_count]
  369.  
  370.     ; And finally, return the buffer to the free queue
  371.   .freebuf:
  372.         pop     eax
  373.         call    freeBuff
  374.  
  375.   .exit:
  376.         ret
  377. endp
  378.  
  379. ;***************************************************************************
  380. ;   Function
  381. ;      ether_IP_handler
  382. ;
  383. ;   Description
  384. ;      Called when an IP ethernet packet is received on the ethernet
  385. ;      Header + Data is in Ether_buffer[]
  386. ;      We just need to get a buffer from the 'free' queue, and
  387. ;      store the packet in it, then insert the packet number into the
  388. ;      IPRX queue.
  389. ;      If no queue entry is available, the packet is silently discarded
  390. ;      All registers may be destroyed
  391. ;
  392. ;***************************************************************************
  393. ;uglobal
  394. ;  ether_IP_handler_cnt dd ?
  395. ;endg
  396. ether_IP_handler:
  397.         mov     eax, EMPTY_QUEUE
  398.         call    dequeue
  399.         cmp     ax, NO_BUFFER
  400.         je      eiph00x
  401.  
  402.     ; convert buffer pointer eax to the absolute address
  403.         push    eax
  404.         mov     ecx, IPBUFFSIZE
  405.         mul     ecx
  406.         add     eax, IPbuffs
  407.  
  408.         mov     edi, eax
  409.  
  410.     ; get a pointer to the start of the DATA
  411.         mov     esi, ETH_FRAME.Data
  412.  
  413.     ; Now store it all away
  414.         mov     ecx, IPBUFFSIZE / 4 ; Copy all of the available
  415.                               ; data across - worse case
  416.         cld
  417.         rep movsd
  418.  
  419. ;        inc     [ether_IP_handler_cnt]
  420. ;        DEBUGF  1, "K : ether_IP_handler (%u)\n", [ether_IP_handler_cnt]
  421.  
  422.     ; And finally, place the buffer in the IPRX queue
  423.         pop     ebx
  424.         mov     eax, IPIN_QUEUE
  425.         call    queue
  426.  
  427. eiph00x:
  428.         ret
  429.  
  430. ;***************************************************************************
  431. ;   Function
  432. ;      eth_probe
  433. ;   Description
  434. ;      Searches for an ethernet card. If found, the card is enabled and
  435. ;      the ethernet -> IP link established
  436. ;
  437. ;      This function scans the PCI bus looking for a supported device.
  438. ;      ISA bus is currently not supported.
  439. ;
  440. ;        eax is 0 if no hardware found
  441. ;***************************************************************************
  442. eth_probe:
  443.     ; Find a card on the PCI bus, and get it's address
  444.         call    scan_bus                ; Find the ethernet cards PIC address
  445.         xor     eax, eax
  446.         cmp     [io_addr], eax
  447.         je      ep_00x                  ; Return 0 in eax if no cards found
  448.  
  449.         call    dword [drvr_probe]      ; Call the drivers probe function
  450.  
  451.         mov     eax, [io_addr]          ; return a non zero value
  452.  
  453. ep_00x:
  454.         ret
  455.  
  456. ;***************************************************************************
  457. ;   Function
  458. ;      ethernet_driver
  459. ;
  460. ;   Description
  461. ;       The ethernet RX and TX handler
  462. ;       This is a kernel function, called by stack_handler
  463. ;
  464. ;***************************************************************************
  465. ethernet_driver:
  466.     ; Do nothing if the driver is inactive
  467.         cmp     [ethernet_active], byte 0
  468.         je      eth_exit
  469.  
  470.         call    eth_rx
  471.         call    eth_tx
  472.  
  473. eth_exit:
  474.         ret
  475.  
  476. ;***************************************************************************
  477. ;   Function
  478. ;      eth_rx
  479. ;
  480. ;   Description
  481. ;      Polls the ethernet card for received data. Extracts if present
  482. ;       Depending on the Protocol within the packet:
  483. ;         ARP : Pass to ARP_handler. This may result in an ARP reply
  484. ;               being tx'ed
  485. ;         IP  : Store in an IP buffer
  486. ;
  487. ;***************************************************************************
  488. eth_rx:
  489.         xor     ax, ax
  490.         mov     [eth_rx_data_len], ax
  491.         call    dword [drvr_poll]   ; Call the drivers poll function
  492.  
  493.         mov     ax, [eth_rx_data_len]
  494.         cmp     ax, 0
  495.         je      .exit
  496.  
  497.  
  498.     ; Check the protocol. Call appropriate handler
  499.  
  500.         mov     ax, [ETH_FRAME.Type]; The address of the protocol word
  501.  
  502.         cmp     ax, ETHER_IP
  503.         je      .is_ip               ; It's IP
  504.  
  505.         cmp     ax, ETHER_ARP
  506.         je      .is_arp              ; It is ARP
  507.  
  508.     DEBUGF  1,"K : eth_rx - dumped (%u)\n", ax
  509.         inc     [dumped_rx_count]
  510.         jmp     .exit           ; If not IP or ARP, ignore
  511.  
  512.   .is_ip:
  513. ;    DEBUGF  1,"K : eth_rx - IP packet\n"
  514.         inc     dword [ip_rx_count]
  515.         call    ether_IP_handler
  516.         jmp     .exit
  517.  
  518.   .is_arp:
  519. ;    DEBUGF  1,"K : eth_rx - ARP packet\n"
  520.     ; At this point, the packet is still in the Ether_buffer
  521.         call    arp_handler
  522.  
  523.   .exit:
  524.         ret
  525.