- /* Insert new rule. */
- oftable_insert_rule(rule);
-
- ovs_rwlock_rdlock(&table->cls.rwlock);
- n_rules = classifier_count(&table->cls);
- ovs_rwlock_unlock(&table->cls.rwlock);
- if (n_rules > table->max_flows) {
- ovs_rwlock_rdlock(&rule->evict);
- if (choose_rule_to_evict(table, &evict)) {
- ovs_rwlock_unlock(&rule->evict);
- ovs_rwlock_unlock(&evict->evict);
- if (evict->pending) {
- error = OFPROTO_POSTPONE;
- goto exit;
- }
- } else {
- ovs_rwlock_unlock(&rule->evict);
- error = OFPERR_OFPFMFC_TABLE_FULL;
- goto exit;
- }
- } else {
- evict = NULL;
- }
-
- group = ofopgroup_create(ofproto, ofconn, request, fm->buffer_id);
- op = ofoperation_create(group, rule, OFOPERATION_ADD, 0);
-