forked from KolibriOS/kolibrios
Incoming packets are now handled in separate thread instead of directly by interrupt handler.
git-svn-id: svn://kolibrios.org@3982 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
26381ac6e6
commit
818a0e4636
@ -17,6 +17,7 @@
|
|||||||
$Revision: 3346 $
|
$Revision: 3346 $
|
||||||
|
|
||||||
ETH_FRAME_MINIMUM = 60
|
ETH_FRAME_MINIMUM = 60
|
||||||
|
ETH_QUEUE_SIZE = 255
|
||||||
|
|
||||||
struct ETH_header
|
struct ETH_header
|
||||||
|
|
||||||
@ -32,12 +33,40 @@ struct ETH_DEVICE NET_DEVICE
|
|||||||
|
|
||||||
ends
|
ends
|
||||||
|
|
||||||
|
struct ETH_queue_entry
|
||||||
|
|
||||||
|
device dd ?
|
||||||
|
packet dd ?
|
||||||
|
size dd ?
|
||||||
|
|
||||||
|
ends
|
||||||
|
|
||||||
iglobal
|
iglobal
|
||||||
align 4
|
align 4
|
||||||
|
|
||||||
ETH_BROADCAST dp 0xffffffffffff
|
ETH_BROADCAST dp 0xffffffffffff
|
||||||
endg
|
endg
|
||||||
|
|
||||||
|
uglobal
|
||||||
|
align 4
|
||||||
|
ETH_input_event dd ?
|
||||||
|
ETH_queue rd (ETH_QUEUE_SIZE*sizeof.ETH_queue_entry + sizeof.queue)/4
|
||||||
|
endg
|
||||||
|
|
||||||
|
macro ETH_init {
|
||||||
|
|
||||||
|
init_queue ETH_queue
|
||||||
|
|
||||||
|
movi ebx, 1
|
||||||
|
mov ecx, ETH_process_input
|
||||||
|
call new_sys_threads
|
||||||
|
test eax, eax
|
||||||
|
jns @f
|
||||||
|
DEBUGF DEBUG_NETWORK_ERROR,'K : cannot create kernel thread for ethernet, error %d\n', eax
|
||||||
|
@@:
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
;
|
;
|
||||||
; ETH_input
|
; ETH_input
|
||||||
@ -53,10 +82,62 @@ endg
|
|||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
align 4
|
align 4
|
||||||
ETH_input:
|
ETH_input:
|
||||||
mov eax, [esp]
|
|
||||||
mov ecx, [esp+4]
|
|
||||||
|
|
||||||
DEBUGF DEBUG_NETWORK_VERBOSE,"ETH_input: size=%u\n", ecx
|
push ebx
|
||||||
|
mov esi, esp
|
||||||
|
|
||||||
|
pushf
|
||||||
|
cli
|
||||||
|
add_to_queue ETH_queue, ETH_QUEUE_SIZE, sizeof.ETH_queue_entry, .fail
|
||||||
|
popf
|
||||||
|
|
||||||
|
add esp, sizeof.ETH_queue_entry
|
||||||
|
|
||||||
|
xor edx, edx
|
||||||
|
mov eax, [ETH_input_event]
|
||||||
|
mov ebx, [eax + EVENT.id]
|
||||||
|
xor esi, esi
|
||||||
|
call raise_event
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
.fail:
|
||||||
|
popf
|
||||||
|
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH incoming queue is full, discarding packet!\n"
|
||||||
|
|
||||||
|
add esp, sizeof.ETH_queue_entry - 8
|
||||||
|
call NET_packet_free
|
||||||
|
add esp, 4
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
align 4
|
||||||
|
ETH_process_input:
|
||||||
|
|
||||||
|
xor esi, esi
|
||||||
|
mov ecx, MANUAL_DESTROY
|
||||||
|
call create_event
|
||||||
|
mov [ETH_input_event], eax
|
||||||
|
|
||||||
|
.wait:
|
||||||
|
mov eax, [ETH_input_event]
|
||||||
|
mov ebx, [eax + EVENT.id]
|
||||||
|
call wait_event
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
get_from_queue ETH_queue, ETH_QUEUE_SIZE, sizeof.ETH_queue_entry, .wait
|
||||||
|
|
||||||
|
mov eax, [esi + ETH_queue_entry.packet]
|
||||||
|
mov ecx, [esi + ETH_queue_entry.size]
|
||||||
|
mov ebx, [esi + ETH_queue_entry.device]
|
||||||
|
|
||||||
|
pushd .loop ; return address
|
||||||
|
push ecx eax
|
||||||
|
|
||||||
|
DEBUGF DEBUG_NETWORK_VERBOSE, "ETH_input: size=%u\n", ecx
|
||||||
sub ecx, sizeof.ETH_header
|
sub ecx, sizeof.ETH_header
|
||||||
jb .dump
|
jb .dump
|
||||||
|
|
||||||
|
@ -248,6 +248,8 @@ stack_init:
|
|||||||
mov ecx, (NET_DEVICES_MAX + 2)
|
mov ecx, (NET_DEVICES_MAX + 2)
|
||||||
rep stosd
|
rep stosd
|
||||||
|
|
||||||
|
ETH_init
|
||||||
|
|
||||||
PPPoE_init
|
PPPoE_init
|
||||||
|
|
||||||
IPv4_init
|
IPv4_init
|
||||||
|
Loading…
Reference in New Issue
Block a user