Rev 2010 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2010 | Rev 2434 | ||
---|---|---|---|
Line 28... | Line 28... | ||
28 | ;; ;; |
28 | ;; ;; |
29 | ;; See file COPYING for details ;; |
29 | ;; See file COPYING for details ;; |
30 | ;; ;; |
30 | ;; ;; |
31 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
31 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 32... | Line 32... | ||
32 | 32 | ||
Line 33... | Line 33... | ||
33 | $Revision: 2010 $ |
33 | $Revision: 2434 $ |
34 | 34 | ||
35 | 35 | ||
36 | ;******************************************************************** |
36 | ;******************************************************************** |
37 | ; Interface |
37 | ; Interface |
38 | ; ethernet_driver called by stack_handler in stack.inc |
38 | ; ethernet_driver called by stack_handler in stack.inc |
Line 39... | Line 39... | ||
39 | ; eth_probe called by app_stack_handler in stack.inc |
39 | ; eth_probe called by app_stack_handler in stack.inc |
40 | ; |
40 | ; |
41 | ;******************************************************************** |
41 | ;******************************************************************** |
Line 42... | Line 42... | ||
42 | 42 | ||
43 | ETHER_IP equ 0x0008 ; Reversed from 0800 for intel |
43 | ETHER_IP equ 0x0008 ; Reversed from 0800 for intel |
44 | ETHER_ARP equ 0x0608 ; Reversed from 0806 for intel |
44 | ETHER_ARP equ 0x0608 ; Reversed from 0806 for intel |
45 | ETHER_RARP equ 0x3580 |
45 | ETHER_RARP equ 0x3580 |
46 | 46 | ||
47 | struc ETH_FRAME |
47 | struc ETH_FRAME |
Line 48... | Line 48... | ||
48 | { .DstMAC dp ? ;destination MAC-address [6 bytes] |
48 | { .DstMAC dp ? ;destination MAC-address [6 bytes] |
49 | .SrcMAC dp ? ;source MAC-address [6 bytes] |
49 | .SrcMAC dp ? ;source MAC-address [6 bytes] |
50 | .Type dw ? ;type of the upper-layer protocol [2 bytes] |
50 | .Type dw ? ;type of the upper-layer protocol [2 bytes] |
Line 115... | Line 115... | ||
115 | ; The last entry must be kept at all zeros, to indicate the end of the list |
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 |
116 | ; As a PCI driver may support more than one hardware implementation, there may |
117 | ; be several lines which refer to the same functions. |
117 | ; be several lines which refer to the same functions. |
118 | ; The first driver found on the PCI bus will be the one used. |
118 | ; The first driver found on the PCI bus will be the one used. |
Line 119... | Line 119... | ||
119 | 119 | ||
Line 120... | Line 120... | ||
120 | PCICARDS_ENTRY_SIZE equ 24 ; Size of each PCICARDS entry |
120 | PCICARDS_ENTRY_SIZE equ 24 ; Size of each PCICARDS entry |
121 | 121 | ||
122 | iglobal |
122 | iglobal |
123 | PCICards: |
123 | PCICards: |
124 | dd 0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
124 | dd 0x12098086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
125 | dd 0x10298086, 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 |
126 | dd 0x12298086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
- | 127 | dd 0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
|
Line 127... | Line 128... | ||
127 | dd 0x10308086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
128 | dd 0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
Line 128... | Line 129... | ||
128 | dd 0x24498086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
129 | dd 0x10688086, I8255x_probe, I8255x_reset, I8255x_poll, I8255x_transmit, 0 |
129 | 130 | ||
130 | dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
131 | dd 0x802910ec, rtl8029_probe, rtl8029_reset, rtl8029_poll, rtl8029_transmit, 0 |
131 | 132 | ||
132 | ;dd 0x813910ec, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
133 | 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 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 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 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 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 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 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 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 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 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 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 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 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 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 0x101202ac, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
Line 147... | Line 148... | ||
147 | ;dd 0x0106018a, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
148 | 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 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 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 | dd 0x8139021b, rtl8139_probe, rtl8139_reset, rtl8139_poll, rtl8139_transmit, rtl8139_cable |
Line 236... | Line 237... | ||
236 | dd 0x0ab310de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested |
237 | 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 | dd 0x0d7d10de, forcedeth_probe, forcedeth_reset, forcedeth_poll, forcedeth_transmit, forcedeth_cable ; not tested |
Line 238... | Line 239... | ||
238 | 239 | ||
Line 239... | Line 240... | ||
239 | dd 0x604017F3, r6040_probe, r6040_reset, r6040_poll, r6040_transmit, 0 |
240 | dd 0x604017F3, r6040_probe, r6040_reset, r6040_poll, r6040_transmit, 0 |
240 | 241 | ||
Line 241... | Line 242... | ||
241 | rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
242 | rb PCICARDS_ENTRY_SIZE ; end of list marker, do not remove |
242 | endg |
243 | endg |
- | 244 | ||
243 | 245 | uglobal |
|
- | 246 | ;Net-stack's interface's settings |
|
244 | uglobal |
247 | node_addr: |
- | 248 | db 0,0,0,0,0,0 |
|
245 | ;Net-stack's interface's settings |
249 | gateway_ip: |
246 | node_addr: db 0,0,0,0,0,0 |
250 | dd 0 |
247 | gateway_ip: dd 0 |
251 | dns_ip: |
- | 252 | dd 0 |
|
- | 253 | ||
248 | dns_ip: dd 0 |
254 | eth_rx_data_len: |
- | 255 | dw 0 |
|
249 | 256 | eth_status: |
|
- | 257 | dd 0 |
|
250 | eth_rx_data_len: dw 0 |
258 | io_addr: |
251 | eth_status: dd 0 |
259 | dd 0 |
- | 260 | hdrtype: |
|
- | 261 | db 0 |
|
252 | io_addr: dd 0 |
262 | vendor_device: |
- | 263 | dd 0 |
|
253 | hdrtype: db 0 |
264 | pci_data: |
- | 265 | dd 0 |
|
254 | vendor_device: dd 0 |
266 | pci_dev: |
Line 255... | Line 267... | ||
255 | pci_data: dd 0 |
267 | dd 0 |
- | 268 | pci_bus: |
|
256 | pci_dev: dd 0 |
269 | dd 0 |
- | 270 | ||
257 | pci_bus: dd 0 |
271 | ; These will hold pointers to the selected driver functions |
- | 272 | drvr_probe: |
|
258 | 273 | dd 0 |
|
259 | ; These will hold pointers to the selected driver functions |
274 | drvr_reset: |
- | 275 | dd 0 |
|
- | 276 | drvr_poll: |
|
260 | drvr_probe: dd 0 |
277 | dd 0 |
Line 261... | Line 278... | ||
261 | drvr_reset: dd 0 |
278 | drvr_transmit: |
Line 262... | Line 279... | ||
262 | drvr_poll: dd 0 |
279 | dd 0 |
- | 280 | drvr_cable: |
|
263 | drvr_transmit: dd 0 |
281 | dd 0 |
- | 282 | ||
264 | drvr_cable: dd 0 |
283 | endg |
265 | 284 | ||
Line 266... | Line 285... | ||
266 | endg |
285 | iglobal |
267 | 286 | broadcast_add: |
|
Line 290... | Line 309... | ||
290 | ;*************************************************************************** |
309 | ;*************************************************************************** |
291 | proc eth_tx stdcall uses ebx esi edi |
310 | proc eth_tx stdcall uses ebx esi edi |
292 | local MACAddress dp ? ;allocate 6 bytes in the stack |
311 | local MACAddress dp ? ;allocate 6 bytes in the stack |
Line 293... | Line 312... | ||
293 | 312 | ||
294 | ; Look for a buffer to tx |
313 | ; Look for a buffer to tx |
295 | mov eax, NET1OUT_QUEUE |
314 | mov eax, NET1OUT_QUEUE |
296 | call dequeue |
315 | call dequeue |
297 | cmp ax, NO_BUFFER |
316 | cmp ax, NO_BUFFER |
Line 298... | Line 317... | ||
298 | je .exit ; Exit if no buffer available |
317 | je .exit ; Exit if no buffer available |
Line 299... | Line 318... | ||
299 | 318 | ||
300 | push eax ;save buffer number |
319 | push eax;save buffer number |
301 | 320 | ||
Line 302... | Line 321... | ||
302 | ; convert buffer pointer eax to the absolute address |
321 | ; convert buffer pointer eax to the absolute address |
303 | imul eax, IPBUFFSIZE |
322 | imul eax, IPBUFFSIZE |
304 | add eax, IPbuffs |
323 | add eax, IPbuffs |
305 | 324 | ||
306 | ; Extract the destination IP |
325 | ; Extract the destination IP |
Line 307... | Line 326... | ||
307 | ; find the destination IP in the ARP table, get MAC |
326 | ; find the destination IP in the ARP table, get MAC |
308 | ; store this MAC in 'MACAddress' |
327 | ; store this MAC in 'MACAddress' |
309 | mov ebx, eax ; Save buffer address |
328 | mov ebx, eax ; Save buffer address |
310 | mov edx, [ebx + 16] ; get destination address |
329 | mov edx, [ebx + 16] ; get destination address |
311 | 330 | ||
312 | ; If the destination address is 255.255.255.255, |
331 | ; If the destination address is 255.255.255.255, |
313 | ; set the MACAddress to all ones ( broadcast ) |
332 | ; set the MACAddress to all ones ( broadcast ) |
314 | cld |
333 | cld |
315 | mov esi, broadcast_add |
334 | mov esi, broadcast_add |
Line 316... | Line 335... | ||
316 | lea edi, [MACAddress] |
335 | lea edi, [MACAddress] |
317 | movsd |
336 | movsd |
Line 318... | Line 337... | ||
318 | movsw |
337 | movsw |
319 | cmp edx, 0xffffffff |
338 | cmp edx, 0xffffffff |
Line 320... | Line 339... | ||
320 | je .send ; If it is broadcast, just send |
339 | je .send ; If it is broadcast, just send |
321 | 340 | ||
322 | lea eax, [MACAddress] ;cause this is local variable |
341 | lea eax, [MACAddress];cause this is local variable |
Line 323... | Line 342... | ||
323 | stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax ;opcode,IP,MAC_ptr - Get the MAC address. |
342 | stdcall arp_table_manager, ARP_TABLE_IP_TO_MAC, edx, eax;opcode,IP,MAC_ptr - Get the MAC address. |
324 | 343 | ||
325 | cmp eax, ARP_VALID_MAPPING |
344 | cmp eax, ARP_VALID_MAPPING |
326 | je .send |
345 | je .send |
327 | 346 | ||
328 | ; No valid entry. Has the request been sent, but timed out? |
347 | ; No valid entry. Has the request been sent, but timed out? |
Line 329... | Line 348... | ||
329 | cmp eax, ARP_RESPONSE_TIMEOUT |
348 | cmp eax, ARP_RESPONSE_TIMEOUT |
330 | je .freebuf |
349 | je .freebuf |
331 | 350 | ||
332 | .wait_response: ;we wait arp-response |
351 | .wait_response: ;we wait arp-response |
333 | ; Re-queue the packet, and exit |
352 | ; Re-queue the packet, and exit |
334 | pop ebx |
353 | pop ebx |
335 | mov eax, NET1OUT_QUEUE |
354 | mov eax, NET1OUT_QUEUE |
336 | call queue ; Get the buffer back |
355 | call queue ; Get the buffer back |
337 | jmp .exit |
356 | jmp .exit |
Line 338... | Line 357... | ||
338 | 357 | ||
339 | .send: ;if ARP_VALID_MAPPING then send the packet |
358 | .send: ;if ARP_VALID_MAPPING then send the packet |
Line 340... | Line 359... | ||
340 | lea edi, [MACAddress] ; Pointer to 48 bit destination address |
359 | lea edi, [MACAddress] ; Pointer to 48 bit destination address |
341 | movzx ecx, word[ebx+2] ; Size of IP packet to send |
360 | movzx ecx, word[ebx+2] ; Size of IP packet to send |
342 | xchg ch, cl ; because mirror byte-order |
361 | xchg ch, cl ; because mirror byte-order |
343 | mov esi, ebx ; Pointer to packet data |
362 | mov esi, ebx ; Pointer to packet data |
Line 344... | Line 363... | ||
344 | mov bx, ETHER_IP ; Type of packet |
363 | mov bx, ETHER_IP ; Type of packet |
345 | push ebp |
364 | push ebp |
346 | call dword [drvr_transmit] ; Call the drivers transmit function |
365 | call dword [drvr_transmit]; Call the drivers transmit function |
Line 347... | Line 366... | ||
347 | pop ebp |
366 | pop ebp |
348 | 367 | ||
349 | ; OK, we have sent a packet, so increment the count |
368 | ; OK, we have sent a packet, so increment the count |
Line 374... | Line 393... | ||
374 | ;*************************************************************************** |
393 | ;*************************************************************************** |
375 | ;uglobal |
394 | ;uglobal |
376 | ; ether_IP_handler_cnt dd ? |
395 | ; ether_IP_handler_cnt dd ? |
377 | ;endg |
396 | ;endg |
378 | ether_IP_handler: |
397 | ether_IP_handler: |
379 | mov eax, EMPTY_QUEUE |
398 | mov eax, EMPTY_QUEUE |
380 | call dequeue |
399 | call dequeue |
381 | cmp ax, NO_BUFFER |
400 | cmp ax, NO_BUFFER |
382 | je eiph00x |
401 | je eiph00x |
Line 383... | Line 402... | ||
383 | 402 | ||
384 | ; convert buffer pointer eax to the absolute address |
403 | ; convert buffer pointer eax to the absolute address |
385 | push eax |
404 | push eax |
386 | mov ecx, IPBUFFSIZE |
405 | mov ecx, IPBUFFSIZE |
387 | mul ecx |
406 | mul ecx |
Line 388... | Line 407... | ||
388 | add eax, IPbuffs |
407 | add eax, IPbuffs |
Line 389... | Line 408... | ||
389 | 408 | ||
390 | mov edi, eax |
409 | mov edi, eax |
Line 391... | Line 410... | ||
391 | 410 | ||
392 | ; get a pointer to the start of the DATA |
411 | ; get a pointer to the start of the DATA |
393 | mov esi, ETH_FRAME.Data |
412 | mov esi, ETH_FRAME.Data |
394 | 413 | ||
395 | ; Now store it all away |
414 | ; Now store it all away |
Line 396... | Line 415... | ||
396 | mov ecx, IPBUFFSIZE / 4 ; Copy all of the available |
415 | mov ecx, IPBUFFSIZE / 4 ; Copy all of the available |
397 | ; data across - worse case |
416 | ; data across - worse case |
Line 398... | Line 417... | ||
398 | cld |
417 | cld |
399 | rep movsd |
418 | rep movsd |
400 | 419 | ||
401 | ; inc [ether_IP_handler_cnt] |
420 | ; inc [ether_IP_handler_cnt] |
Line 402... | Line 421... | ||
402 | ; DEBUGF 1, "K : ether_IP_handler (%u)\n", [ether_IP_handler_cnt] |
421 | ; DEBUGF 1, "K : ether_IP_handler (%u)\n", [ether_IP_handler_cnt] |
403 | 422 | ||
Line 404... | Line 423... | ||
404 | ; And finally, place the buffer in the IPRX queue |
423 | ; And finally, place the buffer in the IPRX queue |
405 | pop ebx |
424 | pop ebx |
406 | mov eax, IPIN_QUEUE |
425 | mov eax, IPIN_QUEUE |
407 | call queue |
426 | call queue |
Line 421... | Line 440... | ||
421 | ; |
440 | ; |
422 | ; eax is 0 if no hardware found |
441 | ; eax is 0 if no hardware found |
423 | ;*************************************************************************** |
442 | ;*************************************************************************** |
424 | eth_probe: |
443 | eth_probe: |
425 | ; Find a card on the PCI bus, and get it's address |
444 | ; Find a card on the PCI bus, and get it's address |
426 | call scan_bus ; Find the ethernet cards PIC address |
445 | call scan_bus ; Find the ethernet cards PIC address |
427 | xor eax, eax |
446 | xor eax, eax |
428 | cmp [io_addr], eax |
447 | cmp [io_addr], eax |
429 | je ep_00x ; Return 0 in eax if no cards found |
448 | je ep_00x ; Return 0 in eax if no cards found |
Line 430... | Line 449... | ||
430 | 449 | ||
Line 431... | Line 450... | ||
431 | call dword [drvr_probe] ; Call the drivers probe function |
450 | call dword [drvr_probe] ; Call the drivers probe function |
Line 432... | Line 451... | ||
432 | 451 | ||
433 | mov eax, [io_addr] ; return a non zero value |
452 | mov eax, [io_addr] ; return a non zero value |
Line 434... | Line 453... | ||
434 | 453 | ||
435 | ep_00x: |
454 | ep_00x: |
436 | ret |
455 | ret |
437 | 456 | ||
Line 444... | Line 463... | ||
444 | ; This is a kernel function, called by stack_handler |
463 | ; This is a kernel function, called by stack_handler |
445 | ; |
464 | ; |
446 | ;*************************************************************************** |
465 | ;*************************************************************************** |
447 | ethernet_driver: |
466 | ethernet_driver: |
448 | ; Do nothing if the driver is inactive |
467 | ; Do nothing if the driver is inactive |
449 | cmp [ethernet_active], byte 0 |
468 | cmp [ethernet_active], byte 0 |
450 | je eth_exit |
469 | je eth_exit |
Line 451... | Line 470... | ||
451 | 470 | ||
452 | call eth_rx |
471 | call eth_rx |
Line 453... | Line 472... | ||
453 | call eth_tx |
472 | call eth_tx |
454 | 473 | ||
Line 455... | Line 474... | ||
455 | eth_exit: |
474 | eth_exit: |
456 | ret |
475 | ret |
457 | 476 | ||
458 | ;*************************************************************************** |
477 | ;*************************************************************************** |
Line 466... | Line 485... | ||
466 | ; being tx'ed |
485 | ; being tx'ed |
467 | ; IP : Store in an IP buffer |
486 | ; IP : Store in an IP buffer |
468 | ; |
487 | ; |
469 | ;*************************************************************************** |
488 | ;*************************************************************************** |
470 | eth_rx: |
489 | eth_rx: |
471 | xor ax, ax |
490 | xor ax, ax |
472 | mov [eth_rx_data_len], ax |
491 | mov [eth_rx_data_len], ax |
473 | call dword [drvr_poll] ; Call the drivers poll function |
492 | call dword [drvr_poll] ; Call the drivers poll function |
474 | 493 | ||
475 | mov ax, [eth_rx_data_len] |
494 | mov ax, [eth_rx_data_len] |
476 | cmp ax, 0 |
495 | cmp ax, 0 |
477 | je .exit |
496 | je .exit |
Line 478... | Line 497... | ||
478 | 497 | ||
Line 479... | Line 498... | ||
479 | 498 | ||
Line 480... | Line 499... | ||
480 | ; Check the protocol. Call appropriate handler |
499 | ; Check the protocol. Call appropriate handler |
481 | 500 | ||
Line 482... | Line 501... | ||
482 | mov ax, [ETH_FRAME.Type] ; The address of the protocol word |
501 | mov ax, [ETH_FRAME.Type]; The address of the protocol word |
483 | 502 | ||
Line 484... | Line 503... | ||
484 | cmp ax, ETHER_IP |
503 | cmp ax, ETHER_IP |
485 | je .is_ip ; It's IP |
504 | je .is_ip ; It's IP |
486 | 505 | ||
Line 487... | Line 506... | ||
487 | cmp ax, ETHER_ARP |
506 | cmp ax, ETHER_ARP |
488 | je .is_arp ; It is ARP |
507 | je .is_arp ; It is ARP |
489 | 508 | ||
490 | DEBUGF 1,"K : eth_rx - dumped (%u)\n", ax |
509 | DEBUGF 1,"K : eth_rx - dumped (%u)\n", ax |
491 | inc [dumped_rx_count] |
510 | inc [dumped_rx_count] |
Line 492... | Line 511... | ||
492 | jmp .exit ; If not IP or ARP, ignore |
511 | jmp .exit ; If not IP or ARP, ignore |
493 | 512 | ||
494 | .is_ip: |
513 | .is_ip: |
495 | ; DEBUGF 1,"K : eth_rx - IP packet\n" |
514 | ; DEBUGF 1,"K : eth_rx - IP packet\n" |
Line 496... | Line 515... | ||
496 | inc dword [ip_rx_count] |
515 | inc dword [ip_rx_count] |
497 | call ether_IP_handler |
516 | call ether_IP_handler |