/data/eng/Makefile |
---|
187,7 → 187,6 |
media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ |
media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ |
media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ |
network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ |
network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ |
network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ |
network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ |
/data/eng/menu.dat |
---|
131,7 → 131,6 |
Zero-Config /sys/network/zeroconf |
Network Config /sys/network/netcfg |
Network status /sys/network/netstat |
ARP status /sys/network/arpcfg |
#16 **** SERVERS **** |
FTP daemon /sys/network/ftpd |
#17 **** CLIENTS **** |
/data/it/Makefile |
---|
187,7 → 187,6 |
media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ |
media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ |
media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ |
network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ |
network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ |
network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ |
network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ |
/data/it/menu.dat |
---|
130,7 → 130,6 |
Zero-Config /sys/network/zeroconf |
Network Config /sys/network/netcfg |
Network status /sys/network/netstat |
ARP status /sys/network/arpcfg |
#16 **** SERVERS **** |
FTP daemon /sys/network/ftpd |
#17 **** CLIENTS **** |
/data/rus/Makefile |
---|
187,7 → 187,6 |
media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ |
media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ |
media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ |
network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ |
network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ |
network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ |
network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ |
/data/rus/menu.dat |
---|
136,7 → 136,6 |
Zero-Config /sys/network/zeroconf |
Network Config /sys/network/netcfg |
Network status /sys/network/netstat |
ARP status /sys/network/arpcfg |
#16 **** SERVERS **** |
FTP daemon /sys/network/ftpd |
#17 **** CLIENTS **** |
/data/sp/Makefile |
---|
187,7 → 187,6 |
media/midamp:MEDIA/MIDAMP:$(PROGS)/media/midamp/trunk/midamp.asm \ |
media/palitra:MEDIA/PALITRA:$(PROGS)/media/palitra/trunk/palitra.asm \ |
media/startmus:MEDIA/STARTMUS:$(PROGS)/media/startmus/trunk/STARTMUS.ASM \ |
network/arpcfg:NETWORK/ARPCFG:$(PROGS)/network/arpcfg/arpcfg.asm \ |
network/ping:NETWORK/PING:$(PROGS)/network/icmp/ping.asm \ |
network/netcfg:NETWORK/NETCFG:$(PROGS)/network/netcfg/netcfg.asm \ |
network/netstat:NETWORK/NETSTAT:$(PROGS)/network/netstat/netstat.asm \ |
/data/sp/menu.dat |
---|
131,7 → 131,6 |
Zero-Config /sys/network/zeroconf |
Network Config /sys/network/netcfg |
Network status /sys/network/netstat |
ARP status /sys/network/arpcfg |
#16 **** SERVIDORES **** |
FTP daemon /sys/network/ftpd |
#17 **** CLIENTES **** |
/kernel/trunk/network/ARP.inc |
---|
58,10 → 58,10 |
align 4 |
uglobal |
NumARP dd ? |
ARP_table rb ARP_TABLE_SIZE * sizeof.ARP_entry ; TODO: separate ARP table and stats per interface |
ARP_table rb NET_DEVICES_MAX*(ARP_TABLE_SIZE * sizeof.ARP_entry) |
ARP_entries_num rd NET_DEVICES_MAX |
ARP_PACKETS_TX rd NET_DEVICES_MAX |
ARP_PACKETS_RX rd NET_DEVICES_MAX |
ARP_CONFLICTS rd NET_DEVICES_MAX |
81,10 → 81,8 |
macro ARP_init { |
xor eax, eax |
mov [NumARP], eax |
mov edi, ARP_PACKETS_TX |
mov ecx, 3*NET_DEVICES_MAX |
mov edi, ARP_entries_num |
mov ecx, 4*NET_DEVICES_MAX |
rep stosd |
} |
111,11 → 109,15 |
; The last status value is provided to allow the network layer to delete |
; a packet that is queued awaiting an ARP response |
mov ecx, [NumARP] |
xor edi, edi |
.loop_outer: |
mov ecx, [ARP_entries_num + 4*edi] |
test ecx, ecx |
jz .exit |
mov esi, ARP_table |
mov esi, (ARP_TABLE_SIZE * sizeof.ARP_entry) |
imul esi, edi |
add esi, ARP_table |
.loop: |
cmp [esi + ARP_entry.TTL], ARP_STATIC_ENTRY |
je .next |
133,9 → 135,9 |
cmp [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE |
je .response_timeout |
push esi ecx |
push esi edi ecx |
call ARP_del_entry |
pop ecx esi |
pop ecx edi esi |
jmp .next |
146,6 → 148,9 |
jmp .next |
.exit: |
inc edi |
cmp edi, NET_DEVICES_MAX |
jb .loop_outer |
} |
196,11 → 201,13 |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_input: It's a reply\n" |
mov ecx, [NumARP] |
mov ecx, [ARP_entries_num + 4*edi] |
test ecx, ecx |
jz .exit |
mov esi, ARP_table |
mov esi, (ARP_TABLE_SIZE * sizeof.ARP_entry) |
imul esi, edi |
add esi, ARP_table |
.loop: |
cmp [esi + ARP_entry.IP], eax |
je .gotit |
298,23 → 305,20 |
; |
; ARP_output_request |
; |
; IN: ip in eax |
; device in edi |
; IN: ebx = device ptr |
; eax = IP |
; OUT: / |
; scratched: probably everything |
; |
;--------------------------------------------------------------------------- |
align 4 |
ARP_output_request: |
push eax ; DestIP |
pushd [IP_LIST + edi] ; SenderIP |
inc [ARP_PACKETS_TX + edi] ; assume we will succeed |
push eax |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: ip=%u.%u.%u.%u\n",\ |
[esp + 4]:1, [esp + 5]:1, [esp + 6]:1, [esp + 7]:1 |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: ip=%u.%u.%u.%u device=0x%x\n",\ |
[esp]:1, [esp + 1]:1, [esp + 2]:1, [esp + 3]:1, ebx |
mov ebx, [NET_DRV_LIST + edi] ; device ptr |
lea eax, [ebx + ETH_DEVICE.mac] ; local device mac |
mov edx, ETH_BROADCAST ; broadcast mac |
mov ecx, sizeof.ARP_header |
322,8 → 326,6 |
call ETH_output |
jz .exit |
mov ecx, eax |
mov [edi + ARP_header.HardwareType], 0x0100 ; Ethernet |
mov [edi + ARP_header.ProtocolType], 0x0008 ; IP |
mov [edi + ARP_header.HardwareSize], 6 ; MAC-addr length |
331,29 → 333,29 |
mov [edi + ARP_header.Opcode], ARP_REQ_OPCODE ; Request |
add edi, ARP_header.SenderMAC |
lea esi, [ebx + ETH_DEVICE.mac] ; SenderMac |
movsw ; |
movsd ; |
pop eax ; SenderIP |
stosd ; |
mov eax, -1 ; DestMac |
stosd ; |
stosw ; |
pop eax ; DestIP |
stosd ; |
; mov esi, [ebx + NET_DEVICE.number] |
xor esi, esi ;;;; FIXME |
inc esi ;;;;;;;;; |
inc [ARP_PACKETS_TX + 4*esi] ; assume we will succeed |
lea esi, [IP_LIST + 4*esi] ; SenderIP |
movsd |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: device=%x\n", ebx |
mov esi, ETH_BROADCAST ; DestMac |
movsw ; |
movsd ; |
popd [edi] ; DestIP |
push edx ecx |
push edx eax |
call [ebx + NET_DEVICE.transmit] |
ret |
.exit: |
add esp, 4 + 4 |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_output_request: failed\n" |
sub eax, eax |
add esp, 4 |
DEBUGF DEBUG_NETWORK_ERROR, "ARP_output_request: send failed\n" |
ret |
362,50 → 364,65 |
; ARP_add_entry (or update) |
; |
; IN: esi = ptr to entry (can easily be made on the stack) |
; edi = device num |
; OUT: eax = entry #, -1 on error |
; edi = ptr to newly created entry |
; esi = ptr to newly created entry |
; |
;----------------------------------------------------------------- ; TODO: use a mutex |
align 4 |
ARP_add_entry: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: " |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: device=%u\n", edi |
mov ecx, [NumARP] |
mov ecx, [ARP_entries_num + 4*edi] |
cmp ecx, ARP_TABLE_SIZE ; list full ? |
jae .error |
jae .full |
xor eax, eax |
mov edi, ARP_table |
mov ecx, [esi + ARP_entry.IP] |
; From this point on, we can only fail if IP has a static entry, or if table is corrupt. |
inc [ARP_entries_num + 4*edi] ; assume we will succeed |
push edi |
xor ecx, ecx |
imul edi, ARP_TABLE_SIZE*sizeof.ARP_entry |
add edi, ARP_table |
mov eax, [edi + ARP_entry.IP] |
.loop: |
cmp [edi + ARP_entry.Status], ARP_NO_ENTRY ; is this slot empty? |
je .add |
cmp [edi + ARP_entry.IP], ecx ; if not, check if it doesnt collide |
cmp [edi + ARP_entry.IP], eax ; if not, check if it doesnt collide |
jne .maybe_next |
cmp [edi + ARP_entry.TTL], ARP_STATIC_ENTRY ; ok, its the same IP, update it if not static |
jne .add |
DEBUGF DEBUG_NETWORK_ERROR, "ARP_add_entry: failed, IP already has a static entry\n" |
jmp .error |
.maybe_next: ; try the next slot |
add edi, sizeof.ARP_entry |
inc eax |
cmp eax, ARP_TABLE_SIZE |
jae .error |
jmp .loop |
inc ecx |
cmp ecx, ARP_TABLE_SIZE |
jb .loop |
.add: |
push ecx |
mov ecx, sizeof.ARP_entry/2 |
rep movsw |
inc [NumARP] |
sub edi, sizeof.ARP_entry |
DEBUGF DEBUG_NETWORK_VERBOSE, "entry=%u\n", eax |
pop ecx |
lea esi, [edi - sizeof.ARP_entry] |
pop edi |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_add_entry: entry=%u\n", ecx |
ret |
.error: |
DEBUGF DEBUG_NETWORK_VERBOSE, "failed\n" |
pop edi |
dec [ARP_entries_num + 4*edi] |
DEBUGF DEBUG_NETWORK_ERROR, "ARP_add_entry_failed\n" |
.full: |
mov eax, -1 |
ret |
415,6 → 432,7 |
; ARP_del_entry |
; |
; IN: esi = ptr to arp entry |
; edi = device number |
; OUT: / |
; |
;----------------------------------------------------------------- |
421,23 → 439,28 |
align 4 |
ARP_del_entry: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: entry=%x entrys=%u\n", esi, [NumARP] |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: entry=%x entrys=%u\n", esi, [ARP_entries_num + 4*edi] |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: IP=%u.%u.%u.%u\n", \ |
[esi + ARP_entry.IP]:1, [esi + ARP_entry.IP + 1]:1, [esi + ARP_entry.IP + 2]:1, [esi + ARP_entry.IP + 3]:1 |
mov ecx, ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry |
push edi |
imul edi, (ARP_TABLE_SIZE) * sizeof.ARP_entry |
lea ecx, [ARP_table + (ARP_TABLE_SIZE - 1) * sizeof.ARP_entry + edi] |
sub ecx, esi |
shr ecx, 1 |
; move all trailing entries, sizeof.ARP_entry bytes to left. |
mov edi, esi |
add esi, sizeof.ARP_entry |
rep movsw |
; now add an empty entry to the end (erasing previous one) |
xor eax, eax |
mov ecx, sizeof.ARP_entry/2 |
rep stosw |
dec [NumARP] |
pop edi |
dec [ARP_entries_num + 4*edi] |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_del_entry: success\n" |
ret |
465,7 → 488,7 |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: %u.%u", al, ah |
rol eax, 16 |
DEBUGF DEBUG_NETWORK_VERBOSE, ".%u.%u\n", al, ah |
DEBUGF DEBUG_NETWORK_VERBOSE, ".%u.%u device: %u\n", al, ah, edi |
rol eax, 16 |
cmp eax, 0xffffffff |
474,7 → 497,7 |
;-------------------------------- |
; Try to find the IP in ARP_table |
mov ecx, [NumARP] |
mov ecx, [ARP_entries_num + 4*edi] |
test ecx, ecx |
jz .not_in_list |
mov esi, ARP_table + ARP_entry.IP |
482,17 → 505,14 |
cmp [esi], eax |
je .found_it |
add esi, sizeof.ARP_entry |
loop .scan_loop |
dec ecx |
jnz .scan_loop |
.not_in_list: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: preparing for ARP request\n" |
;-------------------- |
; Send an ARP request |
push eax edi ; save IP for ARP_output_request |
; Now create the ARP entry |
; Now craft the ARP entry on the stack |
pushw ARP_REQUEST_TTL ; TTL |
pushw ARP_AWAITING_RESPONSE ; status |
pushd 0 ; mac |
499,21 → 519,27 |
pushw 0 |
pushd eax ; ip |
mov esi, esp |
; Add it to the list |
call ARP_add_entry |
; Delete the temporary entry |
add esp, sizeof.ARP_entry ; clear the entry from stack |
; If we could not add it to the list, give up |
cmp eax, -1 ; did ARP_add_entry fail? |
je .full |
mov esi, edi |
pop edi eax ; IP in eax, device number in edi, for ARP_output_request |
;----------------------------------------------- |
; At this point, we got an ARP entry in the list |
; Now send a request packet on the network |
pop edi eax ; IP in eax, device number in ebx, for ARP_output_request |
push esi edi |
call ARP_output_request ; And send a request |
mov ebx, [NET_DRV_LIST + 4*edi] |
call ARP_output_request |
pop edi esi |
;----------------------------------------------- |
; At this point, we got an ARP entry in the list |
.found_it: |
cmp [esi + ARP_entry.Status], ARP_VALID_MAPPING ; Does it have a MAC assigned? |
je .valid |
522,10 → 548,10 |
cmp [esi + ARP_entry.Status], ARP_AWAITING_RESPONSE ; Are we waiting for reply from remote end? |
jne .give_up |
push esi |
push esi edi |
mov esi, 10 ; wait 10 ms |
call delay_ms |
pop esi |
pop edi esi |
jmp .found_it ; now check again |
else |
536,8 → 562,8 |
.valid: |
DEBUGF DEBUG_NETWORK_VERBOSE, "ARP_IP_to_MAC: found MAC\n" |
movzx eax, word[esi + ARP_entry.MAC] |
mov ebx, dword[esi + ARP_entry.MAC + 2] |
movzx eax, word[edi + ARP_entry.MAC] |
mov ebx, dword[edi + ARP_entry.MAC + 2] |
ret |
.full: |
606,17 → 632,19 |
ret |
.entries: |
mov eax, [NumARP] |
mov eax, [ARP_entries_num + eax] |
ret |
.read: |
cmp ecx, [NumARP] |
cmp ecx, [ARP_entries_num + eax] |
jae .error |
shr eax, 2 |
imul eax, sizeof.ARP_entry*ARP_TABLE_SIZE |
add eax, ARP_table |
; edi = pointer to buffer |
; ecx = # entry |
imul ecx, sizeof.ARP_entry |
add ecx, ARP_table |
mov esi, ecx |
lea esi, [eax + ecx] |
mov ecx, sizeof.ARP_entry/2 |
rep movsw |
625,20 → 653,24 |
.write: |
; esi = pointer to buffer |
mov edi, eax |
shr edi, 2 |
call ARP_add_entry ; out: eax = entry number, -1 on error |
ret |
.remove: |
; ecx = # entry |
cmp ecx, [NumARP] |
cmp ecx, [ARP_entries_num + eax] |
jae .error |
imul ecx, sizeof.ARP_entry |
lea esi, [ARP_table + ecx] |
mov edi, eax |
shr edi, 2 |
call ARP_del_entry |
ret |
.send_announce: |
mov edi, eax |
mov ebx, [NET_DRV_LIST + eax] |
mov eax, [IP_LIST + eax] |
call ARP_output_request ; now send a gratuitous ARP |
ret |
/kernel/trunk/network/IPv4.inc |
---|
568,7 → 568,7 |
align 4 |
IPv4_output: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: size=%u\n", ecx |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_output: size=%u ip=0x%x\n", ecx, eax |
cmp ecx, 65500 ; Max IPv4 packet size |
ja .too_large |
585,9 → 585,9 |
push ebx ; push the mac onto the stack |
push ax |
inc [IP_packets_tx + edi] ; update stats |
inc [IP_packets_tx + 4*edi] ; update stats |
mov ebx, [NET_DRV_LIST + edi] |
mov ebx, [NET_DRV_LIST + 4*edi] |
lea eax, [ebx + ETH_DEVICE.mac] |
mov edx, esp |
mov ecx, [esp + 10 + 6] |
675,8 → 675,8 |
push ebx ; push the mac |
push ax |
inc [IP_packets_tx + edi] |
mov ebx, [NET_DRV_LIST + edi] |
inc [IP_packets_tx + 4*edi] |
mov ebx, [NET_DRV_LIST + 4*edi] |
lea eax, [ebx + ETH_DEVICE.mac] |
mov edx, esp |
mov ecx, [esp + 6 + 4] |
855,7 → 855,7 |
; IPv4_route |
; |
; IN: eax = Destination IP |
; OUT: edi = device id * 4 |
; OUT: edi = device number |
; eax = ip of gateway if nescessary, unchanged otherwise |
; |
;--------------------------------------------------------------------------- |
882,8 → 882,9 |
jnz .loop |
.invalid: |
xor edi, edi ; if none found, use device 0 as default |
mov eax, [GATEWAY_LIST] |
xor edi, edi ; if none found, use device 1 as default ;;; FIXME |
inc di |
mov eax, [GATEWAY_LIST+4] |
.found_it: |
DEBUGF DEBUG_NETWORK_VERBOSE, "IPv4_route: %u\n", edi |
890,7 → 891,8 |
ret |
.broadcast: |
xor edi, edi |
xor edi, edi ;;;; FIXME |
inc di |
ret |
973,7 → 975,8 |
or ebx, ecx |
mov [BROADCAST_LIST + eax], ebx |
mov eax, ecx |
mov ebx, [NET_DRV_LIST + eax] |
mov eax, [IP_LIST + eax] |
call ARP_output_request ; now send a gratuitous ARP |
call NET_send_event |
/kernel/trunk/network/ethernet.inc |
---|
67,10 → 67,10 |
cmp ax, ETHER_PROTO_IPv4 |
je IPv4_input |
cmp ax, ETHER_PROTO_IPv4 |
cmp ax, ETHER_PROTO_ARP |
je ARP_input |
cmp ax, ETHER_PROTO_IPv4 |
cmp ax, ETHER_PROTO_IPv6 |
je IPv6_input |
cmp ax, ETHER_PROTO_PPP_DISCOVERY |
162,7 → 162,7 |
; |
; ETH_API |
; |
; This function is called by system function 75 |
; This function is called by system function 76 |
; |
; IN: subfunction number in bl |
; device number in bh |
187,12 → 187,7 |
jmp dword [.table + 4*ebx] |
.table: |
dd .packets_tx ; 0 |
dd .packets_rx ; 1 |
dd .bytes_tx ; 2 |
dd .bytes_rx ; 3 |
dd .read_mac ; 4 |
dd .state ; 5 |
dd .read_mac ; 0 |
.number = ($ - .table) / 4 - 1 |
.error: |
199,28 → 194,7 |
or eax, -1 |
ret |
.packets_tx: |
mov eax, [eax + NET_DEVICE.packets_tx] |
ret |
.packets_rx: |
mov eax, [eax + NET_DEVICE.packets_rx] |
ret |
.bytes_tx: |
mov ebx, dword [eax + NET_DEVICE.bytes_tx + 4] |
mov eax, dword [eax + NET_DEVICE.bytes_tx] |
mov [esp+20+4], ebx ; TODO: fix this ugly code |
ret |
.bytes_rx: |
mov ebx, dword [eax + NET_DEVICE.bytes_rx + 4] |
mov eax, dword [eax + NET_DEVICE.bytes_rx] |
mov [esp+20+4], ebx ; TODO: fix this ugly code |
ret |
.read_mac: |
movzx ebx, word [eax + ETH_DEVICE.mac] |
mov eax, dword [eax + ETH_DEVICE.mac + 2] |
227,7 → 201,4 |
mov [esp+20+4], ebx ; TODO: fix this ugly code |
ret |
.state: |
mov eax, [eax + NET_DEVICE.link_state] |
ret |
/kernel/trunk/network/icmp.inc |
---|
16,7 → 16,6 |
;; ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
$Revision: 2924 $ |
; ICMP types & codes |
168,9 → 167,6 |
mov esi, [esp] ; Start of buffer |
cmp dword[edi + 4], 1 shl 24 + 127 |
je .loopback |
; Update stats (and validate device ptr) |
call NET_ptr_to_num |
cmp edi,-1 |
178,6 → 174,11 |
inc [ICMP_PACKETS_RX + 4*edi] |
inc [ICMP_PACKETS_TX + 4*edi] |
cmp ebx, LOOPBACK_DEVICE |
je .loopback |
; FIXME: dont assume device is an ethernet device! |
; exchange dest and source address in IP header |
; exchange dest and source MAC in ETH header |
push dword [esi + ETH_header.DstMAC] |
188,10 → 189,10 |
push word [esi + ETH_header.SrcMAC + 4] |
pop word [esi + ETH_header.DstMAC + 4] |
pop word [esi + ETH_header.SrcMAC + 4] |
add esi, sizeof.ETH_header-2 |
add esi, sizeof.ETH_header-4 |
.loopback: |
add esi, 2 |
add esi, 4 |
push [esi + IPv4_header.SourceAddress] |
push [esi + IPv4_header.DestinationAddress] |
pop [esi + IPv4_header.SourceAddress] |
/kernel/trunk/network/loopback.inc |
---|
33,6 → 33,9 |
.packets_tx dd 0 |
.packets_rx dd 0 |
.link_state dd -1 |
.hwacc dd 0 |
.namestr db 'loopback', 0 |
.dummy_fn: |
40,6 → 43,23 |
endg |
macro LOOP_init { |
local .fail |
mov ebx, LOOPBACK_DEVICE |
call NET_add_device |
cmp eax, -1 |
je .fail |
mov [IP_LIST], 127 + 1 shl 24 |
mov [SUBNET_LIST], 255 |
mov [BROADCAST_LIST], 0xffffff00 + 127 |
.fail: |
} |
;----------------------------------------------------------------- |
; |
; LOOP_input |
/kernel/trunk/network/socket.inc |
---|
433,11 → 433,10 |
.tcp: |
.udp: |
mov ebx, [edx + 4] ; First, fill in the IP |
cmp ebx, [edx + 4] ; First, fill in the IP |
test ebx, ebx ; If IP is 0, use default |
jnz @f |
mov ebx, [NET_DEFAULT] |
mov ebx, [IP_LIST + 4*ebx] |
mov ebx, [IP_LIST + 4] ;;;;; FIXME !i!i!i |
@@: |
mov [eax + IP_SOCKET.LocalIP], ebx |
484,7 → 483,7 |
.af_inet4: |
cmp [eax + IP_SOCKET.LocalIP], 0 |
jne @f |
push [IP_LIST] ; FIXME |
push [IP_LIST + 4] ; FIXME !i!i!i! |
pop [eax + IP_SOCKET.LocalIP] |
@@: |
515,6 → 514,8 |
pushd [edx + 4] |
pop [eax + IP_SOCKET.RemoteIP] |
DEBUGF 1, "Connecting to 0x%x\n", [eax + IP_SOCKET.RemoteIP] |
cmp [eax + UDP_SOCKET.LocalPort], 0 |
jne @f |
call SOCKET_find_port |
633,7 → 634,7 |
cmp [eax + IP_SOCKET.LocalIP], 0 |
jne @f |
push [IP_LIST] |
push [IP_LIST + 4] ;;; fixme!!!! |
pop [eax + IP_SOCKET.LocalIP] |
@@: |
/kernel/trunk/network/stack.inc |
---|
217,7 → 217,6 |
uglobal |
NET_RUNNING dd ? |
NET_DEFAULT dd ? |
NET_DRV_LIST rd NET_DEVICES_MAX |
endg |
254,6 → 253,8 |
SOCKET_init |
LOOP_init |
mov [net_tmr_count], 0 |
ret |
312,7 → 313,7 |
align 4 |
NET_link_changed: |
DEBUGF DEBUG_NETWORK_VERBOSE, "NET_link_changed device=0x%x status=0x%x\n", ebx, [ebx + NET_DEVICE.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: |
398,7 → 399,7 |
; |
; NET_Remove_Device: |
; |
; This function is called by etwork drivers, |
; This function is called by network drivers, |
; to unregister network devices from the kernel |
; |
; IN: Pointer to device structure in ebx |
411,28 → 412,12 |
cmp [NET_RUNNING], 0 |
je .error |
cmp [NET_DRV_LIST], ebx |
jne @f |
mov [NET_DRV_LIST], 0 |
cmp [NET_RUNNING], 1 |
je @f |
; there are still active devices, find one and make it default |
xor eax, eax |
mov ecx, NET_DEVICES_MAX |
mov edi, NET_DRV_LIST |
repe scasd |
je @f |
shr edi, 2 |
dec edi |
mov [NET_DEFAULT], edi |
@@: |
;---------------------------- |
; Find the driver in the list |
mov eax, ebx |
mov ecx, NET_DEVICES_MAX |
mov edi, NET_DRV_LIST+4 |
mov edi, NET_DRV_LIST |
repne scasd |
jnz .error |
442,10 → 427,11 |
xor eax, eax |
mov dword [edi-4], eax |
dec [NET_RUNNING] |
call NET_send_event |
dec [NET_RUNNING] |
xor eax, eax |
ret |
.error: |
610,17 → 596,18 |
;---------------------------------------------------------------- |
; |
; System function to work with network devices (75) |
; System function to work with network devices (74) |
; |
;---------------------------------------------------------------- |
align 4 |
sys_network: ; FIXME: make default device easily accessible |
sys_network: |
cmp ebx, -1 |
jne @f |
mov eax, [NET_RUNNING] |
jmp .return |
mov [esp+32], eax |
ret |
@@: |
cmp bh, NET_DEVICES_MAX ; Check if device number exists |
647,16 → 634,20 |
dd .stop ; 3 |
dd .get_ptr ; 4 |
dd .get_drv_name ; 5 |
dd .packets_tx ; 6 |
dd .packets_rx ; 7 |
dd .bytes_tx ; 8 |
dd .bytes_rx ; 9 |
dd .state ; 10 |
.number = ($ - .table) / 4 - 1 |
.get_type: ; 0 = Get device type (ethernet/token ring/...) |
.get_type: |
mov eax, [eax + NET_DEVICE.device_type] |
jmp .return |
mov [esp+32], eax |
ret |
.get_dev_name: ; 1 = Get device name |
.get_dev_name: |
mov esi, [eax + NET_DEVICE.name] |
mov edi, ecx |
664,38 → 655,66 |
rep movsd |
xor eax, eax |
jmp .return |
mov [esp+32], eax |
ret |
.reset: ; 2 = Reset the device |
.reset: |
call [eax + NET_DEVICE.reset] |
jmp .return |
mov [esp+32], eax |
ret |
.stop: ; 3 = Stop driver for this device |
.stop: |
call [eax + NET_DEVICE.unload] |
jmp .return |
mov [esp+32], eax |
ret |
.get_ptr: ; 4 = Get driver pointer |
.get_ptr: |
mov [esp+32], eax |
ret |
jmp .return |
.get_drv_name: |
xor eax, eax |
mov [esp+32], eax |
ret |
.get_drv_name: ; 5 = Get driver name |
.packets_tx: |
mov eax, [eax + NET_DEVICE.packets_tx] |
mov [esp+32], eax |
ret |
xor eax, eax |
jmp .return |
.packets_rx: |
mov eax, [eax + NET_DEVICE.packets_rx] |
mov [esp+32], eax |
ret |
.bytes_tx: |
mov ebx, dword [eax + NET_DEVICE.bytes_tx + 4] |
mov [esp+20], ebx |
mov eax, dword [eax + NET_DEVICE.bytes_tx] |
mov [esp+32], eax |
ret |
.doesnt_exist: |
mov eax, -1 |
.bytes_rx: |
mov ebx, dword [eax + NET_DEVICE.bytes_rx + 4] |
mov [esp+20], ebx |
mov eax, dword [eax + NET_DEVICE.bytes_rx] |
mov [esp+32], eax |
ret |
.return: |
.state: |
mov eax, [eax + NET_DEVICE.link_state] |
mov [esp+32], eax |
ret |
.doesnt_exist: |
mov dword[esp+32], -1 |
ret |
;---------------------------------------------------------------- |
; |
; System function to work with protocols (76) |
/programs/develop/libraries/network/network.asm |
---|
675,7 → 675,7 |
mov eax, 0x01000100 |
stosd |
; 7. Get DNS server address. |
mcall 76, API_IPv4 + 4 ; protocol IP=0, device number=0, function=get DNS address |
mcall 76, API_IPv4 + (1 shl 8) + 4 ; protocol IP=0, device number=0, function=get DNS address |
cmp eax, -1 |
je .ret.dnserr |
mov esi, eax ; put server address to esi |
/programs/network/arpcfg/arpcfg.asm |
---|
File deleted |
/programs/network/arpcfg |
---|
Property changes: |
Deleted: tsvn:logminsize |
-5 |
\ No newline at end of property |
/programs/network/netstat/netstat.asm |
---|
22,9 → 22,9 |
dd 0x01 ; header version |
dd START ; start of code |
dd I_END ; size of image |
dd (I_END+0x100) ; memory for app |
dd (I_END+0x100) ; esp |
dd I_PARAM , 0x0 ; I_Param , I_Icon |
dd (I_END+0x1000) ; memory for app |
dd (I_END+0x1000) ; esp |
dd 0, 0 ; I_Param , I_Path |
include '..\macros.inc' |
include '..\network.inc' |
38,6 → 38,11 |
call draw_interfaces |
xor ebx, ebx |
mov bh, [device] |
mcall 74 |
mov [device_type], eax |
mov edx, 101 |
mov esi, 0x00aaaaff |
mov edi, 0x00aaffff |
44,11 → 49,10 |
cmp dl, [mode] |
cmove esi, edi |
mcall 8, 25 shl 16 + 65, 25 shl 16 + 20 |
mcall 8, 5 shl 16 + 55, 5 shl 16 + 20 |
.morebuttons: |
inc edx |
add ebx, 75 shl 16 |
add ebx, 60 shl 16 |
mov esi, 0x00aaaaff |
cmp dl, [mode] |
58,12 → 62,12 |
cmp edx, 105 |
jle .morebuttons |
mcall 4, 28 shl 16 + 31, 0x80000000, modes |
mcall 4, 8 shl 16 + 11, 0x80000000, modes |
cmp [mode], 101 |
jne .no_eth |
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx |
mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx |
add ebx, 18 |
mov edx, str_packets_rx |
mcall |
74,19 → 78,23 |
mov edx, str_bytes_rx |
mcall |
add ebx, 18 |
mov edx, str_MAC |
mov edx, str_link |
mcall |
cmp [device_type], 1 |
jne end_of_draw |
add ebx, 18 |
mov edx, str_link |
mov edx, str_MAC |
mcall |
mov ebx, API_ETH + 4 |
mov ebx, API_ETH |
mov bh, [device] |
mcall 76 |
push eax |
push bx |
mov edx, 135 shl 16 + 75 + 4*18 |
mov edx, 135 shl 16 + 35 + 5*18 |
call draw_mac |
jmp end_of_draw |
95,7 → 103,7 |
cmp [mode], 102 |
jne .no_ip |
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx |
mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx |
add ebx, 18 |
mov edx, str_packets_rx |
mcall |
133,7 → 141,7 |
mcall 76 |
push eax |
mov edx, 135 shl 16 + 75 + 2*18 |
mov edx, 135 shl 16 + 35 + 2*18 |
call draw_ip |
add edx, 18 |
152,7 → 160,7 |
cmp [mode], 103 |
jne .no_arp |
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx |
mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx |
add ebx, 18 |
mov edx, str_packets_rx |
mcall |
163,11 → 171,13 |
mov edx, str_conflicts |
mcall |
mcall 4, 8 shl 16 + 130, 0x80000000, str_ARP_legend |
jmp end_of_draw |
.no_arp: |
mcall 4, 20 shl 16 + 75, 0x80000000, str_packets_tx |
mcall 4, 8 shl 16 + 35, 0x80000000, str_packets_tx |
add ebx, 18 |
mov edx, str_packets_rx |
196,26 → 206,24 |
mov ebx, API_ETH |
mov bh, [device] |
mov bl, 6 |
@@: |
push ebx |
mcall 76 |
mcall 74 |
pop ebx |
push eax |
inc bl |
cmp bl, 3 |
cmp bl, 10 |
jbe @r |
inc bl |
mcall 76 |
push eax |
mov ebx, 0x000a0000 |
pop ecx |
mov edx, 135 shl 16 + 75 + 5*18 |
mov edx, 135 shl 16 + 35 + 4*18 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
mcall 47 |
sub edx, 18*2 |
sub edx, 18 |
pop ecx |
mcall |
255,7 → 263,7 |
mov ebx, 0x000a0000 |
pop ecx |
mov edx, 135 shl 16 + 75 + 18 |
mov edx, 135 shl 16 + 35 + 18 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
mcall 47 |
299,7 → 307,7 |
mov ebx, 0x000a0000 |
pop ecx |
mov edx, 135 shl 16 + 75 + 3*18 |
mov edx, 135 shl 16 + 35 + 3*18 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
mcall 47 |
316,8 → 324,85 |
pop ecx |
mcall |
jmp mainloop |
mov edx, 50 shl 16 + 150 |
mov [last], 0 |
.arp_loop: |
mov ebx, API_ARP + 3 |
mov bh, [device] |
mcall 76, , [last],,, arp_buf |
cmp eax, -1 |
je mainloop |
mcall 4, 20 shl 16 + 140, 0x80000000, str_ARP_entry |
mov edx, ebx |
mov eax, 47 |
mov ebx, 0x00030000 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
xor ecx, ecx |
mov cl, byte[arp_buf.IP+0] |
mcall |
mov cl, byte[arp_buf.IP+1] |
add edx, 24 shl 16 |
mcall |
mov cl, byte[arp_buf.IP+2] |
add edx, 24 shl 16 |
mcall |
mov cl, byte[arp_buf.IP+3] |
add edx, 24 shl 16 |
mcall |
mov ebx, 0x00020100 |
mov cl, byte[arp_buf.MAC+0] |
add edx, 36 shl 16 |
mcall |
mov cl, byte[arp_buf.MAC+1] |
add edx, 18 shl 16 |
mcall |
mov cl, byte[arp_buf.MAC+2] |
add edx, 18 shl 16 |
mcall |
mov cl, byte[arp_buf.MAC+3] |
add edx, 18 shl 16 |
mcall |
mov cl, byte[arp_buf.MAC+4] |
add edx, 18 shl 16 |
mcall |
mov cl, byte[arp_buf.MAC+5] |
add edx, 18 shl 16 |
mcall |
mov ebx, 0x00040000 |
mov cx, [arp_buf.status] |
add edx, 30 shl 16 |
mcall |
mov cx, [arp_buf.TTL] |
add edx, 60 shl 16 |
mcall |
add dx, 18 |
rol edx, 16 |
mov dx, 8 |
rol edx, 16 |
inc [last] |
jmp .arp_loop |
not_103: |
cmp [mode], 104 |
338,7 → 423,7 |
mov ebx, 0x000a0000 |
pop ecx |
mov edx, 135 shl 16 + 75 + 18 |
mov edx, 135 shl 16 + 35 + 18 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
mcall 47 |
369,7 → 454,7 |
mov ebx, 0x000a0000 |
pop ecx |
mov edx, 135 shl 16 + 75 + 18 |
mov edx, 135 shl 16 + 35 + 18 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
mcall 47 |
412,7 → 497,7 |
mov ebx, 0x000a0000 |
pop ecx |
mov edx, 135 shl 16 + 75 + 18*3 |
mov edx, 135 shl 16 + 35 + 18*3 |
mov esi, 0x40000000 |
mov edi, 0x00bcbcbc |
mcall 47 |
530,8 → 615,8 |
draw_interfaces: |
mov [.btnpos], 8 shl 16 + 20 |
mov [.txtpos], 490 shl 16 + 15 |
mov [.btnpos], 5 shl 16 + 20 |
mov [.txtpos], 455 shl 16 + 12 |
mcall 74, -1 ; get number of active network devices |
mov ecx, eax |
539,8 → 624,8 |
xor ebx, ebx ; get device type |
.loop: |
mcall 74 |
cmp eax, 1 ; ethernet? |
je .hit |
cmp eax, 1 ; loopback or ethernet? |
jbe .hit |
inc bh |
jb .loop ; tried all 256? |
ret |
553,7 → 638,7 |
mov esi, 0x00aaaaff |
cmp bh, [device] |
cmove esi, 0x00aaffff |
mcall 8, 485 shl 16 + 100, [.btnpos] |
mcall 8, 450 shl 16 + 135, [.btnpos] |
mov ebx, [esp] |
inc bl |
mov ecx, namebuf |
587,7 → 672,9 |
name db 'Netstat', 0 |
mode db 101 |
device db 0 |
modes db 'Ethernet IPv4 ARP ICMP UDP TCP', 0 |
device_type dd 0 |
last dd 0 |
modes db 'Physical IPv4 ARP ICMP UDP TCP', 0 |
str_packets_tx db 'Packets sent:', 0 |
str_packets_rx db 'Packets received:', 0 |
605,10 → 692,12 |
str_dumped db 'Packets dumped:',0 |
str_link db 'Link state:',0 |
str_ARP_legend db 'IP-address MAC-address Status TTL', 0 |
str_ARP_entry db ' . . . - - - - - s', 0 |
namebuf rb 64 |
arp_buf ARP_entry |
I_PARAM rb 1024 |
I_END: |
/programs/network/zeroconf/zeroconf.asm |
---|
141,7 → 141,9 |
DEBUGF 1,">Zero-config service loaded\n" |
.wait: |
mcall 76, API_ETH + 4 ; get MAC of ethernet interface 0 |
mov ebx, API_ETH + 0 |
mov bh, [device] |
mcall 76 ; get MAC of ethernet interface 1 |
cmp eax, -1 |
jne .start |
342,10 → 344,15 |
call dhcp_end |
mcall 76, API_IPv4 + 3, [dhcp.ip] ; ip |
mcall 76, API_IPv4 + 5, [dhcp.dns] ; dns |
mcall 76, API_IPv4 + 7, [dhcp.subnet] ; subnet |
mcall 76, API_IPv4 + 9, [dhcp.gateway] ; gateway |
mov ebx, API_IPv4 + 3 |
mov bh, [device] |
mcall 76, , [dhcp.ip] ; ip |
mov bl, 5 |
mcall 76, , [dhcp.dns] ; dns |
mov bl, 7 |
mcall 76, , [dhcp.subnet] ; subnet |
mov bl, 9 |
mcall 76, , [dhcp.gateway] ; gateway |
jmp exit |
479,11 → 486,16 |
mov cx, ax |
shl ecx, 16 |
mov cx, 0xfea9 ; IP 169.254.0.0 link local net, see RFC3927 |
mcall 76, API_IPv4 + 3, ecx ; mask is 255.255.0.0 |
mov ebx, API_IPv4 + 3 |
mov bh, [device] |
mcall 76, , ecx ; mask is 255.255.0.0 |
DEBUGF 1,"Link Local IP assinged: 169.254.%u.%u\n", [generator+0]:1, [generator+1]:1 |
mcall 76, API_IPv4 + 7, 0xffff |
mcall 76, API_IPv4 + 9, 0x0 |
mcall 76, API_IPv4 + 5, 0x0 |
mov bl, 7 |
mcall 76, , 0xffff |
mov bl, 9 |
mcall 76, , 0x0 |
mov bl, 5 |
mcall 76, , 0x0 |
mcall 5, PROBE_WAIT*100 |
506,7 → 518,9 |
mcall 5 |
DEBUGF 1,"Sending Probe\n" |
mcall 76, API_ARP + 6 |
mov ebx, API_ARP + 6 |
mov bh, [device] |
mcall 76 |
inc esi |
cmp esi, PROBE_NUM |
521,7 → 535,9 |
announce_loop: |
DEBUGF 1,"Sending Announce\n" |
mcall 76, API_ARP + 6 |
mov ebx, API_ARP + 6 |
mov bh, [device] |
mcall 76 |
inc esi |
cmp esi,ANNOUNCE_NUM |
594,6 → 610,7 |
IM_END: |
device db 1 |
inibuf rb 16 |
dhcpMsgType db ? |