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 <[email protected]> --- 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. -- 2.7.4 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
