50,6 → 50,9 |
|
add esp, sizeof.TCP_queue_entry |
|
call NET_ptr_to_num4 |
inc [TCP_segments_rx + edi] |
|
xor edx, edx |
mov eax, [TCP_input_event] |
mov ebx, [eax + EVENT.id] |
62,7 → 65,8 |
popf |
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP incoming queue is full, discarding packet!\n" |
|
inc [TCP_segments_missed] ; FIXME: use correct interface |
call NET_ptr_to_num4 |
inc [TCP_segments_missed + edi] |
|
add esp, sizeof.TCP_queue_entry - 8 |
call kernel_free |
146,6 → 150,11 |
; (IP Packet TCP Source Port = remote Port) OR (remote Port = 0) |
|
.findpcb: |
pusha |
mov ecx, socket_mutex |
call mutex_lock |
popa |
|
mov ebx, net_sockets |
mov si, [edx + TCP_header.DestinationPort] |
|
152,7 → 161,7 |
.socket_loop: |
mov ebx, [ebx + SOCKET.NextPtr] |
or ebx, ebx |
jz .respond_seg_reset |
jz .no_socket ;respond_seg_reset |
|
cmp [ebx + SOCKET.Domain], AF_INET4 |
jne .socket_loop |
176,13 → 185,13 |
test ax, ax |
jnz .socket_loop |
.found_socket: ; ebx now contains the socketpointer |
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "TCP_input: socket ptr=%x state=%u flags=%x\n", ebx, [ebx + TCP_SOCKET.t_state], [edx + TCP_header.Flags]:2 |
|
;------------- |
; update stats |
|
inc [TCP_segments_rx] ; FIXME: correct interface? |
|
;---------------------------- |
; Check if socket isnt closed |
|
1161,10 → 1170,18 |
.ack_la: |
jnc .ack_processed |
|
push ebx |
lea ecx, [ebx + SOCKET.mutex] |
call mutex_unlock |
pop ebx |
|
push ebx |
mov eax, ebx |
call TCP_disconnect |
jmp .drop |
pop ebx |
|
jmp .destroy_new_socket |
|
.ack_tw: |
mov [ebx + TCP_SOCKET.timer_timed_wait], 2 * TCP_time_MSL |
or [ebx + TCP_SOCKET.timer_flags], timer_flag_wait |
1223,7 → 1240,10 |
|
and [ebx + TCP_SOCKET.temp_bits], not TCP_BIT_DROPSOCKET |
|
;;; call SOCKET_notify_owner |
pusha |
mov eax, ebx |
call SOCKET_notify |
popa |
|
jmp .trim_then_step6 |
|
1298,7 → 1318,10 |
;;; TODO: update stats |
|
; set socket state to connected |
mov [ebx + SOCKET.state], SS_ISCONNECTED |
push eax |
mov eax, ebx |
call SOCKET_is_connected |
pop eax |
mov [ebx + TCP_SOCKET.t_state], TCPS_ESTABLISHED |
|
; Do window scaling on this connection ? |
1620,6 → 1643,13 |
pop ebx |
jmp .destroy_new_socket |
|
.no_socket: |
|
pusha |
mov ecx, socket_mutex |
call mutex_unlock |
popa |
|
.respond_seg_reset: |
test [edx + TCP_header.Flags], TH_RST |
jnz .drop_no_socket |