2
0
mirror of https://github.com/openvswitch/ovs synced 2025-08-31 14:25:26 +00:00

dpif: Eliminate ODPPF_* constants from client-visible interface.

Following this commit, the ODPPF_* constants are only used in
Linux-specific parts of OVS userspace code.  This allows the actual Linux
datapath interface to evolve more freely.

Reviewed by Justin Pettit.
This commit is contained in:
Ben Pfaff
2011-01-26 07:12:24 -08:00
parent c97fb13280
commit ba25b8f41f
6 changed files with 44 additions and 30 deletions

View File

@@ -506,7 +506,7 @@ dpif_linux_flow_get(const struct dpif *dpif_, int flags,
}
static int
dpif_linux_flow_put(struct dpif *dpif_, int flags,
dpif_linux_flow_put(struct dpif *dpif_, enum dpif_flow_put_flags flags,
const struct nlattr *key, size_t key_len,
const struct nlattr *actions, size_t actions_len,
struct dpif_flow_stats *stats)
@@ -520,7 +520,16 @@ dpif_linux_flow_put(struct dpif *dpif_, int flags,
put.flow.actions = (struct nlattr *) actions;
put.flow.actions_len = actions_len;
put.flow.flags = 0;
put.flags = flags;
put.flags = 0;
if (flags & DPIF_FP_CREATE) {
put.flags |= ODPPF_CREATE;
}
if (flags & DPIF_FP_MODIFY) {
put.flags |= ODPPF_MODIFY;
}
if (flags & DPIF_FP_ZERO_STATS) {
put.flags |= ODPPF_ZERO_STATS;
}
error = do_ioctl(dpif_, ODP_FLOW_PUT, &put);
if (!error && stats) {
odp_flow_stats_to_dpif_flow_stats(&put.flow.stats, stats);

View File

@@ -797,7 +797,7 @@ clear_stats(struct dp_netdev_flow *flow)
}
static int
dpif_netdev_flow_put(struct dpif *dpif, int flags,
dpif_netdev_flow_put(struct dpif *dpif, enum dpif_flow_put_flags flags,
const struct nlattr *nl_key, size_t nl_key_len,
const struct nlattr *actions, size_t actions_len,
struct dpif_flow_stats *stats)
@@ -814,7 +814,7 @@ dpif_netdev_flow_put(struct dpif *dpif, int flags,
flow = dp_netdev_lookup_flow(dp, &key);
if (!flow) {
if (flags & ODPPF_CREATE) {
if (flags & DPIF_FP_CREATE) {
if (hmap_count(&dp->flow_table) < MAX_FLOWS) {
if (stats) {
memset(stats, 0, sizeof *stats);
@@ -827,13 +827,13 @@ dpif_netdev_flow_put(struct dpif *dpif, int flags,
return ENOENT;
}
} else {
if (flags & ODPPF_MODIFY) {
if (flags & DPIF_FP_MODIFY) {
int error = set_flow_actions(flow, actions, actions_len);
if (!error) {
if (stats) {
get_dpif_flow_stats(flow, stats);
}
if (flags & ODPPF_ZERO_STATS) {
if (flags & DPIF_FP_ZERO_STATS) {
clear_stats(flow);
}
}

View File

@@ -231,21 +231,21 @@ struct dpif_class {
* with types ODPAT_* in the 'actions_len' bytes starting at 'actions'.
*
* - If the flow's key does not exist in 'dpif', then the flow will be
* added if 'flags' includes ODPPF_CREATE. Otherwise the operation will
* fail with ENOENT.
* added if 'flags' includes DPIF_FP_CREATE. Otherwise the operation
* will fail with ENOENT.
*
* If the operation succeeds, then 'stats', if nonnull, must be zeroed.
*
* - If the flow's key does exist in 'dpif', then the flow's actions will
* be updated if 'flags' includes ODPPF_MODIFY. Otherwise the operation
* will fail with EEXIST. If the flow's actions are updated, then its
* statistics will be zeroed if 'flags' includes ODPPF_ZERO_STATS, and
* left as-is otherwise.
* be updated if 'flags' includes DPIF_FP_MODIFY. Otherwise the
* operation will fail with EEXIST. If the flow's actions are updated,
* then its statistics will be zeroed if 'flags' includes
* DPIF_FP_ZERO_STATS, and left as-is otherwise.
*
* If the operation succeeds, then 'stats', if nonnull, must be set to
* the flow's statistics before the update.
*/
int (*flow_put)(struct dpif *dpif, int flags,
int (*flow_put)(struct dpif *dpif, enum dpif_flow_put_flags flags,
const struct nlattr *key, size_t key_len,
const struct nlattr *actions, size_t actions_len,
struct dpif_flow_stats *stats);

View File

@@ -772,22 +772,22 @@ dpif_flow_get(const struct dpif *dpif, int flags,
* types ODPAT_* in the 'actions_len' bytes starting at 'actions'.
*
* - If the flow's key does not exist in 'dpif', then the flow will be added if
* 'flags' includes ODPPF_CREATE. Otherwise the operation will fail with
* 'flags' includes DPIF_FP_CREATE. Otherwise the operation will fail with
* ENOENT.
*
* If the operation succeeds, then 'stats', if nonnull, will be zeroed.
*
* - If the flow's key does exist in 'dpif', then the flow's actions will be
* updated if 'flags' includes ODPPF_MODIFY. Otherwise the operation will
* updated if 'flags' includes DPIF_FP_MODIFY. Otherwise the operation will
* fail with EEXIST. If the flow's actions are updated, then its statistics
* will be zeroed if 'flags' includes ODPPF_ZERO_STATS, and left as-is
* will be zeroed if 'flags' includes DPIF_FP_ZERO_STATS, and left as-is
* otherwise.
*
* If the operation succeeds, then 'stats', if nonnull, will be set to the
* flow's statistics before the update.
*/
int
dpif_flow_put(struct dpif *dpif, int flags,
dpif_flow_put(struct dpif *dpif, enum dpif_flow_put_flags flags,
const struct nlattr *key, size_t key_len,
const struct nlattr *actions, size_t actions_len,
struct dpif_flow_stats *stats)
@@ -795,6 +795,7 @@ dpif_flow_put(struct dpif *dpif, int flags,
int error;
COVERAGE_INC(dpif_flow_put);
assert(!(flags & ~(DPIF_FP_CREATE | DPIF_FP_MODIFY | DPIF_FP_ZERO_STATS)));
error = dpif->dpif_class->flow_put(dpif, flags, key, key_len,
actions, actions_len, stats);
@@ -802,23 +803,19 @@ dpif_flow_put(struct dpif *dpif, int flags,
memset(stats, 0, sizeof *stats);
}
if (should_log_flow_message(error)) {
enum { ODPPF_ALL = ODPPF_CREATE | ODPPF_MODIFY | ODPPF_ZERO_STATS };
struct ds s;
ds_init(&s);
ds_put_cstr(&s, "put");
if (flags & ODPPF_CREATE) {
if (flags & DPIF_FP_CREATE) {
ds_put_cstr(&s, "[create]");
}
if (flags & ODPPF_MODIFY) {
if (flags & DPIF_FP_MODIFY) {
ds_put_cstr(&s, "[modify]");
}
if (flags & ODPPF_ZERO_STATS) {
if (flags & DPIF_FP_ZERO_STATS) {
ds_put_cstr(&s, "[zero]");
}
if (flags & ~ODPPF_ALL) {
ds_put_format(&s, "[%x]", flags & ~ODPPF_ALL);
}
log_flow_message(dpif, error, ds_cstr(&s), key, key_len, stats,
actions, actions_len);
ds_destroy(&s);

View File

@@ -117,8 +117,14 @@ struct dpif_flow_stats {
void dpif_flow_stats_format(const struct dpif_flow_stats *, struct ds *);
enum dpif_flow_put_flags {
DPIF_FP_CREATE = 1 << 0, /* Allow creating a new flow. */
DPIF_FP_MODIFY = 1 << 1, /* Allow modifying an existing flow. */
DPIF_FP_ZERO_STATS = 1 << 2 /* Zero the stats of an existing flow. */
};
int dpif_flow_flush(struct dpif *);
int dpif_flow_put(struct dpif *, int flags,
int dpif_flow_put(struct dpif *, enum dpif_flow_put_flags,
const struct nlattr *key, size_t key_len,
const struct nlattr *actions, size_t actions_len,
struct dpif_flow_stats *);

View File

@@ -206,7 +206,8 @@ struct facet {
*
* - Do include packets and bytes that were obtained from the datapath
* when a flow was deleted (e.g. dpif_flow_del()) or when its
* statistics were reset (e.g. dpif_flow_put() with ODPPF_ZERO_STATS).
* statistics were reset (e.g. dpif_flow_put() with
* DPIF_FP_ZERO_STATS).
*
* - Do not include any packets or bytes that can currently be obtained
* from the datapath by, e.g., dpif_flow_get().
@@ -2306,7 +2307,8 @@ facet_make_actions(struct ofproto *p, struct facet *facet,
}
static int
facet_put__(struct ofproto *ofproto, struct facet *facet, int flags)
facet_put__(struct ofproto *ofproto, struct facet *facet,
enum dpif_flow_put_flags flags)
{
uint32_t keybuf[ODPUTIL_FLOW_KEY_U32S];
struct ofpbuf key;
@@ -2326,9 +2328,9 @@ static void
facet_install(struct ofproto *p, struct facet *facet, bool zero_stats)
{
if (facet->may_install) {
int flags = ODPPF_CREATE | ODPPF_MODIFY;
enum dpif_flow_put_flags flags = DPIF_FP_CREATE | DPIF_FP_MODIFY;
if (zero_stats) {
flags |= ODPPF_ZERO_STATS;
flags |= DPIF_FP_ZERO_STATS;
}
if (!facet_put__(p, facet, flags)) {
facet->installed = true;
@@ -2507,7 +2509,7 @@ facet_revalidate(struct ofproto *ofproto, struct facet *facet)
odp_flow_key_from_flow(&key, &facet->flow);
dpif_flow_put(ofproto->dpif,
ODPPF_CREATE | ODPPF_MODIFY | ODPPF_ZERO_STATS,
DPIF_FP_CREATE | DPIF_FP_MODIFY | DPIF_FP_ZERO_STATS,
key.data, key.size,
odp_actions->data, odp_actions->size, &stats);