From ff3fef9490dfae98ffd4cd3113a869d642fa9c32 Mon Sep 17 00:00:00 2001 From: Norbert Federa Date: Tue, 18 Oct 2011 18:36:34 +0200 Subject: [PATCH] pcap: fix timstamps to use gettimeofday pcap used utils/stopwatch to save a record's timestamp which is not suitable because stopwatch measures cpu time and not the wall-clock time also fixed the sleep calculation in the tfreerdp test server --- include/freerdp/utils/pcap.h | 2 -- libfreerdp-utils/pcap.c | 15 ++++------ server/test/tfreerdp.c | 58 +++++++++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 23 deletions(-) diff --git a/include/freerdp/utils/pcap.h b/include/freerdp/utils/pcap.h index a431fbc60..147b1f380 100644 --- a/include/freerdp/utils/pcap.h +++ b/include/freerdp/utils/pcap.h @@ -22,7 +22,6 @@ #include #include -#include struct _pcap_header { @@ -59,7 +58,6 @@ struct rdp_pcap { FILE* fp; char* name; - STOPWATCH* sw; boolean write; int file_size; int record_count; diff --git a/libfreerdp-utils/pcap.c b/libfreerdp-utils/pcap.c index 48f2a711d..132a0cd00 100644 --- a/libfreerdp-utils/pcap.c +++ b/libfreerdp-utils/pcap.c @@ -17,7 +17,7 @@ * limitations under the License. */ -#include +#include #include #include @@ -65,6 +65,7 @@ void pcap_write_record(rdpPcap* pcap, pcap_record* record) void pcap_add_record(rdpPcap* pcap, void* data, uint32 length) { pcap_record* record; + struct timeval tp; if (pcap->tail == NULL) { @@ -88,9 +89,9 @@ void pcap_add_record(rdpPcap* pcap, void* data, uint32 length) record->header.incl_len = length; record->header.orig_len = length; - stopwatch_stop(pcap->sw); - stopwatch_get_elapsed_time_in_useconds(pcap->sw, &record->header.ts_sec, &record->header.ts_usec); - stopwatch_start(pcap->sw); + gettimeofday(&tp, 0); + record->header.ts_sec = tp.tv_sec; + record->header.ts_usec = tp.tv_usec; } boolean pcap_has_next_record(rdpPcap* pcap) @@ -161,9 +162,6 @@ rdpPcap* pcap_open(char* name, boolean write) fseek(pcap->fp, 0, SEEK_SET); pcap_read_header(pcap, &pcap->header); } - - pcap->sw = stopwatch_create(); - stopwatch_start(pcap->sw); } return pcap; @@ -187,7 +185,4 @@ void pcap_close(rdpPcap* pcap) if (pcap->fp != NULL) fclose(pcap->fp); - - stopwatch_stop(pcap->sw); - stopwatch_free(pcap->sw); } diff --git a/server/test/tfreerdp.c b/server/test/tfreerdp.c index b16cbd337..d3fd11355 100644 --- a/server/test/tfreerdp.c +++ b/server/test/tfreerdp.c @@ -33,6 +33,7 @@ #include static char* test_pcap_file = NULL; +static boolean test_dump_rfx_realtime = True; /* HL1, LH1, HH1, HL2, LH2, HH2, HL3, LH3, HH3, LL3 */ static const unsigned int test_quantization_values[] = @@ -246,11 +247,49 @@ static void test_peer_draw_icon(freerdp_peer* client, int x, int y) context->icon_y = y; } +static boolean test_sleep_tsdiff(uint32 *old_sec, uint32 *old_usec, uint32 new_sec, uint32 new_usec) +{ + sint32 sec, usec; + + if (*old_sec==0 && *old_usec==0) + { + *old_sec = new_sec; + *old_usec = new_usec; + return True; + } + + sec = new_sec - *old_sec; + usec = new_usec - *old_usec; + + if (sec<0 || (sec==0 && usec<0)) + { + printf("Invalid time stamp detected.\n"); + return False; + } + + *old_sec = new_sec; + *old_usec = new_usec; + + while (usec < 0) + { + usec += 1000000; + sec--; + } + + if (sec > 0) + freerdp_sleep(sec); + + if (usec > 0) + freerdp_usleep(usec); + + return True; +} + void tf_peer_dump_rfx(freerdp_peer* client) { STREAM* s; - uint32 seconds; - uint32 useconds; + uint32 prev_seconds; + uint32 prev_useconds; rdpUpdate* update; rdpPcap* pcap_rfx; pcap_record record; @@ -260,7 +299,7 @@ void tf_peer_dump_rfx(freerdp_peer* client) client->update->pcap_rfx = pcap_open(test_pcap_file, False); pcap_rfx = client->update->pcap_rfx; - seconds = useconds = 0; + prev_seconds = prev_useconds = 0; while (pcap_has_next_record(pcap_rfx)) { @@ -273,14 +312,8 @@ void tf_peer_dump_rfx(freerdp_peer* client) pcap_get_next_record_content(pcap_rfx, &record); s->p = s->data + s->size; - seconds = record.header.ts_sec - seconds; - useconds = record.header.ts_usec - useconds; - - if (seconds > 0) - freerdp_sleep(seconds); - - if (useconds > 0) - freerdp_usleep(useconds); + if (test_dump_rfx_realtime && test_sleep_tsdiff(&prev_seconds, &prev_useconds, record.header.ts_sec, record.header.ts_usec) == False) + break; update->SurfaceCommand(update, s); } @@ -548,6 +581,9 @@ int main(int argc, char* argv[]) if (argc > 1) test_pcap_file = argv[1]; + + if (argc > 2 && !strcmp(argv[2], "--fast")) + test_dump_rfx_realtime = False; /* Open the server socket and start listening. */ if (instance->Open(instance, NULL, 3389))