* With few exceptions, ofproto implementations may look at these fields but
* should not modify them. */
struct rule {
- struct ofproto *ofproto; /* The ofproto that contains this rule. */
- struct cls_rule cr; /* In owning ofproto's classifier. */
+ /* Where this rule resides in an OpenFlow switch.
+ *
+ * These are immutable once the rule is constructed, hence 'const'. */
+ struct ofproto *const ofproto; /* The ofproto that contains this rule. */
+ const struct cls_rule cr; /* In owning ofproto's classifier. */
+ const uint8_t table_id; /* Index in ofproto's 'tables' array. */
+
atomic_uint ref_count;
struct ofoperation *pending; /* Operation now in progress, if nonnull. */
long long int created; /* Creation time. */
long long int modified; /* Time of last modification. */
long long int used; /* Last use; time created if never used. */
- uint8_t table_id; /* Index in ofproto's 'tables' array. */
bool send_flow_removed; /* Send a flow removed message? */
uint16_t hard_timeout OVS_GUARDED; /* In seconds from ->modified. */
static void
ofproto_rule_destroy__(struct rule *rule)
{
- cls_rule_destroy(&rule->cr);
+ cls_rule_destroy(CONST_CAST(struct cls_rule *, &rule->cr));
rule_actions_unref(rule->actions);
ovs_mutex_destroy(&rule->mutex);
rule->ofproto->ofproto_class->rule_dealloc(rule);
}
/* Initialize base state. */
- rule->ofproto = ofproto;
- cls_rule_move(&rule->cr, &cr);
+ *CONST_CAST(struct ofproto **, &rule->ofproto) = ofproto;
+ cls_rule_move(CONST_CAST(struct cls_rule *, &rule->cr), &cr);
atomic_init(&rule->ref_count, 1);
rule->pending = NULL;
rule->flow_cookie = fm->new_cookie;
rule->hard_timeout = fm->hard_timeout;
ovs_mutex_unlock(&rule->mutex);
- rule->table_id = table - ofproto->tables;
+ *CONST_CAST(uint8_t *, &rule->table_id) = table - ofproto->tables;
rule->send_flow_removed = (fm->flags & OFPUTIL_FF_SEND_FLOW_REM) != 0;
rule->actions = rule_actions_create(fm->ofpacts, fm->ofpacts_len);
list_init(&rule->meter_list_node);
struct rule *rule)
OVS_REQ_WRLOCK(cls->rwlock) OVS_RELEASES(rule->mutex)
{
- classifier_remove(cls, &rule->cr);
+ classifier_remove(cls, CONST_CAST(struct cls_rule *, &rule->cr));
ovs_mutex_lock(&ofproto_mutex);
cookies_remove(ofproto, rule);
list_insert(&meter->rules, &rule->meter_list_node);
}
ovs_rwlock_wrlock(&table->cls.rwlock);
- classifier_insert(&table->cls, &rule->cr);
+ classifier_insert(&table->cls, CONST_CAST(struct cls_rule *, &rule->cr));
ovs_rwlock_unlock(&table->cls.rwlock);
eviction_group_add_rule(rule);
}