}
}
+void
+flow_unwildcard_tp_ports(const struct flow *flow, struct flow_wildcards *wc)
+{
+ if (flow->nw_proto != IPPROTO_ICMP) {
+ memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
+ memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
+ } else {
+ wc->masks.tp_src = htons(0xff);
+ wc->masks.tp_dst = htons(0xff);
+ }
+}
+
/* Initializes 'fmd' with the metadata found in 'flow'. */
void
flow_get_metadata(const struct flow *flow, struct flow_metadata *fmd)
memset(&wc->masks, 0, sizeof wc->masks);
}
+/* Clear the metadata and register wildcard masks. They are not packet
+ * header fields. */
+void
+flow_wildcards_clear_non_packet_fields(struct flow_wildcards *wc)
+{
+ memset(&wc->masks.metadata, 0, sizeof wc->masks.metadata);
+ memset(&wc->masks.regs, 0, sizeof wc->masks.regs);
+}
+
/* Returns true if 'wc' matches every packet, false if 'wc' fixes any bits or
* fields. */
bool
}
if (is_ip_any(flow)) {
memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
- memset(&wc->masks.tp_src, 0xff, sizeof wc->masks.tp_src);
- memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
+ flow_unwildcard_tp_ports(flow, wc);
}
wc->masks.vlan_tci |= htons(VLAN_VID_MASK | VLAN_CFI);
break;
default:
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
}
return flow_hash_symmetric_l4(flow, basis);
}
- NOT_REACHED();
+ OVS_NOT_REACHED();
}
/* Returns a string representation of 'fields'. */