summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--datapath/datapath.c2
-rw-r--r--datapath/flow.c14
-rw-r--r--datapath/flow.h1
3 files changed, 16 insertions, 1 deletions
diff --git a/datapath/datapath.c b/datapath/datapath.c
index 89b0d7f0c..babe63c07 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -855,7 +855,7 @@ static int odp_flow_cmd_fill_info(struct sw_flow *flow, struct datapath *dp,
spin_unlock_bh(&flow->lock);
if (used)
- NLA_PUT_MSECS(skb, ODP_FLOW_ATTR_USED, used);
+ NLA_PUT_U64(skb, ODP_FLOW_ATTR_USED, flow_used_time(used));
if (stats.n_packets)
NLA_PUT(skb, ODP_FLOW_ATTR_STATS, sizeof(struct odp_flow_stats), &stats);
diff --git a/datapath/flow.c b/datapath/flow.c
index e90b36a93..eb67cf450 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -82,6 +82,20 @@ static inline bool icmphdr_ok(struct sk_buff *skb)
return skb->len >= skb_transport_offset(skb) + sizeof(struct icmphdr);
}
+u64 flow_used_time(unsigned long flow_jiffies)
+{
+ struct timespec cur_ts;
+ u64 cur_ms, idle_ms;
+
+ ktime_get_ts(&cur_ts);
+ idle_ms = jiffies_to_msecs(jiffies - flow_jiffies);
+ cur_ms = (u64)cur_ts.tv_sec * MSEC_PER_SEC +
+ cur_ts.tv_nsec / NSEC_PER_MSEC;
+
+ return cur_ms - idle_ms;
+}
+
+
#define TCP_FLAGS_OFFSET 13
#define TCP_FLAG_MASK 0x3f
diff --git a/datapath/flow.h b/datapath/flow.h
index 78d5a7019..be734532c 100644
--- a/datapath/flow.h
+++ b/datapath/flow.h
@@ -91,6 +91,7 @@ void flow_put(struct sw_flow *);
int flow_extract(struct sk_buff *, u16 in_port, struct sw_flow_key *, bool *is_frag);
void flow_used(struct sw_flow *, struct sk_buff *);
+u64 flow_used_time(unsigned long flow_jiffies);
u32 flow_hash(const struct sw_flow_key *);
int flow_cmp(const struct tbl_node *, void *target);