forked from KolibriOS/kolibrios
Fixed bugs in TCP (crash when closing socket, crash when responding to segment that has no socket)
git-svn-id: svn://kolibrios.org@3270 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
ac6e97fffd
commit
4fe36c5853
@ -639,7 +639,7 @@ TCP_process_input:
|
|||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call TCP_close
|
call TCP_close
|
||||||
;;;TODO: update stats
|
;;;TODO: update stats
|
||||||
jmp .drop_with_reset
|
jmp .drop_with_reset_no_socket
|
||||||
|
|
||||||
;----------------------------------------
|
;----------------------------------------
|
||||||
; Remove data beyond right edge of window (700-736)
|
; Remove data beyond right edge of window (700-736)
|
||||||
@ -770,14 +770,14 @@ TCP_process_input:
|
|||||||
;;; TODO: update stats (tcp drops)
|
;;; TODO: update stats (tcp drops)
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call TCP_close
|
call TCP_close
|
||||||
jmp .drop
|
jmp .drop_no_socket
|
||||||
|
|
||||||
.rst_close:
|
.rst_close:
|
||||||
DEBUGF 1,"TCP_input: Closing with reset\n"
|
DEBUGF 1,"TCP_input: Closing with reset\n"
|
||||||
|
|
||||||
mov eax, ebx
|
mov eax, ebx
|
||||||
call TCP_close
|
call TCP_close
|
||||||
jmp .drop
|
jmp .drop_no_socket
|
||||||
|
|
||||||
.no_rst:
|
.no_rst:
|
||||||
|
|
||||||
@ -1596,13 +1596,12 @@ align 4
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
.drop_with_reset_no_socket:
|
.drop_with_reset_no_socket:
|
||||||
|
|
||||||
DEBUGF 1,"TCP_input: Drop with reset (no socket)\n"
|
DEBUGF 1,"TCP_input: Drop with reset (no socket)\n"
|
||||||
|
|
||||||
test [edx + TCP_header.Flags], TH_RST
|
test [edx + TCP_header.Flags], TH_RST
|
||||||
jnz .drop_no_socket
|
jnz .drop_no_socket
|
||||||
|
|
||||||
;;; if its a multicast/broadcast, also drop
|
;;; TODO: if its a multicast/broadcast, also drop
|
||||||
|
|
||||||
test [edx + TCP_header.Flags], TH_ACK
|
test [edx + TCP_header.Flags], TH_ACK
|
||||||
jnz .respond_seg_ack
|
jnz .respond_seg_ack
|
||||||
|
@ -318,7 +318,7 @@ TCP_respond:
|
|||||||
|
|
||||||
|
|
||||||
;-------------------------
|
;-------------------------
|
||||||
; TCP_respond.segment:
|
; TCP_respond_segment:
|
||||||
;
|
;
|
||||||
; IN: edx = segment ptr (a previously received segment)
|
; IN: edx = segment ptr (a previously received segment)
|
||||||
; edi = ptr to dest and src IPv4 addresses
|
; edi = ptr to dest and src IPv4 addresses
|
||||||
@ -327,7 +327,7 @@ TCP_respond:
|
|||||||
align 4
|
align 4
|
||||||
TCP_respond_segment:
|
TCP_respond_segment:
|
||||||
|
|
||||||
DEBUGF 1,"TCP_respond_segment: frame=%x flags=%c\n", edx, cl
|
DEBUGF 1,"TCP_respond_segment: frame=%x flags=%x\n", edx, cl
|
||||||
|
|
||||||
;---------------------
|
;---------------------
|
||||||
; Create the IP packet
|
; Create the IP packet
|
||||||
@ -336,7 +336,7 @@ TCP_respond_segment:
|
|||||||
mov ebx, [edi + 4]
|
mov ebx, [edi + 4]
|
||||||
mov eax, [edi]
|
mov eax, [edi]
|
||||||
mov ecx, sizeof.TCP_header
|
mov ecx, sizeof.TCP_header
|
||||||
mov di , IP_PROTO_TCP shl 8 + 128
|
mov di, IP_PROTO_TCP shl 8 + 128
|
||||||
call IPv4_output
|
call IPv4_output
|
||||||
jz .error
|
jz .error
|
||||||
pop esi cx
|
pop esi cx
|
||||||
@ -368,12 +368,11 @@ TCP_respond_segment:
|
|||||||
;---------------------
|
;---------------------
|
||||||
; Fill in the checksum
|
; Fill in the checksum
|
||||||
|
|
||||||
.checksum:
|
|
||||||
lea esi, [edi - sizeof.TCP_header]
|
lea esi, [edi - sizeof.TCP_header]
|
||||||
mov ecx, sizeof.TCP_header
|
mov ecx, sizeof.TCP_header
|
||||||
TCP_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\ ; FIXME
|
TCP_checksum (esi - sizeof.IPv4_header + IPv4_header.DestinationAddress),\ ; FIXME
|
||||||
(esi - sizeof.IPv4_header + IPv4_header.SourceAddress)
|
(esi - sizeof.IPv4_header + IPv4_header.SourceAddress)
|
||||||
mov [esi+TCP_header.Checksum], dx
|
mov [esi + TCP_header.Checksum], dx
|
||||||
|
|
||||||
;--------------------
|
;--------------------
|
||||||
; And send the segment
|
; And send the segment
|
||||||
|
@ -57,6 +57,7 @@ TCP_usrclosed:
|
|||||||
|
|
||||||
.wait1:
|
.wait1:
|
||||||
mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1
|
mov [eax + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1
|
||||||
|
; TODO: set timer?
|
||||||
pop ebx
|
pop ebx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
@ -67,6 +68,7 @@ TCP_usrclosed:
|
|||||||
|
|
||||||
.disc:
|
.disc:
|
||||||
call SOCKET_is_disconnected
|
call SOCKET_is_disconnected
|
||||||
|
; TODO: set timer?
|
||||||
.ret:
|
.ret:
|
||||||
pop ebx
|
pop ebx
|
||||||
ret
|
ret
|
||||||
|
Loading…
Reference in New Issue
Block a user