From 445f854caeb3d20734d09c59e6ea1e5f38bfb3fb Mon Sep 17 00:00:00 2001 From: hidnplayr Date: Sat, 31 Jul 2010 11:17:06 +0000 Subject: [PATCH] Correct use of TYPE and PROTOCOL parameters in socket function git-svn-id: svn://kolibrios.org@1542 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../net/applications/network_lib/network.asm | 61 +++---- .../net/applications/network_lib/network.inc | 60 ------- .../net/applications/nslookup/dll.inc | 157 ------------------ .../net/applications/nslookup/nslookup.asm | 2 +- .../net/applications/synergyc/synergyc.asm | 2 +- .../net/applications/telnet/telnet.asm | 2 +- .../branches/net/applications/tftpc/TFTP.asm | 2 +- .../net/applications/zeroconf/zeroconf.asm | 22 ++- kernel/branches/net/network/icmp.inc | 3 - kernel/branches/net/network/socket.inc | 148 ++++++++++------- kernel/branches/net/network/tcp.inc | 9 +- kernel/branches/net/network/udp.inc | 2 +- 12 files changed, 141 insertions(+), 329 deletions(-) delete mode 100644 kernel/branches/net/applications/network_lib/network.inc delete mode 100644 kernel/branches/net/applications/nslookup/dll.inc diff --git a/kernel/branches/net/applications/network_lib/network.asm b/kernel/branches/net/applications/network_lib/network.asm index 787722f0b9..40f89a9f24 100644 --- a/kernel/branches/net/applications/network_lib/network.asm +++ b/kernel/branches/net/applications/network_lib/network.asm @@ -7,7 +7,7 @@ include '../proc32.inc' include '../macros.inc' purge section,mov,add,sub -include 'network.inc' +include '../network.inc' section '.flat' code readable align 16 @@ -29,7 +29,8 @@ lib_init: ;//////////////////////////////////////////////////////////////////;; 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 @@ inet_ntoa: ;; 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 @@ getaddrinfo: ;; ;;---------------------------------------------------------------------------;; ;> 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,30 +426,30 @@ end virtual 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. 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 @@ end virtual 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 @@ end virtual ; 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 @@ lock xadd [DNSrequestID], eax ; atomically increment ID, get old value 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 @@ lock xadd [DNSrequestID], eax ; atomically increment ID, get old value 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 @@ end virtual 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 @@ end virtual @@: 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 @@ getaddrinfo._.generate_data: ;; ; 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 @@ getaddrinfo._.generate_data: ;; 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 @@ getaddrinfo_abort: ;; ;;===========================================================================;; ; 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 diff --git a/kernel/branches/net/applications/network_lib/network.inc b/kernel/branches/net/applications/network_lib/network.inc deleted file mode 100644 index ae5ff20dff..0000000000 --- a/kernel/branches/net/applications/network_lib/network.inc +++ /dev/null @@ -1,60 +0,0 @@ -; Socket types -SOCK_STREAM = 1 -SOCK_DGRAM = 2 -SOCK_RAW = 3 ; not supported by the kernel - -; IP protocols -IPPROTO_IP = 0 -IPPROTO_ICMP = 1 ; not supported by the kernel -IPPROTO_TCP = 6 -IPPROTO_UDP = 17 - -; Address families -AF_UNSPEC = 0 -AF_INET = 2 ; IPv4 -;AF_INET6 = 28 ; IPv6 (not supported) - -PF_UNSPEC = AF_UNSPEC -PF_INET = AF_INET -;PF_INET6 = AF_INET6 - -; Flags for addrinfo -AI_PASSIVE = 1 -AI_CANONNAME = 2 -AI_NUMERICHOST = 4 -AI_NUMERICSERV = 8 -AI_ADDRCONFIG = 0x400 - -; internal definition -AI_SUPPORTED = 0x40F - -struct sockaddr_in - sin_family dw ? ; sa_family_t - sin_port dw ? ; in_port_t - sin_addr dd ? ; struct in_addr - sin_zero rb 8 ; zero -ends - -struct addrinfo - ai_flags dd ? ; bitmask of AI_* - ai_family dd ? ; PF_* - ai_socktype dd ? ; SOCK_* - ai_protocol dd ? ; 0 or IPPROTO_* - ai_addrlen dd ? ; length of ai_addr - ai_canonname dd ? ; char* - ai_addr dd ? ; struct sockaddr* - ai_next dd ? ; struct addrinfo* -ends - -EAI_ADDRFAMILY = 1 -EAI_AGAIN = 2 -EAI_BADFLAGS = 3 -EAI_FAIL = 4 -EAI_FAMILY = 5 -EAI_MEMORY = 6 -EAI_NONAME = 8 -EAI_SERVICE = 9 -EAI_SOCKTYPE = 10 -EAI_BADHINTS = 12 -EAI_PROTOCOL = 13 -EAI_OVERFLOW = 14 diff --git a/kernel/branches/net/applications/nslookup/dll.inc b/kernel/branches/net/applications/nslookup/dll.inc deleted file mode 100644 index 6ceb2d514d..0000000000 --- a/kernel/branches/net/applications/nslookup/dll.inc +++ /dev/null @@ -1,157 +0,0 @@ -;----------------------------------------------------------------------------- -proc mem.Alloc size ;///////////////////////////////////////////////////////// -;----------------------------------------------------------------------------- - push ebx ecx - mov eax,[size] - lea ecx,[eax+4+4095] - and ecx,not 4095 - mcall 68,12 - add ecx,-4 - mov [eax],ecx - add eax,4 - pop ecx ebx - ret -endp - -;----------------------------------------------------------------------------- -proc mem.ReAlloc mptr,size;/////////////////////////////////////////////////// -;----------------------------------------------------------------------------- - push ebx ecx esi edi eax - mov eax,[mptr] - mov ebx,[size] - or eax,eax - jz @f - lea ecx,[ebx+4+4095] - and ecx,not 4095 - add ecx,-4 - cmp ecx,[eax-4] - je .exit - @@: mov eax,ebx - call mem.Alloc - xchg eax,[esp] - or eax,eax - jz .exit - mov esi,eax - xchg eax,[esp] - mov edi,eax - mov ecx,[esi-4] - cmp ecx,[edi-4] - jbe @f - mov ecx,[edi-4] - @@: add ecx,3 - shr ecx,2 - cld - rep movsd - xchg eax,[esp] - call mem.Free - .exit: - pop eax edi esi ecx ebx - ret -endp - -;----------------------------------------------------------------------------- -proc mem.Free mptr ;////////////////////////////////////////////////////////// -;----------------------------------------------------------------------------- - mov eax,[mptr] - or eax,eax - jz @f - push ebx ecx - lea ecx,[eax-4] - mcall 68,13 - pop ecx ebx - @@: ret -endp - - -proc dll.Load, import_table:dword - mov esi,[import_table] - .next_lib: mov edx,[esi] - or edx,edx - jz .exit - push esi - mov esi,[esi+4] - mov edi,s_libdir.fname - @@: lodsb - stosb - or al,al - jnz @b - mcall 68,19,s_libdir - or eax,eax - jz .fail - stdcall dll.Link,eax,edx - stdcall dll.Init,[eax+4] - pop esi - add esi,8 - jmp .next_lib - .exit: xor eax,eax - ret - .fail: add esp,4 - xor eax,eax - inc eax - ret -endp - -proc dll.Link, exp:dword,imp:dword - push eax - mov esi,[imp] - test esi,esi - jz .done - .next: lodsd - test eax,eax - jz .done - stdcall dll.GetProcAddress,[exp],eax - or eax,eax - jz @f - mov [esi-4],eax - jmp .next - @@: mov dword[esp],0 - .done: pop eax - ret -endp - -proc dll.Init, dllentry:dword - pushad - mov eax,mem.Alloc - mov ebx,mem.Free - mov ecx,mem.ReAlloc - mov edx,dll.Load - stdcall [dllentry] - popad - ret -endp - -proc dll.GetProcAddress, exp:dword,sz_name:dword - mov edx,[exp] - xor eax,eax - .next: or edx,edx - jz .end - cmp dword[edx],0 - jz .end - stdcall strcmp,[edx],[sz_name] - test eax,eax - jz .ok - add edx,8 - jmp .next - .ok: mov eax,[edx+4] - .end: ret -endp - -proc strcmp, str1:dword,str2:dword - push esi edi - mov esi,[str1] - mov edi,[str2] - xor eax,eax - @@: lodsb - scasb - jne .fail - or al,al - jnz @b - jmp .ok - .fail: or eax,-1 - .ok: pop edi esi - ret -endp - -s_libdir: - db '/sys/lib/' - .fname rb 32 diff --git a/kernel/branches/net/applications/nslookup/nslookup.asm b/kernel/branches/net/applications/nslookup/nslookup.asm index 326a1231ec..f226c0ff7c 100644 --- a/kernel/branches/net/applications/nslookup/nslookup.asm +++ b/kernel/branches/net/applications/nslookup/nslookup.asm @@ -15,7 +15,7 @@ purge mov,add,sub include '../proc32.inc' include '../dll.inc' -include '../network_lib/network.inc' +include '../network.inc' ; entry point start: diff --git a/kernel/branches/net/applications/synergyc/synergyc.asm b/kernel/branches/net/applications/synergyc/synergyc.asm index 14a9e5094b..8ad849f7a4 100644 --- a/kernel/branches/net/applications/synergyc/synergyc.asm +++ b/kernel/branches/net/applications/synergyc/synergyc.asm @@ -86,7 +86,7 @@ start: 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 diff --git a/kernel/branches/net/applications/telnet/telnet.asm b/kernel/branches/net/applications/telnet/telnet.asm index f502d8e39c..38dde445cf 100644 --- a/kernel/branches/net/applications/telnet/telnet.asm +++ b/kernel/branches/net/applications/telnet/telnet.asm @@ -92,7 +92,7 @@ main: 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 diff --git a/kernel/branches/net/applications/tftpc/TFTP.asm b/kernel/branches/net/applications/tftpc/TFTP.asm index bffc4c5342..df5dd4be1d 100644 --- a/kernel/branches/net/applications/tftpc/TFTP.asm +++ b/kernel/branches/net/applications/tftpc/TFTP.asm @@ -226,7 +226,7 @@ start_transfer: 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 diff --git a/kernel/branches/net/applications/zeroconf/zeroconf.asm b/kernel/branches/net/applications/zeroconf/zeroconf.asm index cc561facc1..d7f6ebd2e9 100644 --- a/kernel/branches/net/applications/zeroconf/zeroconf.asm +++ b/kernel/branches/net/applications/zeroconf/zeroconf.asm @@ -42,14 +42,10 @@ RATE_LIMIT_INTERVAL equ 60 ; seconds (delay between successive attempts) 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 @@ START: ; start of execution 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 @@ skip_ini: 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 @@ read_data: ; we have data - this will be the response 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 @@ read_data: ; we have data - this will be the response 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 @@ request: 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 @@ pr_exit: ; DEBUGF 1,"Sending ARP announce\n" ;;; - jmp close + jmp exit apipa: stdcall mem.Free, [dhcpMsg] @@ -511,7 +507,7 @@ link_local: ; we should, instead of closing, detect ARP conflicts and detect if cable keeps connected ;) error: -close: +exit: mcall -1 @@ -592,4 +588,6 @@ I_END_2: path rb 1024+5 + rb 65536 + I_END: \ No newline at end of file diff --git a/kernel/branches/net/network/icmp.inc b/kernel/branches/net/network/icmp.inc index 466705d028..db4cd02aaa 100644 --- a/kernel/branches/net/network/icmp.inc +++ b/kernel/branches/net/network/icmp.inc @@ -225,9 +225,6 @@ ICMP_input: 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 diff --git a/kernel/branches/net/network/socket.inc b/kernel/branches/net/network/socket.inc index 8166daf672..be40a39a95 100644 --- a/kernel/branches/net/network/socket.inc +++ b/kernel/branches/net/network/socket.inc @@ -58,8 +58,8 @@ virtual at IP_SOCKET.end 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 @@ virtual at IP_SOCKET.end 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 @@ virtual at IP_SOCKET.end ICMP_SOCKET: - .Identifier dw ? ; + .Identifier dw ? .end: end virtual @@ -250,10 +250,9 @@ macro SOCKET_init { ;----------------------------------------------------------------- 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,10 +273,8 @@ sock_sysfn_table: 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 ;----------------------------------------------------------------- ; @@ -297,24 +294,22 @@ SOCKET_open: 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 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,7 +318,43 @@ SOCKET_open: .no_inet4: ret +align 4 + .raw: +; test esi, esi ; IP_PROTO_IP +; jz .ip + + cmp esi, IP_PROTO_ICMP + je .icmp + + cmp esi, IP_PROTO_UDP + je .udp + + 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 + + mov [eax + SOCKET.snd_proc], SOCKET_send_udp + mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram + + ret + +align 4 .tcp: + mov [eax + SOCKET.Protocol], IP_PROTO_TCP + + 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] @@ -337,26 +368,10 @@ SOCKET_open: ret - .udp: - push eax - init_queue (eax + SOCKET_QUEUE_LOCATION) - pop eax - - mov [eax + SOCKET.snd_proc], SOCKET_send_udp - mov [eax + SOCKET.rcv_proc], SOCKET_receive_dgram - - ret - - .raw: -; test esi, esi -; jz .ip - - cmp esi, IP_PROTO_ICMP - je .icmp - - ret +;align 4 ; .ip: +; ; push eax ; init_queue (eax + SOCKET_QUEUE_LOCATION) ; pop eax @@ -366,7 +381,10 @@ SOCKET_open: ; ; ret + +align 4 .icmp: + push eax init_queue (eax + SOCKET_QUEUE_LOCATION) pop eax @@ -421,8 +439,6 @@ SOCKET_bind: 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 @@ SOCKET_connect: .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 @@ SOCKET_connect: mov dword [esp+32], 0 ret - +align 4 .tcp: lea ebx, [eax + SOCKET.lock] call wait_mutex @@ -532,7 +552,8 @@ SOCKET_connect: 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 @@ SOCKET_listen: 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 @@ SOCKET_listen: 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 @@ SOCKET_accept: .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 @@ SOCKET_close: 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 @@ SOCKET_get_opt: + +align 4 +SOCKET_set_opt: + + ret + + + ;----------------------------------------------------------------- ; ; SOCKET_debug @@ -942,10 +974,10 @@ SOCKET_find_port: 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_find_port: ;----------------------------------------------------------------- ; -; 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 @@ SOCKET_check_port: 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 @@ SOCKET_check_port: 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 @@ SOCKET_free: 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 @@ SOCKET_process_end: 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 diff --git a/kernel/branches/net/network/tcp.inc b/kernel/branches/net/network/tcp.inc index a81afe0305..00c74664c1 100644 --- a/kernel/branches/net/network/tcp.inc +++ b/kernel/branches/net/network/tcp.inc @@ -135,7 +135,7 @@ local .exit 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 @@ local .exit 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 @@ TCP_input: 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 @@ align 4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; code missing (943?) + + mov eax, [edx + TCP_segment.AckNumber] mov [ebx + TCP_SOCKET.SND_UNA], eax @@ -1114,7 +1116,6 @@ align 4 mov [ebx + TCP_SOCKET.SND_NXT], eax @@: -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;--------------------------------------- ; Wake up process waiting on send buffer diff --git a/kernel/branches/net/network/udp.inc b/kernel/branches/net/network/udp.inc index 02df80e8d8..535ce3fa23 100644 --- a/kernel/branches/net/network/udp.inc +++ b/kernel/branches/net/network/udp.inc @@ -152,7 +152,7 @@ UDP_input: 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