Files
openflow/datapath/table.h
T
Justin Pettit 176265ed07 Use new method to describe table entries in OpenFlow wire protocol.
Older versions of OpenFlow pre-defined a few different types of tables and the
Features Reply message would indicate how many of those entries existed.  This
was very inflexible, so now the Features Reply just indicates how many tables
there are.  The controller now sends a Table Stats request to find out how
many entries are supported and the fields that can be wildcarded.

This change also removes the "buffer_mb" field from the Features Reply, since
it was not being used and seemed to be of limited value.
2008-09-10 13:03:25 -07:00

100 lines
3.8 KiB
C

/* Individual switching tables. Generally grouped together in a chain (see
* chain.h). */
#ifndef TABLE_H
#define TABLE_H 1
#include <linux/types.h>
struct sw_flow;
struct sw_flow_key;
struct datapath;
/* Table statistics. */
struct sw_table_stats {
const char *name; /* Human-readable name. */
uint32_t wildcards; /* Bitmap of OFPFW_* wildcards that are
supported by the table. */
unsigned int n_flows; /* Number of active flows. */
unsigned int max_flows; /* Flow capacity. */
unsigned long int n_matched; /* Number of packets that have hit. */
};
/* Position within an iteration of a sw_table.
*
* The contents are private to the table implementation, except that a position
* initialized to all-zero-bits represents the start of a table. */
struct sw_table_position {
unsigned long private[4];
};
/* A single table of flows.
*
* All functions, except destroy, must be called holding the
* rcu_read_lock. destroy must be fully serialized.
*/
struct sw_table {
/* Keep track of the number of packets that matched this table. To
* make this 100% accurate, it should be atomic. However, we're
* primarily concerned about speed. */
unsigned long int n_matched;
/* Searches 'table' for a flow matching 'key', which must not have any
* wildcard fields. Returns the flow if successful, a null pointer
* otherwise. */
struct sw_flow *(*lookup)(struct sw_table *table,
const struct sw_flow_key *key);
/* Inserts 'flow' into 'table', replacing any duplicate flow. Returns
* 0 if successful or a negative error. Error can be due to an
* over-capacity table or because the flow is not one of the kind that
* the table accepts.
*
* If successful, 'flow' becomes owned by 'table', otherwise it is
* retained by the caller. */
int (*insert)(struct sw_table *table, struct sw_flow *flow);
/* Deletes from 'table' any and all flows that match 'key' from
* 'table'. If 'strict' set, wildcards and priority must match.
* Returns the number of flows that were deleted. */
int (*delete)(struct sw_table *table, const struct sw_flow_key *key,
uint16_t priority, int strict);
/* Performs timeout processing on all the flow entries in 'table'.
* Returns the number of flow entries deleted through expiration. */
int (*timeout)(struct datapath *dp, struct sw_table *table);
/* Destroys 'table', which must not have any users. */
void (*destroy)(struct sw_table *table);
/* Iterates through the flow entries in 'table', passing each one
* matches 'key' to 'callback'. The callback function should return 0
* to continue iteration or a nonzero error code to stop. The iterator
* function returns either 0 if the table iteration completed or the
* value returned by the callback function otherwise.
*
* The iteration starts at 'position', which may be initialized to
* all-zero-bits to iterate from the beginning of the table. If the
* iteration terminates due to an error from the callback function,
* 'position' is updated to a value that can be passed back to the
* iterator function to continue iteration later from the same position
* that caused the error (assuming that that flow entry has not been
* deleted in the meantime). */
int (*iterate)(struct sw_table *table,
const struct sw_flow_key *key,
struct sw_table_position *position,
int (*callback)(struct sw_flow *flow, void *private),
void *private);
/* Dumps statistics for 'table' into 'stats'. */
void (*stats)(struct sw_table *table, struct sw_table_stats *stats);
};
struct sw_table *table_hash_create(unsigned int polynomial,
unsigned int n_buckets);
struct sw_table *table_hash2_create(unsigned int poly0, unsigned int buckets0,
unsigned int poly1, unsigned int buckets1);
struct sw_table *table_linear_create(unsigned int max_flows);
#endif /* table.h */