Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1541 → Rev 1542

/kernel/branches/net/applications/network_lib/network.inc
File deleted
Property changes:
Deleted: svn:keywords
-Revision
\ No newline at end of property
Deleted: svn:mergeinfo
/kernel/branches/net/applications/network_lib/network.asm
7,7 → 7,7
include '../macros.inc'
purge section,mov,add,sub
 
include 'network.inc'
include '../network.inc'
 
section '.flat' code readable align 16
 
29,7 → 29,8
mov [dll.load], edx
mov [DNSrequestID], 1
stdcall edx, @IMPORT
ret 4
xor eax, eax
ret
 
;;===========================================================================;;
;; in_addr_t __stdcall inet_addr(__in const char* hostname); ;;
257,7 → 258,7
ret
 
struct __gai_reqdata
socket dd ?
socketnum dd ?
; external code should not look on rest of this structure,
; it is internal for getaddrinfo_start/process/abort
reqid dw ? ; DNS request ID
279,7 → 280,7
;;---------------------------------------------------------------------------;;
;> first parameter (optional) = host name ;;
;> second parameter (optional) = service name (decimal number for now) ;;
;> third parameter (optional) = hints for socket type ;;
;> third parameter (optional) = hints for socketnum type ;;
;> fourth parameter = pointer to result (head of L1-list) ;;
;;---------------------------------------------------------------------------;;
;< eax = 0 on success / one of EAI_ codes on error ;;
425,14 → 426,14
jecxz @f
cmp [ecx+addrinfo.ai_family], edi
jz @f
cmp [ecx+addrinfo.ai_family], PF_INET
cmp [ecx+addrinfo.ai_family], AF_INET4
jnz .ret
@@:
; 1e. Valid combinations for ai_socktype/ai_protocol: 0/0 for any or
; SOCK_STREAM/IPPROTO_TCP, SOCK_DGRAM/IPPROTO_UDP
; (raw sockets are not yet supported by the kernel)
; (raw socketnums are not yet supported by the kernel)
xor edx, edx ; assume 0=any if no hints
jecxz .socket_type_ok
jecxz .socketnum_type_ok
mov edx, [ecx+addrinfo.ai_socktype]
mov esi, [ecx+addrinfo.ai_protocol]
; 1f. Test for ai_socktype=0 and ai_protocol=0.
439,16 → 440,16
test edx, edx
jnz .check_socktype
test esi, esi
jz .socket_type_ok
jz .socketnum_type_ok
; 1g. ai_socktype=0, ai_protocol is nonzero.
push EAI_SERVICE
pop eax
inc edx ; edx = SOCK_STREAM
cmp esi, IPPROTO_TCP
jz .socket_type_ok
jz .socketnum_type_ok
inc edx ; edx = SOCK_DGRAM
cmp esi, IPPROTO_UDP
jz .socket_type_ok
jz .socketnum_type_ok
.ret:
; Restore saved registers, destroy stack frame and return.
mov esp, ebp
464,16 → 465,16
cmp edx, SOCK_DGRAM
jnz .ret
test esi, esi
jz .socket_type_ok
jz .socketnum_type_ok
cmp esi, IPPROTO_UDP
jz .socket_type_ok
jz .socketnum_type_ok
jmp .ret
.check_tcp:
test esi, esi
jz .socket_type_ok
jz .socketnum_type_ok
cmp esi, IPPROTO_TCP
jnz .ret
.socket_type_ok:
.socketnum_type_ok:
mov [ebx+__gai_reqdata.socktype], dl
; 2. Resolve service.
; 2a. If no name is given, remember value -1.
513,7 → 514,7
; 3. Process host name.
mov esi, [.hostname]
; 3a. If hostname is not given,
; use localhost for active sockets and INADDR_ANY for passive sockets.
; use localhost for active socketnums and INADDR_ANY for passive socketnums.
mov eax, 0x0100007F ; 127.0.0.1 in network byte order
test byte [ebx+__gai_reqdata.flags], AI_PASSIVE
jz @f
679,17 → 680,17
cmp eax, -1
je .ret.dnserr
mov esi, eax ; put server address to esi
; 8. Open UDP socket to DNS server, port 53.
; 8a. Create new socket.
mcall 74, 0, AF_INET, IPPROTO_UDP
; 8. Open UDP socketnum to DNS server, port 53.
; 8a. Create new socketnum.
mcall 74, 0, AF_INET4, SOCK_DGRAM
cmp eax, -1 ; error?
jz .ret.dnserr
mov ecx, eax ; put socket handle to ecx
mov ecx, eax ; put socketnum handle to ecx
; 8b. Create sockaddr structure on the stack.
push 0
push 0 ; sin_zero
push esi ; sin_addr
push AF_INET + (53 shl 16)
push AF_INET4 + (53 shl 16)
; sin_family and sin_port in network byte order
; 8c. Connect.
mcall 74, 4, , esp, sizeof.sockaddr_in
706,7 → 707,7
cmp eax, -1
jz .ret.close
mov eax, [.reqdata]
mov [eax+__gai_reqdata.socket], ecx
mov [eax+__gai_reqdata.socketnum], ecx
push -1
pop eax ; return status: more processing required
jmp .ret.dns
759,11 → 760,11
push ebx esi edi
mov edi, [.reqdata]
; 2. Read UDP datagram.
mov ecx, [edi+__gai_reqdata.socket]
mov ecx, [edi+__gai_reqdata.socketnum]
push edi
mcall 74, 7, , , 512, 0
pop edi
; 3. Ignore events for other sockets (return if no data read)
; 3. Ignore events for other socketnums (return if no data read)
test eax, eax
jz .ret.more_processing_required
; 4. Sanity check: discard too short packets.
918,10 → 919,10
@@:
pop eax
.ret.close:
; 15. Close socket.
; 15. Close socketnum.
push eax
mov ecx, [.reqdata]
mov ecx, [ecx+__gai_reqdata.socket]
mov ecx, [ecx+__gai_reqdata.socketnum]
mcall 74, 1
pop eax
; 16. Restore used registers, destroy stack frame and return.
1170,12 → 1171,12
; 4. Fill struct addrinfo.
mov eax, [ebx+__gai_reqdata.flags]
mov [edi+addrinfo.ai_flags], eax
mov byte [edi+addrinfo.ai_family], PF_INET
mov byte [edi+addrinfo.ai_family], AF_INET4
mov byte [edi+addrinfo.ai_addrlen], sizeof.sockaddr_in
lea ecx, [edi+sizeof.addrinfo]
mov [edi+addrinfo.ai_addr], ecx
; 5. Fill struct sockaddr_in.
mov byte [ecx+sockaddr_in.sin_family], PF_INET
mov byte [ecx+sockaddr_in.sin_family], AF_INET4
pop eax
mov [ecx+sockaddr_in.sin_addr], eax
; 6. Append new item to the list.
1189,7 → 1190,7
ret
 
.set_socktype:
; Set ai_socktype and ai_protocol fields by given socket type.
; Set ai_socktype and ai_protocol fields by given socketnum type.
mov byte [edi+addrinfo.ai_socktype], cl
dec cl
jnz .set_udp
1219,9 → 1220,9
;;===========================================================================;;
; 0. Save used registers for __stdcall.
push ebx
; 1. Allocated resources: only socket, so close it and return.
; 1. Allocated resources: only socketnum, so close it and return.
mov eax, [esp+8]
mov ecx, [eax+__gai_reqdata.socket]
mov ecx, [eax+__gai_reqdata.socketnum]
mcall 74, 1
; 2. Restore used registers and return.
pop ebx
/kernel/branches/net/applications/nslookup/dll.inc
File deleted
Property changes:
Deleted: svn:keywords
-Revision
\ No newline at end of property
/kernel/branches/net/applications/nslookup/nslookup.asm
15,7 → 15,7
include '../proc32.inc'
include '../dll.inc'
 
include '../network_lib/network.inc'
include '../network.inc'
 
; entry point
start:
/kernel/branches/net/applications/synergyc/synergyc.asm
86,7 → 86,7
push newline
call [con_write_asciiz]
 
mcall socket, AF_INET4, IPPROTO_TCP, 0
mcall socket, AF_INET4, SOCK_STREAM, 0
cmp eax, -1
je error
 
/kernel/branches/net/applications/telnet/telnet.asm
92,7 → 92,7
push str4
call [con_write_asciiz]
 
mcall socket, AF_INET4, IPPROTO_TCP, 0
mcall socket, AF_INET4, SOCK_STREAM, 0
cmp eax, -1
jz fail2
mov [socketnum], eax
/kernel/branches/net/applications/tftpc/TFTP.asm
226,7 → 226,7
mov esi, [esi + sockaddr_in.sin_addr]
mov dword [IP], esi
 
mcall socket, AF_INET4, IP_PROTO_UDP, 0 ; socket_open
mcall socket, AF_INET4, SOCK_DGRAM, 0 ; socket_open
cmp eax, -1
je still
 
/kernel/branches/net/applications/zeroconf/zeroconf.asm
42,14 → 42,10
DEFEND_INTERVAL equ 10 ; seconds (min. wait between defensive ARPs)
 
 
AF_INET4 equ 2 ;;;;;
IP_PROTO_UDP equ 17
 
 
 
include '../proc32.inc'
include '../macros.inc'
include '../debug-fdo.inc'
include '../network.inc'
include 'dhcp.inc'
include 'dll.inc'
 
136,7 → 132,7
mcall 75, 1337 shl 16 + 4
 
cmp eax, -1
je close
je exit
 
mov word[MAC], bx
mov dword[MAC+2], eax
198,7 → 194,7
 
DEBUGF 1,"->Skip ini\n"
 
mcall 74, 0, AF_INET4, IP_PROTO_UDP, 0 ; open socket (parameters: domain, type, reserved)
mcall 74, 0, AF_INET4, SOCK_DGRAM, 0 ; open socket (parameters: domain, type, reserved)
cmp eax, -1
je error
mov [socketNum], eax
300,7 → 296,7
DEBUGF 1,"->%d bytes received\n", eax
 
push eax
mcall 74, 1, [socketNum] ; close the socket
mcall 74, 1, [socketNum] ; exit the socket
pop eax
 
cmp eax, -1
323,7 → 319,7
cmp [dhcpMsgType], byte 0x03 ; did we send a request?
je request
 
jmp close ; really unknown, what we did
jmp exit ; really unknown, what we did
 
discover:
call parseResponse
339,7 → 335,7
cmp [dhcpMsgType], byte 0x05 ; Was the response an ACK? It should be
jne apipa ; NO - so we do zeroconf
 
jmp close
jmp exit
 
;***************************************************************************
; Function
447,7 → 443,7
; DEBUGF 1,"Sending ARP announce\n"
;;;
 
jmp close
jmp exit
 
apipa:
stdcall mem.Free, [dhcpMsg]
511,7 → 507,7
; we should, instead of closing, detect ARP conflicts and detect if cable keeps connected ;)
 
error:
close:
exit:
mcall -1
 
 
592,4 → 588,6
 
path rb 1024+5
 
rb 65536
 
I_END:
/kernel/branches/net/network/icmp.inc
225,9 → 225,6
cmp [ebx + SOCKET.Domain], AF_INET4
jne .next_socket
 
cmp [ebx + SOCKET.Type], SOCK_RAW
jne .next_socket
 
cmp [ebx + SOCKET.Protocol], IP_PROTO_ICMP
jne .next_socket
 
/kernel/branches/net/network/socket.inc
58,8 → 58,8
 
TCP_SOCKET:
 
.LocalPort dw ? ; In INET byte order
.RemotePort dw ? ; In INET byte order
.LocalPort dw ?
.RemotePort dw ?
 
.backlog dw ? ; Backlog
.backlog_cur dw ? ; current size of queue for un-accept-ed connections
150,8 → 150,8
 
UDP_SOCKET:
 
.LocalPort dw ? ; In INET byte order
.RemotePort dw ? ; In INET byte order
.LocalPort dw ?
.RemotePort dw ?
.firstpacket db ?
 
.end:
161,7 → 161,7
 
ICMP_SOCKET:
 
.Identifier dw ? ;
.Identifier dw ?
 
.end:
end virtual
250,10 → 250,9
;-----------------------------------------------------------------
align 4
sys_socket:
cmp ebx, 8 ; highest possible number
cmp ebx, 9 ; highest possible number
jg @f
lea ebx, [sock_sysfn_table + 4*ebx]
jmp dword [ebx]
jmp dword [sock_sysfn_table + 4*ebx]
@@:
cmp ebx, 255
jz SOCKET_debug
274,11 → 273,9
dd SOCKET_accept ; 5
dd SOCKET_send ; 6
dd SOCKET_receive ; 7
dd SOCKET_get_opt ; 8
; dd SOCKET_set_opt ; 9
dd SOCKET_set_opt ; 8
dd SOCKET_get_opt ; 9
 
 
 
;-----------------------------------------------------------------
;
; SOCKET_open
297,12 → 294,12
call SOCKET_alloc
jz s_error
 
mov [esp+32], edi ; return socketnumber
 
mov [eax + SOCKET.Domain], ecx
mov [eax + SOCKET.Type], edx
mov [eax + SOCKET.Protocol], esi
 
mov [esp+32], edi ; return socketnumber
 
cmp ecx, AF_INET4
jne .no_inet4
 
309,12 → 306,10
push [IP_LIST]
pop [eax + IP_SOCKET.LocalIP] ; fill in local ip number
 
call SOCKET_find_port ; fill in a local port number, application may change it later, or use this one
 
cmp edx, IP_PROTO_UDP
cmp edx, SOCK_DGRAM
je .udp
 
cmp edx, IP_PROTO_TCP
cmp edx, SOCK_STREAM
je .tcp
 
cmp edx, SOCK_RAW
323,21 → 318,28
.no_inet4:
ret
 
.tcp:
mov ebx, eax
align 4
.raw:
; test esi, esi ; IP_PROTO_IP
; jz .ip
 
lea eax, [ebx + STREAM_SOCKET.snd]
call SOCKET_ring_create
cmp esi, IP_PROTO_ICMP
je .icmp
 
lea eax, [ebx + STREAM_SOCKET.rcv]
call SOCKET_ring_create
cmp esi, IP_PROTO_UDP
je .udp
 
mov [ebx + SOCKET.snd_proc], SOCKET_send_tcp
mov [ebx + SOCKET.rcv_proc], SOCKET_receive_tcp
cmp esi, IP_PROTO_TCP
je .tcp
 
ret
 
align 4
.udp:
mov [eax + SOCKET.Protocol], IP_PROTO_UDP
 
call SOCKET_find_port ; fill in a local port number, application may change it later, or use this one
 
push eax
init_queue (eax + SOCKET_QUEUE_LOCATION)
pop eax
347,16 → 349,29
 
ret
 
.raw:
; test esi, esi
; jz .ip
align 4
.tcp:
mov [eax + SOCKET.Protocol], IP_PROTO_TCP
 
cmp esi, IP_PROTO_ICMP
je .icmp
call SOCKET_find_port ; fill in a local port number, application may change it later, or use this one
 
mov ebx, eax
 
lea eax, [ebx + STREAM_SOCKET.snd]
call SOCKET_ring_create
 
lea eax, [ebx + STREAM_SOCKET.rcv]
call SOCKET_ring_create
 
mov [ebx + SOCKET.snd_proc], SOCKET_send_tcp
mov [ebx + SOCKET.rcv_proc], SOCKET_receive_tcp
 
ret
 
 
;align 4
; .ip:
;
; push eax
; init_queue (eax + SOCKET_QUEUE_LOCATION)
; pop eax
366,7 → 381,10
;
; ret
 
 
align 4
.icmp:
 
push eax
init_queue (eax + SOCKET_QUEUE_LOCATION)
pop eax
421,8 → 439,6
cmp esi, 6
jl s_error
 
mov ecx, [eax + SOCKET.Type]
 
mov bx, word [edx + 2]
test bx, bx
jz .use_preset_port
473,17 → 489,21
 
.af_inet4:
 
cmp [eax + SOCKET.Type], IP_PROTO_UDP
cmp [eax + SOCKET.Protocol], IP_PROTO_UDP
je .udp
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
je .tcp
 
cmp [eax + SOCKET.Type], SOCK_RAW
je .raw
cmp [eax + SOCKET.Protocol], IP_PROTO_IP
je .ip
 
cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP
je .ip
 
jmp s_error
 
align 4
.udp:
mov bx , word [edx + 2]
mov word [eax + UDP_SOCKET.RemotePort], bx
497,7 → 517,7
mov dword [esp+32], 0
ret
 
 
align 4
.tcp:
lea ebx, [eax + SOCKET.lock]
call wait_mutex
532,7 → 552,8
mov dword [esp+32], 0 ; success!
ret
 
.raw:
align 4
.ip:
push dword [edx + 4]
pop dword [eax + IP_SOCKET.RemoteIP]
 
560,7 → 581,7
cmp word [eax + SOCKET.Domain], AF_INET4
jne s_error
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
jne s_error
 
; TODO: check local port number
572,7 → 593,7
 
mov [eax + TCP_SOCKET.backlog], dx
mov [eax + TCP_SOCKET.t_state], TCB_LISTEN
or [eax + SOCKET.options], SO_ACCEPTCON
or [eax + SOCKET.options], SO_ACCEPTCON ;;;; TODO: set socket state to listen
 
mov dword [esp+32], 0
 
604,7 → 625,7
 
.af_inet4:
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
je .tcp
 
jmp s_error
651,13 → 672,16
cmp [eax + SOCKET.Domain], AF_INET4
jne s_error
 
cmp [eax + SOCKET.Type], IP_PROTO_UDP
cmp [eax + SOCKET.Protocol], IP_PROTO_UDP
je .free
 
cmp [eax + SOCKET.Type], IP_PROTO_ICMP
cmp [eax + SOCKET.Protocol], IP_PROTO_ICMP
je .free
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_IP
je .free
 
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
je .tcp
 
jmp s_error
895,6 → 919,14
 
 
 
 
align 4
SOCKET_set_opt:
 
ret
 
 
 
;-----------------------------------------------------------------
;
; SOCKET_debug
942,10 → 974,10
 
push ebx esi ecx
 
cmp [eax + SOCKET.Type], IP_PROTO_UDP
cmp [eax + SOCKET.Protocol], IP_PROTO_UDP
je .udp
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
je .tcp
 
jmp .error
986,7 → 1018,7
 
;-----------------------------------------------------------------
;
; SOCKET_check_port
; SOCKET_check_port (to be used with AF_INET only!)
;
; Checks if a local port number is unused
; If the proposed port number is unused, it is filled in in the socket structure
1002,7 → 1034,7
 
DEBUGF 1,"SOCKET_check_port\n"
 
mov ecx, [eax + SOCKET.Type]
mov ecx, [eax + SOCKET.Protocol]
mov esi, net_sockets
 
.next_socket:
1010,7 → 1042,7
or esi, esi
jz .port_ok
 
cmp [esi + SOCKET.Type], ecx
cmp [esi + SOCKET.Protocol], ecx
jne .next_socket
 
cmp [esi + UDP_SOCKET.LocalPort], bx
1404,7 → 1436,7
cmp [eax + SOCKET.Domain], AF_INET4
jnz .no_tcp
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP
jnz .no_tcp
 
mov ebx, eax
1625,10 → 1657,10
 
mov [ebx + SOCKET.PID], 0
 
cmp [ebx + SOCKET.Type], IP_PROTO_UDP
cmp [ebx + SOCKET.Protocol], IP_PROTO_UDP
je .udp
 
cmp [ebx + SOCKET.Type], IP_PROTO_TCP
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP
je .tcp
 
jmp .next_socket ; kill all sockets for given PID
/kernel/branches/net/network/tcp.inc
135,7 → 135,7
or eax, eax
jz .exit
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP ;;; We should also check if family is AF_INET
jne .loop
 
dec [eax + TCP_SOCKET.timer_ack]
177,7 → 177,7
or eax, eax
jz .exit
 
cmp [eax + SOCKET.Type], IP_PROTO_TCP
cmp [eax + SOCKET.Protocol], IP_PROTO_TCP ;;; We should also check if family is AF_INET
jne .loop
 
inc [eax + TCP_SOCKET.t_idle]
378,7 → 378,7
or ebx, ebx
jz .drop_with_reset
 
cmp [ebx + SOCKET.Type], IP_PROTO_TCP
cmp [ebx + SOCKET.Protocol], IP_PROTO_TCP ;;; We should also check if family is AF_INET
jne .socket_loop
 
mov ax, [edx + TCP_segment.DestinationPort]
1106,6 → 1106,8
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code missing (943?)
 
 
 
mov eax, [edx + TCP_segment.AckNumber]
mov [ebx + TCP_SOCKET.SND_UNA], eax
 
1114,7 → 1116,6
mov [ebx + TCP_SOCKET.SND_NXT], eax
@@:
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
;---------------------------------------
; Wake up process waiting on send buffer
/kernel/branches/net/network/udp.inc
152,7 → 152,7
jz .dump
cmp [eax + SOCKET.Domain], AF_INET4
jne .next_socket
cmp [eax + SOCKET.Type], IP_PROTO_UDP
cmp [eax + SOCKET.Protocol], IP_PROTO_UDP
jne .next_socket
cmp [eax + UDP_SOCKET.LocalPort], si
jne .next_socket