Subversion Repositories Kolibri OS

Rev

Rev 1887 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 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