Ping: Initiate ICMP packet id with program PID, receive more packets if ID didnt match and timeout didnt exceed.

git-svn-id: svn://kolibrios.org@7891 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
hidnplayr 2020-05-07 20:33:25 +00:00
parent f53424d741
commit d0a8eb080c

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2010-2015. All rights reserved. ;;
;; Copyright (C) KolibriOS team 2010-2020. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;; ping.asm - ICMP echo client for KolibriOS ;;
@ -14,8 +14,7 @@
format binary as ""
BUFFERSIZE = 1500
IDENTIFIER = 0x1337
BUFFERSIZE = 65536
use32
org 0x0
@ -58,6 +57,10 @@ START:
push 25
push 80
call [con_init]
; Init identifier with our PID number
mcall 9, thread_info, -1
mov eax, [thread_info.PID]
mov [icmp_packet.id], ax
; expand payload to 65504 bytes
mov edi, icmp_packet.data+32
mov ecx, 65504/32-1
@ -261,7 +264,13 @@ mainloop:
cmp eax, -1
je fail2
mcall 23, [timeout]
mov [time_exceeded], 0
.receiveloop:
mov ebx, [timeout]
sub ebx, [time_exceeded]
jb .no_response
mcall 23 ; Wait for network event with timeout
mcall 26, 10 ; Get high precision timer count
sub eax, [time_reference]
jz @f
@ -272,7 +281,7 @@ mainloop:
jb @f
inc eax
@@:
mov [time_reference], eax
mov [time_exceeded], eax ; Exceeded time in 1/100 s
; Receive reply
mcall recv, [socketnum], buffer_ptr, BUFFERSIZE, MSG_DONTWAIT
@ -295,6 +304,11 @@ mainloop:
; make esi point to ICMP packet header
add esi, buffer_ptr
; Check identifier
mov ax, [icmp_packet.id]
cmp [esi + ICMP_header.Identifier], ax
jne .receiveloop
; we have a response, print the sender IP
push esi
mov eax, [buffer_ptr + IPv4_header.SourceAddress]
@ -324,10 +338,7 @@ mainloop:
.echo_reply:
cmp [esi + ICMP_header.Identifier], IDENTIFIER
jne .invalid
; Validate the packet
; Validate the payload
add esi, sizeof.ICMP_header
mov ecx, [size]
mov edi, icmp_packet.data
@ -336,12 +347,13 @@ mainloop:
; update stats
inc [stats.rx]
mov eax, [time_reference]
mov eax, [time_exceeded]
add [stats.time], eax
; Print time exceeded
movzx eax, [buffer_ptr + IPv4_header.TimeToLive]
push eax
mov eax, [time_reference]
mov eax, [time_exceeded]
xor edx, edx
mov ebx, 10
div ebx
@ -504,7 +516,8 @@ sockaddr1:
.ip dd 0
rb 10
time_reference dd ?
time_reference dd ? ; start time of sent packet
time_exceeded dd ? ; time exceeded between send and receive
ip_ptr dd ?
count dd ?
size dd ?
@ -544,13 +557,15 @@ socketnum dd ?
icmp_packet db ICMP_ECHO ; type
db 0 ; code
dw 0 ; checksum
.id dw IDENTIFIER ; identifier
.id dw 0 ; identifier
.seq dw 0x0000 ; sequence number
.data db 'abcdefghijklmnopqrstuvwxyz012345'
I_END:
rb 65504-32
thread_info process_information
params rb 1024
buffer_ptr: rb BUFFERSIZE