A backend which a driver employs to handle flow rules of a given
type depends on the underlying NIC flow engine. The driver in
question in its current state is tailored to support the only
flow engine, VNIC filtering. As the need arises to add support
for transfer rules, the driver has to be reworked so that it
becomes possible to introduce yet another backend.
As a preparation step, make the flow list shared
between different engines.
Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
struct sfc_port port;
struct sfc_filter filter;
struct sfc_port port;
struct sfc_filter filter;
+ struct sfc_flow_list flow_list;
+
unsigned int rxq_max;
unsigned int txq_max;
unsigned int rxq_max;
unsigned int txq_max;
size_t supported_match_num;
/** Driver cache of supported filter match masks */
uint32_t *supported_match;
size_t supported_match_num;
/** Driver cache of supported filter match masks */
uint32_t *supported_match;
- /** List of flow rules */
- struct sfc_flow_list flow_list;
/**
* Supports any of ip_proto, remote host or local host
* filters. This flag is used for filter match exceptions
/**
* Supports any of ip_proto, remote host or local host
* filters. This flag is used for filter match exceptions
- TAILQ_INSERT_TAIL(&sa->filter.flow_list, flow, entries);
+ TAILQ_INSERT_TAIL(&sa->flow_list, flow, entries);
if (sa->state == SFC_ADAPTER_STARTED) {
rc = sfc_flow_filter_insert(sa, flow);
if (sa->state == SFC_ADAPTER_STARTED) {
rc = sfc_flow_filter_insert(sa, flow);
return flow;
fail_filter_insert:
return flow;
fail_filter_insert:
- TAILQ_REMOVE(&sa->filter.flow_list, flow, entries);
+ TAILQ_REMOVE(&sa->flow_list, flow, entries);
fail_bad_value:
rte_free(flow);
fail_bad_value:
rte_free(flow);
"Failed to destroy flow rule");
}
"Failed to destroy flow rule");
}
- TAILQ_REMOVE(&sa->filter.flow_list, flow, entries);
+ TAILQ_REMOVE(&sa->flow_list, flow, entries);
rte_free(flow);
return rc;
rte_free(flow);
return rc;
- TAILQ_FOREACH(flow_ptr, &sa->filter.flow_list, entries) {
+ TAILQ_FOREACH(flow_ptr, &sa->flow_list, entries) {
if (flow_ptr == flow)
rc = 0;
}
if (flow_ptr == flow)
rc = 0;
}
- while ((flow = TAILQ_FIRST(&sa->filter.flow_list)) != NULL) {
+ while ((flow = TAILQ_FIRST(&sa->flow_list)) != NULL) {
rc = sfc_flow_remove(sa, flow, error);
if (rc != 0)
ret = rc;
rc = sfc_flow_remove(sa, flow, error);
if (rc != 0)
ret = rc;
{
SFC_ASSERT(sfc_adapter_is_locked(sa));
{
SFC_ASSERT(sfc_adapter_is_locked(sa));
- TAILQ_INIT(&sa->filter.flow_list);
+ TAILQ_INIT(&sa->flow_list);
SFC_ASSERT(sfc_adapter_is_locked(sa));
SFC_ASSERT(sfc_adapter_is_locked(sa));
- while ((flow = TAILQ_FIRST(&sa->filter.flow_list)) != NULL) {
- TAILQ_REMOVE(&sa->filter.flow_list, flow, entries);
+ while ((flow = TAILQ_FIRST(&sa->flow_list)) != NULL) {
+ TAILQ_REMOVE(&sa->flow_list, flow, entries);
SFC_ASSERT(sfc_adapter_is_locked(sa));
SFC_ASSERT(sfc_adapter_is_locked(sa));
- TAILQ_FOREACH(flow, &sa->filter.flow_list, entries)
+ TAILQ_FOREACH(flow, &sa->flow_list, entries)
sfc_flow_filter_remove(sa, flow);
}
sfc_flow_filter_remove(sa, flow);
}
SFC_ASSERT(sfc_adapter_is_locked(sa));
SFC_ASSERT(sfc_adapter_is_locked(sa));
- TAILQ_FOREACH(flow, &sa->filter.flow_list, entries) {
+ TAILQ_FOREACH(flow, &sa->flow_list, entries) {
rc = sfc_flow_filter_insert(sa, flow);
if (rc != 0)
goto fail_bad_flow;
rc = sfc_flow_filter_insert(sa, flow);
if (rc != 0)
goto fail_bad_flow;