/kernel/branches/net/network/ARP.inc |
---|
122,7 → 122,8 |
.next: |
add esi, ARP_ENTRY.size |
loop .loop |
dec ecx |
jnz .loop |
jmp .exit |
.time_out: |
161,7 → 162,7 |
DEBUGF 1,"ARP_Handler - start\n" |
cmp ecx, 28 |
jl .exit |
jb .exit |
;--------------------- |
; Handle Reply packets |
183,7 → 184,8 |
cmp [esi + ARP_ENTRY.IP], eax |
je .gotit |
add esi, ARP_ENTRY.size |
loop .loop |
dec ecx |
jnz .loop |
jmp .exit |
349,7 → 351,7 |
test ecx, ecx ; first entry? |
jz .add |
cmp ecx, ARP_TABLE_SIZE ; list full ? |
jge .error |
jae .error |
mov eax, dword[esi + ARP_ENTRY.MAC] |
mov bx , word[esi + ARP_ENTRY.MAC + 4] |
602,7 → 604,7 |
.read: |
cmp ecx, [NumARP] |
jge .error |
jae .error |
; edi = pointer to buffer |
; ecx = # entry |
imul ecx, ARP_ENTRY.size |
622,7 → 624,7 |
.remove: |
; ecx = # entry |
cmp ecx, [NumARP] |
jge .error |
jae .error |
imul ecx, ARP_ENTRY.size |
lea esi, [ARP_table + ecx] |
call ARP_del_entry |
/kernel/branches/net/network/IPv4.inc |
---|
597,7 → 597,7 |
DEBUGF 1,"IPv4_create_packet: size=%u\n", ecx |
cmp ecx, 65500 ; Max IPv4 packet size |
jg .too_large |
ja .too_large |
push ecx eax ebx dx di |
673,7 → 673,7 |
DEBUGF 1,"IPv4_output_raw: size=%u ptr=%x socket=%x\n", ecx, esi, eax |
cmp ecx, 1480 ;;;;; |
jg .too_large |
ja .too_large |
sub esp, 8 |
push esi eax |
761,7 → 761,7 |
and ecx, not 111b ; align 4 |
cmp ecx, IPv4_Packet.DataOrOptional + 8 ; must be able to put at least 8 bytes |
jl .err2 |
jb .err2 |
push esi ecx |
mov eax, [esi + IPv4_Packet.DestinationAddress] |
846,7 → 846,7 |
DEBUGF 1,"Ipv4_fragment - bytes remaining: %u\n", ecx |
cmp ecx, [esp+1*4] |
jge .new_fragment |
jae .new_fragment |
mov [esp+4], ecx ; set fragment size to remaining packet size |
jmp .new_fragment |
/kernel/branches/net/network/ethernet.inc |
---|
64,7 → 64,7 |
DEBUGF 1,"ETH_input - size: %u\n", ecx |
cmp ecx, 60 ; check packet length |
jl .dump |
jb .dump |
sub ecx, ETH_FRAME.Data |
lea edx, [eax + ETH_FRAME.Data] |
110,7 → 110,7 |
DEBUGF 1,"ETH_output: size=%u device:%x\n", ecx, ebx |
cmp ecx, [ebx + NET_DEVICE.mtu] |
jg .exit |
ja .exit |
push ecx ; << 1 |
push di eax edx ; << 2 |
140,8 → 140,8 |
pop ecx ; >> 1 |
cmp edx, 60-1 ; minimum ethernet packet size |
jle .adjust_size |
cmp edx, 60 ; minimum ethernet packet size |
jb .adjust_size |
DEBUGF 1,"ETH_output: done: %x total size: %u\n", eax, edx |
ret |
181,7 → 181,7 |
ETH_API: |
cmp bh, MAX_NET_DEVICES |
jg .error |
ja .error |
movzx eax, bh |
shl eax, 2 |
/kernel/branches/net/network/queue.inc |
---|
44,7 → 44,7 |
macro add_to_queue ptr, size, entry_size, failaddr { |
cmp [ptr + queue.size], size ; Check if queue isnt full |
jge failaddr |
jae failaddr |
inc [ptr + queue.size] ; if not full, queue one more |
54,7 → 54,7 |
lea ecx, [size*entry_size+ptr+queue.data] |
cmp edi, ecx ; entry size |
jl .no_wrap |
jb .no_wrap |
sub edi, size*entry_size |
79,7 → 79,7 |
lea ecx, [size*entry_size+ptr+queue.data] |
cmp esi, ecx ; entry size |
jl .no_wrap |
jb .no_wrap |
sub esi, size*entry_size |
/kernel/branches/net/network/socket.inc |
---|
216,17 → 216,17 |
@@: |
pseudo_random eax |
cmp ax, MIN_EPHEMERAL_PORT |
jl @r |
jb @r |
cmp ax, MAX_EPHEMERAL_PORT |
jg @r |
ja @r |
mov [last_UDP_port], ax |
@@: |
pseudo_random eax |
cmp ax, MIN_EPHEMERAL_PORT |
jl @r |
jb @r |
cmp ax, MAX_EPHEMERAL_PORT |
jg @r |
ja @r |
mov [last_TCP_port], ax |
} |
240,7 → 240,7 |
align 4 |
sys_socket: |
cmp ebx, 9 ; highest possible number |
jg @f |
ja @f |
jmp dword [sock_sysfn_table + 4*ebx] |
@@: |
cmp ebx, 255 |
372,7 → 372,7 |
jz s_error |
cmp esi, 2 |
jl s_error |
jb s_error |
cmp word [edx], AF_INET4 |
je .af_inet4 |
393,7 → 393,7 |
DEBUGF 1,"af_inet4\n" |
cmp esi, 6 |
jl s_error |
jb s_error |
push word [edx + 2] |
pop word [eax + UDP_SOCKET.LocalPort] |
430,7 → 430,7 |
jz s_error |
cmp esi, 8 |
jl s_error |
jb s_error |
cmp word [edx], AF_INET4 |
je .af_inet4 |
577,7 → 577,7 |
@@: |
cmp edx, MAX_backlog |
jle @f |
jbe @f |
mov edx, MAX_backlog |
@@: |
665,7 → 665,7 |
.tcp: |
cmp [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED ; state must be LISTEN, SYN_SENT or CLOSED |
jl .free |
jb .free |
call TCP_output |
mov dword [esp+32], 0 |
715,7 → 715,7 |
DEBUGF 1,"Got %u bytes of data\n", ecx |
cmp ecx, ebx |
jg .too_small |
ja .too_small |
push [esi + socket_queue_entry.buf_ptr] ; save the buffer addr so we can clear it later |
mov esi, [esi + socket_queue_entry.data_ptr] |
1119,7 → 1119,7 |
add [eax + RING_BUFFER.size], ecx |
cmp [eax + RING_BUFFER.size], SOCKET_MAXDATA |
jg .too_large |
ja .too_large |
.copy: |
mov edi, [eax + RING_BUFFER.write_ptr] |
1141,7 → 1141,7 |
pop ecx |
cmp edi, [eax + RING_BUFFER.end_ptr] |
jge .wrap |
jae .wrap |
mov [eax + RING_BUFFER.write_ptr], edi |
ret |
1155,7 → 1155,7 |
.too_large: |
mov ecx, SOCKET_MAXDATA ; calculate number of bytes available in buffer |
sub ecx, [eax + RING_BUFFER.size] |
jge .full |
jae .full |
mov [eax + RING_BUFFER.size], SOCKET_MAXDATA ; update size, we will fill buffer completely |
jmp .copy |
1185,7 → 1185,7 |
DEBUGF 1,"SOCKET_ring_read: ringbuff=%x ptr=%x size=%u\n", eax, edi, ecx |
cmp ecx, [eax + RING_BUFFER.size] |
jg .less_data |
ja .less_data |
.copy: |
mov esi, [eax + RING_BUFFER.read_ptr] |
1234,12 → 1234,12 |
DEBUGF 1,"SOCKET_ring_free: %u bytes from ring %x\n", ecx, eax |
sub [eax + RING_BUFFER.size], ecx |
jl .sumthinwong |
jb .sumthinwong |
add [eax + RING_BUFFER.read_ptr], ecx |
mov edx, [eax + RING_BUFFER.end_ptr] |
cmp [eax + RING_BUFFER.read_ptr], edx |
jl @f |
jb @f |
sub [eax + RING_BUFFER.read_ptr], SOCKET_MAXDATA |
@@: |
ret |
1468,7 → 1468,7 |
; Exit if backlog queue is full |
mov eax, [ebx + SOCKET_QUEUE_LOCATION + queue.size] |
cmp ax, [ebx + SOCKET.backlog] |
jge .fail |
jae .fail |
; Allocate new socket |
call SOCKET_alloc |
/kernel/branches/net/network/stack.inc |
---|
274,7 → 274,7 |
mov eax, [NET_RUNNING] |
cmp eax, MAX_NET_DEVICES |
jge .error |
jae .error |
;---------------------------------- |
; Check if device is already listed |
339,7 → 339,7 |
DEBUGF 1,"NET_set_default %x\n", eax |
cmp eax, MAX_NET_DEVICES |
jge .error |
jae .error |
cmp [NET_DRV_LIST+eax*4], 0 |
je .error |
583,7 → 583,7 |
@@: |
cmp bh, MAX_NET_DEVICES ; Check if device number exists |
jge .doesnt_exist |
jae .doesnt_exist |
mov esi, ebx |
and esi, 0x0000ff00 |
679,7 → 679,7 |
align 4 |
sys_protocols: |
cmp bh, MAX_NET_DEVICES ; Check if device number exists |
jge .doesnt_exist |
jae .doesnt_exist |
mov esi, ebx |
and esi, 0x0000ff00 |
/kernel/branches/net/network/tcp_input.inc |
---|
46,7 → 46,7 |
DEBUGF 1,"headersize=%u\n", eax |
cmp eax, 20 |
jl .drop_not_locked |
jb .drop_not_locked |
;------------------------------- |
; Now, re-calculate the checksum |
66,7 → 66,7 |
DEBUGF 1,"Checksum is correct\n" |
sub ecx, esi ; update packet size |
jl .drop_not_locked |
jb .drop_not_locked |
DEBUGF 1,"we got %u bytes of data\n", ecx |
;----------------------------------------------------------------------------------------- |
73,7 → 73,7 |
; Check if this packet has a timestamp option (We do it here so we can process it quickly) |
cmp esi, 20 + 12 ; Timestamp option is 12 bytes |
jl .no_timestamp |
jb .no_timestamp |
je .is_ok |
cmp byte [edx + TCP_segment.Data + 12], TCP_OPT_EOL ; end of option list |
226,7 → 226,7 |
.opt_loop: |
cmp edi, eax |
jge .no_options |
jae .no_options |
cmp byte [edi], TCP_OPT_EOL ; end of option list? |
jz .no_options |
349,16 → 349,16 |
; This test is true only if the window is fully open, that is, the connection is not in the middle of slow start or congestion avoidance. |
mov eax, [ebx + TCP_SOCKET.SND_CWND] |
cmp eax, [ebx + TCP_SOCKET.SND_WND] |
jl .not_uni_xfer |
jb .not_uni_xfer |
; - The acknowledgment field in the segment is less than or equal to the maximum sequence number sent. |
mov eax, [edx + TCP_segment.AckNumber] |
cmp eax, [ebx + TCP_SOCKET.SND_MAX] |
jg .not_uni_xfer |
ja .not_uni_xfer |
; - The acknowledgment field in the segment is greater than the largest unacknowledged sequence number. |
sub eax, [ebx + TCP_SOCKET.SND_UNA] |
jle .not_uni_xfer |
jbe .not_uni_xfer |
DEBUGF 1,"Header prediction: we are sender\n" |
527,10 → 527,10 |
mov eax, [edx + TCP_segment.AckNumber] |
cmp eax, [ebx + TCP_SOCKET.ISS] |
jle .drop_with_reset |
jbe .drop_with_reset |
cmp eax, [ebx + TCP_SOCKET.SND_MAX] |
jg .drop_with_reset |
ja .drop_with_reset |
@@: |
test [edx + TCP_segment.Flags], TH_RST |
559,7 → 559,7 |
mov eax, [edx + TCP_segment.AckNumber] |
mov [ebx + TCP_SOCKET.SND_UNA], eax |
cmp eax, [ebx + TCP_SOCKET.SND_NXT] |
jle @f |
jbe @f |
mov [ebx + TCP_SOCKET.SND_NXT], eax |
@@: |
576,7 → 576,7 |
mov eax, [ebx + TCP_SOCKET.SND_UNA] |
cmp eax, [ebx + TCP_SOCKET.ISS] |
jle .simultaneous_open |
jbe .simultaneous_open |
test [edx + TCP_segment.Flags], TH_ACK |
jz .simultaneous_open |
660,7 → 660,7 |
mov eax, [ebx + TCP_SOCKET.RCV_NXT] |
sub eax, [edx + TCP_segment.SequenceNumber] |
jle .no_duplicate |
jbe .no_duplicate |
DEBUGF 1,"Uh oh.. %u bytes of duplicate data!\n", eax |
673,7 → 673,7 |
inc [edx + TCP_segment.SequenceNumber] |
cmp [edx + TCP_segment.UrgentPointer], 1 |
jle @f |
jbe @f |
dec [edx + TCP_segment.UrgentPointer] |
jmp .dup_syn |
@@: |
687,7 → 687,7 |
; Check for entire duplicate packet |
cmp eax, ecx |
jge .duplicate |
jae .duplicate |
DEBUGF 1,"Going to drop %u out of %u bytes\n", eax, ecx |
743,7 → 743,7 |
;;; TODO |
sub [edx + TCP_segment.UrgentPointer], ax |
jg @f |
ja @f |
and [edx + TCP_segment.Flags], not (TH_URG) |
mov [edx + TCP_segment.UrgentPointer], 0 |
753,10 → 753,10 |
; Handle data that arrives after process terminates |
cmp [ebx + SOCKET.PID], 0 |
jg @f |
ja @f |
cmp [ebx + TCP_SOCKET.t_state], TCPS_CLOSE_WAIT |
jle @f |
jbe @f |
test ecx, ecx |
jz @f |
777,12 → 777,12 |
; eax now holds the number of bytes to drop |
jle .no_excess_data |
jbe .no_excess_data |
;;; TODO: update stats |
cmp eax, ecx |
jl .dont_drop_all |
jb .dont_drop_all |
;;; TODO 700-736 |
898,9 → 898,9 |
mov eax, [edx + TCP_segment.AckNumber] |
cmp [ebx + TCP_SOCKET.SND_UNA], eax |
jg .drop_with_reset |
ja .drop_with_reset |
cmp eax, [ebx + TCP_SOCKET.SND_MAX] |
jg .drop_with_reset |
ja .drop_with_reset |
;;; update stats |
mov eax, ebx |
931,7 → 931,7 |
mov eax, [edx + TCP_segment.AckNumber] |
cmp eax, [ebx + TCP_SOCKET.SND_UNA] |
jg .not_dup_ack |
ja .not_dup_ack |
test ecx, ecx |
jnz .reset_dupacks |
943,7 → 943,7 |
DEBUGF 1,"Processing a duplicate ACK..\n" |
cmp [ebx + TCP_SOCKET.timer_retransmission], 10000 ;;;; |
jg @f |
ja @f |
mov eax, [edx + TCP_segment.AckNumber] |
cmp eax, [ebx + TCP_SOCKET.SND_UNA] |
968,7 → 968,7 |
xor edx, edx |
div [ebx + TCP_SOCKET.t_maxseg] |
cmp eax, 2 |
jge @f |
jae @f |
mov ax, 2 |
@@: |
mul [ebx + TCP_SOCKET.t_maxseg] |
995,7 → 995,7 |
pop eax ; <<<< |
cmp eax, [ebx + TCP_SOCKET.SND_NXT] |
jl @f |
jb @f |
mov [ebx + TCP_SOCKET.SND_NXT], eax |
@@: |
1003,7 → 1003,7 |
.no_re_xmit: |
jle .not_dup_ack |
jbe .not_dup_ack |
DEBUGF 1,"Increasing congestion window\n" |
1028,9 → 1028,9 |
mov eax, [ebx + TCP_SOCKET.SND_SSTHRESH] |
cmp eax, [ebx + TCP_SOCKET.SND_CWND] |
jg @f |
ja @f |
cmp [ebx + TCP_SOCKET.t_dupacks], TCP_re_xmit_thresh |
jle @f |
jbe @f |
mov [ebx + TCP_SOCKET.SND_CWND], eax |
@@: |
1038,7 → 1038,7 |
mov eax, [edx + TCP_segment.AckNumber] |
cmp eax, [ebx + TCP_SOCKET.SND_MAX] |
jle @f |
jbe @f |
;;; TODO: update stats |
jmp .drop_after_ack |
1084,7 → 1084,7 |
mov eax, [ebx + TCP_SOCKET.t_maxseg] |
cmp esi, [ebx + TCP_SOCKET.SND_SSTHRESH] |
jle @f |
jbe @f |
push edx |
push eax |
mul eax |
1135,7 → 1135,7 |
mov [ebx + TCP_SOCKET.SND_UNA], eax |
cmp eax, [ebx + TCP_SOCKET.SND_NXT] |
jl @f |
jb @f |
mov [ebx + TCP_SOCKET.SND_NXT], eax |
@@: |
1226,13 → 1226,13 |
mov eax, [ebx + TCP_SOCKET.SND_WL1] |
cmp eax, [edx + TCP_segment.SequenceNumber] |
jl .update_window |
jg @f |
jb .update_window |
ja @f |
mov eax, [ebx + TCP_SOCKET.SND_WL2] |
cmp eax, [edx + TCP_segment.AckNumber] |
jl .update_window |
jg .no_window_update |
jb .update_window |
ja .no_window_update |
@@: |
mov eax, [ebx + TCP_SOCKET.SND_WL2] |
1241,7 → 1241,7 |
movzx eax, [edx + TCP_segment.Window] |
cmp eax, [ebx + TCP_SOCKET.SND_WND] |
jle .no_window_update |
jbe .no_window_update |
.update_window: |
1258,7 → 1258,7 |
; |
; ;; mov eax, tiwin |
; cmp eax, [ebx + TCP_SOCKET.SND_WND] |
; jle @f |
; jbe @f |
; |
; ;;; update stats |
; |
1266,7 → 1266,7 |
mov eax, dword [edx + TCP_segment.Window] |
cmp eax, [ebx + TCP_SOCKET.max_sndwnd] |
jle @f |
jbe @f |
mov [ebx + TCP_SOCKET.max_sndwnd], eax |
@@: |
mov [ebx + TCP_SOCKET.SND_WND], eax |
1306,7 → 1306,7 |
movzx eax, [edx + TCP_segment.UrgentPointer] |
add eax, [ebx + STREAM_SOCKET.rcv + RING_BUFFER.size] |
cmp eax, SOCKET_MAXDATA |
jle .not_urgent |
jbe .not_urgent |
mov [edx + TCP_segment.UrgentPointer], 0 |
and [edx + TCP_segment.Flags], not (TH_URG) |
1336,7 → 1336,7 |
jnz .process_fin |
cmp [ebx + TCP_SOCKET.t_state], TCPS_FIN_WAIT_1 |
jge .dont_do_data |
jae .dont_do_data |
test ecx, ecx |
jz .final_processing |
/kernel/branches/net/network/tcp_output.inc |
---|
41,7 → 41,7 |
mov ebx, [eax + TCP_SOCKET.t_idle] |
cmp ebx, [eax + TCP_SOCKET.t_rxtcur] |
jle .not_idle |
jbe .not_idle |
; We have been idle for a while and no ACKS are expected to clock out any data we send.. |
; Slow start to get ack "clock" running again. |
56,7 → 56,7 |
mov ecx, [eax + TCP_SOCKET.SND_WND] ; determine window |
cmp ecx, [eax + TCP_SOCKET.SND_CWND] ; |
jl @f ; |
jb @f ; |
mov ecx, [eax + TCP_SOCKET.SND_CWND] ; |
@@: ; |
76,7 → 76,7 |
jnz .no_zero_window |
cmp ebx, [eax + STREAM_SOCKET.snd + RING_BUFFER.size] |
jge @f |
jae @f |
and dl, not (TH_FIN) ; clear the FIN flag ??? how can it be set before? |
95,7 → 95,7 |
mov esi, [eax + STREAM_SOCKET.snd + RING_BUFFER.size] |
cmp esi, ecx |
jl @f |
jb @f |
mov esi, ecx |
@@: |
sub esi, ebx |
132,7 → 132,7 |
; Send one segment at a time (124) |
cmp esi, [eax + TCP_SOCKET.t_maxseg] |
jle @f |
jbe @f |
mov esi, [eax + TCP_SOCKET.t_maxseg] |
176,11 → 176,11 |
mov ebx, [eax + TCP_SOCKET.max_sndwnd] |
shr ebx, 1 |
cmp esi, ebx |
jge .send |
jae .send |
mov ebx, [eax + TCP_SOCKET.SND_NXT] |
cmp ebx, [eax + TCP_SOCKET.SND_MAX] |
jl .send |
jb .send |
.len_zero: |
205,7 → 205,7 |
mov ebx, [eax + TCP_SOCKET.SND_UP] ; when urgent pointer is beyond start of send bufer |
cmp ebx, [eax + TCP_SOCKET.SND_UNA] |
jg .send |
ja .send |
test dl, TH_FIN |
jz .enter_persist ; no reason to send, enter persist state |
347,7 → 347,7 |
add esi, edi ; total TCP segment size |
cmp esi, [eax + TCP_SOCKET.t_maxseg] |
jle .no_overflow |
jbe .no_overflow |
mov esi, [eax + TCP_SOCKET.t_maxseg] |
445,7 → 445,7 |
mov edx, [eax + TCP_SOCKET.SND_NXT] |
cmp edx, [eax + TCP_SOCKET.SND_MAX] |
jle @f |
jbe @f |
mov [eax + TCP_SOCKET.SND_MAX], edx |
;;;; TODO: time transmission (420) |
455,7 → 455,7 |
; set retransmission timer if not already set, and not doing an ACK or keepalive probe |
cmp [eax + TCP_SOCKET.timer_retransmission], 1000 ;;;; |
jl .retransmit_set |
jb .retransmit_set |
cmp edx, [eax + TCP_SOCKET.SND_UNA] ; edx = [eax + TCP_SOCKET.SND_NXT] |
je .retransmit_set |
/kernel/branches/net/network/tcp_subr.inc |
---|
131,7 → 131,7 |
DEBUGF 1,"TCP_drop\n" |
cmp [eax + TCP_SOCKET.t_state], TCPS_SYN_RECEIVED |
jl .no_syn_received |
jb .no_syn_received |
mov [eax + TCP_SOCKET.t_state], TCPS_CLOSED |