Currently, the dpif layer provides an API to set specific features, but not to retrieve their current values. This patch adds a new API, dpif_get_features(), to query the currently configured features.
Signed-off-by: Eelco Chaudron <[email protected]> --- lib/dpif-netdev.c | 1 + lib/dpif-netlink.c | 11 +++++++++++ lib/dpif-provider.h | 1 + lib/dpif.c | 12 +++++++++++- lib/dpif.h | 1 + 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c index 14192c65c..b3127dae6 100644 --- a/lib/dpif-netdev.c +++ b/lib/dpif-netdev.c @@ -9968,6 +9968,7 @@ const struct dpif_class dpif_netdev_class = { dpif_netdev_wait, dpif_netdev_get_stats, NULL, /* set_features */ + NULL, /* get_features */ dpif_netdev_port_add, dpif_netdev_port_del, dpif_netdev_port_set_config, diff --git a/lib/dpif-netlink.c b/lib/dpif-netlink.c index 0515f4ebd..362272da3 100644 --- a/lib/dpif-netlink.c +++ b/lib/dpif-netlink.c @@ -121,6 +121,8 @@ static int dpif_netlink_dp_get(const struct dpif *, struct ofpbuf **bufp); static int dpif_netlink_set_features(struct dpif *dpif_, uint32_t new_features); +static uint32_t +dpif_netlink_get_features(struct dpif *dpif_); static void dpif_netlink_unixctl_dispatch_mode(struct unixctl_conn *conn, int argc, @@ -877,6 +879,14 @@ dpif_netlink_set_features(struct dpif *dpif_, uint32_t new_features) return error; } +static uint32_t +dpif_netlink_get_features(struct dpif *dpif_) +{ + struct dpif_netlink *dpif = dpif_netlink_cast(dpif_); + + return dpif->user_features; +} + static const char * get_vport_type(const struct dpif_netlink_vport *vport) { @@ -4340,6 +4350,7 @@ const struct dpif_class dpif_netlink_class = { NULL, /* wait */ dpif_netlink_get_stats, dpif_netlink_set_features, + dpif_netlink_get_features, dpif_netlink_port_add, dpif_netlink_port_del, NULL, /* port_set_config */ diff --git a/lib/dpif-provider.h b/lib/dpif-provider.h index 02bcae12f..d27ad5165 100644 --- a/lib/dpif-provider.h +++ b/lib/dpif-provider.h @@ -227,6 +227,7 @@ struct dpif_class { int (*get_stats)(const struct dpif *dpif, struct dpif_dp_stats *stats); int (*set_features)(struct dpif *dpif, uint32_t user_features); + uint32_t (*get_features)(struct dpif *dpif); /* Adds 'netdev' as a new port in 'dpif'. If '*port_no' is not * ODPP_NONE, attempts to use that as the port's port number. diff --git a/lib/dpif.c b/lib/dpif.c index 14c870b0e..c294b79ae 100644 --- a/lib/dpif.c +++ b/lib/dpif.c @@ -561,12 +561,22 @@ dpif_get_dp_stats(const struct dpif *dpif, struct dpif_dp_stats *stats) int dpif_set_features(struct dpif *dpif, uint32_t new_features) { - int error = dpif->dpif_class->set_features(dpif, new_features); + int error = dpif->dpif_class->set_features + ? dpif->dpif_class->set_features(dpif, new_features) + : EOPNOTSUPP; log_operation(dpif, "set_features", error); return error; } +uint32_t +dpif_get_features(struct dpif *dpif) +{ + return dpif->dpif_class->get_features + ? dpif->dpif_class->get_features(dpif) + : 0; +} + const char * dpif_port_open_type(const char *datapath_type, const char *port_type) { diff --git a/lib/dpif.h b/lib/dpif.h index f3301ae85..c1b0daa3e 100644 --- a/lib/dpif.h +++ b/lib/dpif.h @@ -440,6 +440,7 @@ struct dpif_dp_stats { int dpif_get_dp_stats(const struct dpif *, struct dpif_dp_stats *); int dpif_set_features(struct dpif *, uint32_t new_features); +uint32_t dpif_get_features(struct dpif *dpif); /* Port operations. */ -- 2.50.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
