include ping_byte_stream
action app_send_event(src:ip.endpoint, dst:ip.endpoint, data : stream_data, pos : stream_pos, close : bool)
function ping_data : stream_data
function ping_packet_end : stream_pos
function ping_pos : stream_pos
function ping_packet_finished : bool
after init {
ping_pos := 0;
ping_packet_finished := false;
}
after app_send_event {
var send_end := pos + data.end;
require ~(send_end > ping_packet_end & ping_packet_finished); # [4]
var end := ping_data.end;
if end < send_end {
end := send_end
};
ping_data := ping_data.resize(end,0); # [1]
var idx := data.begin;
while idx < data.end {
var val := ping_data.value(pos + idx);
TODO: using zero as a "null" value is not correct here.
We need a data structure to capture the known intervals!
require val ~= 0 -> data.value(idx) = val; # [2]
ping_data := ping_data.set(pos+idx,data.value(idx));
idx := idx.next
};
ping_packet_end := end; # [1]
if close {
ping_packet_finished := true; # [3]
}
}