forked from KolibriOS/kolibrios
ARP_IP_to_MAC no longer blocks. Updated SOCKET_process_end (altough kernel does not call it yet). Updated TCP_output to time a retransmit on ARP error.
git-svn-id: svn://kolibrios.org@2629 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
2f09cfb23e
commit
1e3b48239a
@ -156,6 +156,7 @@ local .exit
|
|||||||
; IN: Pointer to buffer in [esp]
|
; IN: Pointer to buffer in [esp]
|
||||||
; size of buffer in [esp+4]
|
; size of buffer in [esp+4]
|
||||||
; packet size (without ethernet header) in ecx
|
; packet size (without ethernet header) in ecx
|
||||||
|
; packet ptr in edx
|
||||||
; OUT: /
|
; OUT: /
|
||||||
;
|
;
|
||||||
;-----------------------------------------------------------------
|
;-----------------------------------------------------------------
|
||||||
@ -173,7 +174,8 @@ ARP_input:
|
|||||||
jne .maybe_request
|
jne .maybe_request
|
||||||
|
|
||||||
DEBUGF 1,"ARP_input - it's a reply packet from %u.%u.%u.%u\n",\
|
DEBUGF 1,"ARP_input - it's a reply packet from %u.%u.%u.%u\n",\
|
||||||
[edx + ARP_header.SenderIP]:1, [edx + ARP_header.SenderIP+1]:1, [edx + ARP_header.SenderIP+2]:1, [edx + ARP_header.SenderIP+3]:1
|
[edx + ARP_header.SenderIP]:1, [edx + ARP_header.SenderIP+1]:1,\
|
||||||
|
[edx + ARP_header.SenderIP+2]:1, [edx + ARP_header.SenderIP+3]:1
|
||||||
|
|
||||||
mov ecx, [NumARP]
|
mov ecx, [NumARP]
|
||||||
test ecx, ecx
|
test ecx, ecx
|
||||||
@ -204,8 +206,8 @@ ARP_input:
|
|||||||
|
|
||||||
mov eax, dword [edx + ARP_header.SenderMAC]
|
mov eax, dword [edx + ARP_header.SenderMAC]
|
||||||
mov dword [esi+ARP_entry.MAC], eax
|
mov dword [esi+ARP_entry.MAC], eax
|
||||||
mov ax , word [edx + ARP_header.SenderMAC + 4]
|
mov cx, word [edx + ARP_header.SenderMAC + 4]
|
||||||
mov word [esi+ARP_entry.MAC+4], ax
|
mov word [esi+ARP_entry.MAC+4], cx
|
||||||
|
|
||||||
jmp .exit
|
jmp .exit
|
||||||
|
|
||||||
@ -225,7 +227,7 @@ ARP_input:
|
|||||||
|
|
||||||
mov eax, [IP_LIST+4*edi]
|
mov eax, [IP_LIST+4*edi]
|
||||||
cmp eax, [edx + ARP_header.TargetIP] ; Is it looking for my IP address?
|
cmp eax, [edx + ARP_header.TargetIP] ; Is it looking for my IP address?
|
||||||
jne .exit ; TODO: instead of quitting, update local entrys with matching IP's ?
|
jne .exit
|
||||||
|
|
||||||
push eax
|
push eax
|
||||||
push edi
|
push edi
|
||||||
@ -259,7 +261,7 @@ ARP_input:
|
|||||||
lea esi, [edx + ARP_header.SenderMAC]
|
lea esi, [edx + ARP_header.SenderMAC]
|
||||||
movsd
|
movsd
|
||||||
movsw
|
movsw
|
||||||
; mov ax , ETHER_ARP
|
; mov ax , ETHER_ARP ; It's already there, I'm sure of it!
|
||||||
; stosw
|
; stosw
|
||||||
|
|
||||||
DEBUGF 1,"ARP_input - Sending reply \n"
|
DEBUGF 1,"ARP_input - Sending reply \n"
|
||||||
@ -492,13 +494,14 @@ ARP_IP_to_MAC:
|
|||||||
;--------------------
|
;--------------------
|
||||||
; Send an ARP request
|
; Send an ARP request
|
||||||
|
|
||||||
push eax
|
push eax ; save IP for ARP_output_request
|
||||||
|
|
||||||
pushw ARP_REQUEST_TTL
|
; Now create the ARP entry
|
||||||
pushw ARP_AWAITING_RESPONSE
|
pushw ARP_REQUEST_TTL ; TTL
|
||||||
pushd 0
|
pushw ARP_AWAITING_RESPONSE ; status
|
||||||
|
pushd 0 ; mac
|
||||||
pushw 0
|
pushw 0
|
||||||
pushd eax
|
pushd eax ; ip
|
||||||
mov esi, esp
|
mov esi, esp
|
||||||
call ARP_add_entry
|
call ARP_add_entry
|
||||||
add esp, sizeof.ARP_entry
|
add esp, sizeof.ARP_entry
|
||||||
@ -506,36 +509,19 @@ ARP_IP_to_MAC:
|
|||||||
cmp eax, -1
|
cmp eax, -1
|
||||||
je .full
|
je .full
|
||||||
|
|
||||||
mov ecx, eax
|
; And send a request
|
||||||
pop eax
|
pop eax
|
||||||
push ecx
|
call ARP_output_request ; IP in eax
|
||||||
call ARP_output_request
|
|
||||||
|
|
||||||
;; TODO: check if driver could transmit packet
|
;; TODO: check if driver could transmit packet
|
||||||
|
|
||||||
pop esi
|
|
||||||
imul esi, sizeof.ARP_entry
|
|
||||||
add esi, ARP_table
|
|
||||||
|
|
||||||
mov ecx, 25
|
|
||||||
.wait_loop:
|
|
||||||
cmp [esi + ARP_entry.Status], 1
|
|
||||||
je .got_it
|
|
||||||
push esi
|
|
||||||
mov esi, 10
|
|
||||||
call delay_ms
|
|
||||||
pop esi
|
|
||||||
loop .wait_loop
|
|
||||||
|
|
||||||
mov eax, -2 ; request send
|
mov eax, -2 ; request send
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.found_it:
|
.found_it:
|
||||||
DEBUGF 1,"found IP in ARPTable\n"
|
DEBUGF 1,"found IP in ARPTable\n"
|
||||||
cmp [esi + ARP_entry.Status], 1
|
cmp [esi + ARP_entry.Status], ARP_VALID_MAPPING
|
||||||
jne .invalid
|
jne .invalid
|
||||||
|
|
||||||
.got_it:
|
|
||||||
movzx eax, word [esi + ARP_entry.MAC]
|
movzx eax, word [esi + ARP_entry.MAC]
|
||||||
mov ebx, dword[esi + ARP_entry.MAC+2]
|
mov ebx, dword[esi + ARP_entry.MAC+2]
|
||||||
ret
|
ret
|
||||||
|
@ -592,8 +592,6 @@ IPv4_output:
|
|||||||
test eax, 0xffff0000 ; error bits
|
test eax, 0xffff0000 ; error bits
|
||||||
jnz .arp_error
|
jnz .arp_error
|
||||||
|
|
||||||
.continue:
|
|
||||||
|
|
||||||
push ebx ; push the mac
|
push ebx ; push the mac
|
||||||
push ax
|
push ax
|
||||||
|
|
||||||
|
@ -1323,6 +1323,8 @@ SOCKET_notify_owner:
|
|||||||
; socket exists, now try to flag an event to the application
|
; socket exists, now try to flag an event to the application
|
||||||
|
|
||||||
mov eax, [eax + SOCKET.PID]
|
mov eax, [eax + SOCKET.PID]
|
||||||
|
test eax, eax
|
||||||
|
jz .error2
|
||||||
mov ecx, 1
|
mov ecx, 1
|
||||||
mov esi, TASK_DATA + TASKDATA.pid
|
mov esi, TASK_DATA + TASKDATA.pid
|
||||||
|
|
||||||
@ -1719,15 +1721,11 @@ SOCKET_process_end:
|
|||||||
|
|
||||||
mov [ebx + SOCKET.PID], 0
|
mov [ebx + SOCKET.PID], 0
|
||||||
|
|
||||||
cmp [ebx + SOCKET.Protocol], IP_PROTO_UDP
|
|
||||||
je .udp
|
|
||||||
|
|
||||||
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
|
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
|
||||||
je .tcp
|
je .tcp
|
||||||
|
|
||||||
jmp .next_socket ; kill all sockets for given PID
|
; The socket is stateless, just kill it right away!
|
||||||
|
|
||||||
.udp:
|
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
mov ebx, [ebx + SOCKET.NextPtr]
|
mov ebx, [ebx + SOCKET.NextPtr]
|
||||||
call SOCKET_free
|
call SOCKET_free
|
||||||
@ -1735,9 +1733,11 @@ SOCKET_process_end:
|
|||||||
|
|
||||||
.tcp:
|
.tcp:
|
||||||
|
|
||||||
;;; TODO
|
push [ebx + SOCKET.NextPtr]
|
||||||
|
mov eax, ebx
|
||||||
jmp .next_socket
|
call TCP_close
|
||||||
|
pop ebx
|
||||||
|
jmp .test_socket
|
||||||
|
|
||||||
.done:
|
.done:
|
||||||
pop ebx
|
pop ebx
|
||||||
|
@ -534,6 +534,8 @@ TCP_output:
|
|||||||
pop eax
|
pop eax
|
||||||
add esp, 8
|
add esp, 8
|
||||||
|
|
||||||
|
mov [eax + TCP_SOCKET.timer_retransmission], TCP_time_re_min
|
||||||
|
|
||||||
pusha
|
pusha
|
||||||
lea ecx, [eax + SOCKET.mutex]
|
lea ecx, [eax + SOCKET.mutex]
|
||||||
call mutex_unlock
|
call mutex_unlock
|
||||||
|
Loading…
Reference in New Issue
Block a user