Subversion Repositories Kolibri OS

Rev

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

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