;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;; ;; Distributed under terms of the GNU General Public License ;; ;; ;; ;; STACK.INC ;; ;; ;; ;; TCP/IP stack for Menuet OS ;; ;; ;; ;; Copyright 2002 Mike Hibbett, mikeh@oceanfree.net ;; ;; ;; ;; See file COPYING for details ;; ;; ;; ;; Version 0.7 ;; ;; Added a timer per socket to allow delays when rx window ;; ;; gets below 1KB ;; ;; ;; ;;10.01.2007 Bugfix for checksum function from Paolo Franchetti ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; $Revision: 983 $ ;******************************************************************* ; Interface ; The interfaces defined in ETHERNET.INC plus: ; stack_init ; stack_handler ; app_stack_handler ; app_socket_handler ; checksum ; ;******************************************************************* uglobal last_1sTick db ? last_1hsTick dd ? endg MAX_NET_DEVICES equ 16 ; TCP opening modes SOCKET_PASSIVE equ 0 SOCKET_ACTIVE equ 1 ;AF_UNSPEC equ 0 ;AF_UNIX equ 1 AF_INET4 equ 2 ;AF_AX25 equ 3 ;AF_IPX equ 4 ;AF_APPLETALK equ 5 ;AF_NETROM equ 6 ;AF_BRIDGE equ 7 ;AF_AAL5 equ 8 ;AF_X25 equ 9 ;AF_INET6 equ 10 ;AF_MAX equ 12 IP_PROTO_IP equ 0 IP_PROTO_ICMP equ 1 IP_PROTO_TCP equ 6 IP_PROTO_UDP equ 17 MIN_EPHEMERAL_PORT equ 49152 MAX_EPHEMERAL_PORT equ 61000 include "queue.inc" include "ARP.inc" include "IPv4.inc" include "ethernet.inc" include "socket.inc" ;include "TCP.inc" include "UDP.inc" include "ICMP.inc" ;----------------------------------------------- ; ; stack_init ; ; This function calls all network init procedures ; ; IN: / ; OUT: / ; ;----------------------------------------------- align 4 stack_init: call ETH_init call IPv4_init call ARP_init call UDP_init call ICMP_init call socket_init mov al, 0x0 ; set up 1s timer out 0x70, al in al, 0x71 mov [last_1sTick], al ret ;----------------------------------------------- ; ; stack_handler ; ; This function calls all network init procedures ; ; IN: / ; OUT: / ; ;----------------------------------------------- align 4 stack_handler: cmp [ETH_RUNNING], 0 je .exit call ETH_Handler ; handle all queued ethernet packets call ETH_send_queued ; Test for 10ms tick, call tcp timer mov eax, [timer_ticks] cmp eax, [last_1hsTick] je .sec_tick mov [last_1hsTick], eax ; call tcp_tx_handler .sec_tick: ; Test for 1 second event, call 1s timer functions mov al, 0x0 ;second out 0x70, al in al, 0x71 cmp al, [last_1sTick] je .exit mov [last_1sTick], al stdcall arp_table_manager, ARP_TABLE_TIMER, 0, 0 call IPv4_decrease_fragment_ttls ; call tcp_tcb_handler .exit: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Checksum [by Johnny_B] ;; IN: ;; buf_ptr=POINTER to buffer ;; buf_size=SIZE of buffer ;; OUT: ;; AX=16-bit checksum ;; Saves all used registers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; proc checksum_jb stdcall uses ebx esi ecx,\ buf_ptr:DWORD, buf_size:DWORD xor eax, eax xor ebx, ebx ;accumulator mov esi, dword[buf_ptr] mov ecx, dword[buf_size] shr ecx, 1 ; ecx=ecx/2 jnc @f ; if CF==0 then size is even number mov bh, byte[esi + ecx*2] @@: cld .loop: lodsw ;eax=word[esi],esi=esi+2 xchg ah,al ;cause must be a net byte-order add ebx, eax loop .loop mov eax, ebx shr eax, 16 add ax, bx not ax ret endp ;---------------------------------------------------------------- ; ; ; ;---------------------------------------------------------------- align 4 sys_network: cmp bh, MAX_NET_DEVICES ; Check if device number exists jge .doesnt_exist mov esi, ebx and esi, 0x0000ff00 shr esi, 6 cmp dword [esi + ETH_DRV_LIST], 0 ; check if driver is running je .doesnt_exist test bl, bl ; 0 = Get device type (ethernet/token ring/...) jnz @f ;TODO: write code here @@: dec bl ; 1 = Get device name jnz @f mov esi, [esi + ETH_DRV_LIST] mov esi, [esi + ETH_DEVICE.name] mov edi, ecx mov ecx, 64 ; max length repnz movsb ret ; TODO: create function wich outputs number of active network devices @@: .doesnt_exist: DEBUGF 1,"sys_network: invalid device/function specified!\n" mov eax, -1 ret ;---------------------------------------------------------------- ; ; ; ;---------------------------------------------------------------- align 4 sys_protocols: cmp bh, MAX_NET_DEVICES ; Check if device number exists jge .doesnt_exist mov esi, ebx and esi, 0x0000ff00 shr esi, 6 cmp dword [esi + ETH_DRV_LIST], 0 ; check if driver is running TODO: check otehr lists too je .doesnt_exist push .return ; return address (we will be using jumps instead of calls) mov eax, ebx ; set ax to protocol number shr eax, 16 ; cmp ax , IP_PROTO_IP je IPv4_API cmp ax , IP_PROTO_ICMP je ICMP_API cmp ax , IP_PROTO_UDP je UDP_API ; cmp ax , IP_PROTO_TCP ; je TCP_API cmp ax, ETHER_ARP je ARP_API cmp ax, 1337 je ETH_API add esp,4 ; if we reached here, no function was called, so we need to balance stack .doesnt_exist: DEBUGF 1,"sys_protocols: invalid device specified!\n" mov eax, -1 .return: mov [esp+32], eax ret