/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 |