/kernel/branches/net/network/ARP.inc |
---|
91,7 → 91,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
ARP_init: |
118,7 → 117,6 |
; ebx = last four bytes of mac ; TODO: special eax value for 'request send' |
; |
;----------------------------------------------------------------- |
align 4 |
ARP_IP_to_MAC: |
202,8 → 200,6 |
; OUT: / |
; |
;--------------------------------------------------------------------------- |
align 4 |
ARP_create_request: |
266,7 → 262,6 |
; OUT: / |
; |
;--------------------------------------------------------------------------- |
align 4 |
ARP_decrease_entry_ttls: |
320,7 → 315,7 |
ret |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ARP_add_entry (or update) |
; |
332,10 → 327,7 |
; |
; OUT: eax = entry #, -1 on error |
; |
;--------------------------------------------------------------------------- |
; TODO: use a mutex |
;----------------------------------------------------------------- ; TODO: use a mutex |
align 4 |
ARP_add_entry: |
397,7 → 389,7 |
jmp .exit |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ARP_del_entry |
; |
404,8 → 396,7 |
; IN: entry # in esi |
; OUT: / |
; |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ARP_del_entry: |
434,7 → 425,7 |
;----------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ARP_Handler: |
; |
446,8 → 437,7 |
; packet size (without ethernet header) in ecx |
; OUT: / |
; |
;----------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ARP_handler: |
565,7 → 555,7 |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ARP_API |
; |
575,10 → 565,9 |
; device number in bh |
; ecx, edx, .. depends on subfunction |
; |
; OUT: |
; OUT: ? |
; |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ARP_API: |
/kernel/branches/net/network/IPv4.inc |
---|
79,7 → 79,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
IPv4_init: |
113,9 → 112,10 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
IPv4_handler: |
IPv4_handler: ; TODO: clean up this mess |
; for instance, there should be only one piece of code wich make the jump to an underlying protocol, and not two.. |
; TODO2: add code for IPv4 sockets (raw sockets) |
DEBUGF 1,"IP_Handler - start\n" |
475,7 → 475,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
IPv4_decrease_fragment_ttls: |
514,10 → 513,7 |
; esi = pointer to sending procedure |
; edi = pointer to start of data (-1 on error) |
; |
;----------------------------------------------------------------- |
;;; TODO: create fragmented packets |
;----------------------------------------------------------------- ;;; TODO: create fragmented packets |
align 4 |
IPv4_create_packet: |
622,7 → 618,6 |
; OUT: device id in edi |
; |
;--------------------------------------------------------------------------- |
align 4 |
IPv4_dest_to_dev: |
663,7 → 658,6 |
; OUT: fragment number in ax |
; |
;--------------------------------------------------------------------------- |
align 4 |
IPv4_get_frgmnt_num: |
xor ax, ax ;;; TODO: replace this with real code |
684,7 → 678,6 |
; OUT: |
; |
;--------------------------------------------------------------------------- |
align 4 |
IPv4_API: |
/kernel/branches/net/network/ethernet.inc |
---|
61,7 → 61,7 |
endg |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_init |
; |
70,8 → 70,7 |
; IN: / |
; OUT: / |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_init: |
86,7 → 85,7 |
ret |
;--------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_Add_Device: |
; |
96,8 → 95,7 |
; IN: Pointer to device structure in ebx |
; OUT: Device num in eax, -1 on error |
; |
;--------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_add_device: |
142,13 → 140,12 |
.error: |
or eax, -1 |
DEBUGF 1,"- fail\n" |
ret |
;-------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_Remove_Device: |
; |
158,8 → 155,7 |
; IN: Pointer to device structure in ebx |
; OUT: eax: -1 on error |
; |
;-------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_remove_device: |
182,18 → 178,16 |
mov dword [ETH_IN_QUEUE], ETH_QUEUE_SIZE |
mov dword [ETH_OUT_QUEUE], ETH_QUEUE_SIZE |
.notlast: |
.notlast: |
ret |
.error: |
.error: |
or eax, -1 |
ret |
;------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_Receiver: |
; |
200,20 → 194,22 |
; This function is called by ethernet drivers, |
; It pushes the received ethernet packets onto the eth_in_queue |
; |
; IN: Pointer to buffer in [esp], size of buffer in [esp-4], pointer to eth_device in ebx |
; IN: [esp] = Pointer to buffer |
; [esp-4] = size of buffer |
; ebx = pointer to eth_device |
; OUT: / |
; |
;------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_receiver: |
DEBUGF 1,"ETH_Receiver: " |
push ebx |
mov esi, esp |
add_to_queue ETH_IN_QUEUE, ETH_QUEUE_SIZE, eth_queue_entry.size, .fail |
DEBUGF 1,"Queued packet successfully\n" |
add esp, 4*3 |
ret |
.fail: |
221,13 → 217,12 |
add esp, 4 |
call kernel_free |
add esp, 4 |
ret |
;------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_Handler: |
; |
236,8 → 231,7 |
; IN: / |
; OUT: / |
; |
;------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_handler: |
292,9 → 286,9 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
ETH_sender: |
DEBUGF 1,"ETH_Sender: queuing for device: %x, %u bytes\n", [esp], [esp + 4] |
push ebx |
302,6 → 296,7 |
add_to_queue ETH_OUT_QUEUE, ETH_QUEUE_SIZE, eth_queue_entry.size, .fail |
DEBUGF 1,"Queued packet successfully\n" |
add esp, 3*4 |
ret |
.fail: |
309,6 → 304,7 |
add esp, 4 |
call kernel_free |
add esp, 4 |
ret |
321,7 → 317,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
ETH_send_queued: |
340,11 → 335,11 |
call kernel_free |
add esp, 4 ; pop (balance stack) |
.gohome: |
.gohome: |
ret |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_struc2dev |
; |
352,8 → 347,7 |
; |
; OUT: edi is -1 on error, device number otherwise |
; |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_struc2dev: |
push eax ecx |
377,9 → 371,9 |
ret |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_create_Packet |
; ETH_create_packet |
; |
; IN: pointer to source mac in eax |
; pointer to destination mac in ebx |
394,8 → 388,7 |
; edx is size of complete buffer |
; esi points to procedure wich needs to be called to send packet |
; |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_create_packet: |
455,7 → 448,7 |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ETH_API |
; |
467,8 → 460,7 |
; |
; OUT: |
; |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ETH_API: |
/kernel/branches/net/network/icmp.inc |
---|
115,7 → 115,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
ICMP_init: |
129,7 → 128,7 |
;-------------------------------- |
;----------------------------------------------------------------- |
; |
; ICMP_Handler: |
; |
143,8 → 142,7 |
; pointer to ICMP Packet data in edx |
; OUT: / |
; |
;-------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ICMP_handler: ;TODO: works only on pure ethernet right now ! |
258,7 → 256,7 |
ret |
;-------------------------------- |
;----------------------------------------------------------------- |
; |
; ICMP_Handler_fragments: |
; |
272,8 → 270,7 |
; pointer to ICMP Packet data in edx |
; OUT: / |
; |
;-------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ICMP_handler_fragments: ; works only on pure ethernet right now ! |
311,6 → 308,7 |
add esp, 4 ; pop (balance stack) |
ret |
;----------------------------------------------------------------- |
; |
; Note: ICMP only works on top of IP protocol :) |
327,7 → 325,6 |
; edi = identifier shl 16 + sequence number |
; |
;----------------------------------------------------------------- |
align 4 |
ICMP_create_packet: |
385,7 → 382,7 |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
; |
; ICMP_API |
; |
397,8 → 394,7 |
; |
; OUT: |
; |
;--------------------------------------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
ICMP_API: |
/kernel/branches/net/network/queue.inc |
---|
14,6 → 14,15 |
$Revision$ |
; The Queues implemented by these macros for a sort of ring-buffer. |
; The data to these queue's always looks like this: |
; |
; At top, you have the queue struct, wich has the size (number of currently queued packets, read and write pointers. |
; This struct is followed by a number of slots wich you can read and write to using the macros. |
; How these slots look like is up to you to chose, normally they should have at least a pointer to where the real data is. |
; (you can see some examples below) |
struct queue |
.size dd ? ; number of queued packets in thsi queue |
.w_ptr dd ? ; current writing pointer in queue |
53,19 → 62,30 |
.size: |
ends |
; The following macros share these inputs: |
; ptr = pointer to where the queue data is located |
; size = number of slots/entrys in the queue |
; entry_size = size of one slot, in bytes |
; failaddr = the address where macro will jump to when there is no data in the queue |
; additionally, add_to_queue requires you to set esi to the data wich you want to queue |
; get_from_queue on the other hand will return a pointer in esi, to the entry you're interessed in |
; PS: macros WILL destroy ecx and edi |
macro add_to_queue ptr, size, entry_size, failaddr { |
cmp [ptr + queue.size], size ; Check if queue isnt full |
cmp [ptr + queue.size], size ; Check if queue isnt full |
jge failaddr |
inc [ptr + queue.size] |
inc [ptr + queue.size] ; if not full, queue one more |
mov edi, [ptr + queue.w_ptr] ; Current write pointer (FIFO!) |
mov edi, [ptr + queue.w_ptr] ; Current write pointer (FIFO!) |
mov ecx, entry_size/4 ; Write the queue entry |
rep movsd ; |
lea ecx, [size*entry_size+ptr+queue.data] |
cmp edi, ecx ; entry size |
cmp edi, ecx ; entry size |
jl .no_wrap |
sub edi, size*entry_size |
79,10 → 99,10 |
macro get_from_queue ptr, size, entry_size, failaddr { |
cmp [ptr + queue.size], 0 ; any packets queued? |
cmp [ptr + queue.size], 0 ; any packets queued? |
je failaddr |
dec [ptr + queue.size] |
dec [ptr + queue.size] ; if so, dequeue one |
mov esi, [ptr + queue.r_ptr] |
push esi |
90,7 → 110,7 |
add esi, entry_size |
lea ecx, [size*entry_size+ptr+queue.data] |
cmp esi, ecx ; entry size |
cmp esi, ecx ; entry size |
jl .no_wrap |
sub esi, size*entry_size |
102,10 → 122,10 |
} |
macro init_queue queue_ptr { |
macro init_queue ptr { |
mov [queue_ptr + queue.size] , 0 |
lea esi, [queue_ptr + queue.data] |
mov [queue_ptr + queue.w_ptr], esi |
mov [queue_ptr + queue.r_ptr], esi |
mov [ptr + queue.size] , 0 |
lea edi, [ptr + queue.data] |
mov [ptr + queue.w_ptr], edi |
mov [ptr + queue.r_ptr], edi |
} |
/kernel/branches/net/network/socket.inc |
---|
97,6 → 97,7 |
MAX_backlog equ 20 ; backlog for stream sockets |
SOCKETBUFFSIZE equ 4096 ; in bytes |
SOCKET_QUEUE_SIZE equ 10 ; maximum number ofincoming packets queued for 1 socket |
SOCKET_QUEUE_LOCATION equ 2048 ; the incoming packet queue for sockets is placed in the socket struct itself, at this location from start |
uglobal |
net_sockets rd 2 |
105,7 → 106,7 |
endg |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_init |
; |
114,8 → 115,7 |
; IN: / |
; OUT: / |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_init: |
128,12 → 128,11 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; Socket API (function 74) |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
sys_socket: |
and ebx, 0x000000FF ; should i remove this line ? |
151,7 → 150,7 |
dd socket_accept ; 5 |
dd socket_send ; 6 |
dd socket_recv ; 7 |
dd socket_get_opt ; 8 |
dd socket_get_opt ; 8 |
; dd socket_set_opt ; 9 |
161,7 → 160,7 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_open |
; |
171,7 → 170,7 |
; protocol in esi |
; OUT: eax is socket num, -1 on error |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_open: |
188,7 → 187,7 |
stdcall net_socket_addr_to_num, eax |
DEBUGF 1,", socketnumber: %u\n", eax |
; TODO: if it is txcp socket, set state to TCB_CLOSED |
; TODO: if it is a tcp socket, set state to TCB_CLOSED |
mov [esp+32], eax |
196,12 → 195,7 |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_bind |
; |
210,7 → 204,7 |
; length of that struct in esi |
; OUT: 0 on success |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_bind: |
278,7 → 272,7 |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_connect |
; |
288,7 → 282,7 |
; length of that struct in esi |
; OUT: 0 on success |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_connect: |
375,9 → 369,7 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_listen |
; |
386,7 → 378,7 |
; backlog in edx |
; OUT: eax is socket num, -1 on error |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_listen: |
414,11 → 406,7 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_accept |
; |
428,7 → 416,7 |
; addrlen in esi |
; OUT: eax is socket num, -1 on error |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_accept: |
461,7 → 449,7 |
dec [esi + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.backlog_cur] |
mov eax, [eax + SOCKET_head.end + IPv4_SOCKET.end + TCP_SOCKET.end + (eax-1)*4] |
mov [esi + SOCKET_head.lock], 0 |
stdcall net_socket_addr_to_num, eax |
stdcall net_socket_addr_to_num, eax |
mov [esp+32], eax |
ret |
.unlock_err: |
469,7 → 457,7 |
jmp s_error |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_close |
; |
477,7 → 465,7 |
; IN: socket number in ecx |
; OUT: eax is socket num, -1 on error |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_close: |
559,7 → 547,7 |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_receive |
; |
570,7 → 558,7 |
; flags in edi |
; OUT: eax is number of bytes copied, -1 on error |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_recv: |
582,7 → 570,7 |
DEBUGF 1,"Socket pointer: %x\n", eax |
get_from_queue (eax + 2048), SOCKET_QUEUE_SIZE, 4*3, s_error |
get_from_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, socket_queue_entry.size, s_error |
mov edi, edx |
mov ecx, [esi + socket_queue_entry.data_size] |
615,7 → 603,7 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_send |
; |
626,8 → 614,7 |
; flags in edi |
; OUT: -1 on error |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_send: |
745,21 → 732,23 |
mov [esp+32], eax |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_send |
; SOCKET_get_options |
; |
; |
; IN: socket number in ecx |
; edx points to the options: |
; dd level, optname, optval, optlen |
; dd level, optname, optval, optlen |
; OUT: -1 on error |
; |
; At moment, uses only pseudo-optname -2 for get last_ack_number for TCP. |
; TODO: find best way to notify that send()'ed data were acknowledged |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_get_opt: |
cmp dword [edx], IP_PROTO_TCP |
jnz .unknown |
cmp dword [edx+4], -2 |
770,7 → 759,7 |
cmp dword [eax], 4 |
mov dword [eax], 4 |
jb .fail |
stdcall net_socket_num_to_addr, ecx |
stdcall net_socket_num_to_addr, ecx |
test eax, eax |
jz .fail |
; todo: check that eax is really TCP socket |
780,15 → 769,15 |
jz @f |
mov [eax], ecx |
@@: |
xor eax, eax |
mov dword [esp+32], 0 |
ret |
.fail: |
.unknown: |
or eax, -1 |
mov dword [esp+32], -1 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_find_free_port (local port) |
; |
797,7 → 786,7 |
; IN: type in ecx (TCP/UDP) |
; OUT: bx = 0 on error, portnumber otherwise |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_find_port: |
848,7 → 837,9 |
rol bx, 8 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_check_port (local port) |
; |
858,7 → 849,7 |
; port to check in bx |
; OUT: bx = 0 on error, unchanged otherwise |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_check_port: |
mov esi, net_sockets |
880,7 → 871,8 |
ret |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; SOCKET_internal_receiver |
; |
895,7 → 887,7 |
; |
; OUT: xxx |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
socket_internal_receiver: |
905,9 → 897,9 |
push ecx ; size |
push esi ; data_ptr |
mov esi, esp |
add_to_queue (eax + 2048), SOCKET_QUEUE_SIZE, 3*4, notify_network_event.full |
add_to_queue (eax + SOCKET_QUEUE_LOCATION), SOCKET_QUEUE_SIZE, socket_queue_entry.size, notify_network_event.full |
DEBUGF 1,"Queued packet successfully\n" |
add esp, 4*3 |
add esp, socket_queue_entry.size |
mov [eax + SOCKET_head.lock], 0 |
964,7 → 956,7 |
rep stosd |
pop eax |
init_queue (eax + 2048) |
init_queue (eax + SOCKET_QUEUE_LOCATION) |
; add socket to the list by changing pointers |
mov ebx, net_sockets |
/kernel/branches/net/network/stack.inc |
---|
29,7 → 29,7 |
MIN_EPHEMERAL_PORT equ 49152 |
MAX_EPHEMERAL_PORT equ 61000 |
ETHER equ 1337 |
ETHER equ 1337 ; TODO: find another value for this (how does it work in posix ?) |
ETHER_ARP equ 0x0608 |
AF_UNSPEC equ 0 |
105,7 → 105,7 |
include "udp.inc" |
include "icmp.inc" |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; stack_init |
; |
114,8 → 114,7 |
; IN: / |
; OUT: / |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
stack_init: |
136,7 → 135,7 |
;----------------------------------------------- |
;----------------------------------------------------------------- |
; |
; stack_handler |
; |
145,47 → 144,43 |
; IN: / |
; OUT: / |
; |
;----------------------------------------------- |
;----------------------------------------------------------------- |
align 4 |
stack_handler: |
cmp [ETH_RUNNING], 0 |
je .exit |
cmp [ETH_RUNNING], 0 |
je .exit |
; Test for 1/100 s (10ms) tick |
mov eax, [timer_ticks] |
cmp eax, [last_1hsTick] |
je .exit |
; Test for 1/100 s (10ms) tick |
mov eax, [timer_ticks] |
cmp eax, [last_1hsTick] |
je .exit |
mov [last_1hsTick], eax |
mov [last_1hsTick], eax |
call ETH_handler ; handle all queued ethernet packets |
call ETH_send_queued |
call TCP_send_queued |
call ETH_handler ; handle all queued ethernet packets |
call ETH_send_queued |
call TCP_send_queued |
.sec_tick: |
; Test for 1 second tick |
mov al, 0 |
out 0x70, al |
in al, 0x71 |
cmp al, [last_1sTick] |
je .exit |
; Test for 1 second tick |
mov al, 0 |
out 0x70, al |
in al, 0x71 |
cmp al, [last_1sTick] |
je .exit |
mov [last_1sTick], al |
mov [last_1sTick], al |
call ARP_decrease_entry_ttls |
call IPv4_decrease_fragment_ttls |
call TCP_decrease_socket_ttls |
call ARP_decrease_entry_ttls |
call IPv4_decrease_fragment_ttls |
call TCP_decrease_socket_ttls |
.exit: |
ret |
ret |
;----------------------------------------------------------------- |
; |
; checksum_1 |
198,7 → 193,6 |
; OUT: edx = semi-checksum |
; |
;----------------------------------------------------------------- |
align 4 |
checksum_1: |
222,7 → 216,6 |
ret |
;----------------------------------------------------------------- |
; |
; checksum_2 |
233,7 → 226,6 |
; OUT: dx = checksum (in INET byte order) |
; |
;----------------------------------------------------------------- |
align 4 |
checksum_2: |
262,7 → 254,6 |
; System function to work with network devices (73) |
; |
;---------------------------------------------------------------- |
align 4 |
sys_network: |
346,7 → 337,6 |
; System Function To work with Protocols (75) |
; |
;---------------------------------------------------------------- |
align 4 |
sys_protocols: |
cmp bh, MAX_NET_DEVICES ; Check if device number exists |
389,4 → 379,4 |
.return: |
mov [esp+28+4], eax |
ret |
ret |
/kernel/branches/net/network/tcp.inc |
---|
20,7 → 20,6 |
TCP_RETRIES equ 5 ; Number of times to resend a Packet |
TCP_PACKET_TTL equ 50 ; resend if not replied to in 1/100 s |
TCP_SOCKET_TTL equ 10 ; # of secs to wait before closing socket |
TCP_QUEUE_SIZE equ 16 |
51,7 → 50,6 |
align 4 |
iglobal |
stateHandler: |
dd stateTCB_LISTEN |
79,7 → 77,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_init: |
90,7 → 87,12 |
init_queue TCP_IN_QUEUE |
; tcp_out_queue is a special type of queue |
; tcp_out_queue is a special type of queue: |
; The first dword is a counter of total packets queued. |
; The remaining bytes are socket 'slots' wich use tcp_out_queue_entry data structure. |
; An empty slot is know by the fact that tcp_out_queue_entry.data_ptr (first dword of the slot) is set to 0 |
; There are TCP_OUT_QUEUE_SIZE number of slots |
xor eax, eax |
mov esi, TCP_OUT_QUEUE |
mov ecx, TCP_QUEUE_SIZE*tcp_out_queue_entry/4+1 |
107,7 → 109,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_decrease_socket_ttls: |
; scan through all the sockets, decrementing active timers |
168,7 → 169,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_send_queued: |
205,6 → 205,7 |
push [esi + tcp_out_queue_entry.data_size] |
push [esi + tcp_out_queue_entry.data_ptr] |
DEBUGF 1,"Now sending TCP packet %x, size: %u, owner: %x, sendproc %x\n", [esp], [esp+4], ebx, [esi + tcp_out_queue_entry.sendproc] |
inc [TCP_PACKETS_TX] |
call [esi + tcp_out_queue_entry.sendproc] |
add esp, 8 |
pop esi ecx eax |
237,7 → 238,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_add_to_queue: |
298,7 → 298,6 |
; OUT: / |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_handler : |
338,6 → 337,8 |
DEBUGF 1,"Found valid socket for packet\n" |
inc [TCP_PACKETS_RX] |
push ebx |
lea ebx, [ebx + SOCKET_head.lock] |
call wait_mutex |
425,7 → 426,6 |
; esi = pointer to data |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_socket_send: |
523,7 → 523,6 |
; bl = flags |
; |
;----------------------------------------------------------------- |
align 4 |
TCP_send_ack: |
570,7 → 569,7 |
; Now, calculate the checksum |
pushw TCP_Packet.Options shl 8 |
pushw IP_PROTO_TCP shl 8 |
pushd [edi-4] ; destination address |
pushd [edi-4] ; destination address ; TODO: fix this, IPv4 packet could have options.. |
pushd [edi-8] ; source address |
xor edx, edx |
979,7 → 978,6 |
; OUT: |
; |
;--------------------------------------------------------------------------- |
align 4 |
TCP_API: |
/kernel/branches/net/network/udp.inc |
---|
247,7 → 247,7 |
mov esi, edi |
call checksum_1 |
; Checksum for pseudoheader |
pushd [edi-4] ; destination address |
pushd [edi-4] ; destination address ; TODO: fix this, IPv4 packet could have options.. |
pushd [edi-8] ; source address |
mov ecx, 12 |
mov esi, esp |