/*
- * Copyright (c) 2009, 2010, 2011 Nicira Networks.
+ * Copyright (c) 2009, 2010, 2011, 2012 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "ofproto/ofproto.h"
#include "cfm.h"
#include "classifier.h"
+#include "heap.h"
#include "list.h"
#include "ofp-errors.h"
#include "shash.h"
struct oftable {
enum oftable_flags flags;
struct classifier cls; /* Contains "struct rule"s. */
+ char *name; /* Table name exposed via OpenFlow, or NULL. */
+
+ /* Maximum number of flows or UINT_MAX if there is no limit besides any
+ * limit imposed by resource limitations. */
+ unsigned int max_flows;
+
+ /* These members determine the handling of an attempt to add a flow that
+ * would cause the table to have more than 'max_flows' flows.
+ *
+ * If 'eviction_fields' is NULL, overflows will be rejected with an error.
+ *
+ * If 'eviction_fields' is nonnull (regardless of whether n_eviction_fields
+ * is nonzero), an overflow will cause a flow to be removed. The flow to
+ * be removed is chosen to give fairness among groups distinguished by
+ * different values for the subfields within 'groups'. */
+ struct mf_subfield *eviction_fields;
+ size_t n_eviction_fields;
+
+ /* Eviction groups.
+ *
+ * When a flow is added that would cause the table to have more than
+ * 'max_flows' flows, and 'eviction_fields' is nonnull, these groups are
+ * used to decide which rule to evict: the rule is chosen from the eviction
+ * group that contains the greatest number of rules.*/
+ uint32_t eviction_group_id_basis;
+ struct hmap eviction_groups_by_id;
+ struct heap eviction_groups_by_size;
};
/* Assigns TABLE to each oftable, in turn, in OFPROTO.
long long int created; /* Creation time. */
long long int modified; /* Time of last modification. */
- uint16_t idle_timeout; /* In seconds from time of last use. */
- uint16_t hard_timeout; /* In seconds from last modification. */
+ long long int used; /* Last use; time created if never used. */
+ uint16_t hard_timeout; /* In seconds from ->modified. */
+ uint16_t idle_timeout; /* In seconds from ->used. */
uint8_t table_id; /* Index in ofproto's 'tables' array. */
bool send_flow_removed; /* Send a flow removed message? */
+ /* Eviction groups. */
+ bool evictable; /* If false, prevents eviction. */
+ struct heap_node evg_node; /* In eviction_group's "rules" heap. */
+ struct eviction_group *eviction_group; /* NULL if not in any group. */
+
union ofp_action *actions; /* OpenFlow actions. */
int n_actions; /* Number of elements in actions[]. */
};
return cls_rule ? CONTAINER_OF(cls_rule, struct rule, cr) : NULL;
}
+void ofproto_rule_update_used(struct rule *, long long int used);
void ofproto_rule_expire(struct rule *, uint8_t reason);
void ofproto_rule_destroy(struct rule *);
* 'flow' reflects the flow information for 'packet'. All of the
* information in 'flow' is extracted from 'packet', except for
* flow->tun_id and flow->in_port, which are assigned the correct values
- * for the incoming packet. The register values are zeroed.
+ * for the incoming packet. The register values are zeroed. 'packet''s
+ * header pointers (e.g. packet->l3) are appropriately initialized.
*
- * The statistics for 'packet' should be included in 'rule'.
+ * The implementation should add the statistics for 'packet' into 'rule'.
*
* Returns 0 if successful, otherwise an OpenFlow error code. */
enum ofperr (*rule_execute)(struct rule *rule, const struct flow *flow,
* support CFM, as does a null pointer. */
int (*set_cfm)(struct ofport *ofport, const struct cfm_settings *s);
- /* Checks the fault status of CFM configured on 'ofport'. Returns 1 if CFM
- * is faulted (generally indicating a connectivity problem), 0 if CFM is
- * not faulted, or -1 if CFM is not enabled on 'port'
+ /* Checks the fault status of CFM configured on 'ofport'. Returns a
+ * bitmask of 'cfm_fault_reason's to indicate a CFM fault (generally
+ * indicating a connectivity problem). Returns zero if CFM is not faulted,
+ * and -1 if CFM is not enabled on 'port'.
*
* This function may be a null pointer if the ofproto implementation does
* not support CFM. */
* will be invoked. */
void (*forward_bpdu_changed)(struct ofproto *ofproto);
+ /* Sets the MAC aging timeout for the OFPP_NORMAL action to 'idle_time',
+ * in seconds. */
+ void (*set_mac_idle_time)(struct ofproto *ofproto, unsigned int idle_time);
+
/* Linux VLAN device support (e.g. "eth0.10" for VLAN 10.)
*
* This is deprecated. It is only for compatibility with broken device drivers