1 << HASH_RXQ_ETH |
0,
},
+ [HASH_RXQ_FLOW_TYPE_BROADCAST] = {
+ .dst_mac_val = "\xff\xff\xff\xff\xff\xff",
+ .dst_mac_mask = "\xff\xff\xff\xff\xff\xff",
+ .hash_types =
+ 1 << HASH_RXQ_UDPV4 |
+ 1 << HASH_RXQ_IPV4 |
+#ifdef HAVE_FLOW_SPEC_IPV6
+ 1 << HASH_RXQ_UDPV6 |
+ 1 << HASH_RXQ_IPV6 |
+#endif /* HAVE_FLOW_SPEC_IPV6 */
+ 1 << HASH_RXQ_ETH |
+ 0,
+ },
+#ifdef HAVE_FLOW_SPEC_IPV6
+ [HASH_RXQ_FLOW_TYPE_IPV6MULTI] = {
+ .dst_mac_val = "\x33\x33\x00\x00\x00\x00",
+ .dst_mac_mask = "\xff\xff\x00\x00\x00\x00",
+ .hash_types =
+ 1 << HASH_RXQ_UDPV6 |
+ 1 << HASH_RXQ_IPV6 |
+ 1 << HASH_RXQ_ETH |
+ 0,
+ },
+#endif /* HAVE_FLOW_SPEC_IPV6 */
};
/**
hash_rxq_special_flow_enable(struct hash_rxq *hash_rxq,
enum hash_rxq_flow_type flow_type)
{
+ struct priv *priv = hash_rxq->priv;
struct ibv_exp_flow *flow;
- FLOW_ATTR_SPEC_ETH(data, hash_rxq_flow_attr(hash_rxq, NULL, 0));
+ FLOW_ATTR_SPEC_ETH(data, priv_flow_attr(priv, NULL, 0, hash_rxq->type));
struct ibv_exp_flow_attr *attr = &data->attr;
struct ibv_exp_flow_spec_eth *spec = &data->spec;
const uint8_t *mac;
* This layout is expected by libibverbs.
*/
assert(((uint8_t *)attr + sizeof(*attr)) == (uint8_t *)spec);
- hash_rxq_flow_attr(hash_rxq, attr, sizeof(data));
+ priv_flow_attr(priv, attr, sizeof(data), hash_rxq->type);
/* The first specification must be Ethernet. */
assert(spec->type == IBV_EXP_FLOW_SPEC_ETH);
assert(spec->size == sizeof(*spec));
{
if (hash_rxq->special_flow[flow_type] == NULL)
return;
- DEBUG("%p: disabling special flow %s (%d)",
- (void *)hash_rxq, hash_rxq_flow_type_str(flow_type), flow_type);
claim_zero(ibv_exp_destroy_flow(hash_rxq->special_flow[flow_type]));
hash_rxq->special_flow[flow_type] = NULL;
DEBUG("%p: special flow %s (%d) disabled",
}
}
+/**
+ * Enable all special flows in all hash RX queues.
+ *
+ * @param priv
+ * Private structure.
+ */
+int
+priv_special_flow_enable_all(struct priv *priv)
+{
+ enum hash_rxq_flow_type flow_type;
+
+ for (flow_type = 0; flow_type != HASH_RXQ_FLOW_TYPE_MAC; ++flow_type) {
+ int ret;
+
+ ret = priv_special_flow_enable(priv, flow_type);
+ if (!ret)
+ continue;
+ /* Failure, rollback. */
+ while (flow_type)
+ priv_special_flow_disable(priv, --flow_type);
+ return ret;
+ }
+ return 0;
+}
+
+/**
+ * Disable all special flows in all hash RX queues.
+ *
+ * @param priv
+ * Private structure.
+ */
+void
+priv_special_flow_disable_all(struct priv *priv)
+{
+ enum hash_rxq_flow_type flow_type;
+
+ for (flow_type = 0; flow_type != HASH_RXQ_FLOW_TYPE_MAC; ++flow_type)
+ priv_special_flow_disable(priv, flow_type);
+}
+
/**
* DPDK callback to enable promiscuous mode.
*