summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/tc.c14
-rw-r--r--tests/system-traffic.at1
2 files changed, 13 insertions, 2 deletions
diff --git a/lib/tc.c b/lib/tc.c
index 1fb2b4a92..4c07e2216 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1366,7 +1366,19 @@ get_user_hz(void)
static void
nl_parse_tcf(const struct tcf_t *tm, struct tc_flower *flower)
{
- uint64_t lastused = time_msec() - (tm->lastuse * 1000 / get_user_hz());
+ uint64_t lastused;
+
+ /* On creation both tm->install and tm->lastuse are set to jiffies
+ * by the kernel. So if both values are the same, the flow has not been
+ * used yet.
+ *
+ * Note that tm->firstuse can not be used due to some kernel bug, i.e.,
+ * hardware offloaded flows do not update tm->firstuse. */
+ if (tm->lastuse == tm->install) {
+ lastused = 0;
+ } else {
+ lastused = time_msec() - (tm->lastuse * 1000 / get_user_hz());
+ }
if (flower->lastused < lastused) {
flower->lastused = lastused;
diff --git a/tests/system-traffic.at b/tests/system-traffic.at
index ce0f14cf1..76f1f39a2 100644
--- a/tests/system-traffic.at
+++ b/tests/system-traffic.at
@@ -7207,7 +7207,6 @@ AT_CLEANUP
AT_BANNER([IGMP])
AT_SETUP([IGMP - flood under normal action])
-CHECK_NO_TC_OFFLOAD()
OVS_TRAFFIC_VSWITCHD_START()
ADD_NAMESPACES(at_ns0, at_ns1)