uint32_t capabilities;
time_t last_features_request;
struct mac_learning *ml; /* NULL to act as hub instead of switch. */
- bool exact_flows; /* Use exact-match flows? */
+ uint32_t wildcards; /* Wildcards to apply to flows. */
bool action_normal; /* Use OFPP_NORMAL? */
/* Number of outgoing queued packets on the rconn. */
sw->last_features_request = time_now() - 1;
sw->ml = learn_macs ? mac_learning_create() : NULL;
sw->action_normal = action_normal;
- sw->exact_flows = exact_flows;
+ if (exact_flows) {
+ /* Exact match. */
+ sw->wildcards = 0;
+ } else {
+ /* We cannot wildcard all fields.
+ * We need in_port to detect moves.
+ * We need both SA and DA to do learning. */
+ sw->wildcards = (OFPFW_DL_TYPE | OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK
+ | OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST);
+ }
sw->queued = rconn_packet_counter_create();
sw->next_query = LLONG_MIN;
sw->last_query = LLONG_MIN;
} else if (sw->max_idle >= 0 && (!sw->ml || out_port != OFPP_FLOOD)) {
struct ofpbuf *buffer;
struct ofp_flow_mod *ofm;
- uint32_t wildcards;
-
- /* Check if we need to wildcard the flows. */
- if (!sw->exact_flows) {
- /* We can not wildcard all fields.
- * We need in_port to detect moves.
- * We need both SA and DA to do learning. */
- wildcards = (OFPFW_DL_TYPE | OFPFW_NW_SRC_MASK | OFPFW_NW_DST_MASK
- | OFPFW_NW_PROTO | OFPFW_TP_SRC | OFPFW_TP_DST);
- } else {
- /* Exact match */
- wildcards = 0;
- }
/* Check if we need to use "NORMAL" action. */
if (sw->action_normal && out_port != OFPP_FLOOD) {
buffer = make_add_simple_flow(&flow, ntohl(opi->buffer_id),
out_port, sw->max_idle);
ofm = buffer->data;
- ofm->match.wildcards = htonl(wildcards);
+ ofm->match.wildcards = htonl(sw->wildcards);
queue_tx(sw, rconn, buffer);
/* If the switch didn't buffer the packet, we need to send a copy. */