diff --git a/tc/q_netem.c b/tc/q_netem.c index 757edcae..7fbc771c 100644 --- a/tc/q_netem.c +++ b/tc/q_netem.c @@ -111,6 +111,11 @@ static int get_ticks(__u32 *ticks, const char *str) if(get_usecs(&t, str)) return -1; + if (tc_core_usec2big(t)) { + fprintf(stderr, "Illegal %d usecs (too large)\n", t); + return -1; + } + *ticks = tc_core_usec2tick(t); return 0; } diff --git a/tc/tc_core.c b/tc/tc_core.c index 07cf2fa9..10c375ef 100644 --- a/tc/tc_core.c +++ b/tc/tc_core.c @@ -27,6 +27,15 @@ static __u32 t2us=1; static __u32 us2t=1; static double tick_in_usec = 1; +int tc_core_usec2big(long usec) +{ + __u64 t = usec; + + t *= tick_in_usec; + return (t >> 32) != 0; +} + + long tc_core_usec2tick(long usec) { return usec*tick_in_usec; diff --git a/tc/tc_core.h b/tc/tc_core.h index 1537f95a..65611b6d 100644 --- a/tc/tc_core.h +++ b/tc/tc_core.h @@ -4,6 +4,7 @@ #include #include +int tc_core_usec2big(long usec); long tc_core_usec2tick(long usec); long tc_core_tick2usec(long tick); unsigned tc_calc_xmittime(unsigned rate, unsigned size);