/*
- * 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 "ofp-util.h"
#include "shash.h"
#include "timeval.h"
bool vlans_changed; /* True if new VLANs are in use. */
};
+void ofproto_init_tables(struct ofproto *, int n_tables);
+
struct ofproto *ofproto_lookup(const char *name);
struct ofport *ofproto_get_port(const struct ofproto *, uint16_t ofp_port);
struct ofproto *ofproto; /* The ofproto that contains this port. */
struct hmap_node hmap_node; /* In struct ofproto's "ports" hmap. */
struct netdev *netdev;
- struct ofp_phy_port opp;
+ struct ofputil_phy_port pp;
uint16_t ofp_port; /* OpenFlow port number. */
unsigned int change_seq;
int mtu;
};
-void ofproto_port_set_state(struct ofport *, ovs_be32 state);
+void ofproto_port_set_state(struct ofport *, enum ofputil_port_state);
+
+enum oftable_flags {
+ OFTABLE_HIDDEN = 1 << 0, /* Hide from most OpenFlow operations. */
+ OFTABLE_READONLY = 1 << 1 /* Don't allow OpenFlow to change this table. */
+};
/* A flow table within a "struct ofproto". */
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 *);
*
* When ->construct() is called, the client does not yet know how many flow
* tables the datapath supports, so ofproto->n_tables will be 0 and
- * ofproto->tables will be NULL. ->construct() should store the number of
- * flow tables supported by the datapath (between 1 and 255, inclusive)
- * into '*n_tables'. After a successful return, the client will initialize
- * the base 'n_tables' member to '*n_tables' and allocate and initialize
- * the base 'tables' member as the specified number of empty flow tables.
- * Each flow table will be initially empty, so ->construct() should delete
- * flows from the underlying datapath, if necessary, rather than populating
- * the tables.
+ * ofproto->tables will be NULL. ->construct() should call
+ * ofproto_init_tables() to allocate and initialize ofproto->n_tables and
+ * ofproto->tables. Each flow table will be initially empty, so
+ * ->construct() should delete flows from the underlying datapath, if
+ * necessary, rather than populating the tables.
*
* Only one ofproto instance needs to be supported for any given datapath.
* If a datapath is already open as part of one "ofproto", then another
* returns.
*/
struct ofproto *(*alloc)(void);
- int (*construct)(struct ofproto *ofproto, int *n_tables);
+ int (*construct)(struct ofproto *ofproto);
void (*destruct)(struct ofproto *ofproto);
void (*dealloc)(struct ofproto *ofproto);
* otherwise.
*
* The implementation should store in '*actions' a bitmap of the supported
- * OpenFlow actions: the bit with value (1 << n) should be set to 1 if the
- * implementation supports the action with value 'n', and to 0 otherwise.
- * For example, if the implementation supports the OFPAT_OUTPUT and
- * OFPAT_ENQUEUE actions, but no others, it would set '*actions' to (1 <<
- * OFPAT_OUTPUT) | (1 << OFPAT_ENQUEUE). Vendor actions are not included
- * in '*actions'. */
+ * OpenFlow actions. Vendor actions are not included in '*actions'. */
void (*get_features)(struct ofproto *ofproto,
- bool *arp_match_ip, uint32_t *actions);
+ bool *arp_match_ip,
+ enum ofputil_action_bitmap *actions);
/* Helper for the OpenFlow OFPST_TABLE statistics request.
*
* function may use a null pointer. */
void (*port_modified)(struct ofport *ofport);
- /* Called after an OpenFlow OFPT_PORT_MOD request changes a port's
- * configuration. 'ofport->opp.config' contains the new configuration.
- * 'old_config' contains the previous configuration.
+ /* Called after an OpenFlow request changes a port's configuration.
+ * 'ofport->pp.config' contains the new configuration. 'old_config'
+ * contains the previous configuration.
*
- * The caller implements OFPPC_PORT_DOWN using netdev functions to turn
- * NETDEV_UP on and off, so this function doesn't have to do anything for
- * that bit (and it won't be called if that is the only bit that
+ * The caller implements OFPUTIL_PC_PORT_DOWN using netdev functions to
+ * turn NETDEV_UP on and off, so this function doesn't have to do anything
+ * for that bit (and it won't be called if that is the only bit that
* changes). */
- void (*port_reconfigured)(struct ofport *ofport, ovs_be32 old_config);
+ void (*port_reconfigured)(struct ofport *ofport,
+ enum ofputil_port_config old_config);
/* Looks up a port named 'devname' in 'ofproto'. On success, initializes
* '*port' appropriately.
* '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