258,16 → 258,14 |
endg |
|
|
;----------------------------------------------------------------- |
; |
; stack_init |
; |
; This function calls all network init procedures |
; |
; IN: / |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; stack_init: Initialize all network variables ; |
; ; |
; IN: / ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
stack_init: |
|
294,21 → 292,21 |
mov ecx, (NET_DEVICES_MAX + 1) |
rep stosd |
|
ETH_init |
eth_init |
|
PPPoE_init |
pppoe_init |
|
IPv4_init |
; IPv6_init |
ICMP_init |
ipv4_init |
; ipv6_init |
icmp_init |
|
ARP_init |
UDP_init |
TCP_init |
arp_init |
udp_init |
tcp_init |
|
SOCKET_init |
socket_init |
|
LOOP_init |
loop_init |
|
mov [net_tmr_count], 0 |
ret |
329,16 → 327,14 |
endp |
|
|
;----------------------------------------------------------------- |
; |
; stack_handler |
; |
; This function is called in kernel loop |
; |
; IN: / |
; OUT: / |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; stack_handler: Network handlers called from os_loop. ; |
; ; |
; IN: / ; |
; OUT: / ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
stack_handler: |
|
354,13 → 350,13 |
test [net_10ms], 0x0f ; 160ms |
jnz .exit |
|
TCP_timer_160ms |
tcp_timer_160ms |
|
test [net_10ms], 0x3f ; 640ms |
jnz .exit |
|
ARP_decrease_entry_ttls |
IPv4_decrease_fragment_ttls |
arp_decrease_entry_ttls |
ipv4_decrease_fragment_ttls |
|
xor edx, edx |
mov eax, [TCP_timer1_event] |
373,7 → 369,8 |
|
|
align 4 |
proc NET_BUFF_alloc stdcall, buffersize |
proc net_buff_alloc stdcall, buffersize |
|
cmp [buffersize], NET_BUFFER_SIZE |
ja .too_large |
|
387,7 → 384,7 |
|
spin_unlock_irqrestore |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "net alloc: 0x%x\n", eax |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_buff_alloc: 0x%x\n", eax |
ret |
|
.out_of_mem: |
394,20 → 391,20 |
spin_unlock_irqrestore |
|
xor eax, eax |
DEBUGF DEBUG_NETWORK_ERROR, "NET_BUFF_alloc: out of mem!\n" |
DEBUGF DEBUG_NETWORK_ERROR, "net_buff_alloc: out of mem!\n" |
ret |
|
.too_large: |
xor eax, eax |
DEBUGF DEBUG_NETWORK_ERROR, "NET_BUFF_alloc: too large!\n" |
DEBUGF DEBUG_NETWORK_ERROR, "net_buff_alloc: too large!\n" |
ret |
endp |
|
|
align 4 |
proc NET_BUFF_free stdcall, buffer |
proc net_buff_free stdcall, buffer |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "net free: 0x%x\n", [buffer] |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_buff_free: 0x%x\n", [buffer] |
|
spin_lock_irqsave |
|
423,14 → 420,14 |
|
|
align 4 |
NET_link_changed: |
net_link_changed: |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.link_state] |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.link_state] |
|
align 4 |
NET_send_event: |
net_send_event: |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_send_event\n" |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_send_event\n" |
|
; Send event to all applications |
push edi ecx |
446,21 → 443,20 |
|
|
|
;----------------------------------------------------------------- |
; |
; NET_add_device: |
; |
; This function is called by the network drivers, |
; to register each running NIC to the kernel |
; |
; IN: Pointer to device structure in ebx |
; OUT: Device num in eax, -1 on error |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; net_add_device: Called by network driver to register interface. ; |
; ; |
; IN: ebx = ptr to device structure ; |
; ; |
; OUT: eax = device num on success ; |
; eax = -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
NET_add_device: |
net_add_device: |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_Add_Device: %x\n", ebx ;;; TODO: use mutex to lock net device list |
DEBUGF DEBUG_NETWORK_VERBOSE, "net_add_device: %x\n", ebx ;;; TODO: use mutex to lock net device list |
|
cmp [NET_RUNNING], NET_DEVICES_MAX |
jae .error |
495,7 → 491,7 |
|
inc [NET_RUNNING] ; Indicate that one more network device is up and running |
|
call NET_send_event |
call net_send_event |
|
DEBUGF DEBUG_NETWORK_VERBOSE, "Device number: %u\n", eax |
ret |
507,19 → 503,17 |
|
|
|
;----------------------------------------------------------------- |
; |
; NET_Remove_Device: |
; |
; This function is called by network drivers, |
; to unregister network devices from the kernel |
; |
; IN: Pointer to device structure in ebx |
; OUT: eax: -1 on error |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; net_remove_device: Called by network driver to unregister dev. ; |
; ; |
; IN: ebx = ptr to device ; |
; ; |
; OUT: eax: -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
NET_remove_device: |
net_remove_device: |
|
cmp [NET_RUNNING], 0 |
je .error |
541,7 → 535,7 |
mov dword [edi-4], eax |
dec [NET_RUNNING] |
|
call NET_send_event |
call net_send_event |
|
xor eax, eax |
ret |
552,18 → 546,20 |
|
|
|
;----------------------------------------------------------------- |
; |
; NET_ptr_to_num |
; |
; IN: ebx = ptr to device struct |
; OUT: edi = -1 on error, device number otherwise |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; net_ptr_to_num ; |
; ; |
; IN: ebx = ptr to device struct ; |
; ; |
; OUT: edi = device number ; |
; edi = -1 on error ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
NET_ptr_to_num: |
net_ptr_to_num: |
|
call NET_ptr_to_num4 |
call net_ptr_to_num4 |
ror edi, 2 ; If -1, stay -1 |
; valid device numbers have last two bits 0, so do just shr |
|
570,7 → 566,7 |
ret |
|
align 4 |
NET_ptr_to_num4: ; Todo, place number in device structure so we only need to verify? |
net_ptr_to_num4: ; Todo, place number in device structure so we only need to verify? |
|
test ebx, ebx |
jz .fail |
595,21 → 591,17 |
pop ecx |
ret |
|
;----------------------------------------------------------------- |
; |
; checksum_1 |
; |
; This is the first of two functions needed to calculate a checksum. |
; |
; IN: edx = start offset for semi-checksum |
; esi = pointer to data |
; ecx = data size |
; OUT: edx = semi-checksum |
; |
; |
; Code was optimized by diamond |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; checksum_1: Calculate semi-checksum for network packets. ; |
; ; |
; IN: edx = start offset for semi-checksum ; |
; esi = pointer to data ; |
; ecx = data size ; |
; ; |
; OUT: edx = semi-checksum ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
checksum_1: |
|
679,16 → 671,15 |
.end: |
ret |
|
;----------------------------------------------------------------- |
; |
; checksum_2 |
; |
; This function calculates the final ip/tcp/udp checksum for you |
; |
; IN: edx = semi-checksum |
; OUT: dx = checksum (in INET byte order) |
; |
;----------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; checksum_2: Calculate the final ip/tcp/udp checksum. ; |
; ; |
; IN: edx = semi-checksum ; |
; ; |
; OUT: dx = checksum (in INET byte order) ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
checksum_2: |
|
713,11 → 704,11 |
|
|
|
;---------------------------------------------------------------- |
; |
; System function to work with network devices (74) |
; |
;---------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; System function 74: Low level access to network devices. ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
sys_network: |
|
834,11 → 825,11 |
|
|
|
;---------------------------------------------------------------- |
; |
; System function to work with protocols (76) |
; |
;---------------------------------------------------------------- |
;-----------------------------------------------------------------; |
; ; |
; System function 76: Low level access to protocol handlers. ; |
; ; |
;-----------------------------------------------------------------; |
align 4 |
sys_protocols: |
cmp bh, NET_DEVICES_MAX ; Check if device number exists |
856,28 → 847,28 |
shr eax, 16 ; |
|
cmp ax, API_ETH |
je ETH_api |
je eth_api |
|
cmp ax, API_IPv4 |
je IPv4_api |
je ipv4_api |
|
cmp ax, API_ICMP |
je ICMP_api |
je icmp_api |
|
cmp ax, API_UDP |
je UDP_api |
je udp_api |
|
cmp ax, API_TCP |
je TCP_api |
je tcp_api |
|
cmp ax, API_ARP |
je ARP_api |
je arp_api |
|
cmp ax, API_PPPOE |
je PPPoE_api |
je pppoe_api |
|
cmp ax, API_IPv6 |
je IPv6_api |
je ipv6_api |
|
add esp, 4 ; if we reached here, no function was called, so we need to balance stack |
|