This patch adds ct_dpif_get_info() to dpif_class for querying conntrack
info from datapath. Later patches will use this function to query ct_fields
such as ct_state, ct_mark, and ct_label for ofproto/trace command.
The following commits will provide implementation of ct_dpif_get_info()
on dpif-netlink and dpif-netdev.
Signed-off-by: Yi-Hung Wei <yihung....@gmail.com>
---
lib/ct-dpif.c | 19 +++++++++++++++++++
lib/ct-dpif.h | 7 +++++++
lib/dpif-netdev.c | 1 +
lib/dpif-netlink.c | 1 +
lib/dpif-provider.h | 8 ++++++++
5 files changed, 36 insertions(+)
diff --git a/lib/ct-dpif.c b/lib/ct-dpif.c
index c79e69e23970..3e6f4cbe9be2 100644
--- a/lib/ct-dpif.c
+++ b/lib/ct-dpif.c
@@ -127,6 +127,25 @@ ct_dpif_flush(struct dpif *dpif, const uint16_t *zone)
: EOPNOTSUPP);
}
+int
+ct_dpif_get_info(struct dpif *dpif, struct ct_dpif_tuple *tuple,
+ const uint16_t zone, struct ct_dpif_info *info)
+{
+ return (dpif->dpif_class->ct_get_info
+ ? dpif->dpif_class->ct_get_info(dpif, tuple, zone, info)
+ : EOPNOTSUPP);
+}
+
+void
+ct_dpif_format_info(const struct ct_dpif_info *info, struct ds *output)
+{
+ struct ds s = DS_EMPTY_INITIALIZER;
+
+ format_flags(&s, ct_state_to_string, info->ct_state, '|');
+ ds_put_format(output, "ct_state=%s", ds_cstr(&s));
+ ds_destroy(&s);
+}
+
void
ct_dpif_entry_uninit(struct ct_dpif_entry *entry)
{
diff --git a/lib/ct-dpif.h b/lib/ct-dpif.h
index d5f966175bc0..0c82fb022f2b 100644
--- a/lib/ct-dpif.h
+++ b/lib/ct-dpif.h
@@ -172,6 +172,10 @@ struct ct_dpif_entry {
uint32_t bkt; /* CT bucket number. */
};
+struct ct_dpif_info {
+ uint32_t ct_state;
+};
+
enum {
CT_STATS_UDP,
CT_STATS_TCP,
@@ -196,6 +200,9 @@ int ct_dpif_dump_start(struct dpif *, struct
ct_dpif_dump_state **,
int ct_dpif_dump_next(struct ct_dpif_dump_state *, struct ct_dpif_entry *);
int ct_dpif_dump_done(struct ct_dpif_dump_state *);
int ct_dpif_flush(struct dpif *, const uint16_t *zone);
+int ct_dpif_get_info(struct dpif *, struct ct_dpif_tuple *,
+ const uint16_t zone, struct ct_dpif_info *);
+void ct_dpif_format_info(const struct ct_dpif_info *, struct ds *);
void ct_dpif_entry_uninit(struct ct_dpif_entry *);
void ct_dpif_format_entry(const struct ct_dpif_entry *, struct ds *,
bool verbose, bool print_stats);
diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index e2cd9310d51f..e9586bc46627 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -5535,6 +5535,7 @@ const struct dpif_class dpif_netdev_class = {
dpif_netdev_ct_dump_next,
dpif_netdev_ct_dump_done,
dpif_netdev_ct_flush,
+ NULL, /* ct_get_info */
dpif_netdev_meter_get_features,
dpif_netdev_meter_set,
dpif_netdev_meter_get,
diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c
index 29001fbe4a54..122c59614f5a 100644
--- a/lib/dpif-netlink.c
+++ b/lib/dpif-netlink.c
@@ -2986,6 +2986,7 @@ const struct dpif_class dpif_netlink_class = {
dpif_netlink_ct_dump_next,
dpif_netlink_ct_dump_done,
dpif_netlink_ct_flush,
+ NULL, /* ct_get_info */
dpif_netlink_meter_get_features,
dpif_netlink_meter_set,
dpif_netlink_meter_get,
diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h
index 1d82a0939aa1..829738739c6b 100644
--- a/lib/dpif-provider.h
+++ b/lib/dpif-provider.h
@@ -75,6 +75,8 @@ dpif_flow_dump_thread_init(struct dpif_flow_dump_thread
*thread,
struct ct_dpif_dump_state;
struct ct_dpif_entry;
+struct ct_dpif_tuple;
+struct ct_dpif_info;
/* Datapath interface class structure, to be defined by each implementation of
* a datapath interface.
@@ -428,6 +430,12 @@ struct dpif_class {
* only deletes connections in '*zone'. */
int (*ct_flush)(struct dpif *, const uint16_t *zone);
+ /* Queries 'dpif' for the connection tracking info of a connection
+ * specified by 'tuple' in 'zone'. On success, returns 0 and sets
+ * 'info', otherwise returns nonzero value. */
+ int (*ct_get_info)(struct dpif *, struct ct_dpif_tuple *tuple,
+ const uint16_t zone, struct ct_dpif_info *info);
+
/* Meters */
/* Queries 'dpif' for supported meter features.